|
|
2.30b OS/2
/* AUTONODE.C */
/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
#include <io.h>
#include <dir.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <process.h>
#include <sys\stat.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LOOP_NODEDAB 100 /* Retries on NODE.DAB locking/unlocking */
typedef struct { /* Node information kept in NODE.DAB */
uchar status, /* Current Status of Node */
errors, /* Number of Critical Errors */
action; /* Action User is doing on Node */
uint useron, /* User on Node */
connection, /* Connection rate of Node */
misc, /* Miscellaneous bits for node */
aux; /* Auxillary word for node */
ulong extaux; /* Extended aux dword for node */
} node_t;
enum { /* Node Status */
NODE_WFC /* Waiting for Call */
,NODE_LOGON /* at logon prompt */
,NODE_NEWUSER /* New user applying */
,NODE_INUSE /* In Use */
,NODE_QUIET /* In Use - quiet mode */
,NODE_OFFLINE /* Offline */
,NODE_NETTING /* Networking */
,NODE_EVENT_WAITING /* Waiting for all nodes to be inactive */
,NODE_EVENT_RUNNING /* Running an external event */
,NODE_EVENT_LIMBO /* Allowing another node to run an event */
};
int nodefile;
void main();
void getnodedat(uchar number, node_t *node, char lockit);
void putnodedat(uchar number, node_t node);
void truncsp(char *str);
void main(int argc,char *argv[])
{
FILE *fp;
char str[256],nodepath[256],*p
,sbbs_ctrl[256],sbbs_node[256],path[MAXPATH]
,*arg[10]={NULL};
int file,num_nodes,autonode,disk,x,y;
node_t node;
printf("\nSynchronet AUTONODE v2.00\n");
if(!strcmp(argv[1],"/?")) {
printf("\nUsage: AUTONODE [file] [args,...]");
printf("\n\nWhere [file] is the name of the file to run and");
printf("\n [args,...] are the command line arguments to use");
printf("\n\nNOTE: The default command line is 'SBBS l q'\n");
return; }
p=getenv("SBBSCTRL");
if(!p) {
printf("\n\7You must set the SBBSCTRL environment variable first.");
printf("\n\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n");
return; }
sprintf(sbbs_ctrl,"%.40s",p);
strupr(sbbs_ctrl);
if(sbbs_ctrl[strlen(sbbs_ctrl)-1]!='\\')
strcat(sbbs_ctrl,"\\");
p=getenv("SBBSNODE");
if(!p) {
printf("\n\7You must set the SBBSNODE environment variable first.");
printf("\n\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n");
return; }
sprintf(sbbs_node,"%.40s",p);
strupr(sbbs_node);
if(sbbs_node[strlen(sbbs_node)-1]!='\\')
strcat(sbbs_node,"\\");
sprintf(str,"%sNODE.DAB",sbbs_ctrl);
if((nodefile=open(str,O_RDWR|O_BINARY|O_DENYNONE))==-1) {
printf("Error opening %s",str); exit(1); }
sprintf(str,"%sMAIN.CNF",sbbs_ctrl);
if((file=open(str,O_RDONLY|O_DENYNONE|O_BINARY))==-1) {
printf("Error opening %s",str);
exit(1); }
lseek(file,227L,SEEK_SET);
read(file,&num_nodes,2);
printf("\nNumber of Available Nodes = %d",num_nodes);
lseek(file,64L*(long)num_nodes,SEEK_CUR);
lseek(file,328L,SEEK_CUR);
read(file,&autonode,2);
printf("\nNumber of First Autonode = %d",autonode);
for(x=autonode;x<=num_nodes;x++) {
printf("\nChecking Node #%d",x);
getnodedat(x,&node,1);
if(node.status==NODE_OFFLINE) {
printf("\nFOUND! Node #%d is OFFLINE\n",x);
node.status=NODE_WFC;
putnodedat(x,node);
lseek(file,(229L+((long)(x-1)*64L)),SEEK_SET);
read(file,nodepath,128);
truncsp(nodepath);
if(nodepath[strlen(nodepath)-1]=='\\')
nodepath[strlen(nodepath)-1]=0; /* remove '\' */
if(nodepath[0]=='.')
sprintf(path,"%s%s",sbbs_node,nodepath);
else strcpy(path,nodepath);
if(path[1]==':')
setdisk(path[0]-'A');
if(chdir(path)) {
printf("\nError changing into '%s'",path);
getnodedat(x,&node,1);
node.status=NODE_OFFLINE;
putnodedat(x,node);
exit(1); }
if(argc==1) {
execl(getenv("COMSPEC"),getenv("COMSPEC"),"/c","SBBS","l","q",
NULL); }
else {
arg[0]=argv[0];
strcpy(str,"/c"); arg[1]=str;
for(x=1;x<argc;x++) arg[1+x]=argv[x];
execv(getenv("COMSPEC"),arg); }
getnodedat(x,&node,1);
node.status=NODE_OFFLINE;
putnodedat(x,node);
return; } }
printf("\n\n\7All local nodes are in use!\n");
}
/****************************************************************************/
/* Reads the data for node number 'number' into the structure 'node' */
/* from NODE.DAB */
/* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */
/****************************************************************************/
void getnodedat(uchar number, node_t *node, char lockit)
{
char str[256];
int count=0;
number--; /* make zero based */
while(count<LOOP_NODEDAB) {
lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET);
if(lockit
&& lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) {
count++;
continue; }
if(read(nodefile,node,sizeof(node_t))==sizeof(node_t))
break;
count++; }
if(count==LOOP_NODEDAB)
printf("\7Error unlocking and reading NODE.DAB\n");
}
/****************************************************************************/
/* Write the data from the structure 'node' into NODE.DAB */
/* getnodedat(num,&node,1); must have been called before calling this func */
/* NOTE: ------^ the indicates the node record has been locked */
/****************************************************************************/
void putnodedat(uchar number, node_t node)
{
char str[256];
int count;
number--; /* make zero based */
lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET);
if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) {
unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t));
printf("\7Error writing NODE.DAB for node %u\n",number+1);
return; }
unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t));
}
/****************************************************************************/
/* Truncates white-space chars off end of 'str' and terminates at first tab */
/****************************************************************************/
void truncsp(char *str)
{
char c;
str[strcspn(str,"\t")]=0;
c=strlen(str);
while(c && str[c-1]<=32) c--;
str[c]=0;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.