Another project, another bump in the road and another chance to learn. I've been trying to open gzipped files and parse data from them and hit a snag. I have data in gzips with a place followed by an ip or ip range sort of like this:
Some place:x.x.x.x-x.x.x.x
I was able to modify some code I found that works fine for parsing the data to only show the ips:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
char str[128];
char *ptr;
strcpy (str, "Some place:x.x.x.x-x.x.x.x");
strtok_r (str, ":", &ptr);
printf ("%s\n", ptr);
return 0;
}
Result:
$ ./test
x.x.x.x-x.x.x.x
However, when I add it to the code I have for opening the gzips and reading them I get a segmentation fault. Here is the code I am trying to work from now:
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
const char prefix[] = "zcat ";
const char *arg;
char *strip;
char *range;
char *cmd;
FILE *in;
char buf[4096];
if (argc != 2) {
fprintf(stderr, "Usage: %s file\n", argv[0]);
return 1;
}
arg = argv[1];
cmd = malloc(sizeof(prefix) + strlen(arg) + 1);
if (!cmd) {
fprintf(stderr, "%s: malloc: %s\n", argv[0], strerror(errno));
return 1;
}
sprintf(cmd, "%s%s", prefix, arg);
in = popen(cmd, "r");
if (!in) {
fprintf(stderr, "%s: popen: %s\n", argv[0], strerror(errno));
return 1;
}
while (fscanf(in, "%*s %99[^\n]", buf) == 1){
strcpy (strip, buf);
strtok_r (strip, ":", &range);
printf("%s\n", range);
}
if (ferror(in)) {
fprintf(stderr, "%s: fread: %s\n", argv[0], strerror(errno));
return 1;
}
else if (!feof(in)) {
fprintf(stderr, "%s: %s: unconsumed input\n", argv[0], argv[1]);
return 1;
}
return 0;
}
I tried to look at this with strace and it seems to die directly after reading the first line. Any thoughts appreciated.