@ -232,6 +232,19 @@ int main(int argc, char *argv[])
chdir ( path ) ;
/* user checks */
if ( strlen ( settings . user ) = = 0 )
settings . user = " nobody " ;
verbose ( 2 , " getting uid and gid of user `%s'... " , settings . user ) ;
struct passwd * user ;
if ( ( user = getpwnam ( settings . user ) ) = = NULL )
die ( 1 , " User `%s' doesn't exist \n " , settings . user ) ;
int uid = user - > pw_uid ;
int gid = user - > pw_gid ;
/* server socket creation (before dropping root permissions) */
verbose ( 1 , " initializing server socket... " ) ;
@ -239,20 +252,16 @@ int main(int argc, char *argv[])
if ( ( server = initialize_server ( ) ) = = - 1 )
die ( errno , " Failed to initialize server socket: %s \n " , strerror ( errno ) ) ;
/* chroot and drop root permissions */
if ( getuid ( ) = = 0 ) {
if ( strlen ( settings . user ) = = 0 )
settings . user = " nobody " ;
verbose ( 2 , " getting uid and gid of user `%s'... " , settings . user ) ;
struct passwd * user ;
if ( ( user = getpwnam ( settings . user ) ) = = NULL )
die ( 1 , " User `%s' doesn't exist \n " , settings . user ) ;
/* make feuille run in the background */
if ( ! settings . foreground ) {
verbose ( 1 , " making feuille run in the background... " ) ;
verbose ( 2 , " closing input / output file descriptors... " ) ;
int uid = user - > pw_uid ;
int gid = user - > pw_gid ;
daemon ( 1 , 0 ) ;
}
/* chroot and drop root permissions */
if ( getuid ( ) = = 0 ) {
verbose ( 2 , " setting owner of `%s' to `%s'... " , path , settings . user ) ;
chown ( path , uid , gid ) ;
@ -272,26 +281,6 @@ int main(int argc, char *argv[])
puts ( " " ) ;
}
/* run feuille in the background */
if ( ! settings . foreground ) {
verbose ( 1 , " making feuille run in the background... " ) ;
verbose ( 2 , " closing input / output file descriptors... " ) ;
int pid ;
if ( ( pid = fork ( ) ) < 0 )
exit ( 1 ) ;
else if ( pid > 0 )
exit ( 0 ) ;
if ( setsid ( ) < 0 )
exit ( 1 ) ;
freopen ( " /dev/null " , " r " , stdin ) ;
freopen ( " /dev/null " , " w " , stdout ) ;
freopen ( " /dev/null " , " w " , stderr ) ;
}
/* OpenBSD-only security measures */
# ifdef __OpenBSD__
pledge ( " proc stdio rpath wpath cpath inet " , " stdio rpath wpath cpath inet " ) ;