2000 /* SMTP Reqdir/Reqfil Server for TCP/IP */ /* by Mats Petersson */ /* v1.0 930127 */ #include #include #include #include #include #include #include #include #include FILE* tempfile; FILE* outfile; FILE* reqdatf; char fstr[80]; char commandstr[80]; char tempstr[80]; char tempdir[80]; char roepnaam[80]; char subdir[80],aan[80],dir[80]; char bidstr[5]; char outfname[80]; int bid; struct tm *tbl; time_t t; struct ffblk ffblk; extract(char *s, int p) { char *i; strcpy(s,&fstr[p]); while(s[0] == ' ') strcpy(s,&s[1]); while(i = strrchr(s,'\x20')) i[0] = 0; if( (i != 0) || (i = strrchr(s,'\n')) ) { i[0] = 0; i[1] = 0; } } getdata(FILE* fp) { strcpy(aan,""); strcpy(dir,""); while(fgets(fstr,80,fp)) { if( (! strnicmp(fstr,"From ",5)) && (aan[0] != 0)) return; if(! strnicmp(fstr,"From: ",6)) extract(aan,5); if(! strnicmp(fstr,"Subject: ",9)) extract(dir,8); if(! strnicmp(fstr,"Reply-To: ",10)) extract(aan,9); } } makeheader(char *ftype, char *reqtype) { char datestr[80]; static char *wday[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; static char *mon[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; reqdatf = fopen("request.dat","rt"); if(fscanf(reqdatf,"%s",bidstr) > 0) bid = atoi(bidstr); else { bid = 0; strcpy(bidstr,"0"); } fclose(reqdatf); time(&t); tbl = localtime(&t); sprintf(datestr,"%s, %d %s %d %02d:%02d:%02d CET", wday[tbl->tm_wday],tbl->tm_mday,mon[tbl->tm_mon],tbl->tm_year, tbl->tm_hour,tbl->tm_min,tbl->tm_sec); sprintf(outfname,"spool\\mqueue\\%s.txt",bidstr); outfile = fopen(outfname,"wt"); fprintf(outfile,"Date: %s\n",datestr); fprintf(outfile,"Message-Id: <%s-%s@%s>\n",bidstr,reqtype,roepnaam); fprintf(outfile,"From: %s@%s\n",reqtype,roepnaam); fprintf(outfile,"To: %s\n",aan); fprintf(outfile,"Subject: %s %s\n",ftype,dir); fprintf(outfile,"X-Mailer: SMTP reqdir/reqfil server\n"); fprintf(outfile,"\n"); } makewrkfile(char *reqtype) { sprintf(outfname,"spool\\mqueue\\%s.wrk",bidstr); outfile = fopen(outfname,"wt"); fprintf(outfile,"%s\n",roepnaam); fprintf(outfile,"%s@%s\n",reqtype,roepnaam); fprintf(outfile,"%s\n",aan); fclose(outfile); bid += 2; sprintf(bidstr,"%d\n",bid); reqdatf = fopen("request.dat","wt"); fputs(bidstr,reqdatf); fclose(reqdatf); } reqdir(FILE* rdfile) { int nosuchdir; while(1) { nosuchdir = 0; getdata(rdfile); if((feof(rdfile)) && (aan[0] == 0)) { fclose(rdfile); remove("spool\\mail\\reqdir.txt"); remove("temp.$$$"); return; } sprintf(tempstr,"%s%s",subdir,dir); strcpy(dir,tempstr); makeheader("Directory","reqdir"); if(findfirst(dir,&ffblk,FA_DIREC)) nosuchdir = 1; if (! nosuchdir) { sprintf(commandstr,"dir %s > temp.$$$",dir); system(commandstr); tempfile = fopen("temp.$$$","rt"); while(fgets(fstr,80,tempfile)) if((fstr[0] != ' ') && (fstr[0] != '.')) fputs(fstr,outfile); fclose(tempfile); } else { fprintf(outfile,"Sorry OM\n"); fprintf(outfile,"I can't find %s\n\n",dir); fprintf(outfile,"73's de SMTP reqdir/reqfil server"); } fclose(outfile); makewrkfile("reqdir"); } } splitfile() { tempfile = fopen("temp.$$$","rt"); while(! feof(tempfile)) { fgets(fstr,80,tempfile); if(strstr(fstr," go_7+")) { makeheader("File","reqfil"); fputs(fstr,outfile); do{ fgets(fstr,80,tempfile); fputs(fstr,outfile); } while(! strstr(fstr," stop_7+")); fclose(outfile); makewrkfile("reqfil"); } } fclose(tempfile); } reqfil(FILE* rffile) { FILE* reqfile; unsigned char val1,val2; int result, i; int nosuchfile; char shortfname[8]; while(1) { getdata(rffile); nosuchfile = 0; if((feof(rffile)) && (aan[0] == 0)) { fclose(rffile); remove("spool\\mail\\reqfil.txt"); remove("temp.$$$"); return; } sprintf(tempstr,"%s%s",subdir,dir); strcpy(dir,tempstr); if(findfirst(dir,&ffblk,0)) nosuchfile = 1; if (! nosuchfile) { reqfile = fopen(dir,"rt"); /* BINARY FILE check */ val1 = 0; val2 = 0; for(i = 0;i<300;i++){ fread(&val1,1,1,reqfile); if(val1 > val2) val2 = val1; } fclose(reqfile); if(val2 > 127) { result = spawnl(P_WAIT, searchpath("7plus.exe"), "",dir, NULL); strcpy(shortfname,strrchr(dir,'\\')+1); shortfname[strrchr(shortfname,'.') - shortfname] = 0; sprintf(tempstr,"%s.p??",shortfname); if(! findfirst(tempstr,&ffblk,0)) { sprintf(commandstr,"copy %s temp.$$$ >NUL:",tempstr); system(commandstr); sprintf(commandstr,"del %s",tempstr); system(commandstr); } else { strcat(shortfname,".7pl"); sprintf(commandstr,"copy %s temp.$$$ >NUL:",shortfname); system(commandstr); sprintf(commandstr,"del %s",shortfname); system(commandstr); } splitfile(); clrscr(); } else { makeheader("File","reqfil"); sprintf(commandstr,"copy %s temp.$$$ >NUL:",dir); system(commandstr); tempfile = fopen("temp.$$$","rt"); while(fgets(fstr,80,tempfile)) fputs(fstr,outfile); fclose(tempfile); fclose(outfile); makewrkfile("reqfil"); } } else { makeheader("File","reqfil"); fprintf(outfile,"Sorry OM\n"); fprintf(outfile,"I can't find %s\n\n",dir); fprintf(outfile,"73's de SMTP reqdir/reqfil server"); fclose(outfile); makewrkfile("reqfil"); } } } check() { FILE* reqdirf; FILE* reqfilf; if(reqdirf = fopen("spool\\mail\\reqdir.txt","rt")) reqdir(reqdirf); if(reqfilf = fopen("spool\\mail\\reqfil.txt","rt")) reqfil(reqfilf); } howtouse() { clrscr(); printf(" Request Server for TCP/IP version 1.0\n"); printf("\n"); printf("For correct operation the file 7PLUS.EXE must be in the PATH\n"); printf("\n"); printf("How to use the REQDIR s c96 erver:\n"); printf("Send a message to REQDIR @ to get a directory.\n"); printf("The Subject line must be the name of the directory.\n"); printf("So 'Subject: upload' will check '\\upload\\*.*'\n"); printf("\n"); printf("How to use the REQFIL server:\n"); printf("Send a message to REQFIL @ to get a 7PLUS encoded file.\n"); printf("The subject must be the name of the file.\n"); printf("So 'Subject: upload\\file.ext' sends '\\upload\\file.ext' as\n"); printf("7PLUS encoded file(s).\n"); printf("\n"); printf("ASCII files will be sent as 'normal' messages.\n"); printf("\n"); printf("For all answering there must be an entry in your ALIAS file.\n"); printf("\n"); printf("Options : 0 run the program one time (with the 'AT' command),\n"); printf(" n read mailfile every 'n' seconds (in DV / DD).\n"); printf("\n"); printf("Read the REQUEST.CFG file, made by this server for installation!\n"); getch(); clrscr(); quit(); } init() { FILE* cfgfile; clrscr(); HideCur(); printf("Mail Server v1.0\n"); if(! (cfgfile = fopen("request.cfg","rt"))) { cfgfile = fopen("request.cfg","wt"); fprintf(cfgfile,"# These are the default values for the REQUEST.CFG file.\n"); fprintf(cfgfile,"call sm5sxl # This must be Your Callsign\n"); fprintf(cfgfile,"subdir \\public\\ # This is your base directory\n"); fclose(cfgfile); printf("# These are the default values for the REQUEST.CFG file.\n"); printf("call sm5sxl # This must be Your Callsign\n"); printf("subdir \\public\\ # This is your base directory\n\n"); printf("You must now edit the file REQUEST.CFG for Your configuration!\n"); quit(); } while(fgets(fstr,80,cfgfile)) { if(fstr[0] == 'c') extract(roepnaam,4); if(fstr[0] == 'C') extract(roepnaam,4); if(fstr[0] == 's') extract(subdir,6); if(fstr[0] == 'S') extract(subdir,6); } if(!(reqdatf = fopen("request.dat","rt"))) { reqdatf = fopen("request.dat","wt"); fclose(reqdatf); } else fclose(reqdatf); } quit() { ShowCur(); exit(0); } main(int argc,char **argv) { char ch; int time_int; time_t t; if(argc < 2) howtouse(); init(); time_int = atoi(argv[1]); check(); if(time_int == 0) quit(); t = time(NULL); while ( (ch = bioskey(1) & 0xff) != 27) { gotoxy(1,2); cprintf("Next Action after %02d seconds Timer set to %d Seconds\n", time_int - (int)difftime(time(NULL),t),time_int); if ( (int)difftime(time(NULL),t) == time_int) { check(); t = time(NULL); } } getch(); quit(); } . 0