support + type, thanks pazz0 for the patch - gopherproxy-c - Gopher HTTP proxy in C (CGI)
(HTM) git clone git://git.codemadness.org/gopherproxy-c
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 46a7c58d416fe82d8b2d8aed37f9168574e33e46
(DIR) parent f4621b7ad329dfb9e68e7ee2527dacd73c8aac33
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Wed, 15 May 2019 19:20:27 +0200
support + type, thanks pazz0 for the patch
This supports multiple mirror types. It uses the last non-+ type as described
in the RFC. If a + type is specified without a previous type then it is an
error. Also allow the + type with 'h', because "why not".
Diffstat:
M gopherproxy.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
---
(DIR) diff --git a/gopherproxy.c b/gopherproxy.c
@@ -211,7 +211,7 @@ servedir(const char *server, const char *port, const char *path, const char *par
{
struct visited v;
FILE *fp;
- char line[1024], uri[1024];
+ char line[1024], uri[1024], primarytype;
size_t totalsiz, linenr;
ssize_t n;
int fd, r, i, len;
@@ -232,6 +232,7 @@ servedir(const char *server, const char *port, const char *path, const char *par
die(500, "fdopen: %s\n", strerror(errno));
totalsiz = 0;
+ primarytype = '\0';
for (linenr = 1; fgets(line, sizeof(line), fp); linenr++) {
n = strcspn(line, "\n");
if (line[n] != '\n')
@@ -254,6 +255,11 @@ servedir(const char *server, const char *port, const char *path, const char *par
memset(&v, 0, sizeof(v));
v._type = line[0];
+ if (v._type != '+')
+ primarytype = v._type;
+ else if (!primarytype)
+ die(500, "%s:%s %s:%d: undefined primary server\n",
+ server, port, path, linenr);
/* "username" */
i = 1;
@@ -313,12 +319,12 @@ servedir(const char *server, const char *port, const char *path, const char *par
if (!strcmp(v.port, "70"))
snprintf(uri, sizeof(uri), "%s/%c%s",
- v.server, v._type, v.path);
+ v.server, primarytype, v.path);
else
snprintf(uri, sizeof(uri), "%s:%s/%c%s",
- v.server, v.port, v._type, v.path);
+ v.server, v.port, primarytype, v.path);
- switch (v._type) {
+ switch (primarytype) {
case 'i': /* info */
case '3': /* error */
fputs(typestr(v._type), stdout);
@@ -339,7 +345,7 @@ servedir(const char *server, const char *port, const char *path, const char *par
case '8': /* telnet */
case 'T': /* tn3270 */
fputs(typestr(v._type), stdout);
- printf(" <a href=\"%s://", v._type == '8' ? "telnet" : "tn3270");
+ printf(" <a href=\"%s://", primarytype == '8' ? "telnet" : "tn3270");
if (v.path[0]) {
xmlencode(v.path);
fputs("@", stdout);
@@ -354,7 +360,7 @@ servedir(const char *server, const char *port, const char *path, const char *par
default: /* other */
fputs(typestr(v._type), stdout);
fputs(" <a href=\"", stdout);
- if (v._type == 'h' && !strncmp(v.path, "URL:", sizeof("URL:") - 1)) {
+ if (primarytype == 'h' && !strncmp(v.path, "URL:", sizeof("URL:") - 1)) {
xmlencode(v.path + sizeof("URL:") - 1);
} else {
fputs("?q=", stdout);