summaryrefslogtreecommitdiff
path: root/sqmail-4.3.07/src/setforward.c
diff options
context:
space:
mode:
authorJannis Hoffmann <jannis@fehcom.de>2024-07-09 11:44:11 +0200
committerJannis Hoffmann <jannis@fehcom.de>2024-07-09 11:44:11 +0200
commitf1b71c9fe7dbb4886588a036399cf5ebe16b7c47 (patch)
treee07786aa479c9fb6ee3e537078470aaab5454f80 /sqmail-4.3.07/src/setforward.c
parenta293489ee83c8b05d845a162dc2a4de026f3775d (diff)
removed top level directory
Diffstat (limited to 'sqmail-4.3.07/src/setforward.c')
-rw-r--r--sqmail-4.3.07/src/setforward.c173
1 files changed, 0 insertions, 173 deletions
diff --git a/sqmail-4.3.07/src/setforward.c b/sqmail-4.3.07/src/setforward.c
deleted file mode 100644
index fe17f74..0000000
--- a/sqmail-4.3.07/src/setforward.c
+++ /dev/null
@@ -1,173 +0,0 @@
-#include <unistd.h>
-#include "buffer.h"
-#include "logmsg.h"
-#include "stralloc.h"
-#include "open.h"
-#include "case.h"
-#include "cdbmake.h"
-#include "logmsg.h"
-
-#define WHO "setforward"
-
-int rename(const char *,const char *); // stdio.h
-
-void usage()
-{
- logmsg(WHO,100,USAGE,"setforward data.cdb data.tmp");
-}
-void nomem()
-{
- logmsg(WHO,111,FATAL,"out of memory");
-}
-void missingsemicolon()
-{
- logmsg(WHO,100,FATAL,"final instruction must end with semicolon");
-}
-void extracolon()
-{
- logmsg(WHO,100,FATAL,"double colons are not permitted");
-}
-void extracomma()
-{
- logmsg(WHO,100,FATAL,"commas are not permitted before colons");
-}
-void nulbyte()
-{
- logmsg(WHO,100,FATAL,"NUL bytes are not permitted");
-}
-void longaddress()
-{
- logmsg(WHO,100,FATAL,"addresses over 800 bytes are not permitted");
-}
-
-char *fncdb;
-char *fntmp;
-int fd;
-struct cdb_make cdb;
-stralloc key = {0};
-
-stralloc target = {0}; /* always initialized; no NUL */
-stralloc command = {0}; /* always initialized; no NUL */
-stralloc instr = {0}; /* always initialized */
-
-int flagtarget = 0;
-/* 0: reading target; command is empty; instr is empty */
-/* 1: target is complete; instr still has to be written; reading command */
-
-void writeerr()
-{
- logmsg(WHO,111,FATAL,B("unable to write to: ",fntmp));
-}
-
-void doit(prepend,data,datalen)
-char *prepend;
-char *data;
-int datalen;
-{
- if (!stralloc_copys(&key,prepend)) nomem();
- if (!stralloc_cat(&key,&target)) nomem();
- case_lowerb(key.s,key.len);
- if (cdb_make_add(&cdb,key.s,key.len,data,datalen) == -1)
- writeerr();
-}
-
-int getch(ch)
-char *ch;
-{
- int r;
-
- r = buffer_get(buffer_0small,ch,1);
- if (r == -1)
- logmsg(WHO,111,FATAL,"unable to read input: ");
- return r;
-}
-
-int main(int argc, char **argv)
-{
- char ch;
-
- if (!stralloc_copys(&target,"")) nomem();
- if (!stralloc_copys(&command,"")) nomem();
- if (!stralloc_copys(&instr,"")) nomem();
-
- fncdb = argv[1]; if (!fncdb) usage();
- fntmp = argv[2]; if (!fntmp) usage();
-
- fd = open_trunc(fntmp);
- if (fd == -1)
- logmsg(WHO,111,FATAL,B("unable to create: ",fntmp));
-
- if (cdb_make_start(&cdb,fd) == -1) writeerr();
-
- for (;;) {
- if (!getch(&ch)) goto EOF;
-
- if (ch == '#') {
- while (ch != '\n') if (!getch(&ch)) goto EOF;
- continue;
- }
-
- if (ch == ' ') continue;
- if (ch == '\n') continue;
- if (ch == '\t') continue;
-
- if (ch == ':') {
- if (flagtarget) extracolon();
- flagtarget = 1;
- continue;
- }
-
- if ((ch == ',') || (ch == ';')) {
- if (!flagtarget) extracomma();
- if (command.len) {
- if (command.s[0] == '?') {
- doit("?",command.s + 1,command.len - 1);
- }
- else if ((command.s[0] == '|') || (command.s[0] == '!')) {
- if (!stralloc_cat(&instr,&command)) nomem();
- if (!stralloc_0(&instr)) nomem();
- }
- else if ((command.s[0] == '.') || (command.s[0] == '/')) {
- if (!stralloc_cat(&instr,&command)) nomem();
- if (!stralloc_0(&instr)) nomem();
- }
- else {
- if (command.len > 800) longaddress();
- if (command.s[0] != '&')
- if (!stralloc_cats(&instr,"&")) nomem();
- if (!stralloc_cat(&instr,&command)) nomem();
- if (!stralloc_0(&instr)) nomem();
- }
- }
-
- if (!stralloc_copys(&command,"")) nomem();
-
- if (ch == ';') {
- if (instr.len)
- doit(":",instr.s,instr.len);
-
- if (!stralloc_copys(&target,"")) nomem();
- if (!stralloc_copys(&instr,"")) nomem();
- flagtarget = 0;
- }
- continue;
- }
-
- if (ch == '\\') if (!getch(&ch)) goto EOF;
- if (ch == 0) nulbyte();
- if (!stralloc_append(flagtarget ? &command : &target,&ch)) nomem();
- }
-
- EOF:
- if (flagtarget || target.len)
- missingsemicolon();
-
- if (cdb_make_finish(&cdb) == -1) writeerr();
- if (fsync(fd) == -1) writeerr();
- if (close(fd) == -1) writeerr(); /* NFS stupidity */
-
- if (rename(fntmp,fncdb) == -1)
- logmsg(WHO,111,FATAL,B("unable to move ",fntmp," to: ",fncdb));
-
- _exit(0);
-}