From 65d1074c9ce81511904ab7afeda6364fa90ec02e Mon Sep 17 00:00:00 2001 From: Stackie Jia Date: Sat, 18 Jan 2025 12:15:22 +0800 Subject: [PATCH] reformat files --- .gitignore | 1 + src/configuration.c | 558 +++++++++++++++++++-------------- src/httpclients.c | 730 ++++++++++++++++++++++++++------------------ src/rtp2httpd.c | 213 +++++++------ src/rtp2httpd.h | 30 +- 5 files changed, 900 insertions(+), 632 deletions(-) diff --git a/.gitignore b/.gitignore index 70a9cdf..e4ae5f5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ autom4te.cache aclocal.m4 compile configure +configure~ depcomp install-sh missing diff --git a/src/configuration.c b/src/configuration.c index 22093a7..314a421 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -43,7 +43,6 @@ /* GLOBAL CONFIGURATION VARIABLES */ - enum loglevel conf_verbosity; int conf_daemonise; int conf_udpxy; @@ -61,37 +60,39 @@ int cmd_bind_set; int cmd_fcc_nat_traversal_set; int cmd_hostname_set; -enum section_e { +enum section_e +{ SEC_NONE = 0, SEC_BIND, SEC_SERVICES, SEC_GLOBAL }; - -void parseBindSec(char *line) { +void parseBindSec(char *line) +{ int i, j; char *node, *service; struct bindaddr_s *ba; - j=i=0; + j = i = 0; while (!isspace(line[j])) j++; node = strndup(line, j); - i=j; + i = j; while (isspace(line[i])) i++; - j=i; + j = i; while (!isspace(line[j])) j++; - service = strndup(line+i, j-i); + service = strndup(line + i, j - i); - if (strcmp("*", node) == 0) { + if (strcmp("*", node) == 0) + { free(node); node = NULL; } - logger(LOG_DEBUG, "node: %s, port: %s\n",node, service); + logger(LOG_DEBUG, "node: %s, port: %s\n", node, service); ba = malloc(sizeof(struct bindaddr_s)); ba->node = node; @@ -100,81 +101,92 @@ void parseBindSec(char *line) { bindaddr = ba; } -void parseServicesSec(char *line) { +void parseServicesSec(char *line) +{ int i, j, r, rr; struct addrinfo hints; - char *servname, *type, *maddr, *mport, *msrc="", *msaddr="", *msport=""; + char *servname, *type, *maddr, *mport, *msrc = "", *msaddr = "", *msport = ""; struct services_s *service; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_DGRAM; - j=i=0; + j = i = 0; while (!isspace(line[j])) j++; servname = strndup(line, j); - i=j; + i = j; while (isspace(line[i])) i++; - j=i; + j = i; while (!isspace(line[j])) j++; - type = strndupa(line+i, j-i); + type = strndupa(line + i, j - i); - i=j; + i = j; while (isspace(line[i])) i++; - j=i; + j = i; while (!isspace(line[j])) j++; - maddr = strndupa(line+i, j-i); + maddr = strndupa(line + i, j - i); - i=j; + i = j; while (isspace(line[i])) i++; - j=i; + j = i; while (!isspace(line[j])) j++; - mport = strndupa(line+i, j-i); + mport = strndupa(line + i, j - i); - if (strstr(maddr, "@") != NULL) { + if (strstr(maddr, "@") != NULL) + { char *split; char *current; int cnt = 0; split = strtok(maddr, "@"); - while (split != NULL) { + while (split != NULL) + { current = split; - if (cnt == 0) msrc = current; + if (cnt == 0) + msrc = current; split = strtok(NULL, "@"); - if (cnt > 0 && split != NULL) { + if (cnt > 0 && split != NULL) + { strcat(msrc, "@"); strcat(msrc, current); } - if (cnt > 0 && split == NULL) maddr = current; + if (cnt > 0 && split == NULL) + maddr = current; cnt++; } cnt = 0; msaddr = msrc; split = strtok(msrc, ":"); - while (split != NULL) { + while (split != NULL) + { current = split; - if (cnt == 0) msaddr = current; + if (cnt == 0) + msaddr = current; split = strtok(NULL, ":"); - if (cnt > 0 && split != NULL) { + if (cnt > 0 && split != NULL) + { strcat(msaddr, ":"); strcat(msaddr, current); } - if (cnt > 0 && split == NULL) msport = current; + if (cnt > 0 && split == NULL) + msport = current; cnt++; } } - logger(LOG_DEBUG,"serv: %s, type: %s, maddr: %s, mport: %s, msaddr: %s, msport: %s\n", - servname, type, maddr, mport, msaddr, msport); + logger(LOG_DEBUG, "serv: %s, type: %s, maddr: %s, mport: %s, msaddr: %s, msport: %s\n", + servname, type, maddr, mport, msaddr, msport); - if ((strcasecmp("MRTP", type) != 0) && (strcasecmp("MUDP", type) != 0)) { + if ((strcasecmp("MRTP", type) != 0) && (strcasecmp("MUDP", type) != 0)) + { logger(LOG_ERROR, "Unsupported service type: %s\n", type); free(servname); free(msrc); @@ -186,35 +198,45 @@ void parseServicesSec(char *line) { r = getaddrinfo(maddr, mport, &hints, &(service->addr)); rr = 0; - if (strcmp(msrc, "") != 0 && msrc != NULL) { + if (strcmp(msrc, "") != 0 && msrc != NULL) + { rr = getaddrinfo(msaddr, msport, &hints, &(service->msrc_addr)); } - if (r || rr) { - if (r) { + if (r || rr) + { + if (r) + { logger(LOG_ERROR, "Cannot init service %s. GAI: %s\n", - servname, gai_strerror(r)); + servname, gai_strerror(r)); } - if (rr) { + if (rr) + { logger(LOG_ERROR, "Cannot init service %s. GAI: %s\n", - servname, gai_strerror(rr)); + servname, gai_strerror(rr)); } free(servname); free(msrc); free(service); return; } - if (service->addr->ai_next != NULL) { + if (service->addr->ai_next != NULL) + { logger(LOG_ERROR, "Warning: maddr is ambiguos.\n"); } - if (strcmp(msrc, "") != 0 && msrc != NULL) { - if (service->msrc_addr->ai_next != NULL) { + if (strcmp(msrc, "") != 0 && msrc != NULL) + { + if (service->msrc_addr->ai_next != NULL) + { logger(LOG_ERROR, "Warning: msrc is ambiguos.\n"); } } - if(strcasecmp("MRTP", type) == 0) { + if (strcasecmp("MRTP", type) == 0) + { service->service_type = SERVICE_MRTP; - } else if (strcasecmp("MUDP", type) == 0) { + } + else if (strcasecmp("MUDP", type) == 0) + { service->service_type = SERVICE_MUDP; } @@ -224,115 +246,148 @@ void parseServicesSec(char *line) { services = service; } -void parseGlobalSec(char *line){ +void parseGlobalSec(char *line) +{ int i, j; char *param, *value; char *ind; - j=i=0; + j = i = 0; while (!isspace(line[j])) j++; param = strndupa(line, j); - ind = index(line+j, '='); - if (ind == NULL) { - logger(LOG_ERROR,"Unrecognised config line: %s\n",line); + ind = index(line + j, '='); + if (ind == NULL) + { + logger(LOG_ERROR, "Unrecognised config line: %s\n", line); return; } i = ind - line + 1; while (isspace(line[i])) i++; - j=i; + j = i; while (!isspace(line[j])) j++; - value = strndupa(line+i, j-i); + value = strndupa(line + i, j - i); - if (strcasecmp("verbosity", param) == 0) { - if (!cmd_verbosity_set) { + if (strcasecmp("verbosity", param) == 0) + { + if (!cmd_verbosity_set) + { conf_verbosity = atoi(value); - } else { + } + else + { logger(LOG_INFO, "Warning: Config file value \"verbosity\" ignored. It's already set on CmdLine.\n"); } return; } - if (strcasecmp("daemonise", param) == 0) { - if (!cmd_daemonise_set) { + if (strcasecmp("daemonise", param) == 0) + { + if (!cmd_daemonise_set) + { if ((strcasecmp("on", value) == 0) || (strcasecmp("true", value) == 0) || (strcasecmp("yes", value) == 0) || - (strcasecmp("1", value) == 0)) { + (strcasecmp("1", value) == 0)) + { conf_daemonise = 1; - } else { + } + else + { conf_daemonise = 0; } - } else { + } + else + { logger(LOG_INFO, "Warning: Config file value \"daemonise\" ignored. It's already set on CmdLine.\n"); } return; } - if (strcasecmp("maxclients", param) == 0) { - if (!cmd_maxclients_set) { - if ( atoi(value) < 1) { + if (strcasecmp("maxclients", param) == 0) + { + if (!cmd_maxclients_set) + { + if (atoi(value) < 1) + { logger(LOG_ERROR, "Invalid maxclients! Ignoring.\n"); return; } conf_maxclients = atoi(value); - } else { + } + else + { logger(LOG_INFO, "Warning: Config file value \"maxclients\" ignored. It's already set on CmdLine.\n"); } return; } - if (strcasecmp("udpxy", param) == 0) { - if (!cmd_udpxy_set) { + if (strcasecmp("udpxy", param) == 0) + { + if (!cmd_udpxy_set) + { if ((strcasecmp("on", value) == 0) || (strcasecmp("true", value) == 0) || (strcasecmp("yes", value) == 0) || - (strcasecmp("1", value) == 0)) { + (strcasecmp("1", value) == 0)) + { conf_udpxy = 1; - } else { + } + else + { conf_udpxy = 0; } - } else { + } + else + { logger(LOG_INFO, "Warning: Config file value \"udpxy\" ignored. It's already set on CmdLine.\n"); } return; } - if (strcasecmp("hostname", param) == 0) { - if (!cmd_hostname_set) { + if (strcasecmp("hostname", param) == 0) + { + if (!cmd_hostname_set) + { conf_hostname = strdup(value); - } else { + } + else + { logger(LOG_INFO, "Warning: Config file value \"hostname\" ignored. It's already set on CmdLine.\n"); } return; } - if (strcasecmp("fcc-nat-traversal", param) == 0) { - if (!cmd_fcc_nat_traversal_set) { + if (strcasecmp("fcc-nat-traversal", param) == 0) + { + if (!cmd_fcc_nat_traversal_set) + { conf_fcc_nat_traversal = atoi(value); - } else { + } + else + { logger(LOG_INFO, "Warning: Config file value \"fcc-nat-traversal\" ignored. It's already set on CmdLine.\n"); } return; } - logger(LOG_ERROR,"Unknown config parameter: %s\n", param); + logger(LOG_ERROR, "Unknown config parameter: %s\n", param); } - - -int parseConfigFile(char *path) { +int parseConfigFile(char *path) +{ FILE *cfile; char line[MAX_LINE]; - int i, bindMsgDone=0; + int i, bindMsgDone = 0; enum section_e section = SEC_NONE; - logger(LOG_DEBUG, "Opening %s\n",path); + logger(LOG_DEBUG, "Opening %s\n", path); cfile = fopen(path, "r"); if (cfile == NULL) return -1; - while (fgets(line, MAX_LINE, cfile)) { - i=0; + while (fgets(line, MAX_LINE, cfile)) + { + i = 0; while (isspace(line[i])) i++; @@ -340,69 +395,82 @@ int parseConfigFile(char *path) { if (line[i] == '\0' || line[i] == '#' || line[i] == ';') continue; - if (line[i] == '[') { /* section change */ - char *end = index(line+i, ']'); - if (end) { - char *secname = strndupa(line+i+1, end-line-i-1); - if (strcasecmp("bind", secname) == 0) { + if (line[i] == '[') + { /* section change */ + char *end = index(line + i, ']'); + if (end) + { + char *secname = strndupa(line + i + 1, end - line - i - 1); + if (strcasecmp("bind", secname) == 0) + { section = SEC_BIND; continue; } - if (strcasecmp("services", secname) == 0) { + if (strcasecmp("services", secname) == 0) + { section = SEC_SERVICES; continue; } - if (strcasecmp("global", secname) == 0) { + if (strcasecmp("global", secname) == 0) + { section = SEC_GLOBAL; continue; } - logger(LOG_ERROR,"Invalid section name: %s\n", secname); + logger(LOG_ERROR, "Invalid section name: %s\n", secname); continue; - } else { - logger(LOG_ERROR,"Unterminated section: %s\n", line+i); + } + else + { + logger(LOG_ERROR, "Unterminated section: %s\n", line + i); continue; } } - if (cmd_bind_set && section == SEC_BIND) { - if (!bindMsgDone) { + if (cmd_bind_set && section == SEC_BIND) + { + if (!bindMsgDone) + { logger(LOG_INFO, "Warning: Config file section \"[bind]\" ignored. It's already set on CmdLine.\n"); bindMsgDone = 1; } continue; } - switch(section) { - case SEC_BIND: - parseBindSec(line+i); - break; - case SEC_SERVICES: - parseServicesSec(line+i); - break; - case SEC_GLOBAL: - parseGlobalSec(line+i); - break; - default: - logger(LOG_ERROR, "Unrecognised config line: %s\n",line); + switch (section) + { + case SEC_BIND: + parseBindSec(line + i); + break; + case SEC_SERVICES: + parseServicesSec(line + i); + break; + case SEC_GLOBAL: + parseGlobalSec(line + i); + break; + default: + logger(LOG_ERROR, "Unrecognised config line: %s\n", line); } } fclose(cfile); return 0; } -struct bindaddr_s* newEmptyBindaddr() { - struct bindaddr_s* ba; +struct bindaddr_s *newEmptyBindaddr() +{ + struct bindaddr_s *ba; ba = malloc(sizeof(struct bindaddr_s)); memset(ba, 0, sizeof(*ba)); ba->service = strdup("8080"); return ba; } -void freeBindaddr(struct bindaddr_s* ba){ - struct bindaddr_s* bat; - while (ba) { - bat=ba; - ba=ba->next; +void freeBindaddr(struct bindaddr_s *ba) +{ + struct bindaddr_s *bat; + while (ba) + { + bat = ba; + ba = ba->next; if (bat->node) free(bat->node); if (bat->service) @@ -412,7 +480,8 @@ void freeBindaddr(struct bindaddr_s* ba){ } /* Setup configuration defaults */ -void restoreConfDefaults() { +void restoreConfDefaults() +{ struct services_s *servtmp; struct bindaddr_s *bindtmp; @@ -428,23 +497,28 @@ void restoreConfDefaults() { conf_fcc_nat_traversal = FCC_NAT_T_DISABLED; cmd_fcc_nat_traversal_set = 0; - if (conf_hostname != NULL) { + if (conf_hostname != NULL) + { free(conf_hostname); } cmd_hostname_set = 0; - while (services != NULL) { + while (services != NULL) + { servtmp = services; services = services->next; - if (servtmp->url != NULL) { + if (servtmp->url != NULL) + { free(servtmp->url); } - if (servtmp->addr != NULL) { + if (servtmp->addr != NULL) + { freeaddrinfo(servtmp->addr); } } - while (bindaddr != NULL) { + while (bindaddr != NULL) + { bindtmp = bindaddr; bindaddr = bindaddr->next; if (bindtmp->node != NULL) @@ -454,61 +528,69 @@ void restoreConfDefaults() { } } - -void usage(FILE* f, char* progname) { - char * prog = basename(progname); - fprintf (f, -PACKAGE " - Multicast RTP to Unicast HTTP stream convertor\n" -"\n" -"Version " VERSION "\n" -"Copyright 2008-2014 Ondrej Caletka \n" -"\n" -"This program is free software; you can redistribute it and/or modify\n" -"it under the terms of the GNU General Public License version 2\n" -"as published by the Free Software Foundation.\n"); - fprintf (f, -"\n" -"Usage: %s [options]\n" -"\n" -"Options:\n" -"\t-h --help Show this help\n" -"\t-v --verbose Increase verbosity\n" -"\t-q --quiet Report only fatal errors\n" -"\t-d --daemon Fork to background (implies -q)\n" -"\t-D --nodaemon Do not daemonise. (default)\n" -"\t-U --noudpxy Disable UDPxy compatibility\n" -"\t-m --maxclients Serve max n requests simultaneously (dfl 5)\n" -"\t-l --listen [addr:]port Address/port to bind (default ANY:8080)\n" -"\t-c --config Read this file, instead of\n" -"\t-n --fcc-nat-traversal <0/1/2> NAT traversal for FCC media stream, 0=disabled, 1=punchhole, 2=NAT-PMP (default 0)\n" -"\t-H --hostname Hostname to check in the Host: HTTP header (default none)\n" -"\t default " CONFIGFILE "\n", prog); +void usage(FILE *f, char *progname) +{ + char *prog = basename(progname); + fprintf(f, + PACKAGE " - Multicast RTP to Unicast HTTP stream convertor\n" + "\n" + "Version " VERSION "\n" + "Copyright 2008-2014 Ondrej Caletka \n" + "\n" + "This program is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License version 2\n" + "as published by the Free Software Foundation.\n"); + fprintf(f, + "\n" + "Usage: %s [options]\n" + "\n" + "Options:\n" + "\t-h --help Show this help\n" + "\t-v --verbose Increase verbosity\n" + "\t-q --quiet Report only fatal errors\n" + "\t-d --daemon Fork to background (implies -q)\n" + "\t-D --nodaemon Do not daemonise. (default)\n" + "\t-U --noudpxy Disable UDPxy compatibility\n" + "\t-m --maxclients Serve max n requests simultaneously (dfl 5)\n" + "\t-l --listen [addr:]port Address/port to bind (default ANY:8080)\n" + "\t-c --config Read this file, instead of\n" + "\t-n --fcc-nat-traversal <0/1/2> NAT traversal for FCC media stream, 0=disabled, 1=punchhole, 2=NAT-PMP (default 0)\n" + "\t-H --hostname Hostname to check in the Host: HTTP header (default none)\n" + "\t default " CONFIGFILE "\n", + prog); } - -void parseBindCmd(char *optarg) { +void parseBindCmd(char *optarg) +{ char *p, *node, *service; struct bindaddr_s *ba; - if (optarg[0] == '[') { + if (optarg[0] == '[') + { p = index(optarg++, ']'); - if (p) { + if (p) + { *p = '\0'; p = rindex(++p, ':'); } - } else { + } + else + { p = rindex(optarg, ':'); } - if (p) { + if (p) + { *p = '\0'; node = strdup(optarg); - service = strdup(p+1); - } else { + service = strdup(p + 1); + } + else + { node = NULL; service = strdup(optarg); } - logger(LOG_DEBUG, "node: %s, port: %s\n",node, service); + logger(LOG_DEBUG, "node: %s, port: %s\n", node, service); ba = malloc(sizeof(struct bindaddr_s)); ba->node = node; ba->service = service; @@ -516,22 +598,22 @@ void parseBindCmd(char *optarg) { bindaddr = ba; } -void parseCmdLine(int argc, char *argv[]) { +void parseCmdLine(int argc, char *argv[]) +{ const struct option longopts[] = { - { "verbose", required_argument, 0, 'v' }, - { "quiet", no_argument, 0, 'q' }, - { "help", no_argument, 0, 'h' }, - { "daemon", no_argument, 0, 'd' }, - { "nodaemon", no_argument, 0, 'D' }, - { "noudpxy", no_argument, 0, 'U' }, - { "maxclients", required_argument, 0, 'm' }, - { "listen", required_argument, 0, 'l' }, - { "config", required_argument, 0, 'c' }, - { "noconfig", no_argument, 0, 'C' }, - { "fcc-nat-traversal", required_argument, 0, 'n' }, - { "hostname", required_argument, 0, 'H' }, - { 0, 0, 0, 0} - }; + {"verbose", required_argument, 0, 'v'}, + {"quiet", no_argument, 0, 'q'}, + {"help", no_argument, 0, 'h'}, + {"daemon", no_argument, 0, 'd'}, + {"nodaemon", no_argument, 0, 'D'}, + {"noudpxy", no_argument, 0, 'U'}, + {"maxclients", required_argument, 0, 'm'}, + {"listen", required_argument, 0, 'l'}, + {"config", required_argument, 0, 'c'}, + {"noconfig", no_argument, 0, 'C'}, + {"fcc-nat-traversal", required_argument, 0, 'n'}, + {"hostname", required_argument, 0, 'H'}, + {0, 0, 0, 0}}; const char shortopts[] = "v:qhdDUm:c:l:n:H:C"; int option_index, opt; @@ -540,73 +622,79 @@ void parseCmdLine(int argc, char *argv[]) { restoreConfDefaults(); while ((opt = getopt_long(argc, argv, shortopts, - longopts, &option_index)) != -1) { - switch (opt) { - case 0: - break; - case 'v': - conf_verbosity = atoi(optarg); - cmd_verbosity_set = 1; - break; - case 'q': - conf_verbosity=0; - cmd_verbosity_set = 1; - break; - case 'h': - usage(stdout, argv[0]); - exit(EXIT_SUCCESS); - break; - case 'd': - conf_daemonise=1; - cmd_daemonise_set = 1; - break; - case 'D': - conf_daemonise=0; - cmd_daemonise_set = 1; - break; - case 'U': - conf_udpxy=0; - cmd_udpxy_set = 1; - break; - case 'm': - if (atoi(optarg) < 1) { - logger(LOG_ERROR, "Invalid maxclients! Ignoring.\n"); - } else { - conf_maxclients = atoi(optarg); - cmd_maxclients_set = 1; - } - break; - case 'c': - configfile_failed = parseConfigFile(optarg); - break; - case 'C': - configfile_failed = 0; - break; - case 'l': - parseBindCmd(optarg); - cmd_bind_set = 1; - break; - case 'n': - conf_fcc_nat_traversal = atoi(optarg); - cmd_fcc_nat_traversal_set = 1; - break; - case 'H': - conf_hostname = strdup(optarg); - cmd_hostname_set = 1; - break; - default: - logger(LOG_FATAL, "Unknown option! %d \n",opt); - usage(stderr, argv[0]); - exit(EXIT_FAILURE); + longopts, &option_index)) != -1) + { + switch (opt) + { + case 0: + break; + case 'v': + conf_verbosity = atoi(optarg); + cmd_verbosity_set = 1; + break; + case 'q': + conf_verbosity = 0; + cmd_verbosity_set = 1; + break; + case 'h': + usage(stdout, argv[0]); + exit(EXIT_SUCCESS); + break; + case 'd': + conf_daemonise = 1; + cmd_daemonise_set = 1; + break; + case 'D': + conf_daemonise = 0; + cmd_daemonise_set = 1; + break; + case 'U': + conf_udpxy = 0; + cmd_udpxy_set = 1; + break; + case 'm': + if (atoi(optarg) < 1) + { + logger(LOG_ERROR, "Invalid maxclients! Ignoring.\n"); + } + else + { + conf_maxclients = atoi(optarg); + cmd_maxclients_set = 1; + } + break; + case 'c': + configfile_failed = parseConfigFile(optarg); + break; + case 'C': + configfile_failed = 0; + break; + case 'l': + parseBindCmd(optarg); + cmd_bind_set = 1; + break; + case 'n': + conf_fcc_nat_traversal = atoi(optarg); + cmd_fcc_nat_traversal_set = 1; + break; + case 'H': + conf_hostname = strdup(optarg); + cmd_hostname_set = 1; + break; + default: + logger(LOG_FATAL, "Unknown option! %d \n", opt); + usage(stderr, argv[0]); + exit(EXIT_FAILURE); } } - if(configfile_failed) { + if (configfile_failed) + { configfile_failed = parseConfigFile(CONFIGFILE); } - if(configfile_failed) { + if (configfile_failed) + { logger(LOG_INFO, "Warning: No configfile found.\n"); } logger(LOG_DEBUG, "Verbosity: %d, Daemonise: %d, Maxclients: %d\n", - conf_verbosity, conf_daemonise, conf_maxclients); + conf_verbosity, conf_daemonise, conf_maxclients); } - diff --git a/src/httpclients.c b/src/httpclients.c index 3736dd6..5e4cc1d 100644 --- a/src/httpclients.c +++ b/src/httpclients.c @@ -41,57 +41,57 @@ #define UDPBUFLEN 2000 static const char unimplemented[] = -"\r\n" -"\r\n" -"501 Method Not Implemented\r\n" -"\r\n" -"

501 Method Not Implemented

\r\n" -"

Sorry, only GET is supported.

\r\n" -"
\r\n" -"
Server " PACKAGE " version " VERSION "
\r\n" -"\r\n"; + "\r\n" + "\r\n" + "501 Method Not Implemented\r\n" + "\r\n" + "

501 Method Not Implemented

\r\n" + "

Sorry, only GET is supported.

\r\n" + "
\r\n" + "
Server " PACKAGE " version " VERSION "
\r\n" + "\r\n"; static const char badrequest[] = -"\r\n" -"\r\n" -"400 Bad Request\r\n" -"\r\n" -"

400 Bad Request

\r\n" -"

Your browser sent a request that this server could not understand.
\r\n" -"

\r\n" -"
\r\n" -"
Server " PACKAGE " version " VERSION "
\r\n" -"\r\n"; + "\r\n" + "\r\n" + "400 Bad Request\r\n" + "\r\n" + "

400 Bad Request

\r\n" + "

Your browser sent a request that this server could not understand.
\r\n" + "

\r\n" + "
\r\n" + "
Server " PACKAGE " version " VERSION "
\r\n" + "\r\n"; static const char serviceNotFound[] = -"\r\n" -"\r\n" -"404 Service not found!\r\n" -"\r\n" -"

404 Service not found!

\r\n" -"

Sorry, this service was not configured.

\r\n" -"
\r\n" -"
Server " PACKAGE " version " VERSION "
\r\n" -"\r\n"; + "\r\n" + "\r\n" + "404 Service not found!\r\n" + "\r\n" + "

404 Service not found!

\r\n" + "

Sorry, this service was not configured.

\r\n" + "
\r\n" + "
Server " PACKAGE " version " VERSION "
\r\n" + "\r\n"; static const char serviceUnavailable[] = -"\r\n" -"\r\n" -"503 Service Unavaliable\r\n" -"\r\n" -"

503 Service Unavaliable

\r\n" -"

Sorry, there are too many connections at this time.\r\n" -"Try again later.

\r\n" -"
\r\n" -"
Server " PACKAGE " version " VERSION "
\r\n" -"\r\n"; + "\r\n" + "\r\n" + "503 Service Unavaliable\r\n" + "\r\n" + "

503 Service Unavaliable

\r\n" + "

Sorry, there are too many connections at this time.\r\n" + "Try again later.

\r\n" + "
\r\n" + "
Server " PACKAGE " version " VERSION "
\r\n" + "\r\n"; static const char *responseCodes[] = { - "HTTP/1.1 200 OK\r\n", /* 0 */ - "HTTP/1.1 404 Not Found\r\n", /* 1 */ - "HTTP/1.1 400 Bad Request\r\n", /* 2 */ - "HTTP/1.1 501 Not Implemented\r\n", /* 3 */ - "HTTP/1.1 503 Service Unavailable\r\n", /* 4 */ + "HTTP/1.1 200 OK\r\n", /* 0 */ + "HTTP/1.1 404 Not Found\r\n", /* 1 */ + "HTTP/1.1 400 Bad Request\r\n", /* 2 */ + "HTTP/1.1 501 Not Implemented\r\n", /* 3 */ + "HTTP/1.1 503 Service Unavailable\r\n", /* 4 */ }; #define STATUS_200 0 @@ -101,11 +101,11 @@ static const char *responseCodes[] = { #define STATUS_503 4 static const char *contentTypes[] = { - "Content-Type: application/octet-stream\r\n", /* 0 */ - "Content-Type: text/html\r\n", /* 1 */ - "Content-Type: text/html; charset=utf-8\r\n", /* 2 */ - "Content-Type: video/mpeg\r\n", /* 3 */ - "Content-Type: audio/mpeg\r\n", /* 4 */ + "Content-Type: application/octet-stream\r\n", /* 0 */ + "Content-Type: text/html\r\n", /* 1 */ + "Content-Type: text/html; charset=utf-8\r\n", /* 2 */ + "Content-Type: video/mpeg\r\n", /* 3 */ + "Content-Type: audio/mpeg\r\n", /* 4 */ }; #define CONTENT_OSTREAM 0 @@ -115,8 +115,8 @@ static const char *contentTypes[] = { #define CONTENT_MPEGA 4 static const char staticHeaders[] = -"Server: " PACKAGE "/" VERSION "\r\n" -"\r\n"; + "Server: " PACKAGE "/" VERSION "\r\n" + "\r\n"; /* * Linked list of allowed services @@ -135,12 +135,15 @@ struct services_s *services = NULL; /* * Ensures that all data are written to the socket */ -static void writeToClient(int s,const uint8_t *buf, const size_t buflen) { +static void writeToClient(int s, const uint8_t *buf, const size_t buflen) +{ ssize_t actual; - size_t written=0; - while (written0 ) { + sscanf(addrstr + i + 1, "%2hhx", (unsigned char *)&c) > 0) + { addrstr[i] = c; - memmove(addrstr+i+1, addrstr+i+3, 1+strlen(addrstr+i+3)); + memmove(addrstr + i + 1, addrstr + i + 3, 1 + strlen(addrstr + i + 3)); } } logger(LOG_DEBUG, "decoded addr: %s\n", addrstr); fccaddr = rindex(addrstr, '?'); - if (fccaddr) { + if (fccaddr) + { *fccaddr = '\0'; fccaddr++; fccaddr = strcasestr(fccaddr, "fcc="); - if (fccaddr) { + if (fccaddr) + { fccaddr += 4; fccport = rindex(fccaddr, ':'); - if (fccport) { + if (fccport) + { *fccport = '\0'; fccport++; } } - } else { + } + else + { fccaddr = ""; } - if (!fccport) { + if (!fccport) + { fccport = ""; } - if (addrstr[1] == '[') { + if (addrstr[1] == '[') + { portstr = index(addrstr, ']'); addrstr += 2; - if (portstr) { + if (portstr) + { *portstr = '\0'; portstr = rindex(++portstr, ':'); } - } else { + } + else + { portstr = rindex(addrstr++, ':'); } - if (strstr(addrstr, "@") != NULL) { + if (strstr(addrstr, "@") != NULL) + { char *split; char *current; int cnt = 0; split = strtok(addrstr, "@"); - while (split != NULL) { + while (split != NULL) + { current = split; - if (cnt == 0) msrc = current; + if (cnt == 0) + msrc = current; split = strtok(NULL, "@"); - if (cnt > 0 && split != NULL) { + if (cnt > 0 && split != NULL) + { strcat(msrc, "@"); strcat(msrc, current); } - if (cnt > 0 && split == NULL) addrstr = current; + if (cnt > 0 && split == NULL) + addrstr = current; cnt++; } cnt = 0; msaddr = msrc; split = strtok(msrc, ":"); - while (split != NULL) { + while (split != NULL) + { current = split; - if (cnt == 0) msaddr = current; + if (cnt == 0) + msaddr = current; split = strtok(NULL, ":"); - if (cnt > 0 && split != NULL) { + if (cnt > 0 && split != NULL) + { strcat(msaddr, ":"); strcat(msaddr, current); } - if (cnt > 0 && split == NULL) msport = current; + if (cnt > 0 && split == NULL) + msport = current; cnt++; } } - if (portstr) { + if (portstr) + { *portstr = '\0'; portstr++; - } else + } + else portstr = "1234"; logger(LOG_DEBUG, "addrstr: %s portstr: %s msrc: %s fccaddr: %s fccport: %s\n", addrstr, portstr, msrc, fccaddr, fccport); @@ -278,39 +305,51 @@ static struct services_s* udpxy_parse(char* url) { r = getaddrinfo(addrstr, portstr, &hints, &res); rr = 0; rrr = 0; - if (strcmp(msrc, "") != 0 && msrc != NULL) { + if (strcmp(msrc, "") != 0 && msrc != NULL) + { rr = getaddrinfo(msrc, 0, &hints, &msrc_res); } - if (strcmp(fccaddr, "") != 0 && fccaddr != NULL) { + if (strcmp(fccaddr, "") != 0 && fccaddr != NULL) + { rrr = getaddrinfo(fccaddr, fccport, &hints, &fcc_res); } - if (r | rr | rrr) { - if (r) { + if (r | rr | rrr) + { + if (r) + { logger(LOG_ERROR, "Cannot resolve Multicast address. GAI: %s\n", - gai_strerror(r)); + gai_strerror(r)); } - if (rr) { + if (rr) + { logger(LOG_ERROR, "Cannot resolve Multicast source address. GAI: %s\n", - gai_strerror(rr)); + gai_strerror(rr)); } - if (rrr) { + if (rrr) + { logger(LOG_ERROR, "Cannot resolve FCC server address. GAI: %s\n", - gai_strerror(rrr)); + gai_strerror(rrr)); } - free(msrc); msrc = NULL; + free(msrc); + msrc = NULL; return NULL; } - if (res->ai_next != NULL) { + if (res->ai_next != NULL) + { logger(LOG_ERROR, "Warning: maddr is ambiguos.\n"); } - if (strcmp(msrc, "") != 0 && msrc != NULL) { - if (msrc_res->ai_next != NULL) { + if (strcmp(msrc, "") != 0 && msrc != NULL) + { + if (msrc_res->ai_next != NULL) + { logger(LOG_ERROR, "Warning: msrc is ambiguos.\n"); } } - if (strcmp(fccaddr, "") != 0 && fccaddr != NULL) { - if (fcc_res->ai_next != NULL) { + if (strcmp(fccaddr, "") != 0 && fccaddr != NULL) + { + if (fcc_res->ai_next != NULL) + { logger(LOG_ERROR, "Warning: fcc is ambiguos.\n"); } } @@ -318,17 +357,18 @@ static struct services_s* udpxy_parse(char* url) { /* Copy result into statically allocated structs */ memcpy(&res_addr, res->ai_addr, res->ai_addrlen); memcpy(&res_ai, res, sizeof(struct addrinfo)); - res_ai.ai_addr = (struct sockaddr*) &res_addr; + res_ai.ai_addr = (struct sockaddr *)&res_addr; res_ai.ai_canonname = NULL; res_ai.ai_next = NULL; serv.addr = &res_ai; serv.msrc_addr = NULL; - if (strcmp(msrc, "") != 0 && msrc != NULL) { + if (strcmp(msrc, "") != 0 && msrc != NULL) + { /* Copy result into statically allocated structs */ memcpy(&msrc_res_addr, msrc_res->ai_addr, msrc_res->ai_addrlen); memcpy(&msrc_res_ai, msrc_res, sizeof(struct addrinfo)); - msrc_res_ai.ai_addr = (struct sockaddr*) &msrc_res_addr; + msrc_res_ai.ai_addr = (struct sockaddr *)&msrc_res_addr; msrc_res_ai.ai_canonname = NULL; msrc_res_ai.ai_next = NULL; serv.msrc_addr = &msrc_res_ai; @@ -337,11 +377,12 @@ static struct services_s* udpxy_parse(char* url) { serv.msrc = strdup(msrc); serv.fcc_addr = NULL; - if (strcmp(fccaddr, "") != 0 && fccaddr != NULL) { + if (strcmp(fccaddr, "") != 0 && fccaddr != NULL) + { /* Copy result into statically allocated structs */ memcpy(&fcc_res_addr, fcc_res->ai_addr, fcc_res->ai_addrlen); memcpy(&fcc_res_ai, fcc_res, sizeof(struct addrinfo)); - fcc_res_ai.ai_addr = (struct sockaddr*) &fcc_res_addr; + fcc_res_ai.ai_addr = (struct sockaddr *)&fcc_res_addr; fcc_res_ai.ai_canonname = NULL; fcc_res_ai.ai_next = NULL; serv.fcc_addr = &fcc_res_ai; @@ -350,108 +391,122 @@ static struct services_s* udpxy_parse(char* url) { return &serv; } -static int join_mcast_group(struct services_s *service) { +static int join_mcast_group(struct services_s *service) +{ struct group_req gr; struct group_source_req gsr; int sock, r, level; int on = 1; sock = socket(service->addr->ai_family, service->addr->ai_socktype, - service->addr->ai_protocol); - r = setsockopt(sock, SOL_SOCKET, - SO_REUSEADDR, &on, sizeof(on)); - if (r) { - logger(LOG_ERROR, "SO_REUSEADDR " - "failed: %s\n", strerror(errno)); - } + service->addr->ai_protocol); + r = setsockopt(sock, SOL_SOCKET, + SO_REUSEADDR, &on, sizeof(on)); + if (r) + { + logger(LOG_ERROR, "SO_REUSEADDR " + "failed: %s\n", + strerror(errno)); + } - r = bind(sock,(struct sockaddr *) service->addr->ai_addr, service->addr->ai_addrlen); - if (r) { + r = bind(sock, (struct sockaddr *)service->addr->ai_addr, service->addr->ai_addrlen); + if (r) + { logger(LOG_ERROR, "Cannot bind: %s\n", - strerror(errno)); + strerror(errno)); exit(RETVAL_RTP_FAILED); } memcpy(&(gr.gr_group), service->addr->ai_addr, service->addr->ai_addrlen); - switch (service->addr->ai_family) { - case AF_INET: - level = SOL_IP; - gr.gr_interface = 0; - break; - - case AF_INET6: - level = SOL_IPV6; - gr.gr_interface = ((const struct sockaddr_in6 *) - (service->addr->ai_addr))->sin6_scope_id; - break; - default: - logger(LOG_ERROR, "Address family don't support mcast.\n"); - exit(RETVAL_SOCK_READ_FAILED); + switch (service->addr->ai_family) + { + case AF_INET: + level = SOL_IP; + gr.gr_interface = 0; + break; + + case AF_INET6: + level = SOL_IPV6; + gr.gr_interface = ((const struct sockaddr_in6 *)(service->addr->ai_addr))->sin6_scope_id; + break; + default: + logger(LOG_ERROR, "Address family don't support mcast.\n"); + exit(RETVAL_SOCK_READ_FAILED); } - if (strcmp(service->msrc, "") != 0 && service->msrc != NULL) { + if (strcmp(service->msrc, "") != 0 && service->msrc != NULL) + { gsr.gsr_group = gr.gr_group; gsr.gsr_interface = gr.gr_interface; memcpy(&(gsr.gsr_source), service->msrc_addr->ai_addr, service->msrc_addr->ai_addrlen); r = setsockopt(sock, level, - MCAST_JOIN_SOURCE_GROUP, &gsr, sizeof(gsr)); - } else { + MCAST_JOIN_SOURCE_GROUP, &gsr, sizeof(gsr)); + } + else + { r = setsockopt(sock, level, - MCAST_JOIN_GROUP, &gr, sizeof(gr)); + MCAST_JOIN_GROUP, &gr, sizeof(gr)); } - if (r) { + if (r) + { logger(LOG_ERROR, "Cannot join mcast group: %s\n", - strerror(errno)); + strerror(errno)); exit(RETVAL_RTP_FAILED); } return sock; } -static uint8_t* build_fcc_request_pk(struct addrinfo *maddr, uint16_t fcc_client_nport) { +static uint8_t *build_fcc_request_pk(struct addrinfo *maddr, uint16_t fcc_client_nport) +{ struct sockaddr_in *maddr_sin = (struct sockaddr_in *) - maddr->ai_addr; + maddr->ai_addr; static uint8_t pk[FCC_PK_LEN_REQ]; memset(&pk, 0, sizeof(pk)); uint8_t *p = pk; - *(p++) = 0x82; // Version 2, Padding 0, FMT 2 - *(p++) = 205; // Type: Generic RTP Feedback (205) - *(uint16_t*)p = htons(sizeof(pk)/4 - 1); // Length + *(p++) = 0x82; // Version 2, Padding 0, FMT 2 + *(p++) = 205; // Type: Generic RTP Feedback (205) + *(uint16_t *)p = htons(sizeof(pk) / 4 - 1); // Length p += 2; - p += 4; // Sender SSRC - *(uint32_t*)p = maddr_sin->sin_addr.s_addr; // Media source SSRC + p += 4; // Sender SSRC + *(uint32_t *)p = maddr_sin->sin_addr.s_addr; // Media source SSRC p += 4; // FCI - p += 4; // Version 0, Reserved 3 bytes - *(uint16_t*)p = fcc_client_nport; // FCC client port + p += 4; // Version 0, Reserved 3 bytes + *(uint16_t *)p = fcc_client_nport; // FCC client port p += 2; - *(uint16_t*)p = maddr_sin->sin_port; // Mcast group port + *(uint16_t *)p = maddr_sin->sin_port; // Mcast group port p += 2; - *(uint32_t*)p = maddr_sin->sin_addr.s_addr; // Mcast group IP + *(uint32_t *)p = maddr_sin->sin_addr.s_addr; // Mcast group IP p += 4; return pk; } -static int get_gw_ip(in_addr_t *addr) { +static int get_gw_ip(in_addr_t *addr) +{ long destination, gateway; char buf[4096]; - FILE * file; + FILE *file; memset(buf, 0, sizeof(buf)); file = fopen("/proc/net/route", "r"); - if (!file) { + if (!file) + { return -1; } - while (fgets(buf, sizeof(buf), file)) { - if (sscanf(buf, "%*s %lx %lx", &destination, &gateway) == 2) { - if (destination == 0) { /* default */ + while (fgets(buf, sizeof(buf), file)) + { + if (sscanf(buf, "%*s %lx %lx", &destination, &gateway) == 2) + { + if (destination == 0) + { /* default */ *addr = gateway; fclose(file); return 0; @@ -465,126 +520,146 @@ static int get_gw_ip(in_addr_t *addr) { return -1; } -static uint16_t nat_pmp(uint16_t nport, uint32_t lifetime) { - struct sockaddr_in gw_addr = { .sin_family = AF_INET, .sin_port = htons(5351) }; +static uint16_t nat_pmp(uint16_t nport, uint32_t lifetime) +{ + struct sockaddr_in gw_addr = {.sin_family = AF_INET, .sin_port = htons(5351)}; uint8_t pk[12]; uint8_t buf[16]; - struct timeval tv = { .tv_sec = 1, .tv_usec = 0 }; + struct timeval tv = {.tv_sec = 1, .tv_usec = 0}; - if (get_gw_ip(&gw_addr.sin_addr.s_addr) < 0) return 0; + if (get_gw_ip(&gw_addr.sin_addr.s_addr) < 0) + return 0; int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv); - pk[0] = 0; // Version - pk[1] = 1; // UDP - *(uint16_t*)(pk+2) = 0; // Reserved - *(uint16_t*)(pk+4) = nport; // Private port - *(uint16_t*)(pk+6) = 0; // Public port - *(uint32_t*)(pk+8) = htonl(lifetime); + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof tv); + pk[0] = 0; // Version + pk[1] = 1; // UDP + *(uint16_t *)(pk + 2) = 0; // Reserved + *(uint16_t *)(pk + 4) = nport; // Private port + *(uint16_t *)(pk + 6) = 0; // Public port + *(uint32_t *)(pk + 8) = htonl(lifetime); sendto(sock, pk, sizeof(pk), 0, (struct sockaddr *)&gw_addr, sizeof(gw_addr)); - if (recv(sock, buf, sizeof(buf), 0) > 0) { - if (*(uint16_t*)(buf+2) == 0) { // Result code + if (recv(sock, buf, sizeof(buf), 0) > 0) + { + if (*(uint16_t *)(buf + 2) == 0) + { // Result code close(sock); - return *(uint16_t*)(buf+10); // Mapped public port + return *(uint16_t *)(buf + 10); // Mapped public port } } close(sock); return 0; } -static uint8_t* build_fcc_term_pk(struct addrinfo *maddr, uint16_t seqn) { +static uint8_t *build_fcc_term_pk(struct addrinfo *maddr, uint16_t seqn) +{ struct sockaddr_in *maddr_sin = (struct sockaddr_in *)maddr->ai_addr; static uint8_t pk[FCC_PK_LEN_TERM]; memset(&pk, 0, sizeof(pk)); uint8_t *p = pk; - *(p++) = 0x85; // Version 2, Padding 0, FMT 5 - *(p++) = 205; // Type: Generic RTP Feedback (205) - *(uint16_t*)p = htons(sizeof(pk)/4 - 1); // Length + *(p++) = 0x85; // Version 2, Padding 0, FMT 5 + *(p++) = 205; // Type: Generic RTP Feedback (205) + *(uint16_t *)p = htons(sizeof(pk) / 4 - 1); // Length p += 2; - p += 4; // Sender SSRC - *(uint32_t*)p = maddr_sin->sin_addr.s_addr; // Media source SSRC + p += 4; // Sender SSRC + *(uint32_t *)p = maddr_sin->sin_addr.s_addr; // Media source SSRC p += 4; // FCI - *(p++) = seqn ? 0 : 1; // Stop bit, 0 = normal, 1 = force - p++; // Reserved - *(uint16_t*)p = htons(seqn); // First multicast packet sequence + *(p++) = seqn ? 0 : 1; // Stop bit, 0 = normal, 1 = force + p++; // Reserved + *(uint16_t *)p = htons(seqn); // First multicast packet sequence p += 2; return pk; } -static int get_rtp_payload(uint8_t *buf, int recv_len, uint8_t **payload, int *size) { +static int get_rtp_payload(uint8_t *buf, int recv_len, uint8_t **payload, int *size) +{ int payloadstart, payloadlength; - if (recv_len < 12 || (buf[0]&0xC0) != 0x80) { + if (recv_len < 12 || (buf[0] & 0xC0) != 0x80) + { /*malformed RTP/UDP/IP packet*/ - logger(LOG_DEBUG,"Malformed RTP packet received\n"); + logger(LOG_DEBUG, "Malformed RTP packet received\n"); return -1; } - payloadstart = 12; /* basic RTP header length */ - payloadstart += (buf[0]&0x0F) * 4; /*CRSC headers*/ - if (buf[0]&0x10) { /*Extension header*/ - payloadstart += 4 + 4*ntohs(*((uint16_t *)(buf+payloadstart+2))); + payloadstart = 12; /* basic RTP header length */ + payloadstart += (buf[0] & 0x0F) * 4; /*CRSC headers*/ + if (buf[0] & 0x10) + { /*Extension header*/ + payloadstart += 4 + 4 * ntohs(*((uint16_t *)(buf + payloadstart + 2))); } payloadlength = recv_len - payloadstart; - if (buf[0]&0x20) { /*Padding*/ + if (buf[0] & 0x20) + { /*Padding*/ payloadlength -= buf[recv_len]; /*last octet indicate padding length*/ } - if(payloadlength<0) { - logger(LOG_DEBUG,"Malformed RTP packet received\n"); + if (payloadlength < 0) + { + logger(LOG_DEBUG, "Malformed RTP packet received\n"); return -1; } - *payload = buf+payloadstart; + *payload = buf + payloadstart; *size = payloadlength; return 0; } -static void write_rtp_payload_to_client(int client, int recv_len, uint8_t *buf, uint16_t *oldseqn, uint16_t *notfirst) { +static void write_rtp_payload_to_client(int client, int recv_len, uint8_t *buf, uint16_t *oldseqn, uint16_t *notfirst) +{ int payloadlength; uint8_t *payload; uint16_t seqn; get_rtp_payload(buf, recv_len, &payload, &payloadlength); - seqn = ntohs(*(uint16_t *)(buf+2)); - if (*notfirst && seqn==*oldseqn) { - logger(LOG_DEBUG,"Duplicated RTP packet " - "received (seqn %d)\n", seqn); + seqn = ntohs(*(uint16_t *)(buf + 2)); + if (*notfirst && seqn == *oldseqn) + { + logger(LOG_DEBUG, "Duplicated RTP packet " + "received (seqn %d)\n", + seqn); return; } - if (*notfirst && (seqn != ((*oldseqn+1)&0xFFFF))) { - logger(LOG_DEBUG,"Congestion - expected %d, " - "received %d\n", (*oldseqn+1)&0xFFFF, seqn); + if (*notfirst && (seqn != ((*oldseqn + 1) & 0xFFFF))) + { + logger(LOG_DEBUG, "Congestion - expected %d, " + "received %d\n", + (*oldseqn + 1) & 0xFFFF, seqn); } - *oldseqn=seqn; - *notfirst=1; + *oldseqn = seqn; + *notfirst = 1; writeToClient(client, payload, payloadlength); } static ssize_t sendto_triple(int __fd, const void *__buf, size_t __n, - int __flags, struct sockaddr_in *__addr, socklen_t __addr_len) { + int __flags, struct sockaddr_in *__addr, socklen_t __addr_len) +{ static uint8_t i; - for (i = 0; i < 3; i++) { - if (sendto(__fd, __buf, __n, __flags, (struct sockaddr *)__addr, __addr_len) < 0) { + for (i = 0; i < 3; i++) + { + if (sendto(__fd, __buf, __n, __flags, (struct sockaddr *)__addr, __addr_len) < 0) + { return -1; } } return __n; } -static void fcc_cleanup(int fcc_sock, struct sockaddr_in *fcc_server, struct services_s *service, uint16_t mapped_pub_port, struct sockaddr_in *fcc_client) { +static void fcc_cleanup(int fcc_sock, struct sockaddr_in *fcc_server, struct services_s *service, uint16_t mapped_pub_port, struct sockaddr_in *fcc_client) +{ if (fcc_sock) sendto_triple(fcc_sock, build_fcc_term_pk(service->addr, 0), FCC_PK_LEN_TERM, 0, fcc_server, sizeof(*fcc_server)); if (mapped_pub_port) nat_pmp(fcc_client->sin_port, 0); } -static void startRTPstream(int client, struct services_s *service){ +static void startRTPstream(int client, struct services_s *service) +{ int recv_state = RECV_STATE_INIT; int mcast_sock = 0, fcc_sock = 0, max_sock; int r; @@ -596,17 +671,20 @@ static void startRTPstream(int client, struct services_s *service){ uint8_t *mcast_pending_buf = NULL, *mcast_pbuf_c, *rtp_payload, mcast_pbuf_full; uint mcast_pbuf_len; int actualr; - uint16_t mapped_pub_port = 0, media_port = 0, seqn, mcast_pbuf_lsqen, notfirst=0, fcc_term_sent = 0, fcc_term_seqn = 0; + uint16_t mapped_pub_port = 0, media_port = 0, seqn, mcast_pbuf_lsqen, notfirst = 0, fcc_term_sent = 0, fcc_term_seqn = 0; int payloadlength; fd_set rfds; struct timeval timeout; - void sig_handler(int signum) { + void sig_handler(int signum) + { fcc_cleanup(fcc_sock, fcc_server, service, mapped_pub_port, &fcc_client); - if (signum) exit(RETVAL_CLEAN); + if (signum) + exit(RETVAL_CLEAN); } - void exit_handler() { + void exit_handler() + { sig_handler(0); } @@ -615,165 +693,218 @@ static void startRTPstream(int client, struct services_s *service){ signal(SIGINT, sig_handler); signal(SIGPIPE, sig_handler); - while(1) { - if (recv_state == RECV_STATE_INIT) { - if (service->service_type == SERVICE_MRTP && service->fcc_addr) { + while (1) + { + if (recv_state == RECV_STATE_INIT) + { + if (service->service_type == SERVICE_MRTP && service->fcc_addr) + { struct sockaddr_in sin; - if (!fcc_sock) { + if (!fcc_sock) + { fcc_sock = socket(AF_INET, service->fcc_addr->ai_socktype, service->fcc_addr->ai_protocol); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = 0; r = bind(fcc_sock, (struct sockaddr *)&sin, sizeof(sin)); - if (r) { + if (r) + { logger(LOG_ERROR, "Cannot bind: %s\n", strerror(errno)); exit(RETVAL_RTP_FAILED); } slen = sizeof(fcc_client); getsockname(fcc_sock, (struct sockaddr *)&fcc_client, &slen); - if (conf_fcc_nat_traversal == FCC_NAT_T_NAT_PMP) { + if (conf_fcc_nat_traversal == FCC_NAT_T_NAT_PMP) + { mapped_pub_port = nat_pmp(fcc_client.sin_port, 86400); logger(LOG_DEBUG, "NAT PMP result: %u\n", ntohs(mapped_pub_port)); } - fcc_server = (struct sockaddr_in*) service->fcc_addr->ai_addr; + fcc_server = (struct sockaddr_in *)service->fcc_addr->ai_addr; } r = sendto_triple(fcc_sock, build_fcc_request_pk(service->addr, mapped_pub_port ? mapped_pub_port : fcc_client.sin_port), FCC_PK_LEN_REQ, 0, fcc_server, sizeof(*fcc_server)); - if (r < 0){ + if (r < 0) + { logger(LOG_ERROR, "Unable to send FCC req message: %s\n", strerror(errno)); exit(RETVAL_RTP_FAILED); } logger(LOG_DEBUG, "FCC server requested.\n"); recv_state = RECV_STATE_FCC_REQUESTED; - } else { + } + else + { mcast_sock = join_mcast_group(service); recv_state = RECV_STATE_MCAST_ACCEPTED; } - } else { + } + else + { FD_ZERO(&rfds); max_sock = client; FD_SET(client, &rfds); /* Will be set if connection to client lost.*/ - if (fcc_sock && recv_state != RECV_STATE_MCAST_ACCEPTED) { + if (fcc_sock && recv_state != RECV_STATE_MCAST_ACCEPTED) + { FD_SET(fcc_sock, &rfds); - if (fcc_sock > max_sock) max_sock = fcc_sock; + if (fcc_sock > max_sock) + max_sock = fcc_sock; } - if (mcast_sock && recv_state != RECV_STATE_FCC_REQUESTED) { + if (mcast_sock && recv_state != RECV_STATE_FCC_REQUESTED) + { FD_SET(mcast_sock, &rfds); - if (mcast_sock > max_sock) max_sock = mcast_sock; + if (mcast_sock > max_sock) + max_sock = mcast_sock; } timeout.tv_sec = 5; timeout.tv_usec = 0; /* We use select to get rid of recv stuck if - * multicast group is unoperated. - */ - r=select(max_sock+1, &rfds, NULL, NULL, &timeout); - if (r<0 && errno==EINTR) { + * multicast group is unoperated. + */ + r = select(max_sock + 1, &rfds, NULL, NULL, &timeout); + if (r < 0 && errno == EINTR) + { continue; } - if (r==0) { /* timeout reached */ + if (r == 0) + { /* timeout reached */ exit(RETVAL_SOCK_READ_FAILED); } - if (FD_ISSET(client, &rfds)) { /* client written stg, or conn. lost */ + if (FD_ISSET(client, &rfds)) + { /* client written stg, or conn. lost */ exit(RETVAL_WRITE_FAILED); - } else if (fcc_sock && FD_ISSET(fcc_sock, &rfds)) { + } + else if (fcc_sock && FD_ISSET(fcc_sock, &rfds)) + { actualr = recvfrom(fcc_sock, buf, sizeof(buf), 0, (struct sockaddr *)&peer_addr, &slen); - if (actualr < 0){ + if (actualr < 0) + { logger(LOG_ERROR, "FCC recv failed: %s\n", strerror(errno)); continue; } - if (peer_addr.sin_addr.s_addr != fcc_server->sin_addr.s_addr) { + if (peer_addr.sin_addr.s_addr != fcc_server->sin_addr.s_addr) + { continue; } - if (peer_addr.sin_port == fcc_server->sin_port) { // RTCP signal command - if (buf[1] != 205) { + if (peer_addr.sin_port == fcc_server->sin_port) + { // RTCP signal command + if (buf[1] != 205) + { logger(LOG_DEBUG, "Unrecognized FCC payload type: %u\n", buf[1]); continue; } - if (buf[0] == 0x83) { // FMT 3 - if (buf[12] != 0) { // Result not success + if (buf[0] == 0x83) + { // FMT 3 + if (buf[12] != 0) + { // Result not success logger(LOG_DEBUG, "FCC (FMT 3) gives an error result code: %u\n", buf[12]); mcast_sock = join_mcast_group(service); recv_state = RECV_STATE_MCAST_ACCEPTED; continue; } - uint16_t new_signal_port = *(uint16_t*)(buf+14); + uint16_t new_signal_port = *(uint16_t *)(buf + 14); int signal_port_changed = 0, media_port_changed = 0; - if (new_signal_port && new_signal_port != fcc_server->sin_port) { + if (new_signal_port && new_signal_port != fcc_server->sin_port) + { logger(LOG_DEBUG, "FCC (FMT 3) gives a new signal port: %u\n", ntohs(new_signal_port)); fcc_server->sin_port = new_signal_port; signal_port_changed = 1; } - uint16_t new_media_port = *(uint16_t*)(buf+16); - if (new_media_port && new_media_port != media_port) { + uint16_t new_media_port = *(uint16_t *)(buf + 16); + if (new_media_port && new_media_port != media_port) + { media_port = new_media_port; logger(LOG_DEBUG, "FCC (FMT 3) gives a new media port: %u\n", ntohs(new_media_port)); media_port_changed = 1; } - uint32_t new_fcc_ip = *(uint32_t*)(buf+20); - if (new_fcc_ip && new_fcc_ip != fcc_server->sin_addr.s_addr) { + uint32_t new_fcc_ip = *(uint32_t *)(buf + 20); + if (new_fcc_ip && new_fcc_ip != fcc_server->sin_addr.s_addr) + { fcc_server->sin_addr.s_addr = new_fcc_ip; logger(LOG_DEBUG, "FCC (FMT 3) gives a new FCC ip: %s\n", inet_ntoa(fcc_server->sin_addr)); signal_port_changed = 1; media_port_changed = 1; } - if (buf[13] == 3) { // Redirect to new FCC server + if (buf[13] == 3) + { // Redirect to new FCC server logger(LOG_DEBUG, "FCC (FMT 3) requests a redirection to a new server\n"); recv_state = RECV_STATE_INIT; - } else if (buf[13] != 2) { // Join mcast group instantly + } + else if (buf[13] != 2) + { // Join mcast group instantly logger(LOG_DEBUG, "FCC (FMT 3) requests immediate mcast join, code: %u\n", buf[13]); mcast_sock = join_mcast_group(service); recv_state = RECV_STATE_MCAST_ACCEPTED; - } else { + } + else + { // Send empty packet to make NAT happy - if (conf_fcc_nat_traversal == FCC_NAT_T_PUNCHHOLE) { - if (media_port_changed && media_port) { + if (conf_fcc_nat_traversal == FCC_NAT_T_PUNCHHOLE) + { + if (media_port_changed && media_port) + { struct sockaddr_in sintmp = *fcc_server; sintmp.sin_port = media_port; sendto_triple(fcc_sock, NULL, 0, 0, &sintmp, sizeof(sintmp)); logger(LOG_DEBUG, "Tried to NAT punch hole for media port %u\n", media_port); } - if (signal_port_changed) { + if (signal_port_changed) + { sendto_triple(fcc_sock, NULL, 0, 0, fcc_server, sizeof(*fcc_server)); logger(LOG_DEBUG, "Tried to setup NAT punch hole for signal port %u\n", fcc_server->sin_port); } } logger(LOG_DEBUG, "FCC server accepted the req.\n"); } - } else if (buf[0] == 0x84) { // FMT 4 + } + else if (buf[0] == 0x84) + { // FMT 4 logger(LOG_DEBUG, "FCC (FMT 4) indicates we can now join mcast\n"); mcast_sock = join_mcast_group(service); recv_state = RECV_STATE_MCAST_REQUESTED; } - } else if (peer_addr.sin_port == media_port) { // RTP media packet + } + else if (peer_addr.sin_port == media_port) + { // RTP media packet write_rtp_payload_to_client(client, actualr, buf, &seqn, ¬first); - if (fcc_term_sent && seqn >= fcc_term_seqn - 1) { + if (fcc_term_sent && seqn >= fcc_term_seqn - 1) + { recv_state = RECV_STATE_MCAST_ACCEPTED; } } - } else if (mcast_sock && FD_ISSET(mcast_sock, &rfds)) { + } + else if (mcast_sock && FD_ISSET(mcast_sock, &rfds)) + { actualr = recv(mcast_sock, buf, sizeof(buf), 0); - if (actualr < 0){ + if (actualr < 0) + { logger(LOG_DEBUG, "Mcast recv fail: %s", strerror(errno)); continue; } - if (service->service_type == SERVICE_MUDP) { + if (service->service_type == SERVICE_MUDP) + { writeToClient(client, buf, sizeof(buf)); continue; } - if (recv_state == RECV_STATE_MCAST_ACCEPTED) { - if (mcast_pending_buf) { + if (recv_state == RECV_STATE_MCAST_ACCEPTED) + { + if (mcast_pending_buf) + { writeToClient(client, mcast_pending_buf, mcast_pbuf_len); - free(mcast_pending_buf); mcast_pending_buf = NULL; + free(mcast_pending_buf); + mcast_pending_buf = NULL; seqn = mcast_pbuf_lsqen; logger(LOG_DEBUG, "Flushed mcast pending buffer to client. Term seqn: %u, mcast pending buffer last sqen: %u\n", fcc_term_seqn, mcast_pbuf_lsqen); } write_rtp_payload_to_client(client, actualr, buf, &seqn, ¬first); - } else if (recv_state == RECV_STATE_MCAST_REQUESTED) { - mcast_pbuf_lsqen = ntohs(*(uint16_t *)(buf+2)); - if (!fcc_term_sent) { + } + else if (recv_state == RECV_STATE_MCAST_REQUESTED) + { + mcast_pbuf_lsqen = ntohs(*(uint16_t *)(buf + 2)); + if (!fcc_term_sent) + { fcc_term_seqn = mcast_pbuf_lsqen; r = sendto_triple(fcc_sock, build_fcc_term_pk(service->addr, fcc_term_seqn + 2), FCC_PK_LEN_TERM, 0, fcc_server, sizeof(*fcc_server)); - if (r < 0){ + if (r < 0) + { logger(LOG_ERROR, "Unable to send FCC termination message: %s\n", strerror(errno)); } mcast_pbuf_len = (max(fcc_term_seqn - seqn, 10) + 10) * 2000; @@ -783,11 +914,14 @@ static void startRTPstream(int client, struct services_s *service){ fcc_term_sent = 1; logger(LOG_DEBUG, "FCC term message sent. Mcast pending buffer size: %u\n", mcast_pbuf_len); } - if (mcast_pbuf_full) continue; - if (get_rtp_payload(buf, actualr, &rtp_payload, &payloadlength) < 0) { + if (mcast_pbuf_full) + continue; + if (get_rtp_payload(buf, actualr, &rtp_payload, &payloadlength) < 0) + { continue; } - if (mcast_pbuf_c + payloadlength > mcast_pending_buf + mcast_pbuf_len) { + if (mcast_pbuf_c + payloadlength > mcast_pending_buf + mcast_pbuf_len) + { logger(LOG_ERROR, "Mcast pending buffer is full, video quality may suffer.\n", strerror(errno)); mcast_pbuf_full = 1; continue; @@ -807,7 +941,8 @@ static void startRTPstream(int client, struct services_s *service){ * Service for connected client. * Run in forked thread. */ -void clientService(int s) { +void clientService(int s) +{ char buf[BUFLEN]; FILE *client; int numfields; @@ -820,72 +955,85 @@ void clientService(int s) { client = fdopen(s, "r"); /*read only one line*/ - if (fgets(buf, sizeof(buf), client) == NULL) { + if (fgets(buf, sizeof(buf), client) == NULL) + { exit(RETVAL_READ_FAILED); } - numfields = sscanf(buf,"%ms %ms %c", &method, &url, &httpver); - if(numfields<2) { + numfields = sscanf(buf, "%ms %ms %c", &method, &url, &httpver); + if (numfields < 2) + { logger(LOG_DEBUG, "Non-HTTP input.\n"); } - logger(LOG_INFO,"request: %s %s \n", method, url); + logger(LOG_INFO, "request: %s %s \n", method, url); - if(numfields == 3) { /* Read and discard all headers before replying */ - while(fgets(buf, sizeof(buf), client) != NULL && - strcmp("\r\n", buf) != 0) { - if (strncasecmp("Host: ", buf, 6) == 0) { - hostname = strpbrk(buf+6, ":\r\n"); + if (numfields == 3) + { /* Read and discard all headers before replying */ + while (fgets(buf, sizeof(buf), client) != NULL && + strcmp("\r\n", buf) != 0) + { + if (strncasecmp("Host: ", buf, 6) == 0) + { + hostname = strpbrk(buf + 6, ":\r\n"); if (hostname) - hostname = strndup(buf+6, hostname-buf-6); - logger(LOG_DEBUG, "Host header: %s\n", hostname); - } + hostname = strndup(buf + 6, hostname - buf - 6); + logger(LOG_DEBUG, "Host header: %s\n", hostname); } } + } - if (strcmp(method, "GET") != 0 && strcmp(method, "HEAD") != 0) { + if (strcmp(method, "GET") != 0 && strcmp(method, "HEAD") != 0) + { if (numfields == 3) headers(s, STATUS_501, CONTENT_HTML); - writeToClient(s, (uint8_t*) unimplemented, sizeof(unimplemented)-1); + writeToClient(s, (uint8_t *)unimplemented, sizeof(unimplemented) - 1); exit(RETVAL_UNKNOWN_METHOD); } urlfrom = rindex(url, '/'); - if (urlfrom == NULL || (conf_hostname && strcasecmp(conf_hostname, hostname)!=0)) { + if (urlfrom == NULL || (conf_hostname && strcasecmp(conf_hostname, hostname) != 0)) + { if (numfields == 3) headers(s, STATUS_400, CONTENT_HTML); - writeToClient(s, (uint8_t*) badrequest, sizeof(badrequest)-1); + writeToClient(s, (uint8_t *)badrequest, sizeof(badrequest) - 1); exit(RETVAL_BAD_REQUEST); } - for (servi = services; servi; servi=servi->next) { - if (strcmp(urlfrom+1, servi->url) == 0) + for (servi = services; servi; servi = servi->next) + { + if (strcmp(urlfrom + 1, servi->url) == 0) break; } if (servi == NULL && conf_udpxy) servi = udpxy_parse(url); - free(url); url=NULL; + free(url); + url = NULL; - if (servi == NULL) { + if (servi == NULL) + { if (numfields == 3) headers(s, STATUS_404, CONTENT_HTML); - writeToClient(s, (uint8_t*) serviceNotFound, sizeof(serviceNotFound)-1); + writeToClient(s, (uint8_t *)serviceNotFound, sizeof(serviceNotFound) - 1); exit(RETVAL_CLEAN); } - if (clientcount > conf_maxclients) { /*Too much clients*/ + if (clientcount > conf_maxclients) + { /*Too much clients*/ if (numfields == 3) headers(s, STATUS_503, CONTENT_HTML); - writeToClient(s, (uint8_t*) serviceUnavailable, sizeof(serviceUnavailable)-1); + writeToClient(s, (uint8_t *)serviceUnavailable, sizeof(serviceUnavailable) - 1); exit(RETVAL_CLEAN); } - if (strcmp(method, "HEAD") == 0) { + if (strcmp(method, "HEAD") == 0) + { if (numfields == 3) headers(s, STATUS_200, CONTENT_OSTREAM); exit(RETVAL_CLEAN); } - free(method); method=NULL; + free(method); + method = NULL; if (numfields == 3) headers(s, STATUS_200, CONTENT_OSTREAM); diff --git a/src/rtp2httpd.c b/src/rtp2httpd.c index 3345a03..07ea129 100644 --- a/src/rtp2httpd.c +++ b/src/rtp2httpd.c @@ -34,21 +34,19 @@ #include #include - #include "rtp2httpd.h" - #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ - #define MAX_S 10 /** * Linked list of clients */ -struct client_s { +struct client_s +{ struct sockaddr_storage ss; /* Client host-port */ pid_t pid; struct client_s *next; @@ -56,7 +54,6 @@ struct client_s { static struct client_s *clients; - /* GLOBALS */ struct bindaddr_s *bindaddr = NULL; @@ -72,61 +69,75 @@ int clientcount = 0; * @param format printf style format string * @returns Whatever printf returns */ -int logger(enum loglevel level, const char *format, ...) { +int logger(enum loglevel level, const char *format, ...) +{ va_list ap; - int r=0; - if (conf_verbosity >= level) { + int r = 0; + if (conf_verbosity >= level) + { va_start(ap, format); - r=vfprintf(stderr,format, ap); + r = vfprintf(stderr, format, ap); va_end(ap); } return r; } - -void childhandler(int signum) { /* SIGCHLD handler */ +void childhandler(int signum) +{ /* SIGCHLD handler */ int child; int status; struct client_s *cli, *cli2; int r; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; + while ((child = waitpid(-1, &status, WNOHANG)) > 0) + { - while ( (child = waitpid (-1, &status, WNOHANG)) > 0){ - - for (cli = clients; cli; cli = cli->next) { + for (cli = clients; cli; cli = cli->next) + { if (child == cli->pid) break; } - if (cli != NULL) { - r = getnameinfo((struct sockaddr *) &(cli->ss), sizeof(cli->ss), - hbuf, sizeof(hbuf), - sbuf, sizeof(sbuf), - NI_NUMERICHOST | NI_NUMERICSERV); - if (r) { + if (cli != NULL) + { + r = getnameinfo((struct sockaddr *)&(cli->ss), sizeof(cli->ss), + hbuf, sizeof(hbuf), + sbuf, sizeof(sbuf), + NI_NUMERICHOST | NI_NUMERICSERV); + if (r) + { logger(LOG_ERROR, "getnameinfo failed: %s\n", - gai_strerror(r)); - } else { + gai_strerror(r)); + } + else + { logger(LOG_DEBUG, "Client %s port %s disconnected (%d, %d)\n", - hbuf, sbuf, WEXITSTATUS(status), - WIFSIGNALED(status)); + hbuf, sbuf, WEXITSTATUS(status), + WIFSIGNALED(status)); } /* remove client from the list */ - if (cli == clients) { - clients=cli->next; + if (cli == clients) + { + clients = cli->next; free(cli); - } else { - for (cli2=clients; cli2 != NULL; cli2=cli2->next) { - if (cli2->next == cli) { + } + else + { + for (cli2 = clients; cli2 != NULL; cli2 = cli2->next) + { + if (cli2->next == cli) + { cli2->next = cli->next; free(cli); break; } } } - } else { - if( child != 1 ) + } + else + { + if (child != 1) logger(LOG_ERROR, "Unknown child finished - pid %d\n", child); } @@ -135,8 +146,8 @@ void childhandler(int signum) { /* SIGCHLD handler */ } } - -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ struct addrinfo hints, *res, *ai; struct bindaddr_s *bai; struct sockaddr_storage client; @@ -162,65 +173,79 @@ int main(int argc, char *argv[]) { maxs = 0; nfds = -1; - if (bindaddr == NULL) { + if (bindaddr == NULL) + { bindaddr = newEmptyBindaddr(); } - for (bai=bindaddr; bai; bai=bai->next) { + for (bai = bindaddr; bai; bai = bai->next) + { r = getaddrinfo(bai->node, bai->service, - &hints, &res); - if (r) { + &hints, &res); + if (r) + { logger(LOG_FATAL, "GAI: %s\n", gai_strerror(r)); exit(EXIT_FAILURE); } - for (ai = res; ai && maxs < MAX_S; ai = ai->ai_next) { + for (ai = res; ai && maxs < MAX_S; ai = ai->ai_next) + { s[maxs] = socket(ai->ai_family, ai->ai_socktype, - ai->ai_protocol); + ai->ai_protocol); if (s[maxs] < 0) continue; r = setsockopt(s[maxs], SOL_SOCKET, - SO_REUSEADDR, &on, sizeof(on)); - if (r) { + SO_REUSEADDR, &on, sizeof(on)); + if (r) + { logger(LOG_ERROR, "SO_REUSEADDR " - "failed: %s\n", strerror(errno)); + "failed: %s\n", + strerror(errno)); } #ifdef IPV6_V6ONLY - if (ai->ai_family == AF_INET6) { + if (ai->ai_family == AF_INET6) + { r = setsockopt(s[maxs], IPPROTO_IPV6, - IPV6_V6ONLY, &on, sizeof(on)); - if (r) { + IPV6_V6ONLY, &on, sizeof(on)); + if (r) + { logger(LOG_ERROR, "IPV6_V6ONLY " - "failed: %s\n", strerror(errno)); + "failed: %s\n", + strerror(errno)); } } #endif /* IPV6_V6ONLY */ r = bind(s[maxs], ai->ai_addr, ai->ai_addrlen); - if (r) { + if (r) + { logger(LOG_ERROR, "Cannot bind: %s\n", - strerror(errno)); + strerror(errno)); close(s[maxs]); continue; } r = listen(s[maxs], 0); - if (r) { + if (r) + { logger(LOG_ERROR, "Cannot listen: %s\n", - strerror(errno)); + strerror(errno)); close(s[maxs]); continue; } r = getnameinfo(ai->ai_addr, ai->ai_addrlen, - hbuf, sizeof(hbuf), - sbuf, sizeof(sbuf), - NI_NUMERICHOST | NI_NUMERICSERV); - if (r) { + hbuf, sizeof(hbuf), + sbuf, sizeof(sbuf), + NI_NUMERICHOST | NI_NUMERICSERV); + if (r) + { logger(LOG_ERROR, "getnameinfo failed: %s\n", - gai_strerror(r)); - } else { + gai_strerror(r)); + } + else + { logger(LOG_INFO, "Listening on %s port %s\n", - hbuf, sbuf); + hbuf, sbuf); } if (s[maxs] > nfds) @@ -231,45 +256,54 @@ int main(int argc, char *argv[]) { } freeBindaddr(bindaddr); - if (maxs == 0) { + if (maxs == 0) + { logger(LOG_FATAL, "No socket to listen!\n"); exit(EXIT_FAILURE); } FD_ZERO(&rfd0); - for (i = 0; i < maxs; i++) { + for (i = 0; i < maxs; i++) + { FD_SET(s[i], &rfd0); } - if (conf_daemonise) { + if (conf_daemonise) + { logger(LOG_INFO, "Forking to background...\n"); - if (daemon(1, 0) != 0) { + if (daemon(1, 0) != 0) + { logger(LOG_FATAL, "Cannot fork: %s\n", strerror(errno)); exit(EXIT_FAILURE); } } signal(SIGCHLD, &childhandler); - while (1) { + while (1) + { rfd = rfd0; - r = select(nfds+1, &rfd, NULL, NULL, NULL); - if (r<0) { + r = select(nfds + 1, &rfd, NULL, NULL, NULL); + if (r < 0) + { if (errno == EINTR) continue; - logger(LOG_FATAL,"select() failed: %s\n", - strerror(errno)); + logger(LOG_FATAL, "select() failed: %s\n", + strerror(errno)); exit(EXIT_FAILURE); } - for (i = 0; i < maxs; i++) { - if (FD_ISSET(s[i], &rfd)) { + for (i = 0; i < maxs; i++) + { + if (FD_ISSET(s[i], &rfd)) + { cls = accept(s[i], - (struct sockaddr*) &client, - &client_len); + (struct sockaddr *)&client, + &client_len); /* We have to mask SIGCHLD before we add child to the list*/ sigprocmask(SIG_BLOCK, &childset, NULL); clientcount++; - if ((child = fork())) { /* PARENT */ + if ((child = fork())) + { /* PARENT */ close(cls); newc = malloc(sizeof(struct client_s)); newc->ss = client; @@ -277,22 +311,27 @@ int main(int argc, char *argv[]) { newc->next = clients; clients = newc; - r = getnameinfo((struct sockaddr *) &client, client_len, - hbuf, sizeof(hbuf), - sbuf, sizeof(sbuf), - NI_NUMERICHOST | NI_NUMERICSERV); - if (r) { + r = getnameinfo((struct sockaddr *)&client, client_len, + hbuf, sizeof(hbuf), + sbuf, sizeof(sbuf), + NI_NUMERICHOST | NI_NUMERICSERV); + if (r) + { logger(LOG_ERROR, "getnameinfo failed: %s\n", - gai_strerror(r)); - } else { + gai_strerror(r)); + } + else + { logger(LOG_INFO, "Connection from %s port %s\n", - hbuf, sbuf); + hbuf, sbuf); } sigprocmask(SIG_UNBLOCK, &childset, NULL); - - } else { /* CHILD */ + } + else + { /* CHILD */ sigprocmask(SIG_UNBLOCK, &childset, NULL); - for (j = 0; j < maxs; j++) close(s[j]); + for (j = 0; j < maxs; j++) + close(s[j]); clientService(cls); exit(EXIT_SUCCESS); } @@ -302,13 +341,3 @@ int main(int argc, char *argv[]) { /* Should never reach this */ return 0; } - - - - - - - - - - diff --git a/src/rtp2httpd.h b/src/rtp2httpd.h index 452db57..3398d3b 100644 --- a/src/rtp2httpd.h +++ b/src/rtp2httpd.h @@ -25,7 +25,6 @@ #include #include - #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ @@ -36,23 +35,26 @@ #define CONFIGFILE SYSCONFDIR "/rtp2httpd.conf" -#define max(a,b) ((a)>(b) ? (a):(b)) -#define min(a,b) ((a)<(b) ? (a):(b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min(a, b) ((a) < (b) ? (a) : (b)) -enum loglevel { +enum loglevel +{ LOG_FATAL = 0, /* Always shown */ LOG_ERROR, /* Could be silenced */ LOG_INFO, /* Default verbosity */ LOG_DEBUG }; -enum fcc_nat_traversal { +enum fcc_nat_traversal +{ FCC_NAT_T_DISABLED = 0, FCC_NAT_T_PUNCHHOLE, FCC_NAT_T_NAT_PMP }; -enum service_type { +enum service_type +{ SERVICE_MRTP = 0, SERVICE_MUDP }; @@ -60,7 +62,8 @@ enum service_type { /* * Linked list of adresses to bind */ -struct bindaddr_s { +struct bindaddr_s +{ char *node; char *service; struct bindaddr_s *next; @@ -69,7 +72,8 @@ struct bindaddr_s { /* * Linked list of allowed services */ -struct services_s { +struct services_s +{ char *url; char *msrc; enum service_type service_type; @@ -93,7 +97,6 @@ extern struct services_s *services; extern struct bindaddr_s *bindaddr; extern int clientcount; - /* rtp2httpd.c INTERFACE */ /** @@ -106,7 +109,6 @@ extern int clientcount; */ int logger(enum loglevel level, const char *format, ...); - /* httpclients.c INTERFACE */ /* @@ -129,16 +131,16 @@ void clientService(int s); /* configfile.c INTERFACE */ void parseCmdLine(int argc, char *argv[]); -struct bindaddr_s* newEmptyBindaddr(); -void freeBindaddr(struct bindaddr_s*); +struct bindaddr_s *newEmptyBindaddr(); +void freeBindaddr(struct bindaddr_s *); #endif /* __RTP2HTTPD_H__*/ #ifndef strndupa #define strndupa(s, n) \ - (__extension__ ({const char *__in = (s); \ + (__extension__({const char *__in = (s); \ size_t __len = strnlen (__in, (n)) + 1; \ char *__out = (char *) alloca (__len); \ __out[__len-1] = '\0'; \ - (char *) memcpy (__out, __in, __len-1);})) + (char *) memcpy (__out, __in, __len-1); })) #endif