ref: f5b7c4c3425c5fbf2ff3f6d2e8f546877f36f845
parent: cee3145ab92a46565ddbf00c2cc034464bc8002f
author: Tevo <[email protected]>
date: Thu Nov 5 22:37:09 EST 2020
Remove lsdir, variables are it's own format now
--- a/waffle.c
+++ b/waffle.c
@@ -8,17 +8,13 @@
char *stubhost = "error.host\t1";
char *spacetab = " ";
char *srvroot = "./";
-char *defprog = " \
- # This is a comment and shouldn't be considered\n\
- info system is $sysname on $cputype\n\
- info $objtype \\$notavar $nonexistant \\\\$yay\n\
- lsdir .\n \
+char *defprog = " \n\
+ info $user@$sysname:$querystr\n\
";
enum
{
OP_COMMENT,
- OP_LSDIR,
OP_EXEC,
};
@@ -62,7 +58,6 @@
int op;
} ops[] = {
{"#", OP_COMMENT},
- {"lsdir", OP_LSDIR},
{"exec", OP_EXEC},
{"info", GOPHER_INFO},
@@ -95,7 +90,7 @@
}
/*
- * Like %s, but replaces tabs with spacetab and interpolates variables
+ * Like %s, but replaces tabs with spacetab
*/
#pragma varargck type "G" char*
int
@@ -102,7 +97,7 @@
gopherfmt(Fmt *fmt)
{
String *scratch;
- char *str, *buf;
+ char *str;
int ret = 0;
scratch = s_new();
@@ -113,11 +108,36 @@
case '\t':
ret = fmtprint(fmt, "%s", spacetab);
break;
+ default:
+ fmtprint(fmt, "%c", *str);
+ }
+
+ s_free(scratch);
+ return ret;
+}
+
+/*
+ * Like %G, but interpolates variables
+ */
+#pragma varargck type "V" char*
+int
+varfmt(Fmt *fmt)
+{
+ String *out, *scratch;
+ char *str, *buf;
+ int ret;
+
+ scratch = s_new();
+ out = s_new();
+ str = va_arg(fmt->args, char*);
+ for(; *str != '\0'; str++)
+ switch(*str)
+ {
case '$':
s_restart(scratch);
str++;
- while(!isspace(*str))
+ while(isalnum(*str))
s_putc(scratch, *str++);
str--;
s_terminate(scratch);
@@ -127,8 +147,7 @@
fprint(2, "getenv: %r\n");
else
{
- /* FIXME using %G here resolves variables recursively */
- fmtprint(fmt, "%G", buf);
+ s_append(out, buf);
free(buf);
}
@@ -138,10 +157,14 @@
if(*(str+1) == '$')
str++;
default:
- fmtprint(fmt, "%c", *str);
+ s_putc(out, *str);
}
+ ret = fmtprint(fmt, "%G", s_to_c(out));
+
s_free(scratch);
+ s_free(out);
+
return ret;
}
@@ -153,7 +176,7 @@
va_list args;
va_start(args, fmt);
- fmt = smprint("i%G\t\t%s\r\n", fmt, stubhost);
+ fmt = smprint("i%V\t\t%s\r\n", fmt, stubhost);
n = vfprint(1, fmt, args);
free(fmt);
va_end(args);
@@ -169,7 +192,7 @@
va_list args;
va_start(args, fmt);
- fmt = smprint("3%G\t\t%s\r\n", fmt, stubhost);
+ fmt = smprint("3%V\t\t%s\r\n", fmt, stubhost);
n = vfprint(1, fmt, args);
free(fmt);
va_end(args);
@@ -178,9 +201,9 @@
}
int
-entry(char type, char *name, char *path, char *host, int port)
+entry(char type, char *name, char *path, char *host, char *port)
{
- return print("%c%G\t%G\t%G\t%d\r\n", type, name, path, host, port);
+ return print("%c%V\t%V\t%V\t%V\r\n", type, name, path, host, port);
}
/*
@@ -212,43 +235,6 @@
return strdup(req);
}
-void
-servedir(char *path)
-{
- Dir *dir;
- long n;
- int fd;
-
- dir = dirstat(path);
- if(dir == nil)
- {
- error:
- info("Error: %r");
- entry(GOPHER_DIR, "/", "", "neptune.shrine", 70);
- return;
- }
- if(dir->qid.type&QTDIR)
- {
- free(dir);
- info("%G", path);
- fd = open(path, OREAD);
- if(fd < 0)
- goto error;
- n = dirreadall(fd, &dir);
- if(n < 0)
- goto error;
- for(int c = 0; c < n; c++)
- {
- char *fpath = smprint("%s/%s", path, dir[c].name);
- char type = dir[c].mode&DMDIR ? GOPHER_DIR : GOPHER_FILE;
- entry(type, dir[c].name, fpath, "neptune.shrine", 70);
- free(fpath);
- }
- }
- else
- info("not supported...");
-}
-
String*
getprog(char *path)
{
@@ -268,6 +254,13 @@
return nil;
comm = s_new();
+ /*
+ * funny bug, not sure what triggers this.
+ * maybe we repeatedly get the same memory block
+ * and the leftovers end up being used?
+ */
+ for(char *ptr = comm->base; ptr != comm->end; ptr++)
+ *ptr = 0;
for(; *prog->ptr != '\0'; prog->ptr++)
{
@@ -297,14 +290,11 @@
{
case OP_COMMENT:
break;
- case OP_LSDIR:
- servedir("/usr/tevo");
- break;
case GOPHER_INFO:
- info("%G", line->ptr);
+ info("%V", line->ptr);
break;
case GOPHER_ERR:
- error("%G", line->ptr);
+ error("%V", line->ptr);
break;
case -1:
default:
@@ -334,6 +324,7 @@
} ARGEND;
fmtinstall('G', gopherfmt);
+ fmtinstall('V', varfmt);
req = readrequest();
path = parsepath(s_to_c(req));