From: hyc Date: Fri, 26 Mar 2010 21:07:03 +0000 (+0000) Subject: Use AVal for hostname and sockshost, don't allocate hostnames X-Git-Tag: v2.4~141 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=23fd58d34ba65175826c619097419569f189db62;p=rtmpdump Use AVal for hostname and sockshost, don't allocate hostnames git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@404 400ebc74-4327-4243-bc38-086b20814532 --- diff --git a/librtmp/parseurl.c b/librtmp/parseurl.c index d26910e..4f5ff4f 100644 --- a/librtmp/parseurl.c +++ b/librtmp/parseurl.c @@ -29,7 +29,7 @@ #include "rtmp_sys.h" #include "log.h" -bool RTMP_ParseURL(const char *url, int *protocol, char **host, unsigned int *port, +bool RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port, AVal *playpath, AVal *app) { char *p, *end, *col, *ques, *slash; @@ -99,11 +99,9 @@ parsehost: hostlen = col - p; if(hostlen < 256) { - *host = malloc(hostlen+1); - strncpy(*host, p, hostlen); - (*host)[hostlen]=0; - - RTMP_Log(RTMP_LOGDEBUG, "Parsed host : %s", *host); + host->av_val = p; + host->av_len = hostlen; + RTMP_Log(RTMP_LOGDEBUG, "Parsed host : %.*s", hostlen, host->av_val); } else { RTMP_Log(RTMP_LOGWARNING, "Hostname exceeds 255 characters!"); } diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c index 96a316a..19f90d8 100644 --- a/librtmp/rtmp.c +++ b/librtmp/rtmp.c @@ -283,9 +283,9 @@ const AVal RTMP_DefaultFlashVer = void RTMP_SetupStream(RTMP *r, int protocol, - const char *hostname, + AVal *host, unsigned int port, - const char *sockshost, + AVal *sockshost, AVal *playpath, AVal *tcUrl, AVal *swfUrl, @@ -300,7 +300,7 @@ RTMP_SetupStream(RTMP *r, uint32_t dLength, bool bLiveStream, long int timeout) { RTMP_Log(RTMP_LOGDEBUG, "Protocol : %s", RTMPProtocolStrings[protocol&7]); - RTMP_Log(RTMP_LOGDEBUG, "Hostname : %s", hostname); + RTMP_Log(RTMP_LOGDEBUG, "Hostname : %.*s", host->av_len, host->av_val); RTMP_Log(RTMP_LOGDEBUG, "Port : %d", port); RTMP_Log(RTMP_LOGDEBUG, "Playpath : %s", playpath->av_val); @@ -343,22 +343,24 @@ RTMP_SetupStream(RTMP *r, } #endif - if (sockshost) + if (sockshost->av_len) { - const char *socksport = strchr(sockshost, ':'); - char *hostname = strdup(sockshost); + const char *socksport = strchr(sockshost->av_val, ':'); + char *hostname = strdup(sockshost->av_val); if (socksport) - hostname[socksport - sockshost] = '\0'; - r->Link.sockshost = hostname; + hostname[socksport - sockshost->av_val] = '\0'; + r->Link.sockshost.av_val = hostname; + r->Link.sockshost.av_len = strlen(hostname); r->Link.socksport = socksport ? atoi(socksport + 1) : 1080; - RTMP_Log(RTMP_LOGDEBUG, "Connecting via SOCKS proxy: %s:%d", r->Link.sockshost, + RTMP_Log(RTMP_LOGDEBUG, "Connecting via SOCKS proxy: %s:%d", r->Link.sockshost.av_val, r->Link.socksport); } else { - r->Link.sockshost = NULL; + r->Link.sockshost.av_val = NULL; + r->Link.sockshost.av_len = 0; r->Link.socksport = 0; } @@ -384,7 +386,7 @@ RTMP_SetupStream(RTMP *r, r->Link.timeout = timeout; r->Link.protocol = protocol; - r->Link.hostname = hostname; + r->Link.hostname = *host; r->Link.port = port; r->Link.playpath = *playpath; @@ -400,8 +402,21 @@ RTMP_SetupStream(RTMP *r, } static bool -add_addr_info(struct sockaddr_in *service, const char *hostname, int port) +add_addr_info(struct sockaddr_in *service, AVal *host, int port) { + char *hostname; + bool ret = true; + if (host->av_val[host->av_len]) + { + hostname = malloc(host->av_len+1); + memcpy(hostname, host->av_val, host->av_len); + hostname[host->av_len] = '\0'; + } + else + { + hostname = host->av_val; + } + service->sin_addr.s_addr = inet_addr(hostname); if (service->sin_addr.s_addr == INADDR_NONE) { @@ -409,13 +424,17 @@ add_addr_info(struct sockaddr_in *service, const char *hostname, int port) if (host == NULL || host->h_addr == NULL) { RTMP_Log(RTMP_LOGERROR, "Problem accessing the DNS. (addr: %s)", hostname); - return false; + ret = false; + goto finish; } service->sin_addr = *(struct in_addr *)host->h_addr; } service->sin_port = htons(port); - return true; +finish: + if (hostname != host->av_val) + free(hostname); + return ret; } bool @@ -525,7 +544,7 @@ bool RTMP_Connect(RTMP *r, RTMPPacket *cp) { struct sockaddr_in service; - if (!r->Link.hostname) + if (!r->Link.hostname.av_len) return false; memset(&service, 0, sizeof(struct sockaddr_in)); @@ -534,13 +553,13 @@ RTMP_Connect(RTMP *r, RTMPPacket *cp) if (r->Link.socksport) { // Connect via SOCKS - if (!add_addr_info(&service, r->Link.sockshost, r->Link.socksport)) + if (!add_addr_info(&service, &r->Link.sockshost, r->Link.socksport)) return false; } else { // Connect directly - if (!add_addr_info(&service, r->Link.hostname, r->Link.port)) + if (!add_addr_info(&service, &r->Link.hostname, r->Link.port)) return false; } @@ -558,7 +577,7 @@ SocksNegotiate(RTMP *r) struct sockaddr_in service; memset(&service, 0, sizeof(struct sockaddr_in)); - add_addr_info(&service, r->Link.hostname, r->Link.port); + add_addr_info(&service, &r->Link.hostname, r->Link.port); unsigned long addr = htonl(service.sin_addr.s_addr); char packet[] = { @@ -3024,7 +3043,7 @@ HTTP_Post(RTMP *r, RTMPTCmd cmd, const char *buf, int len) { char hbuf[512]; int hlen = snprintf(hbuf, sizeof(hbuf), "POST /%s%s/%d HTTP/1.1\r\n" - "Host: %s:%d\r\n" + "Host: %.*s:%d\r\n" "Accept: */*\r\n" "User-Agent: Shockwave Flash\n" "Connection: Keep-Alive\n" @@ -3032,7 +3051,8 @@ HTTP_Post(RTMP *r, RTMPTCmd cmd, const char *buf, int len) "Content-type: application/x-fcs\r\n" "Content-length: %d\r\n\r\n", RTMPT_cmds[cmd], r->m_clientID.av_val ? r->m_clientID.av_val : "", - r->m_msgCounter, r->Link.hostname, r->Link.port, len); + r->m_msgCounter, r->Link.hostname.av_len, r->Link.hostname.av_val, + r->Link.port, len); RTMPSockBuf_Send(&r->m_sb, hbuf, hlen); hlen = RTMPSockBuf_Send(&r->m_sb, buf, len); r->m_msgCounter++; diff --git a/librtmp/rtmp.h b/librtmp/rtmp.h index 06ea0ce..fac4ac2 100644 --- a/librtmp/rtmp.h +++ b/librtmp/rtmp.h @@ -119,7 +119,7 @@ extern "C" typedef struct RTMP_LNK { - const char *hostname; + AVal hostname; unsigned int port; int protocol; @@ -142,7 +142,7 @@ extern "C" int timeout; // number of seconds before connection times out - const char *sockshost; + AVal sockshost; unsigned short socksport; #ifdef CRYPTO @@ -234,16 +234,16 @@ extern "C" RTMPSockBuf m_sb; } RTMP; - bool RTMP_ParseURL(const char *url, int *protocol, char **host, + bool RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port, AVal *playpath, AVal *app); void RTMP_ParsePlaypath(AVal *in, AVal *out); void RTMP_SetBufferMS(RTMP *r, int size); void RTMP_UpdateBufferMS(RTMP *r); void RTMP_SetupStream(RTMP *r, int protocol, - const char *hostname, + AVal *hostname, unsigned int port, - const char *sockshost, + AVal *sockshost, AVal *playpath, AVal *tcUrl, AVal *swfUrl, diff --git a/rtmpdump.c b/rtmpdump.c index cc47033..e464460 100644 --- a/rtmpdump.c +++ b/rtmpdump.c @@ -738,7 +738,7 @@ main(int argc, char **argv) uint32_t nInitialFrameSize = 0; int initialFrameType = 0; // tye: audio or video - char *hostname = 0; + AVal hostname = { 0, 0 }; AVal playpath = { 0, 0 }; AVal subscribepath = { 0, 0 }; int port = -1; @@ -762,7 +762,7 @@ main(int argc, char **argv) uint32_t swfSize = 0; AVal flashVer = { 0, 0 }; AVal token = { 0, 0 }; - char *sockshost = 0; + AVal sockshost = { 0, 0 }; AMFObject extras = {0}; int edepth = 0; @@ -1007,7 +1007,7 @@ main(int argc, char **argv) STR2AVAL(subscribepath, optarg); break; case 'n': - hostname = optarg; + STR2AVAL(hostname, optarg); break; case 'c': port = atoi(optarg); @@ -1026,9 +1026,7 @@ main(int argc, char **argv) break; case 'r': { - AVal parsedApp, parsedPlaypath; - - char *parsedHost = 0; + AVal parsedHost, parsedApp, parsedPlaypath; unsigned int parsedPort = 0; int parsedProtocol = RTMP_PROTOCOL_UNDEFINED; @@ -1042,7 +1040,7 @@ main(int argc, char **argv) } else { - if (hostname == 0) + if (!hostname.av_len) hostname = parsedHost; if (port == -1) port = parsedPort; @@ -1118,7 +1116,7 @@ main(int argc, char **argv) RTMP_debuglevel = RTMP_LOGALL; break; case 'S': - sockshost = optarg; + STR2AVAL(sockshost, optarg); break; default: RTMP_LogPrintf("unknown option: %c\n", opt); @@ -1127,7 +1125,7 @@ main(int argc, char **argv) } } - if (hostname == 0) + if (!hostname.av_len) { RTMP_Log(RTMP_LOGERROR, "You must specify a hostname (--host) or url (-r \"rtmp://host[:port]/playpath\") containing a hostname"); @@ -1212,8 +1210,9 @@ main(int argc, char **argv) { char str[512] = { 0 }; - tcUrl.av_len = snprintf(str, 511, "%s://%s:%d/%.*s", - RTMPProtocolStringsLower[protocol], hostname, port, app.av_len, app.av_val); + tcUrl.av_len = snprintf(str, 511, "%s://%.*s:%d/%.*s", + RTMPProtocolStringsLower[protocol], hostname.av_len, + hostname.av_val, port, app.av_len, app.av_val); tcUrl.av_val = (char *) malloc(tcUrl.av_len + 1); strcpy(tcUrl.av_val, str); } @@ -1234,7 +1233,7 @@ main(int argc, char **argv) RTMP rtmp = { 0 }; RTMP_Init(&rtmp); - RTMP_SetupStream(&rtmp, protocol, hostname, port, sockshost, &playpath, + RTMP_SetupStream(&rtmp, protocol, &hostname, port, &sockshost, &playpath, &tcUrl, &swfUrl, &pageUrl, &app, &auth, &swfHash, swfSize, &flashVer, &subscribepath, dSeek, 0, bLiveStream, timeout); diff --git a/rtmpgw.c b/rtmpgw.c index d549133..012c9b4 100644 --- a/rtmpgw.c +++ b/rtmpgw.c @@ -75,7 +75,7 @@ void stopStreaming(STREAMING_SERVER * server); typedef struct { - char *hostname; + AVal hostname; int rtmpport; int protocol; bool bLiveStream; // is it a live stream? then we can't seek/resume @@ -94,7 +94,7 @@ typedef struct AVal flashVer; AVal token; AVal subscribepath; - char *sockshost; + AVal sockshost; AMFObject extras; int edepth; uint32_t swfSize; @@ -468,7 +468,7 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou } // do necessary checks right here to make sure the combined request of default values and GET parameters is correct - if (req.hostname == 0) + if (!req.hostname.av_len) { RTMP_Log(RTMP_LOGERROR, "You must specify a hostname (--host) or url (-r \"rtmp://host[:port]/playpath\") containing a hostname"); @@ -508,9 +508,9 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou if (req.tcUrl.av_len == 0) { char str[512] = { 0 }; - req.tcUrl.av_len = snprintf(str, 511, "%s://%s:%d/%.*s", - RTMPProtocolStringsLower[req.protocol], - req.hostname, req.rtmpport, req.app.av_len, req.app.av_val); + req.tcUrl.av_len = snprintf(str, 511, "%s://%.*s:%d/%.*s", + RTMPProtocolStringsLower[req.protocol], req.hostname.av_len, + req.hostname.av_val, req.rtmpport, req.app.av_len, req.app.av_val); req.tcUrl.av_val = (char *) malloc(req.tcUrl.av_len + 1); strcpy(req.tcUrl.av_val, str); } @@ -556,7 +556,7 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou RTMP_Log(RTMP_LOGDEBUG, "Setting buffer time to: %dms", req.bufferTime); RTMP_Init(&rtmp); RTMP_SetBufferMS(&rtmp, req.bufferTime); - RTMP_SetupStream(&rtmp, req.protocol, req.hostname, req.rtmpport, req.sockshost, + RTMP_SetupStream(&rtmp, req.protocol, &req.hostname, req.rtmpport, &req.sockshost, &req.playpath, &req.tcUrl, &req.swfUrl, &req.pageUrl, &req.app, &req.auth, &req.swfHash, req.swfSize, &req.flashVer, &req.subscribepath, dSeek, dLength, req.bLiveStream, req.timeout); /* backward compatibility, we always sent this as true before */ @@ -856,7 +856,7 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) STR2AVAL(req->subscribepath, arg); break; case 'n': - req->hostname = arg; + STR2AVAL(req->hostname, arg); break; case 'c': req->rtmpport = atoi(arg); @@ -883,8 +883,7 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) { req->rtmpurl = arg; - AVal parsedPlaypath, parsedApp; - char *parsedHost = 0; + AVal parsedHost, parsedPlaypath, parsedApp; unsigned int parsedPort = 0; int parsedProtocol = RTMP_PROTOCOL_UNDEFINED; @@ -896,7 +895,7 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) } else { - if (req->hostname == 0) + if (!req->hostname.av_len) req->hostname = parsedHost; if (req->rtmpport == -1) req->rtmpport = parsedPort; @@ -949,7 +948,7 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) STR2AVAL(req->token, arg); break; case 'S': - req->sockshost = arg; + STR2AVAL(req->sockshost, arg); case 'q': RTMP_debuglevel = RTMP_LOGCRIT; break; diff --git a/rtmpsuck.c b/rtmpsuck.c index e77019a..066f346 100644 --- a/rtmpsuck.c +++ b/rtmpsuck.c @@ -250,15 +250,17 @@ ServeInvoke(STREAMING_SERVER *server, int which, RTMPPacket *pack, const char *b r2 = malloc(len+1); memcpy(r2, r1, len); r2[len] = '\0'; - server->rc.Link.hostname = (const char *)r2; - r1 = strrchr(server->rc.Link.hostname, ':'); + server->rc.Link.hostname.av_val = r2; + r1 = strrchr(r2, ':'); if (r1) { + server->rc.Link.hostname.av_len = r1 - r2; *r1++ = '\0'; server->rc.Link.port = atoi(r1); } else { + server->rc.Link.hostname.av_len = len; server->rc.Link.port = 1935; } } @@ -965,8 +967,7 @@ cleanup: server->f_cur = NULL; free(buf); /* Should probably be done by RTMP_Close() ... */ - free((void *)server->rc.Link.hostname); - server->rc.Link.hostname = NULL; + server->rc.Link.hostname.av_val = NULL; server->rc.Link.tcUrl.av_val = NULL; server->rc.Link.swfUrl.av_val = NULL; server->rc.Link.pageUrl.av_val = NULL;