From ca2d1ada85486d01ace592f20ec7a328dfbd385a Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 7 Oct 2010 22:52:54 +0000 Subject: [PATCH] Get rid of the getopt reimplementation and depend on libcaca instead. --- configure.ac | 31 ++++++----- msvc/config.h | 2 - msvc/zzat.vcxproj | 4 +- msvc/zzuf.vcxproj | 4 +- src/Makefile.am | 13 ++--- src/mygetopt.c | 120 ---------------------------------------- src/mygetopt.h | 29 ---------- src/zzat.c | 29 +++------- src/zzuf.c | 136 +++++++++++++++++++++------------------------- 9 files changed, 97 insertions(+), 271 deletions(-) delete mode 100644 src/mygetopt.c delete mode 100644 src/mygetopt.h diff --git a/configure.ac b/configure.ac index 93d19be..e4ba0b2 100644 --- a/configure.ac +++ b/configure.ac @@ -11,6 +11,18 @@ AM_PROG_CC_C_O AC_PROG_CPP AC_PROG_LIBTOOL +dnl AC_PROG_EGREP only exists in autoconf 2.54+, so we use AC_EGREP_CPP right +dnl now otherwise it might be set in an obscure if statement. Same thing for +dnl PKG_PROG_PKG_CONFIG which needs to be called first. +AC_EGREP_CPP(yes, foo) +PKG_PROG_PKG_CONFIG() + +dnl Don't let pkg-config fuck our cross-compilation environment +m4_pattern_allow([^PKG_CONFIG_LIBDIR$]) +if test "$build" != "$host" -a "${PKG_CONFIG_LIBDIR}" = ""; then + export PKG_CONFIG_LIBDIR=/dev/null +fi + AC_C_INLINE AC_C_FUNC @@ -23,6 +35,11 @@ esac AC_MSG_RESULT($SONAME) AC_DEFINE_UNQUOTED(SONAME, "$SONAME", [Define to the libzzuf full name]) +PKG_CHECK_MODULES(CACA, caca >= 0.99.beta18, + [:], + [AC_MSG_RESULT(no) + AC_MSG_ERROR([you need libcaca version 0.99.beta18 or later])]) + # Optimizations AC_TRY_CFLAGS(-g -O2, CFLAGS="${CFLAGS} -g -O2") # Code qui fait des warnings == code de porc == deux baffes dans ta gueule @@ -45,7 +62,7 @@ esac AC_SUBST(WINSOCK2_LIBS) AC_SUBST(DLL_LDFLAGS) -AC_CHECK_HEADERS(windows.h winsock2.h io.h process.h unistd.h inttypes.h stdint.h getopt.h libc.h malloc.h dlfcn.h regex.h sys/cdefs.h sys/socket.h netinet/in.h arpa/inet.h sys/uio.h aio.h sys/mman.h sys/wait.h sys/resource.h sys/time.h endian.h mach/task.h) +AC_CHECK_HEADERS(windows.h winsock2.h io.h process.h unistd.h inttypes.h stdint.h libc.h malloc.h dlfcn.h regex.h sys/cdefs.h sys/socket.h netinet/in.h arpa/inet.h sys/uio.h aio.h sys/mman.h sys/wait.h sys/resource.h sys/time.h endian.h mach/task.h) AC_CHECK_FUNCS(setenv waitpid setrlimit gettimeofday fork kill pipe _pipe) AC_CHECK_FUNCS(dup dup2 ftello fseeko _IO_getc getline getdelim fgetln map_fd memalign posix_memalign aio_read accept bind connect socket readv pread recv recvfrom recvmsg mmap valloc sigaction getpagesize) @@ -161,18 +178,6 @@ AC_TRY_COMPILE([], [AC_MSG_RESULT(no)]) AC_DEFINE_UNQUOTED(ATTRIBUTE_PRINTF(x,y), $ac_v_attribute_printf, [Define to the __printf__ attribute if present]) -ac_cv_have_getopt_long="no" -AC_CHECK_FUNCS(getopt_long, - [ac_cv_have_getopt_long="yes"], - [AC_CHECK_LIB(gnugetopt, getopt_long, - [ac_cv_have_getopt_long="yes" - GETOPT_LIBS="${GETOPT_LIBS} -lgnugetopt"])]) -if test "$ac_cv_have_getopt_long" != "no"; then - AC_DEFINE(HAVE_GETOPT_LONG, 1, Define to 1 if you have the `getopt_long' function.) -fi -AM_CONDITIONAL(NEED_GETOPT_LONG, test "$ac_cv_have_getopt_long" = "no") -AC_SUBST(GETOPT_LIBS) - AC_CHECK_LIB(m, log, [MATH_LIBS="-lm"]) AC_SUBST(MATH_LIBS) AC_CHECK_LIB(dl, dlopen, [DL_LIBS="-ldl"]) diff --git a/msvc/config.h b/msvc/config.h index 3874a9c..7d25292 100644 --- a/msvc/config.h +++ b/msvc/config.h @@ -49,8 +49,6 @@ /* #undef HAVE_GETC_UNLOCKED */ /* #undef HAVE_GETDELIM */ /* #undef HAVE_GETLINE */ -/* #undef HAVE_GETOPT_H */ -/* #undef HAVE_GETOPT_LONG */ #define HAVE_GETPAGESIZE 1 /* #undef HAVE_GETTIMEOFDAY */ /* #undef HAVE_GLIBC_FILE */ diff --git a/msvc/zzat.vcxproj b/msvc/zzat.vcxproj index 0d3c9fd..3efea28 100644 --- a/msvc/zzat.vcxproj +++ b/msvc/zzat.vcxproj @@ -93,17 +93,15 @@ - $(IntDir)%(FileName)1.obj $(IntDir)%(FileName)1.obj - - \ No newline at end of file + diff --git a/msvc/zzuf.vcxproj b/msvc/zzuf.vcxproj index d5aa807..e5955a1 100644 --- a/msvc/zzuf.vcxproj +++ b/msvc/zzuf.vcxproj @@ -100,7 +100,6 @@ - @@ -112,7 +111,6 @@ - @@ -120,4 +118,4 @@ - \ No newline at end of file + diff --git a/src/Makefile.am b/src/Makefile.am index d0c4d97..1ba5e8c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,21 +23,18 @@ COMMON = \ common/fd.c common/fd.h \ common/fuzz.c common/fuzz.h -if NEED_GETOPT_LONG -GETOPT = mygetopt.c mygetopt.h -endif - -zzuf_SOURCES = $(ZZUF) $(COMMON) $(GETOPT) +zzuf_SOURCES = $(ZZUF) $(COMMON) zzuf_CFLAGS = -DLIBDIR=\"$(libdir)/zzuf\" -I$(srcdir)/common -zzuf_LDFLAGS = $(MATH_LIBS) $(WINSOCK2_LIBS) +zzuf_LDFLAGS = $(CACA_LIBS) $(MATH_LIBS) $(WINSOCK2_LIBS) zzuf_DEPENDENCIES = libzzuf.la -zzat_SOURCES = $(ZZAT) $(GETOPT) +zzat_SOURCES = $(ZZAT) +zzat_LDFLAGS = $(CACA_LIBS) libzzuf_la_SOURCES = $(LIBZZUF) $(COMMON) libzzuf_la_CFLAGS = -DLIBZZUF -I$(srcdir)/libzzuf -I$(srcdir)/common libzzuf_la_LDFLAGS = -avoid-version -no-undefined $(DLL_LDFLAGS) -libzzuf_la_LIBADD = $(GETOPT_LIBS) $(DL_LIBS) $(MATH_LIBS) $(WINSOCK2_LIBS) +libzzuf_la_LIBADD = $(DL_LIBS) $(MATH_LIBS) $(WINSOCK2_LIBS) echo-sources: ; echo $(SOURCES) diff --git a/src/mygetopt.c b/src/mygetopt.c deleted file mode 100644 index fe518e3..0000000 --- a/src/mygetopt.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * zzuf - general purpose fuzzer - * Copyright (c) 2002-2010 Sam Hocevar - * All Rights Reserved - * - * This program is free software. It comes without any warranty, to - * the extent permitted by applicable law. You can redistribute it - * and/or modify it under the terms of the Do What The Fuck You Want - * To Public License, Version 2, as published by Sam Hocevar. See - * http://sam.zoy.org/wtfpl/COPYING for more details. - */ - -/* - * mygetopt.c: getopt_long reimplementation - */ - -#include "config.h" - -#if defined HAVE_STDINT_H -# include -#elif defined HAVE_INTTYPES_H -# include -#endif - -#include -#include - -#include "mygetopt.h" - -int myoptind = 1; -char *myoptarg = NULL; - -/* XXX: this getopt_long implementation should not be trusted for other - * applications without any serious peer reviewing. It “just works” with - * zzuf but may fail miserably in other programs. */ -int mygetopt(int argc, char * const _argv[], const char *optstring, - const struct myoption *longopts, int *longindex) -{ - char **argv = (char **)(uintptr_t)_argv; - char *flag; - int i; - - if(myoptind >= argc) - return -1; - - flag = argv[myoptind]; - - if(flag[0] == '-' && flag[1] != '-') - { - char *tmp; - int ret = flag[1]; - - if(ret == '\0') - return -1; - - tmp = strchr(optstring, ret); - if(!tmp || ret == ':') - return '?'; - - myoptind++; - if(tmp[1] == ':') - { - if(flag[2] != '\0') - myoptarg = flag + 2; - else - myoptarg = argv[myoptind++]; - return ret; - } - - if(flag[2] != '\0') - { - flag[1] = '-'; - myoptind--; - argv[myoptind]++; - } - - return ret; - } - - if(flag[0] == '-' && flag[1] == '-') - { - if(flag[2] == '\0') - return -1; - - for(i = 0; longopts[i].name; i++) - { - size_t l = strlen(longopts[i].name); - - if(strncmp(flag + 2, longopts[i].name, l)) - continue; - - switch(flag[2 + l]) - { - case '=': - if(!longopts[i].has_arg) - goto bad_opt; - if(longindex) - *longindex = i; - myoptind++; - myoptarg = flag + 2 + l + 1; - return longopts[i].val; - case '\0': - if(longindex) - *longindex = i; - myoptind++; - if(longopts[i].has_arg) - myoptarg = argv[myoptind++]; - return longopts[i].val; - default: - break; - } - } - bad_opt: - fprintf(stderr, "%s: unrecognized option `%s'\n", argv[0], flag); - return '?'; - } - - return -1; -} - diff --git a/src/mygetopt.h b/src/mygetopt.h deleted file mode 100644 index e9a2658..0000000 --- a/src/mygetopt.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * zzuf - general purpose fuzzer - * Copyright (c) 2002-2010 Sam Hocevar - * All Rights Reserved - * - * This program is free software. It comes without any warranty, to - * the extent permitted by applicable law. You can redistribute it - * and/or modify it under the terms of the Do What The Fuck You Want - * To Public License, Version 2, as published by Sam Hocevar. See - * http://sam.zoy.org/wtfpl/COPYING for more details. - */ - -/* - * mygetopt.h: getopt_long reimplementation - */ - -struct myoption -{ - const char *name; - int has_arg; - int *flag; - int val; -}; - -extern int myoptind; -extern char *myoptarg; - -int mygetopt(int, char * const[], const char *, const struct myoption *, int *); - diff --git a/src/zzat.c b/src/zzat.c index ef6beb2..c36d3b8 100644 --- a/src/zzat.c +++ b/src/zzat.c @@ -50,18 +50,7 @@ typedef int ssize_t; #include #include -#if !defined HAVE_GETOPT_LONG -# include "mygetopt.h" -#elif defined HAVE_GETOPT_H -# include -#endif - -#if defined HAVE_GETOPT_LONG -# define mygetopt getopt_long -# define myoptind optind -# define myoptarg optarg -# define myoption option -#endif +#include static int run(char const *sequence, char const *file); static void output(char const *buf, size_t len); @@ -99,7 +88,7 @@ int main(int argc, char *argv[]) #define OPTSTR "+AbdeEnr:stTvx:lhV" #define MOREINFO "Try `%s --help' for more information.\n" int option_index = 0; - static struct myoption long_options[] = + static struct caca_option long_options[] = { { "show-all", 0, NULL, 'A' }, { "number-nonblank", 0, NULL, 'b' }, @@ -116,7 +105,7 @@ int main(int argc, char *argv[]) { "version", 0, NULL, 'V' }, { NULL, 0, NULL, 0 } }; - int c = mygetopt(argc, argv, OPTSTR, long_options, &option_index); + int c = caca_getopt(argc, argv, OPTSTR, long_options, &option_index); if (c == -1) break; @@ -142,7 +131,7 @@ int main(int argc, char *argv[]) number_lines = 1; break; case 'r': /* --repeat */ - repeat = atoi(myoptarg); + repeat = atoi(caca_optarg); break; case 's': /* --squeeze-blank */ squeeze_lines = 1; @@ -157,9 +146,9 @@ int main(int argc, char *argv[]) escape_tabs = 1; break; case 'x': /* --execute */ - if (myoptarg[0] == '=') - myoptarg++; - sequence = myoptarg; + if (caca_optarg[0] == '=') + caca_optarg++; + sequence = caca_optarg; break; case 'l': /* --list */ syntax(); @@ -177,14 +166,14 @@ int main(int argc, char *argv[]) } } - if (myoptind >= argc) + if (caca_optind >= argc) { fprintf(stderr, "E: zzat: too few arguments\n"); return EXIT_FAILURE; } while (repeat-- > 0) - for (i = myoptind; i < argc; i++) + for (i = caca_optind; i < argc; i++) { int ret = run(sequence, argv[i]); if (ret) diff --git a/src/zzuf.c b/src/zzuf.c index 7979355..adba612 100644 --- a/src/zzuf.c +++ b/src/zzuf.c @@ -23,11 +23,6 @@ #elif defined HAVE_INTTYPES_H # include #endif -#if !defined HAVE_GETOPT_LONG -# include "mygetopt.h" -#elif defined HAVE_GETOPT_H -# include -#endif #include #include #if defined HAVE_UNISTD_H @@ -55,6 +50,8 @@ # include /* for RLIMIT_AS */ #endif +#include + #include "common.h" #include "opts.h" #include "random.h" @@ -64,13 +61,6 @@ #include "md5.h" #include "timer.h" -#if defined HAVE_GETOPT_LONG -# define mygetopt getopt_long -# define myoptind optind -# define myoptarg optarg -# define myoption option -#endif - #if !defined SIGKILL # define SIGKILL 9 #endif @@ -156,7 +146,7 @@ int main(int argc, char *argv[]) "a:Ab:B:C:dD:e:f:F:ij:l:mnO:p:P:qr:R:s:St:U:vxhV" #define MOREINFO "Try `%s --help' for more information.\n" int option_index = 0; - static struct myoption long_options[] = + static struct caca_option long_options[] = { /* Long option, needs arg, flag, short option */ { "allow", 1, NULL, 'a' }, @@ -199,7 +189,7 @@ int main(int argc, char *argv[]) { "version", 0, NULL, 'V' }, { NULL, 0, NULL, 0 } }; - int c = mygetopt(argc, argv, OPTSTR, long_options, &option_index); + int c = caca_getopt(argc, argv, OPTSTR, long_options, &option_index); if(c == -1) break; @@ -207,18 +197,18 @@ int main(int argc, char *argv[]) switch(c) { case 'a': /* --allow */ - opts->allow = myoptarg; + opts->allow = caca_optarg; break; case 'A': /* --autoinc */ setenv("ZZUF_AUTOINC", "1", 1); break; case 'b': /* --bytes */ - opts->bytes = myoptarg; + opts->bytes = caca_optarg; break; case 'B': /* --max-bytes */ - if(myoptarg[0] == '=') - myoptarg++; - opts->maxbytes = atoi(myoptarg); + if(caca_optarg[0] == '=') + caca_optarg++; + opts->maxbytes = atoi(caca_optarg); break; #if defined HAVE_REGEX_H case 'c': /* --cmdline */ @@ -226,9 +216,9 @@ int main(int argc, char *argv[]) break; #endif case 'C': /* --max-crashes */ - if(myoptarg[0] == '=') - myoptarg++; - opts->maxcrashes = atoi(myoptarg); + if(caca_optarg[0] == '=') + caca_optarg++; + opts->maxcrashes = atoi(caca_optarg); if(opts->maxcrashes <= 0) opts->maxcrashes = 0; break; @@ -236,24 +226,24 @@ int main(int argc, char *argv[]) debug++; break; case 'D': /* --delay */ - if(myoptarg[0] == '=') - myoptarg++; - opts->delay = (int64_t)(atof(myoptarg) * 1000000.0); + if(caca_optarg[0] == '=') + caca_optarg++; + opts->delay = (int64_t)(atof(caca_optarg) * 1000000.0); break; #if defined HAVE_REGEX_H case 'E': /* --exclude */ - exclude = merge_regex(exclude, myoptarg); + exclude = merge_regex(exclude, caca_optarg); if(!exclude) { fprintf(stderr, "%s: invalid regex -- `%s'\n", - argv[0], myoptarg); + argv[0], caca_optarg); _zz_opts_fini(opts); return EXIT_FAILURE; } break; #endif case 'f': /* --fuzzing */ - opts->fuzzing = myoptarg; + opts->fuzzing = caca_optarg; break; case 'F': fprintf(stderr, "%s: `-F' is deprecated, use `-j'\n", argv[0]); @@ -264,32 +254,32 @@ int main(int argc, char *argv[]) break; #if defined HAVE_REGEX_H case 'I': /* --include */ - include = merge_regex(include, myoptarg); + include = merge_regex(include, caca_optarg); if(!include) { fprintf(stderr, "%s: invalid regex -- `%s'\n", - argv[0], myoptarg); + argv[0], caca_optarg); _zz_opts_fini(opts); return EXIT_FAILURE; } break; #endif case 'j': /* --jobs */ - if(myoptarg[0] == '=') - myoptarg++; - opts->maxchild = atoi(myoptarg) > 1 ? atoi(myoptarg) : 1; + if(caca_optarg[0] == '=') + caca_optarg++; + opts->maxchild = atoi(caca_optarg) > 1 ? atoi(caca_optarg) : 1; break; case 'l': /* --list */ - opts->list = myoptarg; + opts->list = caca_optarg; break; case 'm': /* --md5 */ opts->md5 = 1; break; #if defined HAVE_SETRLIMIT && defined ZZUF_RLIMIT_MEM case 'M': /* --max-memory */ - if(myoptarg[0] == '=') - myoptarg++; - opts->maxmem = atoi(myoptarg); + if(caca_optarg[0] == '=') + caca_optarg++; + opts->maxmem = atoi(caca_optarg); break; #endif case 'n': /* --network */ @@ -297,44 +287,44 @@ int main(int argc, char *argv[]) network = 1; break; case 'O': /* --opmode */ - if(myoptarg[0] == '=') - myoptarg++; - if (!strcmp(myoptarg, "preload")) + if(caca_optarg[0] == '=') + caca_optarg++; + if (!strcmp(caca_optarg, "preload")) opts->opmode = OPMODE_PRELOAD; - else if (!strcmp(myoptarg, "copy")) + else if (!strcmp(caca_optarg, "copy")) opts->opmode = OPMODE_COPY; else { fprintf(stderr, "%s: invalid operating mode -- `%s'\n", - argv[0], myoptarg); + argv[0], caca_optarg); _zz_opts_fini(opts); return EXIT_FAILURE; } break; case 'p': /* --ports */ - opts->ports = myoptarg; + opts->ports = caca_optarg; break; case 'P': /* --protect */ - opts->protect = myoptarg; + opts->protect = caca_optarg; break; case 'q': /* --quiet */ opts->quiet = 1; break; case 'r': /* --ratio */ - if(myoptarg[0] == '=') - myoptarg++; - tmp = strchr(myoptarg, ':'); - opts->minratio = atof(myoptarg); + if(caca_optarg[0] == '=') + caca_optarg++; + tmp = strchr(caca_optarg, ':'); + opts->minratio = atof(caca_optarg); opts->maxratio = tmp ? atof(tmp + 1) : opts->minratio; break; case 'R': /* --refuse */ - opts->refuse = myoptarg; + opts->refuse = caca_optarg; break; case 's': /* --seed */ - if(myoptarg[0] == '=') - myoptarg++; - tmp = strchr(myoptarg, ':'); - opts->seed = atol(myoptarg); + if(caca_optarg[0] == '=') + caca_optarg++; + tmp = strchr(caca_optarg, ':'); + opts->seed = atol(caca_optarg); opts->endseed = tmp ? tmp[1] ? (uint32_t)atol(tmp + 1) : (uint32_t)-1L : opts->seed + 1; @@ -343,21 +333,21 @@ int main(int argc, char *argv[]) setenv("ZZUF_SIGNAL", "1", 1); break; case 't': /* --max-time */ - if(myoptarg[0] == '=') - myoptarg++; - opts->maxtime = (int64_t)atoi(myoptarg) * 1000000; + if(caca_optarg[0] == '=') + caca_optarg++; + opts->maxtime = (int64_t)atoi(caca_optarg) * 1000000; break; #if defined HAVE_SETRLIMIT && defined ZZUF_RLIMIT_CPU case 'T': /* --max-cputime */ - if(myoptarg[0] == '=') - myoptarg++; - opts->maxcpu = (int)(atof(myoptarg) + 0.5); + if(caca_optarg[0] == '=') + caca_optarg++; + opts->maxcpu = (int)(atof(caca_optarg) + 0.5); break; #endif case 'U': /* --max-usertime */ - if(myoptarg[0] == '=') - myoptarg++; - opts->maxusertime = (int64_t)(atof(myoptarg) * 1000000.0); + if(caca_optarg[0] == '=') + caca_optarg++; + opts->maxusertime = (int64_t)(atof(caca_optarg) * 1000000.0); break; case 'x': /* --check-exit */ opts->checkexit = 1; @@ -419,7 +409,7 @@ int main(int argc, char *argv[]) /* * Mode 1: asked to read from the standard input */ - if(myoptind >= argc) + if(caca_optind >= argc) { if(opts->verbose) { @@ -448,7 +438,7 @@ int main(int argc, char *argv[]) { int dashdash = 0; - for(i = myoptind + 1; i < argc; i++) + for(i = caca_optind + 1; i < argc; i++) { if(dashdash) include = merge_file(include, argv[i]); @@ -503,9 +493,9 @@ int main(int argc, char *argv[]) opts->oldargv = argv; for(i = 0; i < opts->maxchild; i++) { - int len = argc - myoptind; + int len = argc - caca_optind; opts->child[i].newargv = malloc((len + 1) * sizeof(char *)); - memcpy(opts->child[i].newargv, argv + myoptind, + memcpy(opts->child[i].newargv, argv + caca_optind, len * sizeof(char *)); opts->child[i].newargv[len] = (char *)NULL; } @@ -704,7 +694,7 @@ static void spawn_children(struct opts *opts) if (!tmpdir || !*tmpdir) tmpdir = "/tmp"; - for (j = myoptind + 1; j < opts->oldargc; j++) + for (j = caca_optind + 1; j < opts->oldargc; j++) { fpin = fopen(opts->oldargv[j], "r"); if (!fpin) @@ -722,7 +712,7 @@ static void spawn_children(struct opts *opts) continue; } - opts->child[i].newargv[j - myoptind] = strdup(tmpname); + opts->child[i].newargv[j - caca_optind] = strdup(tmpname); _zz_register(k); while(!feof(fpin)) @@ -897,13 +887,13 @@ static void clean_children(struct opts *opts) if (opts->opmode == OPMODE_COPY) { - for (j = myoptind + 1; j < opts->oldargc; j++) + for (j = caca_optind + 1; j < opts->oldargc; j++) { - if (opts->child[i].newargv[j - myoptind] != opts->oldargv[j]) + if (opts->child[i].newargv[j - caca_optind] != opts->oldargv[j]) { - unlink(opts->child[i].newargv[j - myoptind]); - free(opts->child[i].newargv[j - myoptind]); - opts->child[i].newargv[j - myoptind] = opts->oldargv[j]; + unlink(opts->child[i].newargv[j - caca_optind]); + free(opts->child[i].newargv[j - caca_optind]); + opts->child[i].newargv[j - caca_optind] = opts->oldargv[j]; } } }