#include "cmdutils.h"
#include "ffserver_config.h"
+#define PATH_LENGTH 1024
+
const char program_name[] = "ffserver";
const int program_birth_year = 2000;
for(i=0;i<8;i++)
buf[i] = (pos >> (56 - i * 8)) & 0xff;
if (lseek(fd, 8, SEEK_SET) < 0)
- return AVERROR(EIO);
+ goto bail_eio;
if (write(fd, buf, 8) != 8)
- return AVERROR(EIO);
+ goto bail_eio;
+
return 8;
+
+bail_eio:
+ return AVERROR(EIO);
}
static void ffm_set_write_index(AVFormatContext *s, int64_t pos,
static void start_children(FFServerStream *feed)
{
- char pathname[1024];
+ char *pathname;
char *slash;
int i;
+ size_t cmd_length;
if (no_launch)
return;
+ cmd_length = strlen(my_program_name);
+
+ /**
+ * FIXME: WIP Safeguard. Remove after clearing all harcoded
+ * '1024' path lengths
+ */
+ if (cmd_length > PATH_LENGTH - 1) {
+ http_log("Could not start children. Command line: '%s' exceeds "
+ "path length limit (%d)\n", my_program_name, PATH_LENGTH);
+ return;
+ }
+
+ pathname = av_strdup (my_program_name);
+ if (!pathname) {
+ http_log("Could not allocate memory for children cmd line\n");
+ return;
+ }
/* replace "ffserver" with "ffmpeg" in the path of current
* program. Ignore user provided path */
- av_strlcpy(pathname, my_program_name, sizeof(pathname));
slash = strrchr(pathname, '/');
if (!slash)
signal(SIGPIPE, SIG_DFL);
execvp(pathname, feed->child_argv);
+ av_free (pathname);
_exit(1);
}
+ av_free (pathname);
}
/* open a listening socket */
snprintf(bindmsg, sizeof(bindmsg), "bind(port %d)",
ntohs(my_addr->sin_port));
perror (bindmsg);
- closesocket(server_fd);
- return -1;
+ goto fail;
}
if (listen (server_fd, 5) < 0) {
perror ("listen");
- closesocket(server_fd);
- return -1;
+ goto fail;
}
if (ff_socket_nonblock(server_fd, 1) < 0)
av_log(NULL, AV_LOG_WARNING, "ff_socket_nonblock failed\n");
return server_fd;
+
+fail:
+ closesocket(server_fd);
+ return -1;
}
/* start all multicast streams */
if (config.http_addr.sin_port) {
server_fd = socket_open_listen(&config.http_addr);
- if (server_fd < 0) {
- av_free(poll_table);
- return -1;
- }
+ if (server_fd < 0)
+ goto quit;
}
if (config.rtsp_addr.sin_port) {
rtsp_server_fd = socket_open_listen(&config.rtsp_addr);
if (rtsp_server_fd < 0) {
- av_free(poll_table);
closesocket(server_fd);
- return -1;
+ goto quit;
}
}
if (!rtsp_server_fd && !server_fd) {
http_log("HTTP and RTSP disabled.\n");
- av_free(poll_table);
- return -1;
+ goto quit;
}
http_log("FFserver started.\n");
ret = poll(poll_table, poll_entry - poll_table, delay);
if (ret < 0 && ff_neterrno() != AVERROR(EAGAIN) &&
ff_neterrno() != AVERROR(EINTR)) {
- av_free(poll_table);
- return -1;
+ goto quit;
}
} while (ret < 0);
new_connection(rtsp_server_fd, 1);
}
}
+
+quit:
+ av_free(poll_table);
+ return -1;
}
/* start waiting for a new HTTP/RTSP request */
"Content-type: text/html\r\n"
"\r\n"
"<html><head><title>Too busy</title></head><body>\r\n"
- "<p>The server is too busy to serve your request at this time.</p>\r\n"
- "<p>The number of current connections is %u, and this exceeds the limit of %u.</p>\r\n"
+ "<p>The server is too busy to serve your request at "
+ "this time.</p>\r\n"
+ "<p>The number of current connections is %u, and this "
+ "exceeds the limit of %u.</p>\r\n"
"</body></html>\r\n",
nb_connections, config.nb_max_connections);
av_assert0(len < sizeof(buffer));
char *p;
FFServerStream *stream;
- /* compute filename by matching without the file extensions */
av_strlcpy(file1, filename, sizeof(file1));
p = strrchr(file1, '.');
if (p)
if (c->post == 0 && stream->stream_type == STREAM_TYPE_LIVE)
current_bandwidth += stream->bandwidth;
- /* If already streaming this feed, do not let start another feeder. */
+ /* If already streaming this feed, do not let another feeder start */
if (stream->feed_opened) {
snprintf(msg, sizeof(msg), "This feed is already being received.");
http_log("Feed '%s' already being received\n", stream->feed_filename);
"Content-type: text/html\r\n"
"\r\n"
"<html><head><title>Too busy</title></head><body>\r\n"
- "<p>The server is too busy to serve your request at this time.</p>\r\n"
- "<p>The bandwidth being served (including your stream) is %"PRIu64"kbit/sec, "
- "and this exceeds the limit of %"PRIu64"kbit/sec.</p>\r\n"
+ "<p>The server is too busy to serve your request at "
+ "this time.</p>\r\n"
+ "<p>The bandwidth being served (including your stream) "
+ "is %"PRIu64"kbit/s, and this exceeds the limit of "
+ "%"PRIu64"kbit/s.</p>\r\n"
"</body></html>\r\n",
current_bandwidth, config.max_bandwidth);
q += strlen(q);
stream_no = stream->nb_streams;
avio_printf(pb, "<table cellspacing=0 cellpadding=4><tr><th>Stream<th>"
- "type<th>kbits/s<th align=left>codec<th align=left>"
+ "type<th>kbit/s<th align=left>codec<th align=left>"
"Parameters\n");
for (i = 0; i < stream_no; i++) {
abort();
}
- avio_printf(pb, "<tr><td align=right>%d<td>%s<td align=right>%d"
+ avio_printf(pb, "<tr><td align=right>%d<td>%s<td align=right>%"PRId64
"<td>%s<td>%s\n",
- i, type, st->codec->bit_rate/1000,
+ i, type, (int64_t)st->codec->bit_rate/1000,
codec ? codec->name : "", parameters);
}
/* format status */
avio_printf(pb, "<h2>Available Streams</h2>\n");
avio_printf(pb, "<table cellspacing=0 cellpadding=4>\n");
- avio_printf(pb, "<tr><th valign=top>Path<th align=left>Served<br>Conns<th><br>bytes<th valign=top>Format<th>Bit rate<br>kbits/s<th align=left>Video<br>kbits/s<th><br>Codec<th align=left>Audio<br>kbits/s<th><br>Codec<th align=left valign=top>Feed\n");
+ avio_printf(pb, "<tr><th valign=top>Path<th align=left>Served<br>Conns<th><br>bytes<th valign=top>Format<th>Bit rate<br>kbit/s<th align=left>Video<br>kbit/s<th><br>Codec<th align=left>Audio<br>kbit/s<th><br>Codec<th align=left valign=top>Feed\n");
stream = config.first_stream;
while (stream) {
char sfilename[1024];
avio_printf(pb, "<table>\n");
avio_printf(pb, "<tr><th>#<th>File<th>IP<th>Proto<th>State<th>Target "
- "bits/sec<th>Actual bits/sec<th>Bytes transferred\n");
+ "bit/s<th>Actual bit/s<th>Bytes transferred\n");
c1 = first_http_ctx;
i = 0;
while (c1) {
if ((ret = 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);
}
av_freep(&config.filename);