static int unittest_http_parse(int print_success) { int success = 1, i; char *ut_successes[] = { "GET / HTTP/1.1\r\nUser-Agent: httperf/0.9.0\r\nHost: localhost\r\n\r\n", NULL }; char *ut_pend[] = { "G", /* 1 */ "GET", "GET ", "GET /", "GET / ", /* 5 */ "GET / HT", "GET / HTTP/1.", "GET / HTTP/1.1", "GET / HTTP/1.1\r", "GET / HTTP/1.1\r\n", /* 10 */ "GET / HTTP/1.1\r\nUser-", "GET / HTTP/1.1\r\nUser-blah:blah\r", NULL }; char *ut_fail[] = { "GET / HTTP/1.2", "GET / HTTP/1.2\r\nUser-blah:blah\r", /* 14 */ NULL }; get_ret_t ret; for (i = 0 ; ut_successes[i] ; i++) { if (print_ut(ut_successes[i], strlen(ut_successes[i]), &ret, UT_SUCCESS, print_success)) { success = 0; } } for (i = 0 ; ut_pend[i] ; i++) { if (print_ut(ut_pend[i], strlen(ut_pend[i]), &ret, UT_PENDING, print_success)) { success = 0; } } for (i = 0 ; ut_fail[i] ; i++) { if (print_ut(ut_fail[i], strlen(ut_fail[i]), &ret, UT_FAIL, print_success)) { success = 0; } } if (success) return 0; return 1; }
int main(int argc, char **argv) { int c; int all, is_utmpx, do_getut; int f; char *fn; size_t recsize; size_t nread; union { struct utmp ut; #ifdef UTMPX struct utmpx utx; #endif } u; all = is_utmpx = do_getut = 0; recsize = sizeof(struct utmp); while ((c = getopt(argc, argv, OPTS)) != EOF) { switch (c) { case 'a': all = 1; break; #ifdef UTMPX case 'x': is_utmpx = 1; recsize = sizeof(struct utmpx); break; #endif #ifdef UTN case 'g': do_getut = 1; break; #endif default: usage(argv[0]); } } if (argc <= optind) usage(argv[0]); fn = argv[optind]; if (!do_getut) { f = open(fn, O_RDONLY); if (f == -1) { perror(fn); exit(1); } while ((nread = read(f, &u, recsize)) > 0) { if (nread < recsize) { fprintf(stderr, "short read"); close(f); exit(1); } if (is_utmpx) { #ifdef UTMPX print_utx(all, &u.utx); #else abort(); #endif } else { print_ut(all, &u.ut); } } if (nread == -1) { perror("read"); exit(1); } close(f); } else { if (is_utmpx) { #ifdef UTMPX #ifdef HAVE_UTMPXNAME struct utmpx *utxp; utmpxname(fn); setutxent(); while ((utxp = getutxent()) != NULL) print_utx(all, utxp); #else fprintf(stderr, "no utmpxname(); can't use getutxent()\n"); exit(1); #endif #else abort(); #endif } else { #ifdef HAVE_UTMPNAME struct utmp *utp; utmpname(fn); setutxent(); while ((utp = getutent()) != NULL) print_ut(all, utp); #else fprintf(stderr, "no utmpname(); can't use getutent()\n"); exit(1); #endif } } exit(0); }