str_list_t DLLCALL getNameServerList(void) { #ifdef __unix__ /* Look up DNS server address */ FILE* fp; char* p; char str[128]; str_list_t list; if((list=strListInit())==NULL) return(NULL); if((fp=fopen("/etc/resolv.conf","r"))!=NULL) { while(!feof(fp)) { if(fgets(str,sizeof(str),fp)==NULL) break; truncsp(str); p=str; SKIP_WHITESPACE(p); if(strnicmp(p,"nameserver",10)!=0) /* no match */ continue; FIND_WHITESPACE(p); /* skip "nameserver" */ SKIP_WHITESPACE(p); /* skip more white-space */ strListPush(&list,p); } fclose(fp); } return(list); #elif defined(_WIN32) FIXED_INFO* FixedInfo=NULL; ULONG FixedInfoLen=0; IP_ADDR_STRING* ip; str_list_t list; if((list=strListInit())==NULL) return(NULL); if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_BUFFER_OVERFLOW) { FixedInfo=(FIXED_INFO*)malloc(FixedInfoLen); if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_SUCCESS) { ip=&FixedInfo->DnsServerList; for(; ip!=NULL; ip=ip->Next) strListPush(&list,ip->IpAddress.String); } if(FixedInfo!=NULL) free(FixedInfo); } return(list); #else #error "Need a get_nameserver() implementation for this platform" #endif }
int main(int argc, char **argv) { char revision[16]; int i; str_list_t list; sscanf("$Revision: 1.30 $", "%*s %s", revision); printf("\nFIXSMB v2.10-%s (rev %s) SMBLIB %s - Rebuild Synchronet Message Base\n\n" ,PLATFORM_DESC,revision,smb_lib_ver()); list=strListInit(); for(i=1;i<argc;i++) { if(argv[i][0]=='-') { if(!stricmp(argv[i],"-renumber")) renumber=TRUE; } else strListPush(&list,argv[i]); } if(!strListCount(list)) { printf(usage); exit(1); } atexit(unlock_msgbase); for(i=0;list[i]!=NULL;i++) fixsmb(list[i]); return(0); }
str_list_t csvLineParser(const char* line) { char* p; char* buf; char* tmp; size_t count=0; str_list_t list; if((list=strListInit())==NULL) return(NULL); if((buf=strdup(line))==NULL) { strListFree(&list); return(NULL); } truncsp(buf); for(p=strtok_r(buf,",",&tmp);p;p=strtok_r(NULL,",",&tmp)) strListAppend(&list,p,count++); free(buf); return(list); }
str_list_t dataCreateList(const str_list_t records[], const str_list_t columns, dataLineCreator_t lineCreator) { char* p; str_list_t list; size_t i; size_t li=0; if((list=strListInit())==NULL) return(NULL); if(columns!=NULL) { p=lineCreator(columns); strListAppend(&list,p,li++); free(p); } if(records!=NULL) for(i=0;records[i]!=NULL;i++) { p=lineCreator(records[i]); strListAppend(&list,p,li++); free(p); } return(list); }
str_list_t DLLCALL semfile_list_init(const char* parent, const char* action, const char* service) { char path[MAX_PATH+1]; char hostname[128]; char* p; str_list_t list; if((list=strListInit())==NULL) return(NULL); SAFEPRINTF2(path,"%s%s",parent,action); strListPush(&list,path); SAFEPRINTF3(path,"%s%s.%s",parent,action,service); strListPush(&list,path); if(gethostname(hostname,sizeof(hostname))==0) { SAFEPRINTF3(path,"%s%s.%s",parent,action,hostname); strListPush(&list,path); SAFEPRINTF4(path,"%s%s.%s.%s",parent,action,hostname,service); strListPush(&list,path); if((p=strchr(hostname,'.'))!=NULL) { *p=0; SAFEPRINTF3(path,"%s%s.%s",parent,action,hostname); strListPush(&list,path); SAFEPRINTF4(path,"%s%s.%s.%s",parent,action,hostname,service); strListPush(&list,path); } } return(list); }
static str_list_t str_list_read_file(FILE* fp, str_list_t* lp, size_t max_line_len) { char* buf=NULL; size_t count; str_list_t list; if(max_line_len<1) max_line_len=2048; if(lp==NULL) { if((list = strListInit())==NULL) return(NULL); lp=&list; } if(fp!=NULL) { count=strListCount(*lp); while(!feof(fp)) { if(buf==NULL && (buf=(char*)malloc(max_line_len+1))==NULL) return(NULL); if(fgets(buf,max_line_len+1,fp)==NULL) break; strListAppend(lp, buf, count++); } } if(buf) free(buf); return(*lp); }
static JSBool js_on_exit(JSContext *cx, uintN argc, jsval *arglist) { JSObject *scope=JS_GetScopeChain(cx); JSObject *glob=JS_GetGlobalObject(cx); jsval *argv=JS_ARGV(cx, arglist); global_private_t* pd; str_list_t list; str_list_t oldlist; char *p; JS_SET_RVAL(cx, arglist, JSVAL_VOID); if(glob==scope) { if((pd=(global_private_t*)JS_GetPrivate(cx,glob))==NULL) return(JS_FALSE); if(pd->exit_func==NULL) pd->exit_func=strListInit(); list=pd->exit_func; } else { list=(str_list_t)JS_GetPrivate(cx,scope); if(list==NULL) { list=strListInit(); JS_SetPrivate(cx,scope,list); } } JSVALUE_TO_MSTRING(cx, argv[0], p, NULL); HANDLE_PENDING(cx); if(!p) return JS_TRUE; oldlist=list; strListPush(&list,p); free(p); if(oldlist != list) { if(glob==scope) pd->exit_func=list; else JS_SetPrivate(cx,scope,list); } return(JS_TRUE); }
static JSBool js_on_exit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { js_branch_t* branch; if((branch=(js_branch_t*)JS_GetPrivate(cx,obj))==NULL) return(JS_FALSE); if(branch->exit_func==NULL) branch->exit_func=strListInit(); strListPush(&branch->exit_func,JS_GetStringBytes(JS_ValueToString(cx, argv[0]))); return(JS_TRUE); }
str_list_t DLLCALL listStringList(link_list_t* list) { list_node_t* node; str_list_t str_list; size_t count=0; if(list==NULL) return(NULL); if((str_list=strListInit())==NULL) return(NULL); listLock(list); for(node=list->first; node!=NULL; node=node->next) { if(node->data!=NULL) strListAppend(&str_list, (char*)node->data, count++); } listUnlock(list); return(str_list); }
str_list_t strListSplit(str_list_t* lp, char* str, const char* delimit) { size_t count; char* token; char* tmp; str_list_t list; if(str==NULL || delimit==NULL) return(NULL); if(lp==NULL) { if((list = strListInit())==NULL) return(NULL); lp=&list; count=0; } else count=strListCount(*lp); for(token = strtok_r(str, delimit, &tmp); token!=NULL; token=strtok_r(NULL, delimit, &tmp)) if(strListAppend(lp, token, count++)==NULL) break; return(*lp); }
str_list_t DLLCALL listSubStringList(const list_node_t* node, long max) { long count; str_list_t str_list; link_list_t* list; if(node==NULL) return(NULL); if((str_list=strListInit())==NULL) return(NULL); list=node->list; listLock(list); for(count=0; count<max && node!=NULL; node=node->next) { if(node->data!=NULL) strListAppend(&str_list, (char*)node->data, count++); } listUnlock(list); return(str_list); }
int main(int argc, char **argv) { char str[MAX_PATH+1]; char fname[MAX_PATH+1]; char ini_fname[MAX_PATH+1]; char* p; char* arg; int i; int retval; uint fnames=0; FILE* fp; BOOL tcp_nodelay; char compiler[32]; str_list_t fname_list; fname_list=strListInit(); DESCRIBE_COMPILER(compiler); errfp=stderr; #ifdef __unix__ statfp=stderr; #else statfp=stdout; #endif sscanf("$Revision: 1.77 $", "%*s %s", revision); fprintf(statfp,"\nSynchronet External X/Y/Zmodem v%s-%s" " Copyright %s Rob Swindell\n\n" ,revision ,PLATFORM_DESC ,__DATE__+7 ); xmodem_init(&xm,NULL,&mode,lputs,xmodem_progress,send_byte,recv_byte,is_connected,NULL); zmodem_init(&zm,NULL,lputs,zmodem_progress,send_byte,recv_byte,is_connected,NULL,data_waiting); /* Generate path/sexyz[.host].ini from path/sexyz[.exe] */ SAFECOPY(str,argv[0]); p=getfname(str); SAFECOPY(fname,p); *p=0; if((p=getfext(fname))!=NULL) *p=0; strcat(fname,".ini"); iniFileName(ini_fname,sizeof(ini_fname),str,fname); if((fp=fopen(ini_fname,"r"))!=NULL) fprintf(statfp,"Reading %s\n",ini_fname); tcp_nodelay =iniReadBool(fp,ROOT_SECTION,"TCP_NODELAY",TRUE); telnet =iniReadBool(fp,ROOT_SECTION,"Telnet",TRUE); debug_tx =iniReadBool(fp,ROOT_SECTION,"DebugTx",FALSE); debug_rx =iniReadBool(fp,ROOT_SECTION,"DebugRx",FALSE); debug_telnet =iniReadBool(fp,ROOT_SECTION,"DebugTelnet",FALSE); pause_on_exit =iniReadBool(fp,ROOT_SECTION,"PauseOnExit",FALSE); pause_on_abend =iniReadBool(fp,ROOT_SECTION,"PauseOnAbend",FALSE); log_level =iniReadLogLevel(fp,ROOT_SECTION,"LogLevel",log_level); outbuf.highwater_mark =iniReadInteger(fp,ROOT_SECTION,"OutbufHighwaterMark",1100); outbuf_drain_timeout =iniReadInteger(fp,ROOT_SECTION,"OutbufDrainTimeout",10); outbuf_size =iniReadInteger(fp,ROOT_SECTION,"OutbufSize",16*1024); progress_interval =iniReadInteger(fp,ROOT_SECTION,"ProgressInterval",1); if(iniReadBool(fp,ROOT_SECTION,"Debug",FALSE)) log_level=LOG_DEBUG; xm.send_timeout =iniReadInteger(fp,"Xmodem","SendTimeout",xm.send_timeout); /* seconds */ xm.recv_timeout =iniReadInteger(fp,"Xmodem","RecvTimeout",xm.recv_timeout); /* seconds */ xm.byte_timeout =iniReadInteger(fp,"Xmodem","ByteTimeout",xm.byte_timeout); /* seconds */ xm.ack_timeout =iniReadInteger(fp,"Xmodem","AckTimeout",xm.ack_timeout); /* seconds */ xm.block_size =iniReadInteger(fp,"Xmodem","BlockSize",xm.block_size); /* 128 or 1024 */ xm.max_errors =iniReadInteger(fp,"Xmodem","MaxErrors",xm.max_errors); xm.g_delay =iniReadInteger(fp,"Xmodem","G_Delay",xm.g_delay); zm.init_timeout =iniReadInteger(fp,"Zmodem","InitTimeout",zm.init_timeout); /* seconds */ zm.send_timeout =iniReadInteger(fp,"Zmodem","SendTimeout",zm.send_timeout); /* seconds */ zm.recv_timeout =iniReadInteger(fp,"Zmodem","RecvTimeout",zm.recv_timeout); /* seconds */ zm.crc_timeout =iniReadInteger(fp,"Zmodem","CrcTimeout",zm.crc_timeout); /* seconds */ zm.block_size =iniReadInteger(fp,"Zmodem","BlockSize",zm.block_size); /* 1024 */ zm.max_block_size =iniReadInteger(fp,"Zmodem","MaxBlockSize",zm.max_block_size); /* 1024 or 8192 */ zm.max_errors =iniReadInteger(fp,"Zmodem","MaxErrors",zm.max_errors); zm.recv_bufsize =iniReadInteger(fp,"Zmodem","RecvBufSize",0); zm.no_streaming =!iniReadBool(fp,"Zmodem","Streaming",TRUE); zm.want_fcs_16 =!iniReadBool(fp,"Zmodem","CRC32",TRUE); zm.escape_telnet_iac =iniReadBool(fp,"Zmodem","EscapeTelnetIAC",TRUE); zm.escape_8th_bit =iniReadBool(fp,"Zmodem","Escape8thBit",FALSE); zm.escape_ctrl_chars =iniReadBool(fp,"Zmodem","EscapeCtrlChars",FALSE); dszlog_path =iniReadBool(fp,"DSZLOG","Path",TRUE); dszlog_short =iniReadBool(fp,"DSZLOG","Short",FALSE); dszlog_quotes =iniReadBool(fp,"DSZLOG","Quotes",FALSE); if(fp!=NULL) fclose(fp); if(zm.recv_bufsize > 0xffff) zm.recv_bufsize = 0xffff; if(outbuf_size < MIN_OUTBUF_SIZE) outbuf_size = MIN_OUTBUF_SIZE; else if(outbuf_size > MAX_OUTBUF_SIZE) outbuf_size = MAX_OUTBUF_SIZE; fprintf(statfp,"Output buffer size: %u\n", outbuf_size); RingBufInit(&outbuf, outbuf_size); #if !defined(RINGBUF_EVENT) outbuf_empty=CreateEvent(NULL,/* ManualReset */TRUE, /*InitialState */TRUE,NULL); #endif #if 0 if(argc>1) { fprintf(statfp,"Command line: "); for(i=1;i<argc;i++) fprintf(statfp,"%s ",argv[i]); fprintf(statfp,"\n",statfp); } #endif for(i=1;i<argc;i++) { if(sock==INVALID_SOCKET && isdigit(argv[i][0])) { sock=atoi(argv[i]); continue; } if(!(mode&(SEND|RECV))) { if(toupper(argv[i][0])=='S' || toupper(argv[i][0])=='R') { /* cmd */ if(toupper(argv[i][0])=='R') mode|=RECV; else mode|=SEND; switch(argv[i][1]) { case 'c': case 'C': mode|=XMODEM|CRC; break; case 'x': xm.block_size=128; case 'X': mode|=XMODEM; break; case 'b': /* sz/rz compatible */ case 'B': case 'y': xm.block_size=128; case 'Y': mode|=(YMODEM|CRC); break; case 'g': case 'G': mode|=(YMODEM|CRC|GMODE); break; case 'z': case 'Z': mode|=(ZMODEM|CRC); break; default: fprintf(statfp,"Unrecognized command '%s'\n\n",argv[i]); fprintf(statfp,usage); bail(1); } continue; } if(toupper(argv[i][0])=='V') { fprintf(statfp,"%-8s %s\n",getfname(__FILE__) ,revision); fprintf(statfp,"%-8s %s\n",getfname(xmodem_source()),xmodem_ver(str)); fprintf(statfp,"%-8s %s\n",getfname(zmodem_source()),zmodem_ver(str)); #ifdef _DEBUG fprintf(statfp,"Debug\n"); #endif fprintf(statfp,"Compiled %s %.5s with %s\n",__DATE__,__TIME__,compiler); fprintf(statfp,"%s\n",os_version(str)); bail(0); } arg=argv[i]; if(*arg=='-') { while(*arg=='-') arg++; if(stricmp(arg,"telnet")==0) { telnet=TRUE; continue; } if(stricmp(arg,"rlogin")==0 || stricmp(arg,"ssh")==0 || stricmp(arg,"raw")==0) { telnet=FALSE; continue; } if(stricmp(arg,"debug")==0) { log_level=LOG_DEBUG; continue; } if(stricmp(arg,"quotes")==0) { dszlog_quotes=TRUE; continue; } switch(toupper(*arg)) { case 'K': /* sz/rz compatible */ xm.block_size=1024; break; case 'C': /* sz/rz compatible */ mode|=CRC; break; case '2': zm.max_block_size=2048; break; case '4': zm.max_block_size=4096; break; case '8': /* ZedZap */ zm.max_block_size=8192; break; case 'O': /* disable Zmodem CRC-32 */ zm.want_fcs_16=TRUE; break; case 'S': /* disable Zmodem streaming */ zm.no_streaming=TRUE; break; case 'G': /* Ymodem-G */ mode|=GMODE; break; case 'Y': mode|=OVERWRITE; break; case '!': pause_on_abend=TRUE; break; } } } else if((argv[i][0]=='+' || argv[i][0]=='@') && fexist(argv[i]+1)) { if(mode&RECVDIR) { fprintf(statfp,"!Cannot specify both directory and filename\n"); bail(1); } sprintf(str,"%s",argv[i]+1); if((fp=fopen(str,"r"))==NULL) { fprintf(statfp,"!Error %d opening filelist: %s\n",errno,str); bail(1); } while(!feof(fp) && !ferror(fp)) { if(!fgets(str,sizeof(str),fp)) break; truncsp(str); strListAppend(&fname_list,strdup(str),fnames++); } fclose(fp); } else if(mode&(SEND|RECV)){ if(isdir(argv[i])) { /* is a directory */ if(mode&RECVDIR) { fprintf(statfp,"!Only one directory can be specified\n"); bail(1); } if(fnames) { fprintf(statfp,"!Cannot specify both directory and filename\n"); bail(1); } if(mode&SEND) { fprintf(statfp,"!Cannot send directory '%s'\n",argv[i]); bail(1); } mode|=RECVDIR; } strListAppend(&fname_list,argv[i],fnames++); } } if(!telnet) zm.escape_telnet_iac = FALSE; if(sock==INVALID_SOCKET || sock<1) { #ifdef __unix__ if(STDOUT_FILENO > STDIN_FILENO) sock=STDOUT_FILENO; else sock=STDIN_FILENO; stdio=TRUE; fprintf(statfp,"No socket descriptor specified, using STDIO\n"); telnet=FALSE; #else fprintf(statfp,"!No socket descriptor specified\n\n"); fprintf(errfp,usage); bail(1); #endif } #ifdef __unix__ else statfp=stdout; #endif if(!(mode&(SEND|RECV))) { fprintf(statfp,"!No command specified\n\n"); fprintf(statfp,usage); bail(1); } if(mode&(SEND|XMODEM) && !fnames) { /* Sending with any or recv w/Xmodem */ fprintf(statfp,"!Must specify filename or filelist\n\n"); fprintf(statfp,usage); bail(1); } #ifdef __unix__ if(stdio) { struct termios term; memset(&term,0,sizeof(term)); cfsetispeed(&term,B19200); cfsetospeed(&term,B19200); term.c_iflag &= ~(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); term.c_oflag &= ~OPOST; term.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); term.c_cflag &= ~(CSIZE|PARENB); term.c_cflag |= CS8; atexit(resetterm); tcgetattr(STDOUT_FILENO, &origterm); tcsetattr(STDOUT_FILENO, TCSADRAIN, &term); } #endif /* Code disabled. Why? ToDo */ /* if(mode&RECVDIR) backslash(fname[0]); */ if(!winsock_startup()) bail(-1); /* Enable the Nagle Algorithm */ #ifdef __unix__ if(!stdio) { #endif lprintf(LOG_DEBUG,"Setting TCP_NODELAY to %d",tcp_nodelay); setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char*)&tcp_nodelay,sizeof(tcp_nodelay)); #ifdef __unix__ } #endif if(!socket_check(sock, NULL, NULL, 0)) { lprintf(LOG_WARNING,"No socket connection"); bail(-1); } if((dszlog=getenv("DSZLOG"))!=NULL) { if((logfp=fopen(dszlog,"w"))==NULL) { lprintf(LOG_WARNING,"Error %d opening DSZLOG file: %s",errno,dszlog); bail(-1); } } /* Install Ctrl-C/Break signal handler here */ #if defined(_WIN32) SetConsoleCtrlHandler(ControlHandler, TRUE /* Add */); #elif defined(__unix__) signal(SIGQUIT,break_handler); signal(SIGINT,break_handler); signal(SIGTERM,break_handler); signal(SIGHUP,SIG_IGN); /* Don't die on SIGPIPE */ signal(SIGPIPE,SIG_IGN); #endif #if !SINGLE_THREADED _beginthread(output_thread,0,NULL); #endif if(mode&RECV) retval=receive_files(fname_list, fnames); else retval=send_files(fname_list, fnames); #if !SINGLE_THREADED lprintf(LOG_DEBUG,"Waiting for output buffer to empty... "); if(WaitForEvent(outbuf_empty,5000)!=WAIT_OBJECT_0) lprintf(LOG_DEBUG,"FAILURE"); #endif terminate=TRUE; /* stop output thread */ /* Code disabled. Why? ToDo */ /* sem_post(outbuf.sem); sem_post(outbuf.highwater_sem); */ fprintf(statfp,"Exiting - Error level: %d, flows: %u, select_errors=%u" ,retval, flows, select_errors); fprintf(statfp,"\n"); bail(retval); }
bool sbbs_t::qwk_import_msg(FILE *qwk_fp, char *hdrblk, ulong blocks ,char fromhub, uint subnum ,uint touser, smbmsg_t* msg) { char* body; char* tail; char* qwkbuf; char str[256],col=0,lastch=0,*p; char from[128]; uint i,k; long bodylen,taillen; bool success=false; uint16_t net_type; ushort xlat=XLAT_NONE; int storage=SMB_SELFPACK; long dupechk_hashes=SMB_HASH_SOURCE_DUPE; str_list_t kludges; if(subnum!=INVALID_SUB && (hdrblk[0]=='*' || hdrblk[0]=='+' || cfg.sub[subnum]->misc&SUB_PONLY)) msg->hdr.attr|=MSG_PRIVATE; if(subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_AONLY) msg->hdr.attr|=MSG_ANONYMOUS; if(subnum==INVALID_SUB && cfg.sys_misc&SM_DELREADM) msg->hdr.attr|=MSG_KILLREAD; if((fromhub || useron.rest&FLAG('Q')) && (hdrblk[0]=='*' || hdrblk[0]=='-' || hdrblk[0]=='`')) msg->hdr.attr|=MSG_READ; if(subnum!=INVALID_SUB && !fromhub && cfg.sub[subnum]->mod_ar[0] && chk_ar(cfg.sub[subnum]->mod_ar,&useron,&client)) msg->hdr.attr|=MSG_MODERATED; if(subnum!=INVALID_SUB && !fromhub && cfg.sub[subnum]->misc&SUB_SYSPERM && sub_op(subnum)) msg->hdr.attr|=MSG_PERMANENT; if(!(useron.rest&FLAG('Q')) && !fromhub && msg->hdr.when_written.zone==0) msg->hdr.when_written.zone=sys_timezone(&cfg); msg->hdr.when_imported.time=time32(NULL); msg->hdr.when_imported.zone=sys_timezone(&cfg); hdrblk[116]=0; // don't include number of blocks in "re: msg number" if(!(useron.rest&FLAG('Q')) && !fromhub) msg->hdr.thread_back=atol((char *)hdrblk+108); if(subnum==INVALID_SUB) { /* E-mail */ if(cfg.sys_misc&SM_FASTMAIL) storage=SMB_FASTALLOC; /* duplicate message-IDs must be allowed in mail database */ dupechk_hashes&=~(1<<SMB_HASH_SOURCE_MSG_ID); sprintf(str,"%u",touser); smb_hfield_str(msg,RECIPIENTEXT,str); } else { if(cfg.sub[subnum]->misc&SUB_HYPER) storage = SMB_HYPERALLOC; else if(cfg.sub[subnum]->misc&SUB_FAST) storage = SMB_FASTALLOC; if(cfg.sub[subnum]->misc&SUB_LZH) xlat=XLAT_LZH; } /********************************/ /* Convert the QWK message text */ /********************************/ if((qwkbuf=(char *)malloc((blocks-1)*QWK_BLOCK_LEN))==NULL) { errormsg(WHERE,ERR_ALLOC,"QWK msg buf",(blocks-1)*QWK_BLOCK_LEN); return(false); } if(fread(qwkbuf,QWK_BLOCK_LEN,blocks-1,qwk_fp) != blocks-1) { free(qwkbuf); errormsg(WHERE,ERR_READ,"QWK msg blocks",(blocks-1)*QWK_BLOCK_LEN); } bodylen=0; if((body=(char *)malloc((blocks-1L)*QWK_BLOCK_LEN*2L))==NULL) { free(qwkbuf); errormsg(WHERE,ERR_ALLOC,"QWK msg body",(blocks-1L)*QWK_BLOCK_LEN*2L); return(false); } taillen=0; if((tail=(char *)malloc((blocks-1L)*QWK_BLOCK_LEN*2L))==NULL) { free(qwkbuf); free(body); errormsg(WHERE,ERR_ALLOC,"QWK msg tail",(blocks-1L)*QWK_BLOCK_LEN*2L); return(false); } kludges=strListInit(); for(k=0;k<(blocks-1)*QWK_BLOCK_LEN;k++) { if(qwkbuf[k]==0) continue; if(bodylen==0 && (qwkbuf[k]=='@' || (((useron.qwk&QWK_EXT) || subnum==INVALID_SUB) && (strnicmp(qwkbuf+k,"To:",3)==0 || strnicmp(qwkbuf+k,"From:",5)==0 || strnicmp(qwkbuf+k,"Subject:",8)==0)))) { if((p=strchr(qwkbuf+k, QWK_NEWLINE))==NULL) { body[bodylen++]=qwkbuf[k]; continue; } *p=0; /* Converts QWK_NEWLINE to NUL */ strListPush(&kludges, qwkbuf+k); k+=strlen(qwkbuf+k); continue; } if(!taillen && qwkbuf[k]==' ' && col==3 && bodylen>=3 && body[bodylen-3]=='-' && body[bodylen-2]=='-' && body[bodylen-1]=='-') { bodylen-=3; strcpy(tail,"--- "); /* DO NOT USE SAFECOPY */ taillen=4; col++; continue; } if(qwkbuf[k]==QWK_NEWLINE) { /* expand QWK_NEWLINE to crlf */ if(!bodylen && !taillen) /* Ignore blank lines at top of message */ continue; if(!taillen && col==3 && bodylen>=3 && body[bodylen-3]=='-' && body[bodylen-2]=='-' && body[bodylen-1]=='-') { bodylen-=3; strcpy(tail,"---"); /* DO NOT USE SAFECOPY */ taillen=3; } col=0; if(taillen) { tail[taillen++]=CR; tail[taillen++]=LF; } else { body[bodylen++]=CR; body[bodylen++]=LF; } continue; } /* beep restrict */ if(!fromhub && qwkbuf[k]==BEL && useron.rest&FLAG('B')) continue; /* ANSI restriction */ if(!fromhub && (qwkbuf[k]==CTRL_A || qwkbuf[k]==ESC) && useron.rest&FLAG('A')) continue; if(qwkbuf[k]!=CTRL_A && lastch!=CTRL_A) col++; if(lastch==CTRL_A && !valid_ctrl_a_code(qwkbuf[k])) { if(taillen) taillen--; else bodylen--; lastch=0; continue; } lastch=qwkbuf[k]; if(taillen) tail[taillen++]=qwkbuf[k]; else body[bodylen++]=qwkbuf[k]; } free(qwkbuf); while(bodylen && body[bodylen-1]==' ') bodylen--; /* remove trailing spaces */ if(bodylen>=2 && body[bodylen-2]==CR && body[bodylen-1]==LF) bodylen-=2; while(taillen && tail[taillen-1]<=' ') taillen--; /* remove trailing garbage */ /* Parse QWK Kludges (QWKE standard and SyncQNET legacy) here: */ if(useron.rest&FLAG('Q') || fromhub) { /* QWK Net */ if((p=iniGetString(kludges,ROOT_SECTION,"@VIA",NULL,NULL)) != NULL) { if(!fromhub) set_qwk_flag(QWK_VIA); if(route_circ(p,cfg.sys_id)) { bprintf("\r\nCircular message path: %s\r\n",p); lprintf(LOG_ERR,"Circular message path: %s from %s" ,p,fromhub ? cfg.qhub[fromhub-1]->id:useron.alias); strListFree(&kludges); free(body); free(tail); return(false); } SAFEPRINTF2(str,"%s/%s" ,fromhub ? cfg.qhub[fromhub-1]->id : useron.alias,p); strupr(str); update_qwkroute(str); } else { if(fromhub) SAFECOPY(str,cfg.qhub[fromhub-1]->id); else SAFECOPY(str,useron.alias); } /* From network type & address: */ strupr(str); net_type=NET_QWK; smb_hfield_netaddr(msg, SENDERNETADDR, str, &net_type); smb_hfield_bin(msg,SENDERNETTYPE,net_type); } else { sprintf(str,"%u",useron.number); smb_hfield_str(msg,SENDEREXT,str); if((uint)subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME) SAFECOPY(from,useron.name); else SAFECOPY(from,useron.alias); smb_hfield_str(msg,SENDER,from); } if((p=iniGetString(kludges,ROOT_SECTION,"@MSGID",NULL,NULL)) != NULL) { if(!fromhub) set_qwk_flag(QWK_MSGID); truncstr(p," "); /* Truncate at first space char */ if(msg->id==NULL) smb_hfield_str(msg,RFC822MSGID,p); } if((p=iniGetString(kludges,ROOT_SECTION,"@REPLY",NULL,NULL)) != NULL) { if(!fromhub) set_qwk_flag(QWK_MSGID); truncstr(p," "); /* Truncate at first space char */ if(msg->reply_id==NULL) smb_hfield_str(msg,RFC822REPLYID,p); } if((p=iniGetString(kludges,ROOT_SECTION,"@TZ",NULL,NULL)) != NULL) { if(!fromhub) set_qwk_flag(QWK_TZ); msg->hdr.when_written.zone=(short)ahtoul(p); } if((p=iniGetString(kludges,ROOT_SECTION,"@REPLYTO",NULL,NULL)) != NULL) { if(msg->replyto==NULL) smb_hfield_str(msg,REPLYTO,p); } /* QWKE standard: */ if((p=iniGetString(kludges,ROOT_SECTION,"Subject",NULL,NULL)) != NULL) smb_hfield_replace_str(msg,SUBJECT,p); if((p=iniGetString(kludges,ROOT_SECTION,"To",NULL,NULL)) != NULL) smb_hfield_replace_str(msg,RECIPIENT,p); if((useron.rest&FLAG('Q')) && (p=iniGetString(kludges,ROOT_SECTION,"From",NULL,NULL)) != NULL) smb_hfield_replace_str(msg,SENDER,p); strListFree(&kludges); /* smb_addmsg requires ASCIIZ strings */ body[bodylen]=0; tail[taillen]=0; if(online==ON_REMOTE) bputs(text[WritingIndx]); if(smb.status.max_crcs==0) /* no CRC checking means no body text dupe checking */ dupechk_hashes&=~(1<<SMB_HASH_SOURCE_BODY); if((i=smb_addmsg(&smb,msg,storage,dupechk_hashes,xlat,(uchar*)body,(uchar*)tail))==SMB_SUCCESS) success=true; else if(i==SMB_DUPE_MSG) { bprintf("\r\n!%s\r\n",smb.last_error); if(!fromhub) { if(subnum==INVALID_SUB) { SAFEPRINTF2(str,"%s duplicate e-mail attempt (%s)",useron.alias,smb.last_error); logline(LOG_NOTICE,"E!",str); } else { SAFEPRINTF4(str,"%s duplicate message attempt in %s %s (%s)" ,useron.alias ,cfg.grp[cfg.sub[subnum]->grp]->sname ,cfg.sub[subnum]->lname ,smb.last_error); logline(LOG_NOTICE,"P!",str); } } } else errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); free(body); free(tail); return(success); }