summaryrefslogtreecommitdiff
path: root/ffserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffserver.c')
-rw-r--r--ffserver.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/ffserver.c b/ffserver.c
index 129f9fd462..8799076ddc 100644
--- a/ffserver.c
+++ b/ffserver.c
@@ -3622,7 +3622,7 @@ static void build_file_streams(void)
}
/* compute the needed AVStream for each feed */
-static void build_feed_streams(void)
+static int build_feed_streams(void)
{
FFServerStream *stream, *feed;
int i;
@@ -3658,7 +3658,7 @@ static void build_feed_streams(void)
int ret = ffio_set_buf_size(s->pb, FFM_PACKET_SIZE);
if (ret < 0) {
http_log("Failed to set buffer size\n");
- exit(1);
+ goto bail;
}
/* Now see if it matches */
@@ -3723,7 +3723,7 @@ static void build_feed_streams(void)
if (feed->readonly) {
http_log("Unable to delete feed file '%s' as it is marked readonly\n",
feed->feed_filename);
- exit(1);
+ goto bail;
}
unlink(feed->feed_filename);
}
@@ -3733,27 +3733,27 @@ static void build_feed_streams(void)
if (!s) {
http_log("Failed to allocate context\n");
- exit(1);
+ goto bail;
}
if (feed->readonly) {
http_log("Unable to create feed file '%s' as it is marked readonly\n",
feed->feed_filename);
- exit(1);
+ goto bail;
}
/* only write the header of the ffm file */
if (avio_open(&s->pb, feed->feed_filename, AVIO_FLAG_WRITE) < 0) {
http_log("Could not open output feed file '%s'\n",
feed->feed_filename);
- exit(1);
+ goto bail;
}
s->oformat = feed->fmt;
s->nb_streams = feed->nb_streams;
s->streams = feed->streams;
if (avformat_write_header(s, NULL) < 0) {
http_log("Container doesn't support the required parameters\n");
- exit(1);
+ goto bail;
}
/* XXX: need better API */
av_freep(&s->priv_data);
@@ -3767,7 +3767,7 @@ static void build_feed_streams(void)
if (fd < 0) {
http_log("Could not open output feed file '%s'\n",
feed->feed_filename);
- exit(1);
+ goto bail;
}
feed->feed_write_index = FFMAX(ffm_read_write_index(fd), FFM_PACKET_SIZE);
@@ -3778,6 +3778,10 @@ static void build_feed_streams(void)
close(fd);
}
+ return 0;
+
+bail:
+ return -1;
}
/* compute the bandwidth used by each stream */
@@ -3858,7 +3862,9 @@ static const OptionDef options[] = {
int main(int argc, char **argv)
{
struct sigaction sigact = { { 0 } };
- int ret = 0;
+ int cfg_parsed;
+ int ret = EXIT_FAILURE;
+
config.filename = av_strdup("/etc/ffserver.conf");
@@ -3880,13 +3886,11 @@ int main(int argc, char **argv)
sigact.sa_flags = SA_NOCLDSTOP | SA_RESTART;
sigaction(SIGCHLD, &sigact, 0);
- if ((ret = ffserver_parse_ffconfig(config.filename, &config)) < 0) {
+ if ((cfg_parsed = ffserver_parse_ffconfig(config.filename, &config)) < 0) {
fprintf(stderr, "Error reading configuration file '%s': %s\n",
- config.filename, av_err2str(ret));
- av_freep(&config.filename);
- exit(1);
+ config.filename, av_err2str(cfg_parsed));
+ goto bail;
}
- av_freep(&config.filename);
/* open log file if needed */
if (config.logfilename[0] != '\0') {
@@ -3899,7 +3903,10 @@ int main(int argc, char **argv)
build_file_streams();
- build_feed_streams();
+ if (build_feed_streams() < 0) {
+ http_log("Could not setup feed streams\n");
+ goto bail;
+ }
compute_bandwidth();
@@ -3908,8 +3915,13 @@ int main(int argc, char **argv)
if (http_server() < 0) {
http_log("Could not start server\n");
- exit(1);
+ goto bail;
}
- return 0;
+ ret=EXIT_SUCCESS;
+
+bail:
+ av_freep (&config.filename);
+ avformat_network_deinit();
+ return ret;
}