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

1.1       root        1: /* AUTONODE.C */
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include <io.h>
                      6: #include <dir.h>
                      7: #include <fcntl.h>
                      8: #include <errno.h>
                      9: #include <stdio.h>
                     10: #include <string.h>
                     11: #include <stdlib.h>
                     12: #include <process.h>
                     13: #include <sys\stat.h>
                     14: 
                     15: #define uchar unsigned char
                     16: #define uint unsigned int
                     17: #define ulong unsigned long
                     18: #define LOOP_NODEDAB 100    /* Retries on NODE.DAB locking/unlocking    */
                     19: 
                     20: typedef struct {                                               /* Node information kept in NODE.DAB */
                     21:        uchar   status,                                         /* Current Status of Node */
                     22:                        errors,                                         /* Number of Critical Errors */
                     23:                        action;                                         /* Action User is doing on Node */
                     24:        uint    useron,                                         /* User on Node */
                     25:                        connection,                                     /* Connection rate of Node */
                     26:                        misc,                                           /* Miscellaneous bits for node */
                     27:                        aux;                                            /* Auxillary word for node */
                     28:        ulong   extaux;                                         /* Extended aux dword for node */
                     29:             } node_t;
                     30: 
                     31: enum {                                                         /* Node Status */
                     32:         NODE_WFC                                       /* Waiting for Call */
                     33:        ,NODE_LOGON                     /* at logon prompt */
                     34:        ,NODE_NEWUSER                           /* New user applying */
                     35:        ,NODE_INUSE                                             /* In Use */
                     36:        ,NODE_QUIET                                             /* In Use - quiet mode */
                     37:        ,NODE_OFFLINE                                   /* Offline */
                     38:        ,NODE_NETTING                                   /* Networking */
                     39:        ,NODE_EVENT_WAITING                             /* Waiting for all nodes to be inactive */
                     40:        ,NODE_EVENT_RUNNING                             /* Running an external event */
                     41:        ,NODE_EVENT_LIMBO                               /* Allowing another node to run an event */
                     42:     };
                     43: 
                     44: int nodefile;
                     45: 
                     46: void main();
                     47: void getnodedat(uchar number, node_t *node, char lockit);
                     48: void putnodedat(uchar number, node_t node);
                     49: void truncsp(char *str);
                     50: 
                     51: void main(int argc,char *argv[])
                     52: {
                     53:        FILE *fp;
                     54:        char str[256],nodepath[256],*p
                     55:                ,sbbs_ctrl[256],sbbs_node[256],path[MAXPATH]
                     56:                ,*arg[10]={NULL};
                     57:        int file,num_nodes,autonode,disk,x,y;
                     58:        node_t node;
                     59: 
                     60: printf("\nSynchronet AUTONODE v2.00\n");
                     61: 
                     62:        if(!strcmp(argv[1],"/?")) {
                     63:                printf("\nUsage: AUTONODE [file] [args,...]");
                     64:                printf("\n\nWhere [file]     is the name of the file to run and");
                     65:                printf("\n      [args,...] are the command line arguments to use");
                     66:                printf("\n\nNOTE: The default command line is 'SBBS l q'\n");
                     67:                return; }
                     68:        p=getenv("SBBSCTRL");
                     69:        if(!p) {
                     70:                printf("\n\7You must set the SBBSCTRL environment variable first.");
                     71:                printf("\n\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n");
                     72:                return; }
                     73:        sprintf(sbbs_ctrl,"%.40s",p);
                     74:        strupr(sbbs_ctrl);
                     75:        if(sbbs_ctrl[strlen(sbbs_ctrl)-1]!='\\')
                     76:                strcat(sbbs_ctrl,"\\");
                     77:        p=getenv("SBBSNODE");
                     78:        if(!p) {
                     79:                printf("\n\7You must set the SBBSNODE environment variable first.");
                     80:                printf("\n\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n");
                     81:         return; }
                     82:        sprintf(sbbs_node,"%.40s",p);
                     83:        strupr(sbbs_node);
                     84:        if(sbbs_node[strlen(sbbs_node)-1]!='\\')
                     85:                strcat(sbbs_node,"\\");
                     86: 
                     87:        sprintf(str,"%sNODE.DAB",sbbs_ctrl);
                     88:        if((nodefile=open(str,O_RDWR|O_BINARY|O_DENYNONE))==-1) {
                     89:         printf("Error opening %s",str); exit(1); }
                     90: 
                     91:        sprintf(str,"%sMAIN.CNF",sbbs_ctrl);
                     92:        if((file=open(str,O_RDONLY|O_DENYNONE|O_BINARY))==-1) {
                     93:                printf("Error opening %s",str);
                     94:                exit(1); }
                     95:        lseek(file,227L,SEEK_SET);
                     96:        read(file,&num_nodes,2);
                     97:        printf("\nNumber of Available Nodes = %d",num_nodes);
                     98:        lseek(file,64L*(long)num_nodes,SEEK_CUR);
                     99:        lseek(file,328L,SEEK_CUR);
                    100:        read(file,&autonode,2);
                    101:        printf("\nNumber of First Autonode  = %d",autonode);
                    102:        for(x=autonode;x<=num_nodes;x++) {
                    103:                printf("\nChecking Node #%d",x);
                    104:                getnodedat(x,&node,1);
                    105:                if(node.status==NODE_OFFLINE) {
                    106:                        printf("\nFOUND! Node #%d is OFFLINE\n",x);
                    107:                        node.status=NODE_WFC;
                    108:                        putnodedat(x,node);
                    109:                        lseek(file,(229L+((long)(x-1)*64L)),SEEK_SET);
                    110:                        read(file,nodepath,128);
                    111:                        truncsp(nodepath);
                    112:                        if(nodepath[strlen(nodepath)-1]=='\\')
                    113:                                nodepath[strlen(nodepath)-1]=0;         /* remove '\' */
                    114:                        if(nodepath[0]=='.')
                    115:                                sprintf(path,"%s%s",sbbs_node,nodepath);
                    116:                        else strcpy(path,nodepath);
                    117:                        if(path[1]==':')
                    118:                                setdisk(path[0]-'A');
                    119:                        if(chdir(path)) {
                    120:                                printf("\nError changing into '%s'",path);
                    121:                                getnodedat(x,&node,1);
                    122:                                node.status=NODE_OFFLINE;
                    123:                                putnodedat(x,node);
                    124:                                exit(1); }
                    125:                        if(argc==1) {
                    126:                                execl(getenv("COMSPEC"),getenv("COMSPEC"),"/c","SBBS","l","q",
                    127:                                        NULL); }
                    128:                        else {
                    129:                                arg[0]=argv[0];
                    130:                                strcpy(str,"/c"); arg[1]=str;
                    131:                                for(x=1;x<argc;x++) arg[1+x]=argv[x];
                    132:                                execv(getenv("COMSPEC"),arg); }
                    133:                        getnodedat(x,&node,1);
                    134:                        node.status=NODE_OFFLINE;
                    135:                        putnodedat(x,node);
                    136:                        return; } }
                    137:        printf("\n\n\7All local nodes are in use!\n");
                    138: }
                    139: 
                    140: /****************************************************************************/
                    141: /* Reads the data for node number 'number' into the structure 'node'        */
                    142: /* from NODE.DAB                                                                                                                       */
                    143: /* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */
                    144: /****************************************************************************/
                    145: void getnodedat(uchar number, node_t *node, char lockit)
                    146: {
                    147:        char str[256];
                    148:        int count=0;
                    149: 
                    150: number--;      /* make zero based */
                    151: while(count<LOOP_NODEDAB) {
                    152:        lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET);
                    153:        if(lockit
                    154:                && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) {
                    155:                count++;
                    156:                continue; }
                    157:        if(read(nodefile,node,sizeof(node_t))==sizeof(node_t))
                    158:                break;
                    159:        count++; }
                    160: if(count==LOOP_NODEDAB)
                    161:        printf("\7Error unlocking and reading NODE.DAB\n");
                    162: }
                    163: 
                    164: /****************************************************************************/
                    165: /* Write the data from the structure 'node' into NODE.DAB                                      */
                    166: /* getnodedat(num,&node,1); must have been called before calling this func  */
                    167: /*          NOTE: ------^   the indicates the node record has been locked   */
                    168: /****************************************************************************/
                    169: void putnodedat(uchar number, node_t node)
                    170: {
                    171:        char str[256];
                    172:        int count;
                    173: 
                    174: number--;      /* make zero based */
                    175: lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET);
                    176: if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) {
                    177:        unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t));
                    178:        printf("\7Error writing NODE.DAB for node %u\n",number+1);
                    179:        return; }
                    180: unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t));
                    181: }
                    182: /****************************************************************************/
                    183: /* Truncates white-space chars off end of 'str' and terminates at first tab */
                    184: /****************************************************************************/
                    185: void truncsp(char *str)
                    186: {
                    187:        char c;
                    188: 
                    189: str[strcspn(str,"\t")]=0;
                    190: c=strlen(str);
                    191: while(c && str[c-1]<=32) c--;
                    192: str[c]=0;
                    193: }

unix.superglobalmegacorp.com

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