]> Zhao Yanbai Git Server - minix.git/commitdiff
Importing usr.bin/nohup 40/1040/2
authorThomas Cort <tcort@minix3.org>
Sat, 12 Oct 2013 14:46:34 +0000 (10:46 -0400)
committerThomas Cort <tcort@minix3.org>
Sun, 13 Oct 2013 14:24:23 +0000 (10:24 -0400)
Replaces commands/nohup. No Minix-specific changes needed.

Change-Id: I2fb7c387833a8898cf30fc3ac25ea53ee1031bd1

commands/Makefile
commands/nohup/Makefile [deleted file]
commands/nohup/nohup.c [deleted file]
man/man1/Makefile
man/man1/nohup.1 [deleted file]
releasetools/nbsd_ports
usr.bin/Makefile
usr.bin/nohup/Makefile [new file with mode: 0644]
usr.bin/nohup/nohup.1 [new file with mode: 0644]
usr.bin/nohup/nohup.c [new file with mode: 0644]

index f17c9df330622412f992433ab5de8cabe26e91d6..1fbe640bc6009a13fd9ba5c88c2a9943920410fe 100644 (file)
@@ -16,7 +16,7 @@ SUBDIR=       add_route arp ash at backup btrace \
        less loadkeys loadramdisk logger look lp \
        lpd lspci mail MAKEDEV \
        mesg mined mkfifo \
-       mount mt netconf nohup \
+       mount mt netconf \
        nonamed od paste patch \
        ping postinstall poweroff pr prep printroot \
        profile progressbar pr_routes ps pwdauth \
diff --git a/commands/nohup/Makefile b/commands/nohup/Makefile
deleted file mode 100644 (file)
index 184172b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-PROG=  nohup
-MAN=
-
-.include <bsd.prog.mk>
diff --git a/commands/nohup/nohup.c b/commands/nohup/nohup.c
deleted file mode 100644 (file)
index 94f9584..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2009, Erik van der Kouwe
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, 
- *    this list of conditions and the following disclaimer. 
- * 2. Redistributions in binary form must reproduce the above copyright notice, 
- *    this list of conditions and the following disclaimer in the documentation 
- *    and/or other materials provided with the distribution. 
- * 3. The name of the author may not be used to endorse or promote products 
- *    derived from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * Functionality implemented according to this specification:
- * http://www.opengroup.org/onlinepubs/000095399/utilities/nohup.html
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#define NOHUP_OUT_FILENAME "nohup.out"
-
-static void print_usage(const char *argv0)
-{
-       printf("Usage: %s command [arg...]\n", argv0);
-}
-
-static int redirect_tty(void)
-{
-       int fd;
-       char buffer[PATH_MAX + 1], *home;
-
-       /* redirect stdout to a file if needed */
-       if (isatty(STDOUT_FILENO))
-       {
-               /* first try: current directory */
-               fd = open(NOHUP_OUT_FILENAME, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR);
-               if (fd < 0)
-               {
-                       /* alternative: home directory */
-                       home = getenv("HOME");
-                       if (home)
-                       {
-                               snprintf(buffer, sizeof(buffer), "%s/%s", home, NOHUP_OUT_FILENAME);
-                               buffer[sizeof(buffer) - 1] = 0;
-                               fd = open(buffer, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR);
-                       }
-               }
-                               
-               if (fd < 0)
-               {
-                       perror("cannot create " NOHUP_OUT_FILENAME " and $HOME/" NOHUP_OUT_FILENAME);
-                       return -1;
-               }
-               
-               /* move the fd to stdout */
-               if (dup2(fd, STDOUT_FILENO) < 0 || close(fd) < 0)
-               {
-                       perror("cannot redirect stdout");
-                       return -1;
-               }
-       }
-       
-       /* redirect stderr to stdout if needed */
-       if (isatty(STDERR_FILENO))
-       {
-               if (dup2(STDOUT_FILENO, STDERR_FILENO) < 0)
-               {
-                       perror("cannot redirect stderr");
-                       return -1;
-               }
-       }
-
-       return 0;
-}
-
-int main(int argc, char **argv)
-{
-       struct sigaction sa;
-
-       /* check parameters */
-       if (argc < 2)
-       {
-               print_usage(argv[0]);
-               return 127;
-       }
-
-       /* ignore SIGHUP */
-       sa.sa_handler = SIG_IGN;
-       sigemptyset(&sa.sa_mask);
-       sa.sa_flags = 0;
-       if (sigaction(SIGHUP, &sa, NULL) < 0)
-       {
-               perror("cannot ignore SIGHUP");
-               return 127;
-       }
-
-       /* redirect TTY input and output */
-       if (redirect_tty() < 0)
-               return 127;
-
-       /* run the command */
-       execvp(argv[1], argv + 1);
-       perror("cannot execute");
-
-       /* exit code depends on whether the utility was found */
-       switch (errno)
-       {
-               case ELOOP:
-               case ENAMETOOLONG:
-               case ENOENT:
-               case ENOTDIR:
-                       /* utility not found */
-                       return 127;
-
-               default:
-                       /* exec failed for other reason */
-                       return 126;
-       }
-}
index 9692df0daddf2ffbc597b1ceec3ee68125c4a23b..6e2f2deb6771ea180f0ed67e3fb79c23cbfab48e 100644 (file)
@@ -11,7 +11,7 @@ MAN=  ash.1 at.1 \
        last.1 loadfont.1 loadkeys.1 logger.1 \
        look.1 lp.1 lspci.1 mail.1  \
        mesg.1 mixer.1 \
