[FFmpeg-devel] "OPW Qualification Task: Enable daemon mode for FFserver"

Binathi Bingi binti179 at gmail.com
Fri Oct 31 19:02:37 CET 2014


Hello

I tried to include the changes specified by Nicholas.
We can switch between both Daemon and NoDaemon mode, using the option in
ffserver.conf file.

>From 018f8c1e1acf062a9e6a3ec94f671d574ec4b712 Mon Sep 17 00:00:00 2001
From: Binathi <binti179 at gmail.com>
Date: Fri, 31 Oct 2014 23:27:20 +0530
Subject: [PATCH] Enable Daemon mode for FFServer

Signed-off-by: Binathi <binti179 at gmail.com>
---
 doc/ffserver.conf |  4 ++++
 doc/ffserver.texi |  7 +++++--
 ffserver.c        | 31 +++++++++++++++++++++++++++++--
 ffserver_config.c |  7 +++++--
 ffserver_config.h |  1 +
 5 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/doc/ffserver.conf b/doc/ffserver.conf
index b756961..eac088b 100644
--- a/doc/ffserver.conf
+++ b/doc/ffserver.conf
@@ -25,6 +25,10 @@ MaxBandwidth 1000
 # '-' is the standard output.
 CustomLog -

+# Suppress Daemon if you don't want to launch ffserver in daemon mode.
+#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..15dc4b3 100644
--- a/doc/ffserver.texi
+++ b/doc/ffserver.texi
@@ -406,8 +406,11 @@ ignored, and the log is written to standard output.

 @item NoDaemon
 Set no-daemon mode. This option is currently ignored since now
- at command{ffserver} will always work in no-daemon mode, and is
-deprecated.
+ at command{ffserver} will always work in daemon mode.
+
+@ Daemon
+Set daemon mode.
+ at command{ffserver} will always work in daemon mode. To enable no-daemon
mode, suppress this and enable NoDaemon.
 @end table

 @section Feed section
diff --git a/ffserver.c b/ffserver.c
index ea2a2ae..d6eb0b4 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), "-");
 }

@@ -3736,10 +3737,36 @@ int main(int argc, char **argv)
     build_feed_streams();

     compute_bandwidth();
-
+
+    if (config.ffserver_daemon) {
+    int ffserver_id = 0;
+    pid_t sid = 0;
+
+    ffserver_id = fork();
+
+    if (ffserver_id < 0) {
+        av_log(NULL, AV_LOG_WARNING, "Fork failed!Couldn't launch ffserver
in daemon mode.\n");
+        exit(1);
+    }
+
+    if (ffserver_id > 0) {
+        exit(0);
+    }
+
+    sid = setsid();
+    if (sid < 0) {
+        exit(1);
+    }
+
+    open ("/dev/null", O_RDWR);
+
+    if (strcmp(config.logfilename, "-") != 0) {
+            close(1);
+        }
+    }
     /* signal init */
     signal(SIGPIPE, SIG_IGN);
-
+
     if (http_server() < 0) {
         http_log("Could not start server\n");
         exit(1);
diff --git a/ffserver_config.c b/ffserver_config.c
index e44cdf7..f46d8f4 100644
--- a/ffserver_config.c
+++ b/ffserver_config.c
@@ -358,8 +358,11 @@ 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") || !av_strcasecmp(cmd,
"NoDaemon")) {
+        if (!av_strcasecmp(cmd, "Daemon"))
+            config->ffserver_daemon = 1;
+        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


Binathi.

On Thu, Oct 30, 2014 at 8:41 PM, Reynaldo H. Verdejo Pinochet <
reynaldo at osg.samsung.com> wrote:

> Hello
>
> On 10/30/2014 10:50 AM, Nicolas George wrote:
> > [..] Third, I do not think this exact version is correct. If you
> > make the daemon mode the default, then NoDaemon must not be
> > ignored, it must have its specified effect: turn daemon off; if you
> > do not make the daemon mode the default, then there must be an
> > option to turn it on.
> >
> > IMHO, the best is to have both Daemon and NoDaemon mode. [..]
>
> I would prefer no-deamon mode been the default to not
> break current behavior till deamon-mode has had a good
> deal of production testing. I also think having a single
> Daemonize yes/no toggle should be enough but I'm OK
> either way in the context of this patch.
>
> Binathi: As an added bonus, try adding an -s to your
> commit command line so you get the  Signed-off-by:
> line added, this is customary.
>
> Bests,
>
> --
> Reynaldo H. Verdejo Pinochet
> Open Source Group
> Samsung Research America / Silicon Valley
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list