int main(int argc, char **argv) { extern int optind; extern char *optarg; int ch; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); while ((ch = getopt(argc, argv, "0123456789yli:f:h:t:")) != -1) switch((char)ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* * kludge: last was originally designed to take * a number after a dash. */ if (!maxrec) maxrec = atol(argv[optind - 1] + 1); break; case 'f': file = optarg; break; case 'h': hostconv(optarg); addarg(HOST_TYPE, optarg); break; case 't': addarg(TTY_TYPE, ttyconv(optarg)); break; case 'y': doyear = 1; break; case 'l': dolong = 1; break; case 'i': addarg(INET_TYPE, optarg); break; case '?': default: fputs(_("usage: last [-#] [-f file] [-t tty] [-h hostname] [user ...]\n"), stderr); exit(1); } for (argv += optind; *argv; ++argv) { #define COMPATIBILITY #ifdef COMPATIBILITY /* code to allow "last p5" to work */ addarg(TTY_TYPE, ttyconv(*argv)); #endif addarg(USER_TYPE, *argv); } wtmp(); exit(0); }
int main(int argc, char *argv[]) { const char *errstr; int ch, lastch = '\0', newarg = 1, prevoptind = 1; while ((ch = getopt(argc, argv, "0123456789cf:h:n:st:d:T")) != -1) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* * kludge: last was originally designed to take * a number after a dash. */ if (newarg || !isdigit(lastch)) maxrec = 0; else if (maxrec > INT_MAX / 10) usage(); maxrec = (maxrec * 10) + (ch - '0'); break; case 'c': calculate++; break; case 'f': file = optarg; break; case 'h': hostconv(optarg); addarg(HOST_TYPE, optarg); break; case 'n': maxrec = strtonum(optarg, 0, LONG_MAX, &errstr); if (errstr != NULL) errx(1, "number of lines is %s: %s", errstr, optarg); if (maxrec == 0) exit(0); break; case 's': seconds++; break; case 't': addarg(TTY_TYPE, ttyconv(optarg)); break; case 'd': snaptime = dateconv(optarg); break; case 'T': fulltime = 1; break; default: usage(); } lastch = ch; newarg = optind != prevoptind; prevoptind = optind; } if (maxrec == 0) exit(0); if (argc) { setlinebuf(stdout); for (argv += optind; *argv; ++argv) { #define COMPATIBILITY #ifdef COMPATIBILITY /* code to allow "last p5" to work */ addarg(TTY_TYPE, ttyconv(*argv)); #endif addarg(USER_TYPE, *argv); } } checkargs(); wtmp(); exit(0); }
int main(int argc, char *argv[]) { int ch; char *p; const char *file = NULL; int namesize = UT_NAMESIZE; int linesize = UT_LINESIZE; int hostsize = UT_HOSTSIZE; int numeric = 0; maxrec = -1; while ((ch = getopt(argc, argv, "0123456789f:H:h:L:nN:Tt:x")) != -1) switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* * kludge: last was originally designed to take * a number after a dash. */ if (maxrec == -1) { p = argv[optind - 1]; if (p[0] == '-' && p[1] == ch && !p[2]) maxrec = atol(++p); else if (optind < argc) maxrec = atol(argv[optind] + 1); else usage(); if (!maxrec) return 0; } break; case 'f': file = optarg; if ('\0' == file[0]) usage(); break; case 'H': hostsize = atoi(optarg); if (hostsize < 1) usage(); break; case 'h': hostconv(optarg); addarg(HOST_TYPE, optarg); break; case 'L': linesize = atoi(optarg); if (linesize < 1) usage(); break; case 'N': namesize = atoi(optarg); if (namesize < 1) usage(); break; case 'n': numeric = 1; break; case 'T': fulltime = 1; break; case 't': addarg(TTY_TYPE, ttyconv(optarg)); break; case 'x': xflag = 1; break; case '?': default: usage(); } if (argc) { setlinebuf(stdout); for (argv += optind; *argv; ++argv) { #define COMPATIBILITY #ifdef COMPATIBILITY /* code to allow "last p5" to work */ addarg(TTY_TYPE, ttyconv(*argv)); #endif addarg(USER_TYPE, *argv); } } if (file == NULL) { #ifdef SUPPORT_UTMPX if (access(_PATH_WTMPX, R_OK) == 0) file = _PATH_WTMPX; else #endif #ifdef SUPPORT_UTMP if (access(_PATH_WTMP, R_OK) == 0) file = _PATH_WTMP; #endif if (file == NULL) #if defined(SUPPORT_UTMPX) && defined(SUPPORT_UTMP) errx(EXIT_FAILURE, "Cannot access `%s' or `%s'", _PATH_WTMPX, _PATH_WTMP); #elif defined(SUPPORT_UTMPX) errx(EXIT_FAILURE, "Cannot access `%s'", _PATH_WTMPX); #elif defined(SUPPORT_UTMP) errx(EXIT_FAILURE, "Cannot access `%s'", _PATH_WTMP); #else errx(EXIT_FAILURE, "No utmp or utmpx support compiled in."); #endif } #if defined(SUPPORT_UTMPX) && defined(SUPPORT_UTMP) if (file[strlen(file) - 1] == 'x' || xflag) wtmpx(file, namesize, linesize, hostsize, numeric); else wtmp(file, namesize, linesize, hostsize, numeric); #elif defined(SUPPORT_UTMPX) wtmpx(file, namesize, linesize, hostsize, numeric); #elif defined(SUPPORT_UTMP) wtmp(file, namesize, linesize, hostsize, numeric); #else errx(EXIT_FAILURE, "No utmp or utmpx support compiled in."); #endif exit(EXIT_SUCCESS); }