Annotation of sbbs/sbbs2/node/node.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.