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;
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)
{
-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;
-}
/*
{
/* 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
lib/stringbuf.lo \
lib/json.lo \
lib/wildfire.lo \
+ lib/urlhandling.o \
lib/xdgmime/xdgmime.lo \
lib/xdgmime/xdgmimeglob.lo \
lib/xdgmime/xdgmimeint.lo \
#include <time.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <arpa/inet.h>
+#include <libcitadel.h>
+
#define LIBCITADEL_VERSION_NUMBER 789
/*
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 */
--- /dev/null
+#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;
+}