-       mkproto.1 mount.1 mt.1 nohup.1 od.1 \
+       mkproto.1 mount.1 mt.1 od.1 \
        paste.1 ping.1 playwave.1 pr.1 prep.1 \
        profile.1 ps.1 rcp.1 recwave.1 \
        remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
diff --git a/man/man1/nohup.1 b/man/man1/nohup.1
deleted file mode 100644 (file)
index daa848e..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-.TH NOHUP 1
-.SH NAME
-nohup \- ignore hangup signal
-.SH SYNOPSIS
-\fBnohup\fP \fIutility\fP [\fIargument\fP...]
-.SH DESCRIPTION
-The
-.B nohup
-utility runs \fIutility\fP while ignoring the SIGHUP signal. This 
-allows the process to continue running after the current terminal
-exits, for example when logging off a telnet session. 
-
-Unless output is explicitly redirected when invoking nohup, output is 
-appended to a file named nohup.out. This file is created in the current
-directory or, if this is not possible, in $HOME. If the standard error 
-stream is not explicitly redirected, it is sent to the standard output.
-.SH AUTHOR
-This manual page and the utility were written by Erik van der Kouwe 
-<vdkouwe@cs.vu.nl>.
index e51468bba03644017a50c7e9df58a6cece150a84..849d5556b5b8bb703e451791bb00d840a4e97c89 100644 (file)
 2009/08/15 20:44:56,usr.bin/mktemp
 2012/10/17 12:00:00,usr.bin/nbperf
 2013/10/10 12:00:00,usr.bin/nice
+2013/10/12 12:00:00,usr.bin/nohup
 2012/10/17 12:00:00,usr.bin/nvi
 2010/05/14 17:28:23,usr.bin/newgrp
 2012/10/17 12:00:00,usr.bin/passwd
index 69d89761ae22efd0c01740f03b8d3324560bd52f..ff1d9df621de46e29f3e9f58e4ac414e94b9e0f2 100644 (file)
@@ -18,7 +18,7 @@ SUBDIR= \
        machine make man \
        mkdep mktemp \
        \
-       nbperf newgrp nice nvi \
+       nbperf newgrp nice nohup nvi \
        passwd \
        printf \
        rev \
