diff options
-rw-r--r-- | netsniff-ng.c | 18 | ||||
-rw-r--r-- | str.c | 23 | ||||
-rw-r--r-- | str.h | 1 |
3 files changed, 26 insertions, 16 deletions
diff --git a/netsniff-ng.c b/netsniff-ng.c index e5d1886..5119ad5 100644 --- a/netsniff-ng.c +++ b/netsniff-ng.c @@ -1506,22 +1506,8 @@ int main(int argc, char **argv) } } - if (!ctx.filter && optind != argc) { - int ret; - off_t offset = 0; - - for (i = optind; i < argc; ++i) { - size_t alen = strlen(argv[i]) + 2; - size_t flen = ctx.filter ? strlen(ctx.filter) : 0; - - ctx.filter = xrealloc(ctx.filter, flen + alen); - ret = slprintf(ctx.filter + offset, strlen(argv[i]) + 2, "%s ", argv[i]); - if (ret < 0) - panic("Cannot concatenate filter string!\n"); - else - offset += ret; - } - } + if (!ctx.filter && optind != argc) + ctx.filter = argv2str(optind, argc, argv); if (!ctx.device_in) ctx.device_in = xstrdup("any"); @@ -9,6 +9,8 @@ #include <stdarg.h> #include "str.h" +#include "die.h" +#include "xmalloc.h" size_t strlcpy(char *dest, const char *src, size_t size) { @@ -86,3 +88,24 @@ char *strtrim_right(char *p, char c) return p; } + +char *argv2str(int startind, int argc, char **argv) +{ + off_t offset = 0; + char *str = NULL; + int ret, i; + + for (i = startind; i < argc; ++i) { + size_t alen = strlen(argv[i]) + 2; + size_t slen = str ? strlen(str) : 0; + + str = xrealloc(str, slen + alen); + ret = slprintf(str + offset, strlen(argv[i]) + 2, "%s ", argv[i]); + if (ret < 0) + panic("Cannot concatenate string!\n"); + else + offset += ret; + } + + return str; +} @@ -8,5 +8,6 @@ extern int slprintf(char *dst, size_t size, const char *fmt, ...) __check_forma extern int slprintf_nocheck(char *dst, size_t size, const char *fmt, ...); extern char *strtrim_right(char *p, char c); extern noinline void *xmemset(void *s, int c, size_t n); +extern char *argv2str(int startind, int argc, char **argv); #endif /* STR_H */ |