diff --git a/commands/Makefile b/commands/Makefile index f17c9df33..1fbe640bc 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -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 index 184172b0f..000000000 --- a/commands/nohup/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -PROG= nohup -MAN= - -.include diff --git a/commands/nohup/nohup.c b/commands/nohup/nohup.c deleted file mode 100644 index 94f95842f..000000000 --- a/commands/nohup/nohup.c +++ /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 -#include -#include -#include -#include -#include -#include -#include - -#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; - } -} diff --git a/man/man1/Makefile b/man/man1/Makefile index 9692df0da..6e2f2deb6 100644 --- a/man/man1/Makefile +++ b/man/man1/Makefile @@ -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 index daa848e4c..000000000 --- a/man/man1/nohup.1 +++ /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 -. diff --git a/releasetools/nbsd_ports b/releasetools/nbsd_ports index e51468bba..849d5556b 100644 --- a/releasetools/nbsd_ports +++ b/releasetools/nbsd_ports @@ -179,6 +179,7 @@ 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 diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 69d89761a..ff1d9df62 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -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 index 000000000..bc1a940e6 --- /dev/null +++ b/usr.bin/nohup/Makefile @@ -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 diff --git a/usr.bin/nohup/nohup.1 b/usr.bin/nohup/nohup.1 new file mode 100644 index 000000000..71a76f157 --- /dev/null +++ b/usr.bin/nohup/nohup.1 @@ -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 index 000000000..d177c516d --- /dev/null +++ b/usr.bin/nohup/nohup.c @@ -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 +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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); +}