Opinions, thoughts?
Joerg Sonnenberger mentioned that getprogname() could be used.
On Sat, Nov 07, 2015 at 12:20:42PM +0100, Tobias Stoeckmann wrote:
> Based on Todd's patch for at and cron, I did a grep through our base
> tree to see if there are more occurrences of self-made __progname
> handling.
>
> Here's the patch that fixes these cases.
>
> In newfs and newfs_ext2fs, I prevent an out-of-boundary access in case
> someone calls them with argv[0] set to an empty string. And gomoku
> get a little style while at it.
>
>
> Index: bin/mt/mt.c
> ===================================================================
> RCS file: /cvs/src/bin/mt/mt.c,v
> retrieving revision 1.36
> diff -u -p -u -p -r1.36 mt.c
> --- bin/mt/mt.c 12 Nov 2013 04:36:02 -0000 1.36
> +++ bin/mt/mt.c 7 Nov 2015 11:16:25 -0000
> @@ -88,6 +88,8 @@ int _rmtmtioctop(int fd, struct mtop *c
> struct mtget *_rmtstatus(int fd);
> void _rmtclose(void);
>
> +extern char *__progname;
> +
> char *host = NULL; /* remote host (if any) */
>
> int
> @@ -133,7 +135,6 @@ _rmtclose(void)
> #endif
> }
>
> -char *progname;
> int eject = 0;
>
> int
> @@ -145,12 +146,7 @@ main(int argc, char *argv[])
> char *p, *tape, *realtape, *opts;
> size_t len;
>
> - if ((progname = strrchr(argv[0], '/')))
> - progname++;
> - else
> - progname = argv[0];
> -
> - if (strcmp(progname, "eject") == 0) {
> + if (strcmp(__progname, "eject") == 0) {
> opts = "t";
> eject = 1;
> tape = NULL;
> @@ -320,9 +316,9 @@ void
> usage(void)
> {
> if (eject)
> - (void)fprintf(stderr, "usage: %s [-t] device\n", progname);
> + (void)fprintf(stderr, "usage: %s [-t] device\n", __progname);
> else
> (void)fprintf(stderr,
> - "usage: %s [-f device] command [count]\n", progname);
> + "usage: %s [-f device] command [count]\n", __progname);
> exit(X_USAGE);
> }
> Index: bin/pax/options.c
> ===================================================================
> RCS file: /cvs/src/bin/pax/options.c,v
> retrieving revision 1.91
> diff -u -p -u -p -r1.91 options.c
> --- bin/pax/options.c 18 May 2015 20:26:16 -0000 1.91
> +++ bin/pax/options.c 7 Nov 2015 11:16:25 -0000
> @@ -184,14 +184,12 @@ char *chdname = NULL;
> void
> options(int argc, char **argv)
> {
> + extern char *__progname;
>
> /*
> * Are we acting like pax, tar or cpio (based on argv[0])
> */
> - if ((argv0 = strrchr(argv[0], '/')) != NULL)
> - argv0++;
> - else
> - argv0 = argv[0];
> + argv0 = __progname;
>
> if (strcmp(NM_TAR, argv0) == 0) {
> tar_options(argc, argv);
> Index: games/gomoku/main.c
> ===================================================================
> RCS file: /cvs/src/games/gomoku/main.c,v
> retrieving revision 1.28
> diff -u -p -u -p -r1.28 main.c
> --- games/gomoku/main.c 4 Nov 2015 21:22:10 -0000 1.28
> +++ games/gomoku/main.c 7 Nov 2015 11:16:26 -0000
> @@ -45,10 +45,11 @@
> #define PROGRAM 1 /* get input from program */
> #define INPUTF 2 /* get input from a file */
>
> +extern char *__progname;
> +
> int interactive = 1; /* true if interactive */
> int debug; /* true if debugging */
> int test; /* both moves come from 1: input, 2: computer */
> -char *prog; /* name of program */
> FILE *debugfp; /* file for debug output */
> FILE *inputfp; /* file for debug input */
>
> @@ -67,9 +68,7 @@ char *plyr[2]; /* who's who */
> static char you[LOGIN_NAME_MAX]; /* username */
>
> int
> -main(argc, argv)
> - int argc;
> - char **argv;
> +main(int argc, char *argv[])
> {
> char buf[128];
> char fname[PATH_MAX];
> @@ -81,12 +80,6 @@ main(argc, argv)
> };
> char *tmpname;
>
> - prog = strrchr(argv[0], '/');
> - if (prog)
> - prog++;
> - else
> - prog = argv[0];
> -
> if ((tmpname = getlogin()) != NULL)
> strlcpy(you, tmpname, sizeof(you));
> else
> @@ -114,7 +107,7 @@ main(argc, argv)
> default:
> fprintf(stderr,
> "usage: %s [-bcdu] [-D debugfile] [inputfile]\n",
> - prog);
> + __progname);
> exit(1);
> }
> }
> @@ -191,8 +184,8 @@ again:
> }
> }
> if (interactive) {
> - plyr[BLACK] = input[BLACK] == USER ? you : prog;
> - plyr[WHITE] = input[WHITE] == USER ? you : prog;
> + plyr[BLACK] = input[BLACK] == USER ? you : __progname;
> + plyr[WHITE] = input[WHITE] == USER ? you : __progname;
> bdwho(1);
> }
>
> @@ -219,8 +212,8 @@ again:
> input[WHITE] = PROGRAM;
> break;
> }
> - plyr[BLACK] = input[BLACK] == USER ? you : prog;
> - plyr[WHITE] = input[WHITE] == USER ? you : prog;
> + plyr[BLACK] = input[BLACK] == USER ? you : __progname;
> + plyr[WHITE] = input[WHITE] == USER ? you : __progname;
> bdwho(1);
> goto top;
>
> @@ -326,8 +319,7 @@ again:
> }
>
> int
> -readinput(fp)
> - FILE *fp;
> +readinput(FILE *fp)
> {
> char *cp;
> int c;
> @@ -344,8 +336,7 @@ readinput(fp)
> * Handle strange situations.
> */
> void
> -whatsup(signum)
> - int signum;
> +whatsup(int signum)
> {
> int i, pnum, n, s1, s2, d1, d2;
> struct spotstr *sp;
> @@ -493,8 +484,7 @@ syntax:
> * Display debug info.
> */
> void
> -dlog(str)
> - char *str;
> +dlog(char *str)
> {
>
> if (debugfp)
> @@ -506,10 +496,8 @@ dlog(str)
> }
>
> void
> -logit(str)
> - char *str;
> +logit(char *str)
> {
> -
> if (debugfp)
> fprintf(debugfp, "%s\n", str);
> if (interactive)
> @@ -522,8 +510,7 @@ logit(str)
> * Deal with a fatal error.
> */
> void
> -qlog(str)
> - char *str;
> +qlog(char *str)
> {
> dlog(str);
> if (interactive)
> @@ -534,8 +521,7 @@ qlog(str)
>
> /* ARGSUSED */
> void
> -quit(sig)
> - int sig;
> +quit(int sig)
> {
> if (interactive) {
> bdisp(); /* show final board */
> @@ -548,10 +534,9 @@ quit(sig)
> * Die gracefully.
> */
> void
> -panic(str)
> - char *str;
> +panic(char *str)
> {
> - fprintf(stderr, "%s: %s\n", prog, str);
> + fprintf(stderr, "%s: %s\n", __progname, str);
> fputs("resign\n", stdout);
> quit(0);
> }
> Index: libexec/tradcpp/main.c
> ===================================================================
> RCS file: /cvs/src/libexec/tradcpp/main.c,v
> retrieving revision 1.3
> diff -u -p -u -p -r1.3 main.c
> --- libexec/tradcpp/main.c 9 Oct 2015 12:20:18 -0000 1.3
> +++ libexec/tradcpp/main.c 7 Nov 2015 11:16:26 -0000
> @@ -93,6 +93,8 @@ struct commandline_macro {
> const char *expansion;
> };
>
> +extern char *__progname;
> +
> static struct array commandline_macros;
>
> static
> @@ -937,17 +939,17 @@ check_arg_option(const char *opt, const
>
> DEAD static
> void
> -usage(const char *progname, const char *fmt, ...)
> +usage(const char *fmt, ...)
> {
> va_list ap;
>
> - fprintf(stderr, "%s: ", progname);
> + fprintf(stderr, "%s: ", __progname);
> va_start(ap, fmt);
> vfprintf(stderr, fmt, ap);
> va_end(ap);
> fprintf(stderr, "\n");
>
> - fprintf(stderr, "Usage: %s [options] [infile [outfile]]\n", progname);
> + fprintf(stderr, "Usage: %s [options] [infile [outfile]]\n", __progname);
> fprintf(stderr, "Common options:\n");
> fprintf(stderr, " -C Retain comments\n");
> fprintf(stderr, " -Dmacro[=def] Predefine macro\n");
> @@ -1028,18 +1030,13 @@ freestringlater(char *s)
> int
> main(int argc, char *argv[])
> {
> - const char *progname;
> const char *inputfile = NULL;
> const char *outputfile = NULL;
> struct place cmdplace;
> int i;
>
> - progname = strrchr(argv[0], '/');
> - progname = progname == NULL ? argv[0] : progname + 1;
> - complain_init(progname);
> -
> if (pledge("stdio rpath wpath cpath", NULL) == -1) {
> - fprintf(stderr, "%s: pledge: %s", progname, strerror(errno));
> + fprintf(stderr, "%s: pledge: %s", __progname, strerror(errno));
> exit(1);
> }
>
> @@ -1067,7 +1064,7 @@ main(int argc, char *argv[])
> i++;
> continue;
> }
> - usage(progname, "Invalid option %s", argv[i]);
> + usage("Invalid option %s", argv[i]);
> }
> if (i < argc) {
> inputfile = argv[i++];
> @@ -1076,7 +1073,7 @@ main(int argc, char *argv[])
> outputfile = argv[i++];
> }
> if (i < argc) {
> - usage(progname, "Extra non-option argument %s", argv[i]);
> + usage("Extra non-option argument %s", argv[i]);
> }
>
> mode.output_file = outputfile;
> Index: libexec/tradcpp/place.c
> ===================================================================
> RCS file: /cvs/src/libexec/tradcpp/place.c,v
> retrieving revision 1.1
> diff -u -p -u -p -r1.1 place.c
> --- libexec/tradcpp/place.c 30 Jul 2014 16:33:11 -0000 1.1
> +++ libexec/tradcpp/place.c 7 Nov 2015 11:16:26 -0000
> @@ -47,11 +47,11 @@ struct placefile {
> DECLARRAY(placefile, static UNUSED);
> DEFARRAY(placefile, static);
>
> +extern char *__progname;
> +
> static struct placefilearray placefiles;
> static bool overall_failure;
>
> -static const char *myprogname;
> -
> ////////////////////////////////////////////////////////////
> // seenfiles
>
> @@ -187,13 +187,6 @@ place_printfrom(const struct place *p)
>
> ////////////////////////////////////////////////////////////
> // complaints
> -
> -void
> -complain_init(const char *pn)
> -{
> - myprogname = pn;
> -}
> -
> void
> complain(const struct place *p, const char *fmt, ...)
> {
> @@ -204,7 +197,7 @@ complain(const struct place *p, const ch
> fprintf(stderr, "%s:%u:%u: ", place_getname(p),
> p->line, p->column);
> } else {
> - fprintf(stderr, "%s: ", myprogname);
> + fprintf(stderr, "%s: ", __progname);
> }
> va_start(ap, fmt);
> vfprintf(stderr, fmt, ap);
> Index: sbin/newfs/newfs.c
> ===================================================================
> RCS file: /cvs/src/sbin/newfs/newfs.c,v
> retrieving revision 1.100
> diff -u -p -u -p -r1.100 newfs.c
> --- sbin/newfs/newfs.c 29 Sep 2015 03:19:24 -0000 1.100
> +++ sbin/newfs/newfs.c 7 Nov 2015 11:16:26 -0000
> @@ -410,7 +410,7 @@ main(int argc, char *argv[])
> special);
> }
> cp = strchr(argv[0], '\0') - 1;
> - if (cp == NULL ||
> + if (cp == NULL || cp < argv[0] ||
> ((*cp < 'a' || *cp > ('a' + maxpartitions - 1))
> && !isdigit((unsigned char)*cp)))
> fatal("%s: can't figure out file system partition",
> Index: sbin/newfs_ext2fs/newfs_ext2fs.c
> ===================================================================
> RCS file: /cvs/src/sbin/newfs_ext2fs/newfs_ext2fs.c,v
> retrieving revision 1.17
> diff -u -p -u -p -r1.17 newfs_ext2fs.c
> --- sbin/newfs_ext2fs/newfs_ext2fs.c 14 Oct 2015 15:54:49 -0000 1.17
> +++ sbin/newfs_ext2fs/newfs_ext2fs.c 7 Nov 2015 11:16:27 -0000
> @@ -519,7 +519,8 @@ getpartition(int fsi, const char *specia
> if (!S_ISCHR(st.st_mode))
> warnx("%s: not a character-special device", special);
> cp = strchr(argv[0], '\0') - 1;
> - if (cp == NULL || ((*cp < 'a' || *cp > ('a' + getmaxpartitions() - 1))
> + if (cp == NULL || cp < argv[0] ||
> + ((*cp < 'a' || *cp > ('a' + getmaxpartitions() - 1))
> && !isdigit((unsigned char)*cp)))
> errx(EXIT_FAILURE, "%s: can't figure out file system
> partition", argv[0]);
> lp = getdisklabel(special, fsi);
> Index: usr.bin/id/id.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/id/id.c,v
> retrieving revision 1.26
> diff -u -p -u -p -r1.26 id.c
> --- usr.bin/id/id.c 9 Oct 2015 01:37:07 -0000 1.26
> +++ usr.bin/id/id.c 7 Nov 2015 11:16:27 -0000
> @@ -45,8 +45,9 @@ void pretty(struct passwd *);
> void group(struct passwd *, int);
> void usage(void);
> void user(struct passwd *);
> -struct passwd *
> - who(char *);
> +struct passwd *who(char *);
> +
> +extern char *__progname;
>
> int
> main(int argc, char *argv[])
> @@ -63,13 +64,13 @@ main(int argc, char *argv[])
>
> cflag = Gflag = gflag = nflag = pflag = rflag = uflag = 0;
>
> - if (strcmp(getprogname(), "groups") == 0) {
> + if (strcmp(__progname, "groups") == 0) {
> Gflag = 1;
> nflag = 1;
> opts = "";
> if (argc > 2)
> usage();
> - } else if (strcmp(getprogname(), "whoami") == 0) {
> + } else if (strcmp(__progname, "whoami") == 0) {
> uflag = 1;
> nflag = 1;
> opts = "";
> @@ -340,9 +341,9 @@ who(char *u)
> void
> usage(void)
> {
> - if (strcmp(getprogname(), "groups") == 0) {
> + if (strcmp(__progname, "groups") == 0) {
> (void)fprintf(stderr, "usage: groups [user]\n");
> - } else if (strcmp(getprogname(), "whoami") == 0) {
> + } else if (strcmp(__progname, "whoami") == 0) {
> (void)fprintf(stderr, "usage: whoami\n");
> } else {
> (void)fprintf(stderr, "usage: id [user]\n");
> Index: usr.bin/nl/nl.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/nl/nl.c,v
> retrieving revision 1.6
> diff -u -p -u -p -r1.6 nl.c
> --- usr.bin/nl/nl.c 9 Oct 2015 01:37:08 -0000 1.6
> +++ usr.bin/nl/nl.c 7 Nov 2015 11:16:27 -0000
> @@ -74,6 +74,8 @@ void filter(void);
> void parse_numbering(const char *, int);
> __dead void usage(void);
>
> +extern char *__progname;
> +
> /*
> * Delimiter characters that indicate the start of a logical page section.
> */
> @@ -361,6 +363,6 @@ usage(void)
> {
> (void)fprintf(stderr, "usage: %s [-p] [-b type] [-d delim] [-f type] "
> "[-h type] [-i incr] [-l num]\n\t[-n format] [-s sep] "
> - "[-v startnum] [-w width] [file]\n", getprogname());
> + "[-v startnum] [-w width] [file]\n", __progname);
> exit(EXIT_FAILURE);
> }
> Index: usr.bin/telnet/main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/telnet/main.c,v
> retrieving revision 1.30
> diff -u -p -u -p -r1.30 main.c
> --- usr.bin/telnet/main.c 22 Jul 2014 07:30:24 -0000 1.30
> +++ usr.bin/telnet/main.c 7 Nov 2015 11:16:27 -0000
> @@ -77,6 +77,7 @@ int
> main(int argc, char *argv[])
> {
> int ch;
> + extern char *__progname;
> char *user, *alias;
> const char *errstr;
>
> @@ -84,10 +85,7 @@ main(int argc, char *argv[])
>
> TerminalSaveState();
>
> - if ((prompt = strrchr(argv[0], '/')))
> - ++prompt;
> - else
> - prompt = argv[0];
> + prompt = __progname;
>
> user = alias = NULL;
>
> Index: usr.sbin/crunchgen/crunched_main.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/crunchgen/crunched_main.c,v
> retrieving revision 1.4
> diff -u -p -u -p -r1.4 crunched_main.c
> --- usr.sbin/crunchgen/crunched_main.c 11 Jan 2014 04:43:00 -0000
> 1.4
> +++ usr.sbin/crunchgen/crunched_main.c 7 Nov 2015 11:16:27 -0000
> @@ -47,22 +47,19 @@ extern struct stub entry_points[];
> int
> main(int argc, char *argv[], char **envp)
> {
> - char *slash, *basename;
> + extern char *__progname;
> struct stub *ep;
>
> - if (argv[0] == NULL || *argv[0] == '\0')
> + if (__progname == NULL || *__progname == '\0')
> crunched_usage();
>
> - slash = strrchr(argv[0], '/');
> - basename = slash ? slash + 1 : argv[0];
> -
> for (ep = entry_points; ep->name != NULL; ep++)
> - if (!strcmp(basename, ep->name))
> + if (!strcmp(__progname, ep->name))
> break;
>
> if (ep->name)
> return ep->f(argc, argv, envp);
> - fprintf(stderr, "%s: %s not compiled in\n", EXECNAME, basename);
> + fprintf(stderr, "%s: %s not compiled in\n", EXECNAME, __progname);
> crunched_usage();
> }
>
> Index: usr.sbin/pppd/main.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/pppd/main.c,v
> retrieving revision 1.52
> diff -u -p -u -p -r1.52 main.c
> --- usr.sbin/pppd/main.c 26 Oct 2015 11:10:53 -0000 1.52
> +++ usr.sbin/pppd/main.c 7 Nov 2015 11:16:28 -0000
> @@ -90,7 +90,6 @@ extern char *strerror();
> char ifname[IFNAMSIZ]; /* Interface name */
> int ifunit; /* Interface unit number */
>
> -char *progname; /* Name of this program */
> char hostname[HOST_NAME_MAX+1]; /* Our hostname */
> static char default_devnam[PATH_MAX]; /* name of default device */
> static pid_t pid; /* Our pid */
> @@ -222,8 +221,6 @@ main(argc, argv)
> */
> for (i = 0; (protp = protocols[i]) != NULL; ++i)
> (*protp->init)(0);
> -
> - progname = *argv;
>
> if (!options_from_file(_PATH_SYSOPTIONS, !privileged, 0, 1)
> || !options_from_user())
> Index: usr.sbin/pppd/options.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/pppd/options.c,v
> retrieving revision 1.28
> diff -u -p -u -p -r1.28 options.c
> --- usr.sbin/pppd/options.c 16 Jan 2015 06:40:19 -0000 1.28
> +++ usr.sbin/pppd/options.c 7 Nov 2015 11:16:29 -0000
> @@ -517,7 +517,7 @@ usage()
> {
> if (phase == PHASE_INITIALIZE)
> fprintf(stderr, usage_string, VERSION, PATCHLEVEL, IMPLEMENTATION,
> - progname);
> + __progname);
> }
>
> /*
> @@ -687,7 +687,7 @@ option_error(char *fmt, ...)
> vfmtmsg(buf, sizeof(buf), fmt, args);
> va_end(args);
> if (phase == PHASE_INITIALIZE)
> - fprintf(stderr, "%s: %s\n", progname, buf);
> + fprintf(stderr, "%s: %s\n", __progname, buf);
> syslog(LOG_ERR, "%s", buf);
> }
>
> Index: usr.sbin/pppd/pppd.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/pppd/pppd.h,v
> retrieving revision 1.20
> diff -u -p -u -p -r1.20 pppd.h
> --- usr.sbin/pppd/pppd.h 12 Sep 2015 12:42:36 -0000 1.20
> +++ usr.sbin/pppd/pppd.h 7 Nov 2015 11:16:29 -0000
> @@ -77,7 +77,7 @@ extern char hostname[]; /* Our hostname
> extern u_char outpacket_buf[]; /* Buffer for outgoing packets */
> extern int phase; /* Current state of link - see values below */
> extern int baud_rate; /* Current link speed in bits/sec */
> -extern char *progname; /* Name of this program */
> +extern char *__progname; /* Name of this program */
> extern int redirect_stderr;/* Connector's stderr should go to file */
> extern char peer_authname[];/* Authenticated name of peer */
> extern int privileged; /* We were run by real-uid root */
> Index: sbin/pdisk/errors.c
> ===================================================================
> RCS file: /cvs/src/sbin/pdisk/errors.c,v
> retrieving revision 1.7
> diff -u -p -u -p -r1.7 errors.c
> --- sbin/pdisk/errors.c 25 May 2010 19:01:32 -0000 1.7
> +++ sbin/pdisk/errors.c 7 Nov 2015 11:16:29 -0000
> @@ -58,7 +58,7 @@
> //
> // Global Variables
> //
> -char *program_name;
> +extern char *__progname;
>
>
> //
> @@ -70,20 +70,9 @@ char *program_name;
> // Routines
> //
> void
> -init_program_name(char **argv)
> -{
> - if ((program_name = strrchr(argv[0], '/')) != (char *)NULL) {
> - program_name++;
> - } else {
> - program_name = argv[0];
> - }
> -}
> -
> -
> -void
> do_help()
> {
> - printf("usage: %s [-hilrv] disk\n", program_name);
> + printf("usage: %s [-hilrv] disk\n", __progname);
> /*
> {"debug", no_argument, 0, 'd'},
> {"abbr", no_argument, 0, 'a'},
> @@ -112,7 +101,7 @@ fatal(int value, const char *fmt, ...)
> {
> va_list ap;
>
> - fprintf(stderr, "%s: ", program_name);
> + fprintf(stderr, "%s: ", __progname);
> va_start(ap, fmt);
> vfprintf(stderr, fmt, ap);
> va_end(ap);
> @@ -136,7 +125,7 @@ error(int value, const char *fmt, ...)
> {
> va_list ap;
>
> - fprintf(stderr, "%s: ", program_name);
> + fprintf(stderr, "%s: ", __progname);
> va_start(ap, fmt);
> vfprintf(stderr, fmt, ap);
> va_end(ap);
> Index: sbin/pdisk/errors.h
> ===================================================================
> RCS file: /cvs/src/sbin/pdisk/errors.h,v
> retrieving revision 1.3
> diff -u -p -u -p -r1.3 errors.h
> --- sbin/pdisk/errors.h 27 Apr 2006 19:52:21 -0000 1.3
> +++ sbin/pdisk/errors.h 7 Nov 2015 11:16:29 -0000
> @@ -54,7 +54,6 @@ extern int hflag;
> // Forward declarations
> //
> void do_help(void);
> -void init_program_name(char **argv);
> void error(int value, const char *fmt, ...);
> void fatal(int value, const char *fmt, ...);
> void usage(const char *kind);
> Index: sbin/pdisk/pdisk.c
> ===================================================================
> RCS file: /cvs/src/sbin/pdisk/pdisk.c,v
> retrieving revision 1.17
> diff -u -p -u -p -r1.17 pdisk.c
> --- sbin/pdisk/pdisk.c 20 Aug 2015 22:02:21 -0000 1.17
> +++ sbin/pdisk/pdisk.c 7 Nov 2015 11:16:29 -0000
> @@ -131,8 +131,6 @@ main(int argc, char **argv)
> int name_index;
> char *versionstr;
>
> - init_program_name(argv);
> -
> if (sizeof(DPME) != PBLOCK_SIZE) {
> fatal(-1, "Size of partition map entry (%d) "
> "is not equal to block size (%d)\n",
> Index: usr.bin/lex/main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/lex/main.c,v
> retrieving revision 1.15
> diff -u -p -u -p -r1.15 main.c
> --- usr.bin/lex/main.c 10 Oct 2015 05:47:54 -0000 1.15
> +++ usr.bin/lex/main.c 7 Nov 2015 11:16:30 -0000
> @@ -104,10 +104,7 @@ int end_of_buffer_state;
> char **input_files;
> int num_input_files;
>
> -/* Make sure program_name is initialized so we don't crash if writing
> - * out an error message before getting the program name from argv[0].
> - */
> -char *program_name = "flex";
> +extern char *__progname;
>
> #ifndef SHORT_FILE_NAMES
> static const char outfile_template[] = "lex.%s.%s";
> @@ -138,8 +135,7 @@ char **argv;
>
> if (pledge("stdio rpath wpath cpath", NULL) == -1)
> {
> - fprintf( stderr, _( "%s: pledge\n" ),
> - program_name);
> + fprintf( stderr, _( "%s: pledge\n" ), __progname);
> exit(1);
> }
>
> @@ -413,7 +409,7 @@ int exit_status;
> if ( printstats )
> {
> fprintf( stderr, _( "%s version %s usage statistics:\n" ),
> - program_name, flex_version );
> + __progname, flex_version );
>
> fprintf( stderr, _( " scanner options: -" ) );
>
> @@ -616,10 +612,8 @@ char **argv;
> defs1_offset = prolog_offset = action_offset = action_index = 0;
> action_array[0] = '\0';
>
> - program_name = argv[0];
> -
> - if ( program_name[0] != '\0' &&
> - program_name[strlen( program_name ) - 1] == '+' )
> + if (__progname[0] != '\0' &&
> + __progname[strlen(__progname) - 1] == '+')
> C_plus_plus = true;
>
> /* read flags */
> @@ -802,7 +796,7 @@ char **argv;
>
> case 'V':
> printf( _( "%s version %s\n" ),
> - program_name, flex_version );
> + __progname, flex_version );
> exit( 0 );
>
> case 'w':
> @@ -820,8 +814,8 @@ char **argv;
> default:
> fprintf( stderr,
> _( "%s: unknown flag '%c'. For usage, try\n\t%s --help\n" ),
> - program_name, (int) arg[i],
> - program_name );
> + __progname, (int) arg[i],
> + __progname );
> exit( 1 );
> }
>
> @@ -1123,7 +1117,7 @@ void usage()
>
> fprintf( f,
> _( "%s [-bdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput -Pprefix -Sskeleton]\n"
> ),
> - program_name );
> + __progname );
> fprintf( f, _( "\t[--help --version] [file ...]\n" ) );
>
> fprintf( f, _( "\t-b generate backing-up information to %s\n" ),
> @@ -1158,8 +1152,8 @@ _( "%s [-bdfhilnpstvwBFILTV78+? -C[aefFm
> fprintf( f,
> _( "\t-I generate interactive scanner (opposite of -B)\n" ) );
> fprintf( f, _( "\t-L suppress #line directives in scanner\n" ) );
> - fprintf( f, _( "\t-T %s should run in trace mode\n" ), program_name );
> - fprintf( f, _( "\t-V report %s version\n" ), program_name );
> + fprintf( f, _( "\t-T %s should run in trace mode\n" ), __progname );
> + fprintf( f, _( "\t-V report %s version\n" ), __progname );
> fprintf( f, _( "\t-7 generate 7-bit scanner\n" ) );
> fprintf( f, _( "\t-8 generate 8-bit scanner\n" ) );
> fprintf( f, _( "\t-+ generate C++ scanner class\n" ) );
> @@ -1180,5 +1174,5 @@ _( "\t\t-CF do not compress scanner tab
> fprintf( f, _( "\t-P specify scanner prefix other than \"yy\"\n" ) );
> fprintf( f, _( "\t-S specify skeleton file\n" ) );
> fprintf( f, _( "\t--help produce this help message\n" ) );
> - fprintf( f, _( "\t--version report %s version\n" ), program_name );
> + fprintf( f, _( "\t--version report %s version\n" ), __progname );
> }
> Index: usr.bin/lex/misc.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/lex/misc.c,v
> retrieving revision 1.14
> diff -u -p -u -p -r1.14 misc.c
> --- usr.bin/lex/misc.c 15 Oct 2015 05:57:09 -0000 1.14
> +++ usr.bin/lex/misc.c 7 Nov 2015 11:16:30 -0000
> @@ -37,6 +37,7 @@
>
> #include "flexdef.h"
>
> +extern char *__progname;
>
> void action_define( defname, value )
> char *defname;
> @@ -334,7 +335,7 @@ void dataflush()
> void flexerror( msg )
> const char msg[];
> {
> - fprintf( stderr, "%s: %s\n", program_name, msg );
> + fprintf( stderr, "%s: %s\n", __progname, msg );
> flexend( 1 );
> }
>
> @@ -345,7 +346,7 @@ void flexfatal( msg )
> const char msg[];
> {
> fprintf( stderr, _( "%s: fatal internal error, %s\n" ),
> - program_name, msg );
> + __progname, msg );
> exit( 1 );
> }
>
>