diff --git a/usr.bin/nohup/Makefile b/usr.bin/nohup/Makefile
new file mode 100644 (file)
index 0000000..bc1a940
--- /dev/null
@@ -0,0 +1,6 @@
+#      @(#)Makefile    8.1 (Berkeley) 6/6/93
+#      $NetBSD: Makefile,v 1.3 1995/08/31 23:35:23 jtc Exp $
+
+PROG=  nohup
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/nohup/nohup.1 b/usr.bin/nohup/nohup.1
new file mode 100644 (file)
index 0000000..71a76f1
--- /dev/null
@@ -0,0 +1,115 @@
+.\"    $NetBSD: nohup.1,v 1.15 2012/03/29 18:33:19 wiz Exp $
+.\"
+.\" Copyright (c) 1989, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)nohup.1     8.1 (Berkeley) 6/6/93
+.\"
+.Dd July 15, 2005
+.Dt NOHUP 1
+.Os
+.Sh NAME
+.Nm nohup
+.Nd invoke a command immune to hangups
+.Sh SYNOPSIS
+.Nm
+.Ar utility
+.Op Ar arg ...
+.Sh DESCRIPTION
+The
+.Nm
+command allows the specified utility to be protected from termination
+if the user should become logged out
+(for example, due to a modem line or TCP/IP connection being dropped).
+To do this,
+.Nm
+sets the
+.Dv SIGHUP
+.Xr signal 3
+.Pq Dq terminal line hangup
+to be ignored,
+then executes
+.Ar utility
+along with any arguments.
+.Pp
+If the standard output is a terminal, the standard output is
+appended to the file
+.Pa nohup.out
+in the current directory.
+If standard error is a terminal, it is directed to the same place
+as the standard output.
+If the output file
+.Pa nohup.out
+cannot be created in the current directory,
+.Nm
+attempts to create the file in the user's home directory.
+If the file
+.Pa nohup.out
+cannot be created,
+either in the current directory or the user's home directory,
+.Nm
+will exit without invoking
+.Ar utility ,
+with an exit value as described below.
+.Sh ENVIRONMENT
+The following variable is used by
+.Nm :
+.Bl -tag -width flag
+.It Ev HOME
+User's home directory.
+.El
+.Sh EXIT STATUS
+The
+.Nm
+utility exits with one of the following values:
+.Bl -tag -width Ds
+.It 126
+The
+.Ar utility
+was found but could not be invoked.
+.It 127
+The
+.Ar utility
+could not be found or an error occurred in
+.Nm .
+.El
+.Pp
+Otherwise, the exit status of
+.Nm
+will be that of
+.Ar utility .
+.Sh SEE ALSO
+.Xr signal 3
+.Sh STANDARDS
+The
+.Nm
+command is expected to be
+.St -p1003.2
+compatible.
diff --git a/usr.bin/nohup/nohup.c b/usr.bin/nohup/nohup.c
new file mode 100644 (file)
index 0000000..d177c51
--- /dev/null
@@ -0,0 +1,142 @@
+/*     $NetBSD: nohup.c,v 1.15 2011/09/06 18:24:15 joerg Exp $ */
+
+/*
+ * Copyright (c) 1989 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1989\
+ The Regents of the University of California.  All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)nohup.c    5.4 (Berkeley) 6/1/90";
+#endif
+__RCSID("$NetBSD: nohup.c,v 1.15 2011/09/06 18:24:15 joerg Exp $");
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+static void dofile(void);
+__dead static void usage(void);
+
+/* nohup shall exit with one of the following values:
+   126 - The utility was found but could not be invoked.
+   127 - An error occurred in the nohup utility, or the utility could
+         not be found. */
+#define EXIT_NOEXEC    126
+#define EXIT_NOTFOUND  127
+#define EXIT_MISC      127
+
+int
+main(int argc, char **argv)
+{
+       int exit_status;
+
+       while (getopt(argc, argv, "") != -1) {
+               usage();
+       }
+       argc -= optind;
+       argv += optind;
+
+       if (argc < 1)
+               usage();
+
+       if (isatty(STDOUT_FILENO))
+               dofile();
+       if (isatty(STDERR_FILENO) && dup2(STDOUT_FILENO, STDERR_FILENO) == -1) {
+               /* may have just closed stderr */
+               (void)fprintf(stdin, "nohup: %s\n", strerror(errno));
+               exit(EXIT_MISC);
+       }
+
+       /* The nohup utility shall take the standard action for all signals
+          except that SIGHUP shall be ignored. */
+       (void)signal(SIGHUP, SIG_IGN);
+
+       execvp(argv[0], &argv[0]);
+       exit_status = (errno == ENOENT) ? EXIT_NOTFOUND : EXIT_NOEXEC;
+       (void)fprintf(stderr, "nohup: %s: %s\n", argv[0], strerror(errno));
+       exit(exit_status);
+}
+
+static void
+dofile(void)
+{
+       int fd;
+       char path[MAXPATHLEN];
+       const char *p;
+
+       /* If the standard output is a terminal, all output written to 
+          its standard output shall be appended to the end of the file
+          nohup.out in the current directory.  If nohup.out cannot be
+          created or opened for appending, the output shall be appended
+          to the end of the file nohup.out in the directory specified 
+          by the HOME environment variable.
+
+          If a file is created, the file's permission bits shall be
+          set to S_IRUSR | S_IWUSR. */
+#define        FILENAME        "nohup.out"
+       p = FILENAME;
+       if ((fd = open(p, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR)) >= 0)
+               goto dupit;
+       if ((p = getenv("HOME")) != NULL) {
+               (void)strlcpy(path, p, sizeof(path));
+               (void)strlcat(path, "/", sizeof(path));
+               (void)strlcat(path, FILENAME, sizeof(path));
+               if ((fd = open(p = path, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR)) >= 0)
+                       goto dupit;
+       }
+       (void)fprintf(stderr, "nohup: can't open a nohup.out file.\n");
+       exit(EXIT_MISC);
+
+dupit: (void)lseek(fd, 0L, SEEK_END);
+       if (dup2(fd, STDOUT_FILENO) == -1) {
+               (void)fprintf(stderr, "nohup: %s\n", strerror(errno));
+               exit(EXIT_MISC);
+       }
+       (void)fprintf(stderr, "sending output to %s\n", p);
+}
+
+static void
+usage(void)
+{
+       (void)fprintf(stderr, "usage: nohup utility [argument ...]\n");
+       exit(EXIT_MISC);
+}