diff options
| author | Karel Klic <kklic@redhat.com> | 2011-03-07 11:59:10 +0100 |
|---|---|---|
| committer | Karel Klic <kklic@redhat.com> | 2011-03-07 11:59:10 +0100 |
| commit | 5fbd48fabf60b2e6e9470a9315307c154126d971 (patch) | |
| tree | 6c545c87253184d360040199659f5e000ad0721b /src/lib | |
| parent | 42845614d431e7630d91e231ea16557c4f6b1e66 (diff) | |
| parent | 1e2ccb9242a76abeb27ce98aa44c08b3449cccfb (diff) | |
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/crash_data.c | 66 | ||||
| -rw-r--r-- | src/lib/dump_dir.c | 33 | ||||
| -rw-r--r-- | src/lib/run_event.c | 8 |
3 files changed, 61 insertions, 46 deletions
diff --git a/src/lib/crash_data.c b/src/lib/crash_data.c index 8c948436..63b0a7a5 100644 --- a/src/lib/crash_data.c +++ b/src/lib/crash_data.c @@ -87,27 +87,32 @@ vector_of_crash_data_t *new_vector_of_crash_data(void) /* Miscellaneous helpers */ -static const char *const editable_files[] = { - FILENAME_COMMENT , - FILENAME_BACKTRACE , - NULL -}; - -static bool is_editable(const char *name, const char *const *v) +static bool is_in_list(const char *name, const char *const *v) { - while (*v) { - if (strcmp(*v, name) == 0) - return true; - v++; - } - return false; + while (*v) + { + if (strcmp(*v, name) == 0) + return true; + v++; + } + return false; } -bool is_editable_file(const char *file_name) +static const char *const editable_files[] = { + FILENAME_COMMENT , + FILENAME_BACKTRACE, + NULL +}; +static bool is_editable_file(const char *file_name) { - return is_editable(file_name, editable_files); + return is_in_list(file_name, editable_files); } +static const char *const always_text_files[] = { + FILENAME_CMDLINE , + FILENAME_BACKTRACE, + NULL +}; static char* is_text_file(const char *name, ssize_t *sz) { /* We were using magic.h API to check for file being text, but it thinks @@ -123,9 +128,11 @@ static char* is_text_file(const char *name, ssize_t *sz) * fields declared "text" may end up in editing fields and such. * We don't want to accidentally end up with 100meg text in a textbox! * So, don't remove this. If you really need to, raise the limit. + * + * Bumped up to 200k: saw 124740 byte /proc/PID/smaps file */ off_t size = lseek(fd, 0, SEEK_END); - if (size < 0 || size > 64*1024) + if (size < 0 || size > 200*1024) { close(fd); return NULL; /* it's not a SMALL text */ @@ -133,24 +140,24 @@ static char* is_text_file(const char *name, ssize_t *sz) lseek(fd, 0, SEEK_SET); char *buf = (char*)xmalloc(*sz); - ssize_t r = *sz = full_read(fd, buf, *sz); + ssize_t r = full_read(fd, buf, *sz); close(fd); if (r < 0) { free(buf); return NULL; /* it's not text (because we can't read it) */ } + if (r < *sz) + buf[r] = '\0'; + *sz = r; /* Some files in our dump directories are known to always be textual */ const char *base = strrchr(name, '/'); if (base) { base++; - if (strcmp(base, FILENAME_BACKTRACE) == 0 - || strcmp(base, FILENAME_CMDLINE) == 0 - ) { + if (is_in_list(base, always_text_files)) return buf; - } } /* Every once in a while, even a text file contains a few garbled @@ -211,11 +218,20 @@ void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd } char *content; - if (sz < 4*1024) /* is_text_file did read entire file */ - content = xstrndup(text, sz); //TODO: can avoid this copying if is_text_file() adds NUL - else /* no, need to read it all */ + if (sz < 4*1024) /* did is_text_file read entire file? */ + { + content = text; + /* Strip '\n' from one-line elements: */ + char *nl = strchr(content, '\n'); + if (nl && nl[1] == '\0') + *nl = '\0'; + } + else + { + /* no, need to read it all */ + free(text); content = dd_load_text(dd, short_name); - free(text); + } add_to_crash_data_ext(crash_data, short_name, diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c index a84e2814..d0b1d478 100644 --- a/src/lib/dump_dir.c +++ b/src/lib/dump_dir.c @@ -111,7 +111,7 @@ static bool exist_file_dir(const char *path) } /* Return values: - * -1: error + * -1: error (in this case, errno is 0 if error message is already logged) * 0: failed to lock (someone else has it locked) * 1: success */ @@ -121,8 +121,11 @@ static int get_and_set_lock(const char* lock_file, const char* pid) { if (errno != EEXIST) { - if (errno != ENOENT && errno != ENOTDIR) + if (errno != ENOENT && errno != ENOTDIR && errno != EACCES) + { perror_msg("Can't create lock file '%s'", lock_file); + errno = 0; + } return -1; } @@ -137,6 +140,7 @@ static int get_and_set_lock(const char* lock_file, const char* pid) continue; } perror_msg("Can't read lock file '%s'", lock_file); + errno = 0; return -1; } pid_buf[r] = '\0'; @@ -161,6 +165,7 @@ static int get_and_set_lock(const char* lock_file, const char* pid) if (unlink(lock_file) != 0 && errno != ENOENT) { perror_msg("Can't remove stale lock file '%s'", lock_file); + errno = 0; return -1; } } @@ -169,7 +174,7 @@ static int get_and_set_lock(const char* lock_file, const char* pid) return 1; } -static int dd_lock(struct dump_dir *dd, unsigned sleep_usec) +static int dd_lock(struct dump_dir *dd, unsigned sleep_usec, int flags) { if (dd->locked) error_msg_and_die("Locking bug on '%s'", dd->dd_dirname); @@ -283,7 +288,7 @@ struct dump_dir *dd_opendir(const char *dir, int flags) dir = dd->dd_dirname = rm_trailing_slashes(dir); errno = 0; - if (dd_lock(dd, WAIT_FOR_OTHER_PROCESS_USLEEP) < 0) + if (dd_lock(dd, WAIT_FOR_OTHER_PROCESS_USLEEP, flags) < 0) { if ((flags & DD_OPEN_READONLY) && errno == EACCES) { @@ -306,22 +311,17 @@ struct dump_dir *dd_opendir(const char *dir, int flags) * directory when run without arguments, because its option -d DIR * defaults to "."! */ - /*if (!(flags & DD_FAIL_QUIETLY))... - no, DD_FAIL_QUIETLY only means - * "it's ok if it doesn exist", not "ok if contents is bogus"! - */ error_msg("'%s' is not a crash dump directory", dir); - dd_close(dd); - return NULL; } - - if (errno == ENOENT || errno == ENOTDIR) + else if (errno == ENOENT || errno == ENOTDIR) { - if (!(flags & DD_FAIL_QUIETLY)) + if (!(flags & DD_FAIL_QUIETLY_ENOENT)) error_msg("'%s' does not exist", dir); } else { - perror_msg("Can't access '%s'", dir); + if (!(flags & DD_FAIL_QUIETLY_EACCES)) + perror_msg("Can't access '%s'", dir); } dd_close(dd); return NULL; @@ -335,8 +335,7 @@ struct dump_dir *dd_opendir(const char *dir, int flags) struct stat stat_buf; if (stat(dir, &stat_buf) != 0 || !S_ISDIR(stat_buf.st_mode)) { - if (!(flags & DD_FAIL_QUIETLY)) - error_msg("'%s' does not exist", dir); + error_msg("Can't stat '%s', or it is not a directory", dir); dd_close(dd); return NULL; } @@ -421,7 +420,7 @@ struct dump_dir *dd_create(const char *dir, uid_t uid) return NULL; } - if (dd_lock(dd, CREATE_LOCK_USLEEP) < 0) + if (dd_lock(dd, CREATE_LOCK_USLEEP, /*flags:*/ 0) < 0) { dd_close(dd); return NULL; @@ -585,7 +584,7 @@ static char *load_text_file(const char *path, unsigned flags) FILE *fp = fopen(path, "r"); if (!fp) { - if (!(flags & DD_FAIL_QUIETLY)) + if (!(flags & DD_FAIL_QUIETLY_ENOENT)) perror_msg("Can't open file '%s'", path); return (flags & DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE ? NULL : xstrdup("")); } diff --git a/src/lib/run_event.c b/src/lib/run_event.c index e96e762f..a2bbc76b 100644 --- a/src/lib/run_event.c +++ b/src/lib/run_event.c @@ -160,7 +160,7 @@ static GList *load_event_config(GList *list, /* Get this name from dump dir */ if (!dd) { - dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + dd = dd_opendir(dump_dir_name, DD_OPEN_READONLY); if (!dd) { free(line); @@ -168,7 +168,7 @@ static GList *load_event_config(GList *list, goto stop; /* error (note: dd_opendir logged error msg) */ } } - real_val = malloced_val = dd_load_text_ext(dd, p, DD_FAIL_QUIETLY); + real_val = malloced_val = dd_load_text_ext(dd, p, DD_FAIL_QUIETLY_ENOENT); } /* Does VAL match? */ @@ -342,7 +342,7 @@ int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, c int r = run_event_on_dir_name(state, dir_name, event); g_hash_table_remove_all(data); - dd = dd_opendir(dir_name, 0); + dd = dd_opendir(dir_name, /*flags:*/ 0); free(dir_name); if (dd) { @@ -476,7 +476,7 @@ static int list_possible_events_helper(struct strbuf *result, goto stop; /* error (note: dd_opendir logged error msg) */ } } - char *real_val = dd_load_text_ext(dd, p, DD_FAIL_QUIETLY); + char *real_val = dd_load_text_ext(dd, p, DD_FAIL_QUIETLY_ENOENT); /* Does VAL match? */ if (strcmp(real_val, line_val) != 0) { |
