int main(int argc, char **argv) {
- int enable_x11;
+ int option, enable_x11;
int ptm, pts;
char *name;
- const char *argv0;
- argv0 = argv[0];
- /* Don't pass our argv[0] to the notification program. */
- argv++;
+ /* Don't display error messages for unknown options. */
+ opterr = 0;
enable_x11 = 0;
- if (argc > 1 && argv[0][0] == '-') {
- if (!strcmp("-X", argv[0])) {
- enable_x11 = 1;
- } else {
- if (strcmp("-h", argv[0])) {
- fprintf(stderr, "%s: unknown option '%s'!\n\n", argv0, argv[0]);
- }
- usage(argv0);
+
+ /*
+ * Glibc violates POSIX by default and skips over non-option arguments and
+ * parses later arguments which look like options as well. But we want to
+ * pass everything except the options unmodified to execvp(). Prefixing
+ * the optstring with "+" fixes this behaver. This is not POSIX
+ * compatible, but the option should be ignored on other systems.
+ */
+ while ((option = getopt(argc, argv, "+Xh")) != -1) {
+ switch (option) {
+ case 'X':
+ enable_x11 = 1;
+ break;
+ case 'h':
+ usage(argv[0]);
+ break;
+ default:
+ fprintf(stderr, "%s: unknown option '%s'!\n\n",
+ argv[0], argv[optind - 1]);
+ usage(argv[0]);
+ break;
}
- argc--; /* for usage */
- argv++;
}
- if (argc < 2) {
- usage(argv0);
+ /* No arguments remaining, abort. */
+ if (!argv[optind]) {
+ usage(argv[0]);
}
+ /* Arguments for notification program. */
+ argv += optind;
ptm = open_tty();
if (ptm < 0) {