]> granicus.if.org Git - rtmpdump/commitdiff
Use AVal for hostname and sockshost, don't allocate hostnames
authorhyc <hyc@400ebc74-4327-4243-bc38-086b20814532>
Fri, 26 Mar 2010 21:07:03 +0000 (21:07 +0000)
committerhyc <hyc@400ebc74-4327-4243-bc38-086b20814532>
Fri, 26 Mar 2010 21:07:03 +0000 (21:07 +0000)
git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@404 400ebc74-4327-4243-bc38-086b20814532

librtmp/parseurl.c
librtmp/rtmp.c
librtmp/rtmp.h
rtmpdump.c
rtmpgw.c
rtmpsuck.c

index d26910ec03d42409c0d3ce0e80ac22d37095d4d8..4f5ff4fcf0656b0e9694a80edc1093b180732cab 100644 (file)
@@ -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!");
        }
index 96a316a28b9855626630d8a9e6c80e2771cd099e..19f90d8e29eaa827af393f4ca83732817ec3c2fb 100644 (file)
@@ -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++;
index 06ea0ce16a7664a119f260ad09cae7aff64245fc..fac4ac2e47dcfb7f0fc80a043b65579e15217511 100644 (file)
@@ -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,
index cc470330a98888823c2f4cd5d2aa5f47516039fc..e464460035fde1ac1355bfe4b56695623e2c748f 100644 (file)
@@ -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);
 
index d549133b29b271486247b0f3974f29abe40e718c..012c9b42fd0794d3cd668077d8ace0ba5c8d36d9 100644 (file)
--- 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;
index e77019afecff23671fdf90093189d61666cbe4c7..066f346cd6cbdc04023eed57cf50c24651a6330c 100644 (file)
@@ -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;