|
|
1.1 ! root 1: /* NODE.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /* Synchronet BBS Node control program */ ! 6: ! 7: #include <stdio.h> ! 8: #include <stdlib.h> ! 9: #include <io.h> ! 10: #include <dos.h> ! 11: #include <fcntl.h> ! 12: #include <string.h> ! 13: #include "sbbsdefs.h" ! 14: ! 15: enum { ! 16: MODE_LIST ! 17: ,MODE_ANON ! 18: ,MODE_LOCK ! 19: ,MODE_INTR ! 20: ,MODE_RRUN ! 21: ,MODE_DOWN ! 22: ,MODE_EVENT ! 23: ,MODE_NOPAGE ! 24: ,MODE_NOALERTS ! 25: ,MODE_STATUS ! 26: ,MODE_USERON ! 27: ,MODE_ACTION ! 28: ,MODE_ERRORS ! 29: ,MODE_MISC ! 30: ,MODE_CONN ! 31: ,MODE_AUX ! 32: ,MODE_EXTAUX ! 33: }; ! 34: ! 35: char tmp[256]; ! 36: int nodefile; ! 37: ! 38: /****************************************************************************/ ! 39: /* Reads the data for node number 'number' into the structure 'node' */ ! 40: /* from NODE.DAB */ ! 41: /* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ ! 42: /****************************************************************************/ ! 43: void getnodedat(uchar number, node_t *node, char lockit) ! 44: { ! 45: char str[256]; ! 46: int count=0; ! 47: ! 48: number--; /* make zero based */ ! 49: while(count<LOOP_NODEDAB) { ! 50: lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); ! 51: if(lockit ! 52: && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) { ! 53: count++; ! 54: continue; } ! 55: if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) ! 56: break; ! 57: count++; } ! 58: if(count) ! 59: printf("NODE.DAB COLLISION (READ) - Count:%d\n",count); ! 60: if(count==LOOP_NODEDAB) { ! 61: printf("Error reading nodefile for node %d\n",number+1); ! 62: return; } ! 63: } ! 64: ! 65: /****************************************************************************/ ! 66: /* Write the data from the structure 'node' into NODE.DAB */ ! 67: /* getnodedat(num,&node,1); must have been called before calling this func */ ! 68: /* NOTE: ------^ the indicates the node record has been locked */ ! 69: /****************************************************************************/ ! 70: void putnodedat(uchar number, node_t node) ! 71: { ! 72: char str[256]; ! 73: int count; ! 74: ! 75: number--; /* make zero based */ ! 76: lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); ! 77: if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { ! 78: unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); ! 79: printf("Error writing to nodefile for node %d\n",number+1); ! 80: return; } ! 81: unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); ! 82: } ! 83: ! 84: /****************************************************************************/ ! 85: /* Unpacks the password 'pass' from the 5bit ASCII inside node_t. 32bits in */ ! 86: /* node.extaux, and the other 8bits in the upper byte of node.aux */ ! 87: /****************************************************************************/ ! 88: char *unpackchatpass(char *pass, node_t node) ! 89: { ! 90: char bits; ! 91: int i; ! 92: ! 93: pass[0]=(node.aux&0x1f00)>>8; ! 94: pass[1]=((node.aux&0xe000)>>13)|((node.extaux&0x3)<<3); ! 95: bits=2; ! 96: for(i=2;i<8;i++) { ! 97: pass[i]=(node.extaux>>bits)&0x1f; ! 98: bits+=5; } ! 99: pass[8]=0; ! 100: for(i=0;i<8;i++) ! 101: if(pass[i]) ! 102: pass[i]+=64; ! 103: return(pass); ! 104: } ! 105: ! 106: /****************************************************************************/ ! 107: /* Displays the information for node number 'number' contained in 'node' */ ! 108: /****************************************************************************/ ! 109: void printnodedat(uchar number, node_t node) ! 110: { ! 111: uint i; ! 112: char hour,mer[3]; ! 113: ! 114: printf("Node %2d: ",number); ! 115: switch(node.status) { ! 116: case NODE_WFC: ! 117: printf("Waiting for call"); ! 118: break; ! 119: case NODE_OFFLINE: ! 120: printf("Offline"); ! 121: break; ! 122: case NODE_NETTING: ! 123: printf("Networking"); ! 124: break; ! 125: case NODE_LOGON: ! 126: printf("At logon prompt"); ! 127: break; ! 128: case NODE_EVENT_WAITING: ! 129: printf("Waiting for all nodes to become inactive"); ! 130: break; ! 131: case NODE_EVENT_LIMBO: ! 132: printf("Waiting for node %d to finish external event",node.aux); ! 133: break; ! 134: case NODE_EVENT_RUNNING: ! 135: printf("Running external event"); ! 136: break; ! 137: case NODE_NEWUSER: ! 138: printf("New user"); ! 139: printf(" applying for access "); ! 140: if(!node.connection) ! 141: printf("Locally"); ! 142: else ! 143: printf("at %ubps",node.connection); ! 144: break; ! 145: case NODE_QUIET: ! 146: case NODE_INUSE: ! 147: printf("User #%d",node.useron); ! 148: printf(" "); ! 149: switch(node.action) { ! 150: case NODE_MAIN: ! 151: printf("at main menu"); ! 152: break; ! 153: case NODE_RMSG: ! 154: printf("reading messages"); ! 155: break; ! 156: case NODE_RMAL: ! 157: printf("reading mail"); ! 158: break; ! 159: case NODE_RSML: ! 160: printf("reading sent mail"); ! 161: break; ! 162: case NODE_RTXT: ! 163: printf("reading text files"); ! 164: break; ! 165: case NODE_PMSG: ! 166: printf("posting message"); ! 167: break; ! 168: case NODE_SMAL: ! 169: printf("sending mail"); ! 170: break; ! 171: case NODE_AMSG: ! 172: printf("posting auto-message"); ! 173: break; ! 174: case NODE_XTRN: ! 175: if(!node.aux) ! 176: printf("at external program menu"); ! 177: else ! 178: printf("running external program #%d",node.aux); ! 179: break; ! 180: case NODE_DFLT: ! 181: printf("changing defaults"); ! 182: break; ! 183: case NODE_XFER: ! 184: printf("at transfer menu"); ! 185: break; ! 186: case NODE_RFSD: ! 187: printf("retrieving from device #%d",node.aux); ! 188: break; ! 189: case NODE_DLNG: ! 190: printf("downloading"); ! 191: break; ! 192: case NODE_ULNG: ! 193: printf("uploading"); ! 194: break; ! 195: case NODE_BXFR: ! 196: printf("transferring bidirectional"); ! 197: break; ! 198: case NODE_LFIL: ! 199: printf("listing files"); ! 200: break; ! 201: case NODE_LOGN: ! 202: printf("logging on"); ! 203: break; ! 204: case NODE_LCHT: ! 205: printf("in local chat with sysop"); ! 206: break; ! 207: case NODE_MCHT: ! 208: if(node.aux) { ! 209: printf("in multinode chat channel %d",node.aux&0xff); ! 210: if(node.aux&0x1f00) { /* password */ ! 211: putchar('*'); ! 212: printf(" %s",unpackchatpass(tmp,node)); } } ! 213: else ! 214: printf("in multinode global chat channel"); ! 215: break; ! 216: case NODE_PAGE: ! 217: printf("paging node %u for private chat",node.aux); ! 218: break; ! 219: case NODE_PCHT: ! 220: printf("in private chat with node %u",node.aux); ! 221: break; ! 222: case NODE_GCHT: ! 223: printf("chatting with The Guru"); ! 224: break; ! 225: case NODE_CHAT: ! 226: printf("in chat section"); ! 227: break; ! 228: case NODE_TQWK: ! 229: printf("transferring QWK packet"); ! 230: break; ! 231: case NODE_SYSP: ! 232: printf("performing sysop activities"); ! 233: break; ! 234: default: ! 235: printf(itoa(node.action,tmp,10)); ! 236: break; } ! 237: if(!node.connection) ! 238: printf(" locally"); ! 239: else ! 240: printf(" at %ubps",node.connection); ! 241: if(node.action==NODE_DLNG) { ! 242: if((node.aux/60)>=12) { ! 243: if(node.aux/60==12) ! 244: hour=12; ! 245: else ! 246: hour=(node.aux/60)-12; ! 247: strcpy(mer,"pm"); } ! 248: else { ! 249: if((node.aux/60)==0) /* 12 midnite */ ! 250: hour=12; ! 251: else hour=node.aux/60; ! 252: strcpy(mer,"am"); } ! 253: printf(" ETA %02d:%02d %s" ! 254: ,hour,node.aux-((node.aux/60)*60),mer); } ! 255: break; } ! 256: if(node.misc&(NODE_LOCK|NODE_POFF|NODE_AOFF|NODE_MSGW|NODE_NMSG)) { ! 257: printf(" ("); ! 258: if(node.misc&NODE_AOFF) ! 259: putchar('A'); ! 260: if(node.misc&NODE_LOCK) ! 261: putchar('L'); ! 262: if(node.misc&(NODE_MSGW|NODE_NMSG)) ! 263: putchar('M'); ! 264: if(node.misc&NODE_POFF) ! 265: putchar('P'); ! 266: putchar(')'); } ! 267: if(((node.misc ! 268: &(NODE_ANON|NODE_UDAT|NODE_INTR|NODE_RRUN|NODE_EVENT|NODE_DOWN)) ! 269: || node.status==NODE_QUIET)) { ! 270: printf(" ["); ! 271: if(node.misc&NODE_ANON) ! 272: putchar('A'); ! 273: if(node.misc&NODE_INTR) ! 274: putchar('I'); ! 275: if(node.misc&NODE_RRUN) ! 276: putchar('R'); ! 277: if(node.misc&NODE_UDAT) ! 278: putchar('U'); ! 279: if(node.status==NODE_QUIET) ! 280: putchar('Q'); ! 281: if(node.misc&NODE_EVENT) ! 282: putchar('E'); ! 283: if(node.misc&NODE_DOWN) ! 284: putchar('D'); ! 285: putchar(']'); } ! 286: if(node.errors) ! 287: printf(" %d error%c",node.errors, node.errors>1 ? 's' : '\0' ); ! 288: printf("\n"); ! 289: } ! 290: ! 291: ! 292: /****************************/ ! 293: /* Main program entry point */ ! 294: /****************************/ ! 295: int main(int argc, char **argv) ! 296: { ! 297: char str[256],ctrl_dir[41],*p,debug=0; ! 298: uchar sys_nodes,node_num=0,onoff=0; ! 299: uint i,j,mode=0,misc; ! 300: long value; ! 301: node_t node; ! 302: ! 303: printf("\nSynchronet Node Display/Control Utility v1.03\n\n"); ! 304: ! 305: if(argc<2) { ! 306: printf("usage: node [/debug] [action [on|off]] [node numbers] [...]" ! 307: "\n\n"); ! 308: printf("actions (default is list):\n\n"); ! 309: printf("list = list status\n"); ! 310: printf("anon = anonymous user\n"); ! 311: printf("lock = locked\n"); ! 312: printf("intr = interrupt\n"); ! 313: printf("down = shut-down\n"); ! 314: printf("rerun = rerun\n"); ! 315: printf("event = run event\n"); ! 316: printf("nopage = page disable\n"); ! 317: printf("noalerts = activity alerts disable\n"); ! 318: printf("status=# = set status value\n"); ! 319: printf("useron=# = set useron number\n"); ! 320: printf("action=# = set action value\n"); ! 321: printf("errors=# = set error counter\n"); ! 322: printf("conn=# = set connection value\n"); ! 323: printf("misc=# = set misc value\n"); ! 324: printf("aux=# = set aux value\n"); ! 325: printf("extaux=# = set extended aux value\n"); ! 326: exit(0); } ! 327: ! 328: p=getenv("SBBSCTRL"); ! 329: if(p==NULL) { ! 330: printf("\7\nSBBSCTRL environment variable is not set.\n"); ! 331: printf("This environment variable must be set to your CTRL directory."); ! 332: printf("\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n"); ! 333: exit(1); } ! 334: sprintf(ctrl_dir,"%.40s",p); ! 335: strupr(ctrl_dir); ! 336: if(ctrl_dir[strlen(ctrl_dir)-1]!='\\') ! 337: strcat(ctrl_dir,"\\"); ! 338: ! 339: sprintf(str,"%sNODE.DAB",ctrl_dir); ! 340: if((nodefile=open(str,O_RDWR|O_DENYNONE|O_BINARY))==-1) { ! 341: printf("\7\nError opening %s.\n",str); ! 342: exit(1); } ! 343: ! 344: sys_nodes=filelength(nodefile)/sizeof(node_t); ! 345: if(!sys_nodes) { ! 346: printf("%s reflects 0 nodes!\n",str); ! 347: exit(1); } ! 348: ! 349: for(i=1;i<argc;i++) { ! 350: if(isdigit(argv[i][0])) ! 351: node_num=atoi(argv[i]); ! 352: else { ! 353: node_num=onoff=value=0; ! 354: if(!stricmp(argv[i],"/DEBUG")) ! 355: debug=1; ! 356: else if(!stricmp(argv[i],"LOCK")) ! 357: mode=MODE_LOCK; ! 358: else if(!stricmp(argv[i],"ANON")) ! 359: mode=MODE_ANON; ! 360: else if(!stricmp(argv[i],"INTR")) ! 361: mode=MODE_INTR; ! 362: else if(!stricmp(argv[i],"DOWN")) ! 363: mode=MODE_DOWN; ! 364: else if(!stricmp(argv[i],"RERUN")) ! 365: mode=MODE_RRUN; ! 366: else if(!stricmp(argv[i],"EVENT")) ! 367: mode=MODE_EVENT; ! 368: else if(!stricmp(argv[i],"NOPAGE")) ! 369: mode=MODE_NOPAGE; ! 370: else if(!stricmp(argv[i],"NOALERTS")) ! 371: mode=MODE_NOALERTS; ! 372: else if(!stricmp(argv[i],"ON")) ! 373: onoff=1; ! 374: else if(!stricmp(argv[i],"OFF")) ! 375: onoff=2; ! 376: else if(!strnicmp(argv[i],"STATUS=",7)) { ! 377: mode=MODE_STATUS; ! 378: value=atoi(argv[i]+7); } ! 379: else if(!strnicmp(argv[i],"ERRORS=",7)) { ! 380: mode=MODE_ERRORS; ! 381: value=atoi(argv[i]+7); } ! 382: else if(!strnicmp(argv[i],"USERON=",7)) { ! 383: mode=MODE_USERON; ! 384: value=atoi(argv[i]+7); } ! 385: else if(!strnicmp(argv[i],"ACTION=",7)) { ! 386: mode=MODE_ACTION; ! 387: value=atoi(argv[i]+7); } ! 388: else if(!strnicmp(argv[i],"CONN=",5)) { ! 389: mode=MODE_CONN; ! 390: value=atoi(argv[i]+5); } ! 391: else if(!strnicmp(argv[i],"MISC=",5)) { ! 392: mode=MODE_MISC; ! 393: value=atoi(argv[i]+5); } ! 394: else if(!strnicmp(argv[i],"AUX=",4)) { ! 395: mode=MODE_AUX; ! 396: value=atoi(argv[i]+4); } ! 397: else if(!strnicmp(argv[i],"EXTAUX=",7)) { ! 398: mode=MODE_EXTAUX; ! 399: value=atoi(argv[i]+7); } ! 400: } ! 401: if((mode && node_num) || i+1==argc) ! 402: for(j=1;j<=sys_nodes;j++) ! 403: if(!node_num || j==node_num) { ! 404: getnodedat(j,&node,1); ! 405: misc=0; ! 406: switch(mode) { ! 407: case MODE_ANON: ! 408: misc=NODE_ANON; ! 409: break; ! 410: case MODE_LOCK: ! 411: misc=NODE_LOCK; ! 412: break; ! 413: case MODE_INTR: ! 414: misc=NODE_INTR; ! 415: break; ! 416: case MODE_DOWN: ! 417: misc=NODE_DOWN; ! 418: break; ! 419: case MODE_RRUN: ! 420: misc=NODE_RRUN; ! 421: break; ! 422: case MODE_EVENT: ! 423: misc=NODE_EVENT; ! 424: break; ! 425: case MODE_NOPAGE: ! 426: misc=NODE_POFF; ! 427: break; ! 428: case MODE_NOALERTS: ! 429: misc=NODE_AOFF; ! 430: break; ! 431: case MODE_STATUS: ! 432: node.status=value; ! 433: break; ! 434: case MODE_ERRORS: ! 435: node.errors=value; ! 436: break; ! 437: case MODE_ACTION: ! 438: node.action=value; ! 439: break; ! 440: case MODE_USERON: ! 441: node.useron=value; ! 442: break; ! 443: case MODE_MISC: ! 444: node.misc=value; ! 445: break; ! 446: case MODE_CONN: ! 447: node.connection=value; ! 448: break; ! 449: case MODE_AUX: ! 450: node.aux=value; ! 451: break; ! 452: case MODE_EXTAUX: ! 453: node.extaux=value; ! 454: break; } ! 455: if(misc) { ! 456: if(onoff==0) ! 457: node.misc^=misc; ! 458: else if(onoff==1) ! 459: node.misc|=misc; ! 460: else if(onoff==2) ! 461: node.misc&=~misc; } ! 462: putnodedat(j,node); ! 463: printnodedat(j,node); ! 464: if(debug) { ! 465: printf("status=%u\n",node.status); ! 466: printf("errors=%u\n",node.errors); ! 467: printf("action=%d\n",node.action); ! 468: printf("useron=%u\n",node.useron); ! 469: printf("conn=%u\n",node.connection); ! 470: printf("misc=%u\n",node.misc); ! 471: printf("aux=%u\n",node.aux); ! 472: printf("extaux=%lu\n",node.extaux); } } } ! 473: ! 474: close(nodefile); ! 475: return(0); ! 476: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.