diff options
-rw-r--r-- | misc.c | 20 | ||||
-rw-r--r-- | misc.h | 3 | ||||
-rw-r--r-- | sshd.c | 15 |
3 files changed, 29 insertions, 9 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: misc.c,v 1.106 2016/10/23 22:04:05 dtucker Exp $ */ | 1 | /* $OpenBSD: misc.c,v 1.107 2016/11/30 00:28:31 dtucker Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2000 Markus Friedl. All rights reserved. | 3 | * Copyright (c) 2000 Markus Friedl. All rights reserved. |
4 | * Copyright (c) 2005,2006 Damien Miller. All rights reserved. | 4 | * Copyright (c) 2005,2006 Damien Miller. All rights reserved. |
@@ -1251,3 +1251,21 @@ bind_permitted(int port, uid_t uid) | |||
1251 | return 0; | 1251 | return 0; |
1252 | return 1; | 1252 | return 1; |
1253 | } | 1253 | } |
1254 | |||
1255 | /* returns 1 if process is already daemonized, 0 otherwise */ | ||
1256 | int | ||
1257 | daemonized(void) | ||
1258 | { | ||
1259 | int fd; | ||
1260 | |||
1261 | if ((fd = open(_PATH_TTY, O_RDONLY | O_NOCTTY)) >= 0) { | ||
1262 | close(fd); | ||
1263 | return 0; /* have controlling terminal */ | ||
1264 | } | ||
1265 | if (getppid() != 1) | ||
1266 | return 0; /* parent is not init */ | ||
1267 | if (getsid(0) != getpid()) | ||
1268 | return 0; /* not session leader */ | ||
1269 | debug3("already daemonized"); | ||
1270 | return 1; | ||
1271 | } | ||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: misc.h,v 1.60 2016/10/23 22:04:05 dtucker Exp $ */ | 1 | /* $OpenBSD: misc.h,v 1.61 2016/11/30 00:28:31 dtucker Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 4 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
@@ -31,6 +31,7 @@ struct Forward { | |||
31 | 31 | ||
32 | int forward_equals(const struct Forward *, const struct Forward *); | 32 | int forward_equals(const struct Forward *, const struct Forward *); |
33 | int bind_permitted(int, uid_t); | 33 | int bind_permitted(int, uid_t); |
34 | int daemonized(void); | ||
34 | 35 | ||
35 | /* Common server and client forwarding options. */ | 36 | /* Common server and client forwarding options. */ |
36 | struct ForwardOptions { | 37 | struct ForwardOptions { |
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sshd.c,v 1.477 2016/11/29 03:54:50 dtucker Exp $ */ | 1 | /* $OpenBSD: sshd.c,v 1.478 2016/11/30 00:28:31 dtucker Exp $ */ |
2 | /* | 2 | /* |
3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | 4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
@@ -1343,7 +1343,7 @@ main(int ac, char **av) | |||
1343 | struct ssh *ssh = NULL; | 1343 | struct ssh *ssh = NULL; |
1344 | extern char *optarg; | 1344 | extern char *optarg; |
1345 | extern int optind; | 1345 | extern int optind; |
1346 | int r, opt, i, j, on = 1; | 1346 | int r, opt, i, j, on = 1, already_daemon; |
1347 | int sock_in = -1, sock_out = -1, newsock = -1; | 1347 | int sock_in = -1, sock_out = -1, newsock = -1; |
1348 | const char *remote_ip; | 1348 | const char *remote_ip; |
1349 | int remote_port; | 1349 | int remote_port; |
@@ -1802,11 +1802,12 @@ main(int ac, char **av) | |||
1802 | log_init(__progname, options.log_level, options.log_facility, log_stderr); | 1802 | log_init(__progname, options.log_level, options.log_facility, log_stderr); |
1803 | 1803 | ||
1804 | /* | 1804 | /* |
1805 | * If not in debugging mode, and not started from inetd, disconnect | 1805 | * If not in debugging mode, not started from inetd and not already |
1806 | * from the controlling terminal, and fork. The original process | 1806 | * daemonized (eg re-exec via SIGHUP), disconnect from the controlling |
1807 | * exits. | 1807 | * terminal, and fork. The original process exits. |
1808 | */ | 1808 | */ |
1809 | if (!(debug_flag || inetd_flag || no_daemon_flag)) { | 1809 | already_daemon = daemonized(); |
1810 | if (!(debug_flag || inetd_flag || no_daemon_flag || already_daemon)) { | ||
1810 | 1811 | ||
1811 | if (daemon(0, 0) < 0) | 1812 | if (daemon(0, 0) < 0) |
1812 | fatal("daemon() failed: %.200s", strerror(errno)); | 1813 | fatal("daemon() failed: %.200s", strerror(errno)); |
@@ -1840,7 +1841,7 @@ main(int ac, char **av) | |||
1840 | * Write out the pid file after the sigterm handler | 1841 | * Write out the pid file after the sigterm handler |
1841 | * is setup and the listen sockets are bound | 1842 | * is setup and the listen sockets are bound |
1842 | */ | 1843 | */ |
1843 | if (options.pid_file != NULL && !debug_flag) { | 1844 | if (options.pid_file != NULL && !debug_flag && !already_daemon) { |
1844 | FILE *f = fopen(options.pid_file, "w"); | 1845 | FILE *f = fopen(options.pid_file, "w"); |
1845 | 1846 | ||
1846 | if (f == NULL) { | 1847 | if (f == NULL) { |