|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.