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 9001d81d1e9f768e91346f3aff3d940913c67ac9 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        | 31 ++++++++++++++++++++++++++++++-
 ffserver_config.c |  6 ++++--
 ffserver_config.h |  1 +
 5 files changed, 44 insertions(+), 6 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..e85de1b 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,35 @@ 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);
+
+        if (!strcmp(config.logfilename, "-"))
+            close(1);
+
+		 fd = open("/dev/null", O_RDWR);
+	     if (fd == -1) {
+	    	 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

Reply via email to