*
*/
+#include <getopt.h>
#include <stdio.h>
-#include <unistd.h>
#include <stdlib.h>
+#include <unistd.h>
+
+#include "c.h"
#include "nls.h"
-int
-main(int argc, char *argv[]) {
+static void __attribute__ ((__noreturn__)) usage(FILE * out)
+{
+ fprintf(out, USAGE_HEADER);
+ fprintf(out, _(" %s [options] <program> [arguments ...]\n"),
+ program_invocation_short_name);
+ fprintf(out, USAGE_OPTIONS);
+ fprintf(out, USAGE_HELP);
+ fprintf(out, USAGE_VERSION);
+ fprintf(out, USAGE_MAN_TAIL("setsid(1)"));
+ exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+
+int main(int argc, char **argv)
+{
+ int ch;
+ static const struct option longopts[] = {
+ {"version", no_argument, NULL, 'V'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+ };
+
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
-
- if (argc < 2) {
- fprintf(stderr, _("usage: %s program [arg ...]\n"),
- argv[0]);
- exit(1);
- }
+
+ while ((ch = getopt_long(argc, argv, "Vh", longopts, NULL)) != -1)
+ switch (ch) {
+ case 'V':
+ printf(UTIL_LINUX_VERSION);
+ return EXIT_SUCCESS;
+ case 'h':
+ usage(stdout);
+ default:
+ usage(stderr);
+ }
+
+ if (argc < 2)
+ usage(stderr);
+
if (getpgrp() == getpid()) {
- switch(fork()){
+ switch (fork()) {
case -1:
- perror("fork");
- exit(1);
- case 0: /* child */
+ err(EXIT_FAILURE, _("fork"));
+ case 0:
+ /* child */
break;
- default: /* parent */
- exit(0);
+ default:
+ /* parent */
+ return 0;
}
}
- if (setsid() < 0) {
- perror("setsid"); /* cannot happen */
- exit(1);
- }
+ if (setsid() < 0)
+ /* cannot happen */
+ err(EXIT_FAILURE, _("setsid failed"));
+
execvp(argv[1], argv + 1);
- perror("execvp");
- exit(1);
+ err(EXIT_FAILURE, _("execvp failed"));
}