summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2011-03-07 11:59:10 +0100
committerKarel Klic <kklic@redhat.com>2011-03-07 11:59:10 +0100
commit5fbd48fabf60b2e6e9470a9315307c154126d971 (patch)
tree6c545c87253184d360040199659f5e000ad0721b /src/lib
parent42845614d431e7630d91e231ea16557c4f6b1e66 (diff)
parent1e2ccb9242a76abeb27ce98aa44c08b3449cccfb (diff)
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/crash_data.c66
-rw-r--r--src/lib/dump_dir.c33
-rw-r--r--src/lib/run_event.c8
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)
{