summaryrefslogtreecommitdiffstats
path: root/src/Hooks
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-10-30 19:17:10 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-10-30 19:17:10 +0100
commit276a9017d63445dd322f9a93ff34e67cbdf97dc9 (patch)
treebe5d38eaa1aeaefe49966ea280e6e8d13e6ec2ce /src/Hooks
parentb4e0ad1ef24fd49bcd5cdd1b6f1dd69768036e07 (diff)
downloadabrt-276a9017d63445dd322f9a93ff34e67cbdf97dc9.tar.gz
abrt-276a9017d63445dd322f9a93ff34e67cbdf97dc9.tar.xz
abrt-276a9017d63445dd322f9a93ff34e67cbdf97dc9.zip
lib/Plugins/Logger: much more sane dump format; fix misdetection of text files
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'src/Hooks')
-rw-r--r--src/Hooks/CCpp.cpp31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/Hooks/CCpp.cpp b/src/Hooks/CCpp.cpp
index e6768a60..1c152e6c 100644
--- a/src/Hooks/CCpp.cpp
+++ b/src/Hooks/CCpp.cpp
@@ -54,32 +54,41 @@ static char* get_cmdline(pid_t pid)
char path[PATH_MAX];
char cmdline[COMMAND_LINE_SIZE];
snprintf(path, sizeof(path), "/proc/%u/cmdline", (int)pid);
- int dst = 0;
+ int idx = 0;
int fd = open(path, O_RDONLY);
if (fd >= 0)
{
int len = read(fd, cmdline, sizeof(cmdline) - 1);
- if (len >= 0)
+ close(fd);
+
+ if (len > 0)
{
- int src = 0;
- while (src < len)
+ /* In Linux, there is always one trailing NUL byte,
+ * prevent it from being replaced by space below.
+ */
+ if (cmdline[len - 1] == '\0')
+ len--;
+
+ while (idx < len)
{
- char ch = cmdline[src++];
+ unsigned char ch = cmdline[idx];
if (ch == '\0')
{
- cmdline[dst++] = ' ';
+ cmdline[idx++] = ' ';
}
- /* TODO: maybe just ch >= ' '? */
- else if (isspace(ch) || (isascii(ch) && !iscntrl(ch)))
+ else if (ch >= ' ' && ch <= 0x7e)
{
- cmdline[dst++] = ch;
+ cmdline[idx++] = ch;
+ }
+ else
+ {
+ cmdline[idx++] = '?';
}
}
}
- close(fd);
}
- cmdline[dst] = '\0';
+ cmdline[idx] = '\0';
return xstrdup(cmdline);
}