home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / xdev_118.arj / XLOG.C < prev    next >
C/C++ Source or Header  |  1992-01-28  |  13KB  |  494 lines

  1. /* XLOG -- Quick-and-nasty local logon utility for XBBS  */
  2. /* Copyright (c) 1989 by M. Kimes -- All Rights Reserved */
  3.  
  4. #include "msgg.h"
  5.  
  6. void   pascal readconfig (void);
  7. void   pascal prepare (void);
  8. void   pascal userinfo(void);
  9. void   pascal left(char *a,char *b,int x);
  10. char * pascal rstrip (char *a);
  11. char * pascal lstrip (char *a);
  12. ulong  pascal getxbbstime(void);
  13. char * pascal saydate(struct date *);
  14. char * pascal saytime(struct time *);
  15. char * pascal fidodate(void);
  16. char * pascal split (char *,char *);
  17. char * pascal addtolog(char *);
  18.  
  19. word           baud = 0;
  20. word           timelimit = 60;
  21. struct time    starter;
  22. struct time    timeon;
  23. word           userno = 1;
  24. struct _user   user;
  25. char           variable[10][82];
  26. char           pages = 0;
  27. struct _mboard mboard;
  28. struct _fboard fboard;
  29. char           age;
  30. char       timer_off = 0;
  31. word       hold_time = 0;
  32. struct _config conf;
  33. char           nodenumber = 1;
  34. struct _events event[10];
  35.  
  36.  
  37.  
  38. int cdecl main (int argc,char *argv[]) {
  39.  
  40.  struct stat f;
  41.  FILE *fp;
  42.  int handle;
  43.  word timetoevent;
  44.  register word x;
  45.  struct date tempdate;
  46.  struct date dos_date;
  47.  char text[81],spin[] = "-\|/",*sp = spin;
  48.  register word xx;
  49.  char *p;
  50.  
  51.  
  52.   printf("\x1b[0;1;37m\nXLOG copyright (c) 1989/91 by M. Kimes\n");
  53.   printf("\x1b[0mUsage: XLOG <user#/user_name> <baud> <timetoevent> <nodenumber> <other args>\n");
  54.  
  55.   if(stat(searchpath("users.bbs"),&f)) {
  56.     fprintf(stderr,"\n**You don't have a userfile.\n");
  57.     return(253);
  58.     }
  59.     timetoevent = 24 * 59;
  60.  
  61.   if (argc >= 2) {
  62.     userno = 0;
  63.     if (strchr(argv[1],' ') == NULL && strchr(argv[1],'_') == NULL)
  64.       userno = atoi(argv[1]);
  65.         else {
  66.       p = strchr(strupr(argv[1]),'_');
  67.       *p = ' ';
  68.       printf("\n\04Searching for %s...",argv[1]);
  69.       xx = 0;
  70.       if (f.st_size) {
  71.         if ((handle = _open(searchpath("USERS.BBS"),O_RDONLY | O_BINARY | O_DENYNONE)) == -1) {
  72.           fprintf(stderr,"\n**Error opening userfile\n");
  73.           perror("\nERROR");
  74.           return(254);
  75.                 }
  76.             }
  77.       fp = fdopen(handle,"rb");
  78.       setvbuf(fp,NULL,_IOFBF,sizeof(struct _user) * 33);
  79.       rewind(fp);
  80.       printf("%c\b",*sp++);
  81.       while (!feof(fp)) {
  82.                  xx++;
  83.          if(!(xx % 25)) {
  84.             printf("%c\b",*sp++);
  85.             if(!*sp) sp = spin;
  86.           }
  87.          if(fread(&user,sizeof(user),1,fp) != 1) break;
  88.          if(user.deleted) continue;
  89.          if(!stricmp(user.name,argv[1]) || !stricmp(user.handle,argv[1])) break;
  90.       }
  91.       printf(" \b");
  92.       if((stricmp(user.name,argv[1]) && stricmp(user.handle,argv[1])) ||
  93.         user.deleted) goto NotFound;
  94.       if (!user.stat[0]) {
  95.           fclose(fp);
  96.           fprintf(stderr,"\n**User locked out\n");
  97.           return(254);
  98.       }
  99.       userno = (word)(ftell(fp) / (long)sizeof(struct _user));
  100.       fclose(fp);
  101.       _close(handle);
  102.       printf("\n\04User #%d\n",userno);
  103.         }
  104.     if (!userno) {
  105. NotFound:
  106.             fclose(fp);
  107.       fprintf(stderr,"\n**User not found.\n");
  108.       return(253);
  109.         }
  110.     }
  111.     if (argc >= 3) baud = (word)atol(argv[2]);
  112.   if (argc >= 4) timetoevent = (word)atoi(argv[3]);
  113.   if (argc >= 5) nodenumber = (char)atoi(argv[4]);
  114.   if (argc > 6) for (x = 0;x < (argc - 6);x++) strcpy(variable[x],argv[x]);
  115.     gettime(&timeon);
  116.     gettime(&starter);
  117.   timelimit = timetoevent;
  118.  
  119.   if ((word)(f.st_size / (long)sizeof(struct _user)) < userno) {
  120.     fprintf(stderr,"\n**Requested user #%u not available.\n",userno);
  121. printf("\nUSERS.BBS = %ld bytes, sizeof(user) = %u\n",f.st_size,sizeof(struct _user));
  122.     return(254);
  123.     }
  124.  
  125.   if ((handle = _open(searchpath("USERS.BBS"),O_RDONLY | O_BINARY | O_DENYNONE))==-1) {
  126.      fprintf(stderr,"\n**Error opening userfile\n");
  127.        perror("\nERROR");
  128.      return(254);
  129.     }
  130.   if (lseek(handle,(long)((long)(userno - 1) * (long)sizeof(struct _user)),SEEK_SET) == -1L) {
  131.     fprintf(stderr,"\n**Error seeking user #%u\n",userno);
  132.         perror("\nERROR");
  133.         _close(handle);
  134.     return(254);
  135.     }
  136.   if (_read(handle,&user,sizeof(user)) != sizeof(user)) {
  137.     fprintf(stderr,"\n**Error reading userfile\n");
  138.         perror("\nERROR");
  139.         _close(handle);
  140.     return(254);
  141.     }
  142.     _close(handle);
  143.  
  144.   for (x = 0;x < 10;x++) event[x].secsleft = 0;
  145.     readconfig();
  146.   mboard = conf.mboard;
  147.   fboard = conf.fboard;
  148.  
  149.    if ((user.stat[0]) == 0) {
  150.      printf("\nUser is locked out\n");
  151.      return (254);
  152.    }
  153.       getdate(&tempdate);
  154.     if ((tempdate.da_mon != user.lastdate.da_mon) || (tempdate.da_day != user.lastdate.da_day)) {
  155.       user.callstoday = 0;
  156.       user.timetoday = 0;
  157.       user.uktoday = 0;
  158.       user.dktoday = 0;
  159.       }
  160.   if (user.callsperday != 0) {
  161.     if (user.callstoday >= user.callsperday) {
  162.       fprintf(stderr,"\n**User has exceeded number of calls today\n");
  163.       return(254);
  164.       }
  165.     }
  166.     else {
  167.        if (user.timetoday >= user.totaltime) {
  168.        fprintf(stderr,"\n**User has exceeded time limit for today\n");
  169.        return(254);
  170.        }
  171.     }
  172.   if (user.callsperday != 0) timelimit = user.timepercall;
  173.   else timelimit = (user.totaltime - user.timetoday);
  174.  
  175.   printf("\n\04Creating XBBS files for %s (%s)\n",user.name,user.handle);
  176.  
  177.     getdate(&user.logondate);
  178.     gettime(&user.logontime);
  179.     if (timetoevent<(timelimit)) {
  180.      printf("\n\04A system event is scheduled in %u minutes",timetoevent-1);
  181.      timelimit = ((timetoevent-1));
  182.     }
  183.   if ((baud > 0) && (baud < conf.ansibaud)) user.graphics = 0;
  184.     getdate(&dos_date);
  185.   age = ((dos_date.da_year-user.birthdate.da_year) - 1);
  186.   if (dos_date.da_mon > user.birthdate.da_mon) age++;
  187.   else if ((dos_date.da_mon == user.birthdate.da_mon) && (dos_date.da_day >= user.birthdate.da_day)) age++;
  188.     getdate(&user.logondate);
  189.     gettime(&user.logontime);
  190.     userinfo();
  191.   for (xx = 0;xx < 76;text[xx] = '*',text[xx + 1] = 0,xx++);
  192.   addtolog(text);
  193.   sprintf(text,"Online: %s @ %u baud",user.name,baud);
  194.   addtolog(text);
  195.   return(0);
  196. }
  197.  
  198.  
  199.  
  200. void pascal readconfig (void) {
  201.  
  202.  FILE *fp;
  203.  char s[15];
  204.  
  205.  
  206.   if (nodenumber != 1) sprintf(s,"config%hu.bbs",nodenumber);
  207.     else strcpy(s,"config.bbs");
  208.  
  209.   if((fp = fopen(s,"rb")) == NULL) {
  210. Fatal:
  211.      fprintf(stderr,"\n**Fatal Config Error\n");
  212.        perror("\nCONFIG ERROR");
  213.        exit(254);
  214.     }
  215.   if (fread(&conf,sizeof(conf),1,fp) != 1) goto Fatal;
  216.   fclose(fp);
  217. }
  218.  
  219.  
  220.  
  221. void pascal prepare (void) {
  222.  
  223.   FILE *fp;
  224.   char s[90];
  225.   char numnode[4] = "";
  226.  
  227.  
  228.   if (nodenumber != 1) sprintf(numnode,"%hu",nodenumber);
  229.     sprintf(s,"%sonline%s.xbs",conf.homepath,numnode);
  230.   if((fp = fopen(s,"wb")) == NULL) perror("ONLINE OPEN");
  231.     else {
  232.       fwrite(&user,sizeof(struct _user),1,fp);
  233.       fwrite(&userno,sizeof(userno),1,fp);
  234.       fwrite(&timelimit,sizeof(timelimit),1,fp);
  235.       fwrite(&timeon,sizeof(timeon),1,fp);
  236.       fwrite(&starter,sizeof(starter),1,fp);
  237.       fwrite(&baud,sizeof(baud),1,fp);
  238.       fwrite(&pages,sizeof(pages),1,fp);
  239.       fwrite(&age,sizeof(age),1,fp);
  240.       fwrite(&timer_off,sizeof(timer_off),1,fp);
  241.       fwrite(&hold_time,sizeof(hold_time),1,fp);
  242.       fwrite(variable,sizeof(variable[0]),10,fp);
  243.       fwrite(&mboard,sizeof(struct _mboard),1,fp);
  244.       fwrite(&fboard,sizeof(struct _fboard),1,fp);
  245.       fwrite(event,sizeof(struct _events),10,fp);
  246.       if (ferror(fp)) perror("ONLINE WRITE");
  247.       fclose(fp);
  248.     }
  249. }
  250.  
  251.  
  252. void pascal userinfo (void) {
  253.  
  254.  FILE *fp,*pf;
  255.  char temp[38],temp2[38];
  256.  char *p = NULL;
  257.  char nodes[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  258.  
  259.  
  260.  if(nodenumber == 1) strcpy(temp,"userinfo.xbs");
  261.  else {
  262.    if(nodes[nodenumber % 36] == 'S') {
  263.      strcpy(temp,"userinfo.xb!");
  264.    }
  265.    else sprintf(temp,"userinfo.xb%c",nodes[nodenumber % 36]);
  266.  }
  267.  if((fp = fopen(temp,"wt")) == NULL) {
  268.    perror("USERINFO OPEN");
  269.    goto Next;
  270.  }
  271.  fprintf(fp,"%s\n%u\n",user.handle,baud);
  272.  fprintf(fp,"%s\n%s\n",saydate(&user.lastdate),saytime(&user.lasttime));
  273.  fprintf(fp,"%s\n%s\n",saydate(&user.logondate),saytime(&user.logontime));
  274.  fprintf(fp,"%lu\n%u\n%u\n%hu\n%u\n%hu\n",user.times,(user.graphics),(word)((long)timelimit-(getxbbstime()/60L)),pages,(word)user.credit,user.length);
  275.  fclose(fp);
  276.  
  277. Next:
  278.  
  279.   if(nodenumber == 1) strcpy(temp,"door.sys");
  280.   else sprintf(temp,"door%c.sys",nodes[nodenumber % 36]);
  281.   fp = fopen(temp,"wt");
  282.   if(fp == NULL) {
  283.        perror("DOOR.SYS OPEN");
  284.        goto Next2;
  285.     }
  286.     baud ? fprintf(fp,"COM%u\r\n",conf.commport+1) : fprintf(fp,"COM0\r\n");
  287.     fprintf(fp,"%u\r\n8\r\n%hu\r\nN\r\nY\r\nN\r\n",baud,nodenumber);
  288.   conf.sysopin ? fprintf(fp,"Y") : fprintf(fp,"N");
  289.     fprintf(fp,"\r\nN\r\n%s\r\n%s, %s\r\n%s\r\n",user.handle,user.city,user.state,user.phone1);
  290.   fprintf(fp,"%s\r\n%s\r\n%u\r\n%hu\r\n",user.phone2,user.password,user.stat[0],user.times);
  291.   fprintf(fp,"%02hu/%02hu/%04u\r\n%lu\r\n%lu\r\n",user.lastdate.da_mon,user.lastdate.da_day,user.lastdate.da_year,((long)timelimit-(getxbbstime()/60L))*60L,((long)timelimit-(getxbbstime()/60L)));
  292.   user.graphics ? fprintf(fp,"GR") : fprintf(fp,"NG");
  293.   fprintf(fp,"\r\n%hu\r\n",user.length);
  294.   user.expert ? fprintf(fp,"Y") : fprintf(fp,"N");
  295.   fprintf(fp,"\r\nABCDEFG\r\n%u\r\n01/01/99\r\n%u\r\nZ\r\n",mboard.number,userno);
  296.   fprintf(fp,"%lu\r\n%lu\r\n%u\r\n%u\r\n999999\r\n",user.upk,user.downk,user.dktoday);
  297.     fclose(fp);
  298.  
  299. Next2:
  300.  
  301.    sprintf(temp,"dorinfo%c.def",nodes[nodenumber % 36]);
  302.      unlink(temp);
  303.    *temp = 'q';
  304.    if((fp = fopen(temp,"wt")) == NULL) {
  305.        perror("QORINFO? OPEN");
  306.        goto Last;
  307.      }
  308.    *temp = 'r';
  309.    if((pf = fopen(temp,"wt")) == NULL) {
  310.         perror("RORINFO? OPEN");
  311.         fclose(fp);
  312.     *temp = 'q';
  313.         unlink(temp);
  314.         goto Last;
  315.      }
  316.      strcpy(temp,conf.sysop);
  317.    p = split(temp,p);
  318.      fprintf(fp,"%s\n%s\n%s",conf.system,temp,p);
  319.      strupr(temp);
  320.      strupr(p);
  321.      fprintf(pf,"%s\n%s\n%s",conf.system,temp,p);
  322.      if (!baud) {
  323.           fprintf(fp,"\nCOM0\n");
  324.           fprintf(pf,"\nCOM0\n");
  325.      }
  326.      else {
  327.       fprintf(fp,"\nCOM%u\n",conf.commport + 1);
  328.       fprintf(pf,"\nCOM%u\n",conf.commport + 1);
  329.      }
  330.    if (strchr(user.handle,' ') != NULL) strcpy(temp,user.handle);
  331.      else strcpy(temp,user.name);
  332.    p = split(temp,p);
  333.      fprintf(fp,"%u BAUD,N,8,1\n0\n%s\n%s\n%s, %s\n",baud,temp,p,user.city,user.state);
  334.      strupr(temp);
  335.      strupr(p);
  336.      if(!baud) fprintf(pf,"9600 BAUD,N,8,1\n0\n%s\n%s\n%s, %s\n",temp,p,user.city,user.state);
  337.      else fprintf(pf,"%u BAUD,N,8,1\n0\n%s\n%s\n%s, %s\n",baud,temp,p,user.city,user.state);
  338.      if(user.graphics) fprintf(pf,"2\n");
  339.      else if(user.hiok) fprintf(pf,"1\n");
  340.      else fprintf(pf,"0\n");
  341.      fprintf(fp,"%hu\n",user.graphics);
  342.      fprintf(fp,"%u\n%u\n",user.stat[0],(word)((long)timelimit-(getxbbstime()/60L)));
  343.      fprintf(pf,"%u\n%u\n",user.stat[0],(word)((long)timelimit-(getxbbstime()/60L)));
  344.      fprintf(pf,"1\n");
  345.      fclose(fp);
  346.      fclose(pf);
  347.  
  348.    sprintf(temp,"dorinfo%c.def",nodes[nodenumber % 36]);
  349.      strcpy(temp2,temp);
  350.    if(conf.RBBSorQBBS) *temp2 = 'r';
  351.    else *temp2 = 'q';
  352.      rename(temp2,temp);
  353.  
  354. Last:
  355.  
  356.   prepare();
  357. }
  358.  
  359.  
  360.  
  361.  
  362. ulong pascal getxbbstime (void) {
  363.  
  364.     int hour;
  365.     int min;
  366.     int sec;
  367.     struct time dos_time;
  368.     static ulong xbbs_time;
  369.  
  370.  
  371.      gettime(&dos_time);
  372.    hour = dos_time.ti_hour - starter.ti_hour;
  373.    min = dos_time.ti_min - starter.ti_min;
  374.    sec = dos_time.ti_sec - starter.ti_sec;
  375.    if(dos_time.ti_hour < starter.ti_hour) hour = hour + 24;
  376.    xbbs_time = (long)(hour * 3600) + (min * 60) + sec;
  377.      return (xbbs_time);
  378. }
  379.  
  380.  
  381.  
  382. char * pascal fidodate (void) {
  383.  
  384.  char months[12][4] = {
  385.     "Jan",
  386.     "Feb",
  387.     "Mar",
  388.     "Apr",
  389.     "May",
  390.     "Jun",
  391.     "Jul",
  392.     "Aug",
  393.     "Sep",
  394.     "Oct",
  395.     "Nov",
  396.     "Dec"
  397.  };
  398.  static char fdate[20];
  399.  struct date dos_date;
  400.  struct time dos_time;
  401.  
  402. /* 26 Jul 89  06:23:47 */
  403.  
  404.  getdate(&dos_date);
  405.  gettime(&dos_time);
  406.  
  407.  sprintf(fdate,"%02hu %s %02d  %02hu:%02hu:%02hu",dos_date.da_day,months[dos_date.da_mon-1],dos_date.da_year%100,dos_time.ti_hour,dos_time.ti_min,dos_time.ti_sec);
  408.  return(fdate);
  409.  
  410. }
  411.  
  412.  
  413.  
  414. char * pascal saydate (struct date *a) {
  415.  
  416.     static char xdate[11];
  417.  
  418.  sprintf(xdate,"%02hu/%02hu/%04u",a->da_mon,a->da_day,a->da_year);
  419.  return(xdate);
  420. }
  421.  
  422.  
  423.  
  424. char * pascal saytime (struct time *a) {
  425.  
  426.     static char xtime[9];
  427.  
  428.  sprintf(xtime,"%02u:%02u:%02u",a->ti_hour,a->ti_min,a->ti_sec);
  429.  return(xtime);
  430. }
  431.  
  432.  
  433.  
  434.  
  435. char * pascal split (char *a,char *b) {
  436.  
  437.        b = strchr(a,' ');
  438.        *b = 0;
  439.        return(++b);
  440. }
  441.  
  442.  
  443.  
  444.  
  445. char * pascal rstrip (char *a) {
  446.  
  447.   register int x;
  448.  
  449.  
  450.   x = strlen(a);
  451.   while (x && a && a[x - 1] == ' ') a[--x] = 0;
  452.   return a;
  453. }
  454.  
  455.  
  456.  
  457. char * pascal lstrip (char *a) {
  458.  
  459.   register int x;
  460.  
  461.  
  462.   x = strlen(a);
  463.   while (x && *a == ' ') memmove (a,(a + 1),x--);
  464.   return (a);
  465. }
  466.  
  467.  
  468.  
  469. char * pascal addtolog (char *text) {  /* WRITE LOGFILE ENTRIES */
  470.  
  471.  int handle;
  472.  char p[127];
  473.  
  474.  
  475.  if ((handle = _open(conf.logfile,O_RDWR | O_APPEND | O_BINARY | O_DENYNONE)) == -1)
  476.   if ((handle = creat(conf.logfile,S_IWRITE)) == -1) return text;
  477.  lseek(handle,0,SEEK_END);
  478.  if (text[0] != '*') {
  479.    strcpy(p,fidodate());
  480.    p[16] = 0;
  481.    strcat(p,"  ");
  482.    strncat(p,text,126 - strlen(p));
  483.    p[126] = 0;
  484.  }
  485.  else {
  486.         strncpy(p,text,79);
  487.     p[79] = 0;
  488.  }
  489.  _write(handle,p,strlen(p));
  490.  _write(handle,"\r\n",2);
  491.  _close(handle);
  492.  return text;
  493. }
  494.