move URL parsing / struct over into libcitadel
authorWilfried Goesgens <dothebart@citadel.org>
Fri, 1 Apr 2011 14:51:48 +0000 (16:51 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Fri, 1 Apr 2011 14:51:48 +0000 (16:51 +0200)
citadel/event_client.h
citadel/modules/smtp/serv_smtpqueue.c
citadel/modules/smtp/smtpqueue.h
libcitadel/Makefile.in
libcitadel/lib/libcitadel.h
libcitadel/lib/urlhandling.c [new file with mode: 0644]

index 57d9204074b612ed4de2889e7ede7c92c4dbf8e1..e98a13a8d574a1acddbc248a64633f8fdca83d45 100644 (file)
@@ -35,9 +35,10 @@ struct AsyncIO {
        StrBuf *Host;
        char service[32];
 
-       /* To cycle through several possible services... */
+       /* To cycle through several possible services... * /
        struct addrinfo *res;
        struct addrinfo *curr_ai;
+       */
 
        /* connection related */
        int IP6;
index 87fbc3865ab29ac48e912601d32db77dd921c72c..65cde8f15354eff3c15ed6e2066ab9bce9b4389e 100644 (file)
@@ -136,16 +136,6 @@ void RemoveQItem(OneQueItem *MyQItem)
        DeleteHashPos(&It);
 }
 
-void FreeURL(ParsedURL** Url)
-{
-       if (*Url != NULL) {
-               FreeStrBuf(&(*Url)->URL);
-               if ((*Url)->Next != NULL)
-                       FreeURL(&(*Url)->Next);
-               free(*Url);
-               *Url = NULL;
-       }
-}
 
 void FreeMailQEntry(void *qv)
 {
@@ -599,78 +589,6 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt)
 
 
 
-int ParseURL(ParsedURL **Url, StrBuf *UrlStr, short DefaultPort)
-{
-       const char *pch, *pEndHost, *pPort, *pCredEnd, *pUserEnd;
-       ParsedURL *url = (ParsedURL *)malloc(sizeof(ParsedURL));
-       memset(url, 0, sizeof(ParsedURL));
-
-       url->af = AF_INET;
-       url->Port =  DefaultPort;
-       /*
-        * http://username:passvoid@[ipv6]:port/url 
-        */
-       url->URL = NewStrBufDup(UrlStr);
-       url->Host = pch = ChrPtr(url->URL);
-       url->LocalPart = strchr(pch, '/');
-       if (url->LocalPart != NULL) {
-               if ((*(url->LocalPart + 1) == '/') && 
-                   (*(url->LocalPart + 2) == ':')) { /* TODO: find default port for this protocol... */
-                       url->Host = url->LocalPart + 3;
-                       url->LocalPart = strchr(url->Host, '/');
-               }
-       }
-       if (url->LocalPart == NULL) {
-               url->LocalPart = pch + StrLength(url->URL);
-       }
-
-       pCredEnd = strchr(pch, '@');
-       if (pCredEnd >= url->LocalPart)
-               pCredEnd = NULL;
-       if (pCredEnd != NULL)
-       {
-               url->User = url->Host;
-               url->Host = pCredEnd + 1;
-               pUserEnd = strchr(url->User, ':');
-               
-               if (pUserEnd > pCredEnd)
-                       pUserEnd = pCredEnd;
-               else {
-                       url->Pass = pUserEnd + 1;
-               }
-               StrBufPeek(url->URL, pUserEnd, 0, '\0');
-               StrBufPeek(url->URL, pCredEnd, 0, '\0');                
-       }
-       
-       pPort = NULL;
-       if (*url->Host == '[') {
-               url->Host ++;
-               pEndHost = strchr(url->Host, ']');
-               if (pEndHost == NULL) {
-                       FreeStrBuf(&url->URL);
-                       free(url);
-                       return 0; /* invalid syntax, no ipv6 */
-               }
-               StrBufPeek(url->URL, pEndHost, 0, '\0');
-               if (*(pEndHost + 1) == ':'){
-                       StrBufPeek(url->URL, pEndHost + 1, 0, '\0');
-                       pPort = pEndHost + 2;
-               }
-               url->af = AF_INET6;
-       }
-       else {
-               pPort = strchr(url->Host, ':');
-               if (pPort != NULL) {
-                       StrBufPeek(url->URL, pPort, 0, '\0');
-                       pPort ++;
-               }
-       }
-       if (pPort != NULL)
-               url->Port = atol(pPort);
-       url->IsIP = inet_pton(url->af, url->Host, &url->Addr);
-       *Url = url;
-       return 1;
-}
 /*
 {
 
index 1ae1034b4eac942ba886bdce7d18aeb65e8dcf23..2b252899a5ba28911ec5c77bcbd1ffe15abc3609 100644 (file)
@@ -2,21 +2,6 @@
 /*               SMTP CLIENT (Queue Management) STUFF                        */
 /*****************************************************************************/
 
-typedef struct ParsedURL ParsedURL;
-struct ParsedURL {
-       StrBuf *URL;
-       unsigned Port;
-       const char *Host;
-       const char *User;
-       const char *Pass;
-       const char *LocalPart;
-       int IsIP;
-       int IPv6;
-       int af;
-       struct hostent *HEnt;
-       struct in6_addr Addr;
-       ParsedURL *Next;
-};
 
 
 #define MaxAttempts 15
index 84234628e65a5419f221ca4d8963b597eec41cf9..66da7e903aa4bf48fc698155f80997455fe59b3c 100755 (executable)
@@ -113,6 +113,7 @@ LIB_OBJS = lib/libcitadel.lo \
        lib/stringbuf.lo \
        lib/json.lo \
        lib/wildfire.lo \
+       lib/urlhandling.o \
        lib/xdgmime/xdgmime.lo \
        lib/xdgmime/xdgmimeglob.lo \
        lib/xdgmime/xdgmimeint.lo \
index d74b9f12d8449cebb8f3991e1d2e9b936de6975f..b16e3296c34f56f5b4a897b6690ffada67d2db88 100644 (file)
@@ -14,6 +14,9 @@
 #include <time.h>
 #include <stdlib.h>
 #include <stdarg.h>
+#include <arpa/inet.h>
+#include <libcitadel.h>
+
 #define LIBCITADEL_VERSION_NUMBER      789
 
 /*
@@ -352,6 +355,26 @@ int LoadIconDir(const char *DirName);
 const char *GetIconFilename(char *MimeType, size_t len);
 
 
+/* URL parsing & connection data */
+typedef struct ParsedURL ParsedURL;
+struct ParsedURL {
+       StrBuf *URL;
+       unsigned Port;
+       const char *Host;
+       const char *User;
+       const char *Pass;
+       const char *LocalPart;
+       int IsIP;
+       int IPv6;
+       int af;
+       struct hostent *HEnt;
+       struct in6_addr Addr;
+       ParsedURL *Next;
+};
+
+void FreeURL(ParsedURL** Url);
+int ParseURL(ParsedURL **Url, StrBuf *UrlStr, unsigned short DefaultPort);
+
 /* tools */
 
 
diff --git a/libcitadel/lib/urlhandling.c b/libcitadel/lib/urlhandling.c
new file mode 100644 (file)
index 0000000..a8856fa
--- /dev/null
@@ -0,0 +1,111 @@
+#include "sysdep.h"
+#include <ctype.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/select.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include "libcitadel.h"
+
+/**
+ * @defgroup URLHandling ParsedURL object to handle connection data
+ */
+
+/**
+ * @ingroup URLHandling
+ * @brief frees a linked list of ParsedURL 
+ * @param Url (list) of ParsedURL to be freet; Pointer is NULL'ed for the caller.
+ */
+void FreeURL(ParsedURL** Url)
+{
+       if (*Url != NULL) {
+               FreeStrBuf(&(*Url)->URL);
+               if ((*Url)->Next != NULL)
+                       FreeURL(&(*Url)->Next);
+               free(*Url);
+               *Url = NULL;
+       }
+}
+
+/**
+ * @ingroup URLHandling
+ * @brief parses the string provided with UrlStr into *Url
+ * @param Url on success this contains the parsed object; needs to be free'd by caller.
+ * @param UrlStr String we should parse into parts
+ * @param DefaultPort Which is the default port here?
+ */
+int ParseURL(ParsedURL **Url, StrBuf *UrlStr, unsigned short DefaultPort)
+{
+       const char *pch, *pEndHost, *pPort, *pCredEnd, *pUserEnd;
+       ParsedURL *url = (ParsedURL *)malloc(sizeof(ParsedURL));
+       memset(url, 0, sizeof(ParsedURL));
+
+       url->af = AF_INET;
+       url->Port =  DefaultPort;
+       /*
+        * http://username:passvoid@[ipv6]:port/url 
+        */
+       url->URL = NewStrBufDup(UrlStr);
+       url->Host = pch = ChrPtr(url->URL);
+       url->LocalPart = strchr(pch, '/');
+       if (url->LocalPart != NULL) {
+               if ((*(url->LocalPart + 1) == '/') && 
+                   (*(url->LocalPart + 2) == ':')) { /* TODO: find default port for this protocol... */
+                       url->Host = url->LocalPart + 3;
+                       url->LocalPart = strchr(url->Host, '/');
+               }
+       }
+       if (url->LocalPart == NULL) {
+               url->LocalPart = pch + StrLength(url->URL);
+       }
+
+       pCredEnd = strchr(pch, '@');
+       if (pCredEnd >= url->LocalPart)
+               pCredEnd = NULL;
+       if (pCredEnd != NULL)
+       {
+               url->User = url->Host;
+               url->Host = pCredEnd + 1;
+               pUserEnd = strchr(url->User, ':');
+               
+               if (pUserEnd > pCredEnd)
+                       pUserEnd = pCredEnd;
+               else {
+                       url->Pass = pUserEnd + 1;
+               }
+               StrBufPeek(url->URL, pUserEnd, 0, '\0');
+               StrBufPeek(url->URL, pCredEnd, 0, '\0');                
+       }
+       
+       pPort = NULL;
+       if (*url->Host == '[') {
+               url->Host ++;
+               pEndHost = strchr(url->Host, ']');
+               if (pEndHost == NULL) {
+                       FreeStrBuf(&url->URL);
+                       free(url);
+                       return 0; /* invalid syntax, no ipv6 */
+               }
+               StrBufPeek(url->URL, pEndHost, 0, '\0');
+               if (*(pEndHost + 1) == ':'){
+                       StrBufPeek(url->URL, pEndHost + 1, 0, '\0');
+                       pPort = pEndHost + 2;
+               }
+               url->af = AF_INET6;
+       }
+       else {
+               pPort = strchr(url->Host, ':');
+               if (pPort != NULL) {
+                       StrBufPeek(url->URL, pPort, 0, '\0');
+                       pPort ++;
+               }
+       }
+       if (pPort != NULL)
+               url->Port = atol(pPort);
+       url->IsIP = inet_pton(url->af, url->Host, &url->Addr);
+       *Url = url;
+       return 1;
+}