View | Details | Raw Unified | Return to bug 2641 | Differences between
and this patch

Collapse All | Expand All

(-)a/misc.c (+18 lines)
Lines 1251-1253 bind_permitted(int port, uid_t uid) Link Here
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
}
(-)a/misc.h (+1 lines)
Lines 31-36 struct Forward { Link Here
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 {
(-)a/sshd.c (-6 / +7 lines)
Lines 1343-1349 main(int ac, char **av) Link Here
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;
Lines 1802-1812 main(int ac, char **av) Link Here
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
#ifdef TIOCNOTTY
1811
#ifdef TIOCNOTTY
1811
		int fd;
1812
		int fd;
1812
#endif /* TIOCNOTTY */
1813
#endif /* TIOCNOTTY */
Lines 1849-1855 main(int ac, char **av) Link Here
1849
		 * Write out the pid file after the sigterm handler
1850
		 * Write out the pid file after the sigterm handler
1850
		 * is setup and the listen sockets are bound
1851
		 * is setup and the listen sockets are bound
1851
		 */
1852
		 */
1852
		if (options.pid_file != NULL && !debug_flag) {
1853
		if (options.pid_file != NULL && !debug_flag && !already_daemon) {
1853
			FILE *f = fopen(options.pid_file, "w");
1854
			FILE *f = fopen(options.pid_file, "w");
1854
1855
1855
			if (f == NULL) {
1856
			if (f == NULL) {

Return to bug 2641