Add error checks and fork() call after setsid()
In order to start a daemon, a second call for fork() after changing session ID is usually required, in order to prevent acquiring a controlling tty when it eventually writes to one.
This commit is contained in:
		
							parent
							
								
									e4c67052ef
								
							
						
					
					
						commit
						06c238d486
					
				
					 1 changed files with 27 additions and 3 deletions
				
			
		
							
								
								
									
										30
									
								
								timeoutd.c
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								timeoutd.c
									
										
									
									
									
								
							|  | @ -340,13 +340,37 @@ char *argv[]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* If running in daemon mode (no parameters) */ |     /* If running in daemon mode (no parameters) */ | ||||||
|     if (fork())                 /* the parent process */ |     pid_t pid; | ||||||
|         exit(0);                /* exits */ | 
 | ||||||
|  |     if ((pid = fork()) < 0) { | ||||||
|  |         openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); | ||||||
|  |         syslog(LOG_ERR, "Failed to execute fork number 1"); | ||||||
|  |         closelog(); | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |     if (pid > 0) | ||||||
|  |         exit(0); | ||||||
| 
 | 
 | ||||||
|     close(0); |     close(0); | ||||||
|     close(1); |     close(1); | ||||||
|     close(2); |     close(2); | ||||||
|     setsid(); |     if (setsid() < 0) { | ||||||
|  |         openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); | ||||||
|  |         syslog(LOG_ERR, "Failed to set new session ID at startup."); | ||||||
|  |         closelog(); | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if ((pid = fork()) < 0) { | ||||||
|  |         openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); | ||||||
|  |         syslog(LOG_ERR, "Failed to execute fork number 2"); | ||||||
|  |         closelog(); | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |     if (pid > 0) | ||||||
|  |         exit(0); | ||||||
|  | 
 | ||||||
|  |     umask(0); | ||||||
| 
 | 
 | ||||||
|     openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); |     openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); | ||||||
|     syslog(LOG_NOTICE, "Daemon started."); |     syslog(LOG_NOTICE, "Daemon started."); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Petar Kapris
						Petar Kapris