|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/uio.h> ! 3: #include <stdio.h> ! 4: #include <stdlib.h> ! 5: #include <fcntl.h> ! 6: #include <string.h> ! 7: #include <time.h> ! 8: #include <utime.h> ! 9: #include <unistd.h> ! 10: ! 11: #include "sbbs.h" ! 12: #include "chatfuncs.h" ! 13: ! 14: #define PCHAT_LEN 1000 ! 15: ! 16: char usrname[128]; ! 17: ! 18: static node_t node; ! 19: static int nodenum; ! 20: static int in,out; ! 21: static char inpath[MAX_PATH+1]; ! 22: static char outpath[MAX_PATH+1]; ! 23: static scfg_t cfg; ! 24: ! 25: static int togglechat(int on) ! 26: { ! 27: static int org_act; ! 28: int nodefile; ! 29: ! 30: if(getnodedat(&cfg,nodenum,&node,&nodefile)) ! 31: return(-1); ! 32: if(on) { ! 33: org_act=node.action; ! 34: if(org_act==NODE_PCHT) ! 35: org_act=NODE_MAIN; ! 36: node.misc|=NODE_LCHAT; ! 37: } ! 38: else { ! 39: node.action=org_act; ! 40: node.misc&=~NODE_LCHAT; ! 41: } ! 42: if(putnodedat(&cfg,nodenum,&node,nodefile)) ! 43: return(-1); ! 44: return(0); ! 45: } ! 46: ! 47: int chat_open(int node_num, char *ctrl_dir) ! 48: { ! 49: char *p; ! 50: char str[1024]; ! 51: ! 52: /* Read .cfg files here */ ! 53: memset(&cfg,0,sizeof(cfg)); ! 54: cfg.size=sizeof(cfg); ! 55: SAFECOPY(cfg.ctrl_dir,ctrl_dir); ! 56: if(!load_cfg(&cfg, NULL, TRUE, str)) ! 57: return(-1); ! 58: ! 59: nodenum=node_num; ! 60: ! 61: if(getnodedat(&cfg,nodenum,&node,NULL)) ! 62: return(-1); ! 63: ! 64: username(&cfg,node.useron,usrname); ! 65: ! 66: sprintf(outpath,"%slchat.dab",cfg.node_path[nodenum-1]); ! 67: if((out=sopen(outpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE ! 68: ,S_IREAD|S_IWRITE))==-1) { ! 69: return(-1); ! 70: } ! 71: ! 72: sprintf(inpath,"%schat.dab",cfg.node_path[nodenum-1]); ! 73: if((in=sopen(inpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE ! 74: ,S_IREAD|S_IWRITE))==-1) { ! 75: close(out); ! 76: return(-1); ! 77: } ! 78: ! 79: if((p=(char *)malloc(PCHAT_LEN))==NULL) { ! 80: close(in); ! 81: close(out); ! 82: return(-1); ! 83: } ! 84: memset(p,0,PCHAT_LEN); ! 85: write(in,p,PCHAT_LEN); ! 86: write(out,p,PCHAT_LEN); ! 87: free(p); ! 88: lseek(in,0,SEEK_SET); ! 89: lseek(out,0,SEEK_SET); ! 90: ! 91: if(togglechat(TRUE)) ! 92: return(-1); ! 93: return(0); ! 94: } ! 95: ! 96: int chat_check_remote(void) ! 97: { ! 98: time_t now; ! 99: static time_t last_nodechk=0; ! 100: ! 101: now=time(NULL); ! 102: if(now!=last_nodechk) { ! 103: if(getnodedat(&cfg,nodenum,&node,NULL)!=0) ! 104: return(-1); /* Failed to read nodedat! */ ! 105: last_nodechk=now; ! 106: } ! 107: if(node.misc&NODE_LCHAT) ! 108: return(1); /* Still Waiting */ ! 109: ! 110: if(node.status==NODE_WFC || node.status>NODE_QUIET || node.action!=NODE_PCHT) ! 111: return(0); /* Remote has gone away */ ! 112: ! 113: if(in==-1) ! 114: return(0); /* Remote has gone away */ ! 115: ! 116: if(out==-1) ! 117: return(-1); /* Write error or some such */ ! 118: ! 119: return(2); /* Everything is good! */ ! 120: } ! 121: ! 122: int chat_read_byte(void) ! 123: { ! 124: unsigned char ch=0; ! 125: ! 126: if(in==-1) ! 127: return(-1); ! 128: utime(inpath,NULL); ! 129: switch(read(in,&ch,1)) { ! 130: case -1: ! 131: close(in); ! 132: in=-1; ! 133: return(-1); ! 134: case 0: ! 135: if(lseek(in,0,SEEK_SET)==-1); /* Wrapped */ ! 136: return(-1); ! 137: switch(read(in,&ch,1)) { ! 138: case -1: ! 139: close(in); ! 140: in=-1; ! 141: return(-1); ! 142: } ! 143: /* Fall-through */ ! 144: case 1: ! 145: lseek(in,-1L,SEEK_CUR); ! 146: if(ch) { ! 147: write(in,"",1); ! 148: return(ch); ! 149: } ! 150: } ! 151: ! 152: return(0); ! 153: } ! 154: ! 155: int chat_write_byte(unsigned char ch) ! 156: { ! 157: if(out==-1) ! 158: return(-1); ! 159: if(lseek(out,0,SEEK_CUR)>=PCHAT_LEN) ! 160: lseek(out,0,SEEK_SET); ! 161: switch(write(out,&ch,1)) { ! 162: case -1: ! 163: close(out); ! 164: out=-1; ! 165: return(-1); ! 166: } ! 167: utime(outpath,NULL); ! 168: return(0); ! 169: } ! 170: ! 171: int chat_close(void) ! 172: { ! 173: if(in != -1) ! 174: close(in); ! 175: if(out != -1) ! 176: close(out); ! 177: return(togglechat(FALSE)); ! 178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.