Hi there, I see, we need dup2() to redirect the output to logfile. Therefore, I put it back in the patch.
But, I am not sure if we should definitely use it, because I can't see any messages on the console as all are being redirected to log file For instance, when I run ffserver, I can't see the output like"FFserver started" or when I try to re-run while it is already running as daemon, I can't see the messages like "bind(port 8090): Address already in use" So, I did ps -ux to see if ffserver was running as daemon, and it was. I am not sure if we should use dup2(), as it is redirecting messages from console. Regards, Binathi On Wed, Nov 5, 2014 at 12:04 AM, Binathi Bingi <binti...@gmail.com> wrote: > Hi there, > > I am sorry for the indentation errors in the above mail, it was because of > bad email agent. > > In the attached patch, if the config.logfilename is not "-", then stdout > is closed and then I reopened. > > Reynaldo, is right. I don't think it is good idea to use dup2(). > There were problems in running ffserver it couldn't start when I > redirected the file descriptor to stdin, stdout, stderr using dup2(). > I removed dup2() and just opened something neutral in "/dev/null" > In this patch, I included error check for return value of open(). > > Cheers, > Binathi > > On Tue, Nov 4, 2014 at 7:23 AM, Reynaldo H. Verdejo Pinochet < > reyna...@osg.samsung.com> wrote: > >> Hi >> >> On 11/03/2014 04:09 PM, Binathi Bingi wrote: >> > Hello, >> > >> > Inside the child process, I closed the file descriptor and then reopened >> > and redirected them using dup2() and later closed the opened file. I am >> not >> > sure if I understood and used the functionality of dup2() in the right >> > sense. >> > >> >> Looks about right but see bellow. >> >> > [..] >> >> @@ -3736,10 +3737,42 @@ int main(int argc, char **argv) >> >> build_feed_streams(); >> >> >> >> compute_bandwidth(); >> >> - >> >> + >> >> Remove trailing withe space >> >> >> + if (config.ffserver_daemon) { >> >> What follows needs to be indented >> >> >> + pid_t ffserver_id = 0; >> >> + pid_t sid = 0; >> >> + >> >> + ffserver_id = fork(); >> >> + >> >> + if (ffserver_id < 0) { >> >> + ret = AVERROR(errno); >> >> + av_log(NULL, AV_LOG_ERROR, "Impossible to start in daemon >> mode: %s\n", av_err2str(ret)); >> >> + exit(1); >> >> Fix wrong indentation >> >> >> + } >> >> + >> >> + if (ffserver_id > 0) { >> >> + exit(0); >> >> + } >> >> Drop the braces from single statement ifs blocks like this one. >> >> >> + >> >> + sid = setsid(); >> >> + if (sid < 0) { >> >> + exit(1); >> >> + } >> >> Same as above >> >> >> + >> >> + if (strcmp(config.logfilename, "-") != 0) { >> >> + close(0); >> >> Drop the != 0. Anything but 0 will evaluate to true anyway. You do this >> elsewhere on your own code. Be consistent. >> >> >> + >> >> + fd = open("/dev/null", O_RDWR); >> >> + dup2(fd,0); >> >> + dup2(fd,1); >> >> + dup2(fd,2); >> >> You sure you wana dup2() stdin, stdout and stderr on the above >> condition? Please double check. >> >> >> + close(fd); >> >> Above block needs to be re-indented. Also, check for failures in >> open and dup2() and react accordingly. I think Nicolas mentioned >> this already. >> >> >> + >> >> + } >> >> + } >> >> /* signal init */ >> >> signal(SIGPIPE, SIG_IGN); >> >> - >> >> + >> >> Again, drop the trailing white space you introduced here and on >> multiple lines in this same patch. >> >> It's getting there. Congrats ;) >> >> Bests, >> >> -- >> Reynaldo H. Verdejo Pinochet >> Open Source Group >> Samsung Research America / Silicon Valley >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > >
From 091aa564dc43bf18abd5dc596bf5350e92cad5dd Mon Sep 17 00:00:00 2001 From: Binathi <binti...@gmail.com> Date: Tue, 4 Nov 2014 21:42:07 +0530 Subject: [PATCH] Restore Daemon mode in FFserver Signed-off-by: Binathi Bingi <binti...@gmail.com> --- doc/ffserver.conf | 5 +++++ doc/ffserver.texi | 7 ++++--- ffserver.c | 38 ++++++++++++++++++++++++++++++++++++-- ffserver_config.c | 6 ++++-- ffserver_config.h | 1 + 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/doc/ffserver.conf b/doc/ffserver.conf index b756961..8101f15 100644 --- a/doc/ffserver.conf +++ b/doc/ffserver.conf @@ -25,6 +25,11 @@ MaxBandwidth 1000 # '-' is the standard output. CustomLog - +# Suppress NoDaemon and enable Daemon, if you want to launch ffserver in daemon mode. +# If no option is specified, default option is NoDaemon. +#NoDaemon +Daemon + ################################################################## # Definition of the live feeds. Each live feed contains one video # and/or audio sequence coming from an ffmpeg encoder or another diff --git a/doc/ffserver.texi b/doc/ffserver.texi index 77273d2..5d5fc0f 100644 --- a/doc/ffserver.texi +++ b/doc/ffserver.texi @@ -405,9 +405,10 @@ In case the commandline option @option{-d} is specified this option is ignored, and the log is written to standard output. @item NoDaemon -Set no-daemon mode. This option is currently ignored since now -@command{ffserver} will always work in no-daemon mode, and is -deprecated. +Set no-daemon mode. This is the default. + +@item Daemon +Set daemon mode. The default is NoDaemon @end table @section Feed section diff --git a/ffserver.c b/ffserver.c index ea2a2ae..eda3496 100644 --- a/ffserver.c +++ b/ffserver.c @@ -3671,6 +3671,7 @@ static void handle_child_exit(int sig) static void opt_debug(void) { config.debug = 1; + config.ffserver_daemon = 0; snprintf(config.logfilename, sizeof(config.logfilename), "-"); } @@ -3694,7 +3695,7 @@ int main(int argc, char **argv) { struct sigaction sigact = { { 0 } }; int ret = 0; - + int fd; config.filename = av_strdup("/etc/ffserver.conf"); parse_loglevel(argc, argv, options); @@ -3736,7 +3737,40 @@ int main(int argc, char **argv) build_feed_streams(); compute_bandwidth(); - + if (config.ffserver_daemon) { + pid_t ffserver_id = 0; + pid_t sid = 0; + + ffserver_id = fork(); + + if (ffserver_id < 0) { + ret = AVERROR(errno); + av_log(NULL, AV_LOG_ERROR, "Impossible to start in daemon mode: %s\n", av_err2str(ret)); + exit(1); + } + + if (ffserver_id > 0) + exit(0); + + sid = setsid(); + if (sid < 0) + exit(1); + + fd = open("/dev/null", O_RDWR); + + if (fd != -1){ + dup2 (fd, 0); + dup2 (fd, 2); + while(!strcmp(config.logfilename,"-")) + dup2 (fd, 1); + } else { + ret = AVERROR(errno); + av_log(NULL, AV_LOG_ERROR, "Unable to repoen file descriptors: %s\n", av_err2str(ret)); + exit(1); + } + + } + /* signal init */ signal(SIGPIPE, SIG_IGN); diff --git a/ffserver_config.c b/ffserver_config.c index e44cdf7..63cfd43 100644 --- a/ffserver_config.c +++ b/ffserver_config.c @@ -358,8 +358,10 @@ static int ffserver_parse_config_global(FFServerConfig *config, const char *cmd, ffserver_get_arg(arg, sizeof(arg), p); if (resolve_host(&config->http_addr.sin_addr, arg) != 0) ERROR("%s:%d: Invalid host/IP address: %s\n", arg); - } else if (!av_strcasecmp(cmd, "NoDaemon")) { - WARNING("NoDaemon option has no effect, you should remove it\n"); + } else if (!av_strcasecmp(cmd, "Daemon")){ + config->ffserver_daemon = 1; + } else if (!av_strcasecmp(cmd, "NoDaemon")){ + config->ffserver_daemon = 0; } else if (!av_strcasecmp(cmd, "RTSPPort")) { ffserver_get_arg(arg, sizeof(arg), p); val = atoi(arg); diff --git a/ffserver_config.h b/ffserver_config.h index 36d61d0..e3957b1 100644 --- a/ffserver_config.h +++ b/ffserver_config.h @@ -100,6 +100,7 @@ typedef struct FFServerConfig { unsigned int nb_max_http_connections; unsigned int nb_max_connections; uint64_t max_bandwidth; + int ffserver_daemon; int debug; char logfilename[1024]; struct sockaddr_in http_addr; -- 1.9.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel