summaryrefslogtreecommitdiff
path: root/dist/ipf/lib/load_http.c
diff options
context:
space:
mode:
Diffstat (limited to 'dist/ipf/lib/load_http.c')
-rw-r--r--dist/ipf/lib/load_http.c211
1 files changed, 0 insertions, 211 deletions
diff --git a/dist/ipf/lib/load_http.c b/dist/ipf/lib/load_http.c
deleted file mode 100644
index 9df25939655..00000000000
--- a/dist/ipf/lib/load_http.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/* $NetBSD: load_http.c,v 1.7 2012/02/15 17:55:06 riz Exp $ */
-
-/*
- * Copyright (C) 2006 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * Id: load_http.c,v 1.1.2.2 2009/07/23 20:01:12 darrenr Exp
- */
-
-#include "ipf.h"
-
-/*
- * Because the URL can be included twice into the buffer, once as the
- * full path for the "GET" and once as the "Host:", the buffer it is
- * put in needs to be larger than 512*2 to make room for the supporting
- * text. Why not just use snprintf and truncate? The warning about the
- * URL being too long tells you something is wrong and does not fetch
- * any data - just truncating the URL (with snprintf, etc) and sending
- * that to the server is allowing an unknown and unintentioned action
- * to happen.
- */
-#define MAX_URL_LEN 512
-#define LOAD_BUFSIZE (MAX_URL_LEN * 2 + 128)
-
-/*
- * Format expected is one addres per line, at the start of each line.
- */
-alist_t *
-load_http(char *url)
-{
- char *s, *t, *u, buffer[LOAD_BUFSIZE], *myurl;
- int fd, len, left, port, endhdr, removed;
- alist_t *a, *rtop, *rbot;
- struct sockaddr_in sin;
- struct hostent *host;
- size_t rem;
-
- /*
- * More than this would just be absurd.
- */
- if (strlen(url) > MAX_URL_LEN) {
- fprintf(stderr, "load_http has a URL > %d bytes?!\n",
- MAX_URL_LEN);
- return NULL;
- }
-
- fd = -1;
- rtop = NULL;
- rbot = NULL;
-
- myurl = strdup(url);
- if (myurl == NULL)
- goto done;
-
- rem = sizeof(buffer);
- left = snprintf(buffer, rem, "GET %s HTTP/1.0\r\n", url);
- if (left < 0 || left > rem)
- goto done;
- rem -= left;
-
- s = myurl + 7; /* http:// */
- t = strchr(s, '/');
- if (t == NULL) {
- fprintf(stderr, "load_http has a malformed URL '%s'\n", url);
- goto done;
- }
- *t++ = '\0';
-
- /*
- * 10 is the length of 'Host: \r\n\r\n' below.
- */
- if (strlen(s) + strlen(buffer) + 10 > sizeof(buffer)) {
- fprintf(stderr, "load_http has a malformed URL '%s'\n", url);
- free(myurl);
- return NULL;
- }
-
- u = strchr(s, '@');
- if (u != NULL)
- s = u + 1; /* AUTH */
-
- left = snprintf(buffer + left, rem, "Host: %s\r\n\r\n", s);
- if (left < 0 || left > rem)
- goto done;
- rem -= left;
-
- u = strchr(s, ':');
- if (u != NULL) {
- *u++ = '\0';
- port = atoi(u);
- if (port < 0 || port > 65535)
- goto done;
- } else {
- port = 80;
- }
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_port = htons(port);
-
- if (isdigit((unsigned char)*s)) {
- if (inet_aton(s, &sin.sin_addr) == -1) {
- goto done;
- }
- } else {
- host = gethostbyname(s);
- if (host == NULL)
- goto done;
- memcpy(&sin.sin_addr, host->h_addr_list[0],
- sizeof(sin.sin_addr));
- }
-
- fd = socket(AF_INET, SOCK_STREAM, 0);
- if (fd == -1)
- goto done;
-
- if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
- goto done;
-
- len = strlen(buffer);
- if (write(fd, buffer, len) != len)
- goto done;
-
- s = buffer;
- endhdr = 0;
- left = sizeof(buffer) - 1;
-
- while ((len = read(fd, s, left)) > 0) {
- s[len] = '\0';
- left -= len;
- s += len;
-
- if (endhdr >= 0) {
- if (endhdr == 0) {
- t = strchr(buffer, ' ');
- if (t == NULL)
- continue;
- t++;
- if (*t != '2')
- break;
- }
-
- u = buffer;
- while ((t = strchr(u, '\r')) != NULL) {
- if (t == u) {
- if (*(t + 1) == '\n') {
- u = t + 2;
- endhdr = -1;
- break;
- } else
- t++;
- } else if (*(t + 1) == '\n') {
- endhdr++;
- u = t + 2;
- } else
- u = t + 1;
- }
- if (endhdr >= 0)
- continue;
- removed = (u - buffer) + 1;
- memmove(buffer, u, (sizeof(buffer) - left) - removed);
- s -= removed;
- left += removed;
- }
-
- do {
- t = strchr(buffer, '\n');
- if (t == NULL)
- break;
-
- *t++ = '\0';
- for (u = buffer; isdigit((unsigned char)*u) ||
- (*u == '.'); u++)
- continue;
- if (*u == '/') {
- char *slash;
-
- slash = u;
- u++;
- while (isdigit((unsigned char)*u))
- u++;
- if (!isspace((unsigned char)*u) && *u)
- u = slash;
- }
- *u = '\0';
-
- a = alist_new(4, buffer);
- if (a != NULL) {
- if (rbot != NULL)
- rbot->al_next = a;
- else
- rtop = a;
- rbot = a;
- }
-
- removed = t - buffer;
- memmove(buffer, t, sizeof(buffer) - left - removed);
- s -= removed;
- left += removed;
-
- } while (1);
- }
-
-done:
- if (myurl != NULL)
- free(myurl);
- if (fd != -1)
- close(fd);
- return rtop;
-}