|
|
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.