home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / MYBBS.ZIP / WINDOWS / DESKTOP / MYBBS / WWIVSOR.ZIP / LILO.C < prev    next >
Text File  |  1995-05-12  |  24KB  |  987 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1995 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. extern char cid_num[], cid_name[];
  22.  
  23. void random_screen(char *s1)
  24. {
  25.   char s[81];
  26.   int i,ns=0;
  27.  
  28.   sprintf(s,"%s%s%s",languagedir,s1,".0");
  29.   if (exist(s) && !rip_on()) {
  30.     for (i=0;i<1000;i++) {
  31.       sprintf(s,"%s%s.%d",languagedir,s1,i);
  32.       if (exist(s))
  33.         ns++;
  34.       else
  35.         break;
  36.     }
  37.     sprintf(s,"%s.%d",s1,random(ns));
  38.   } else if (rip) {
  39.     sprintf(s,"%s%s%s",languagedir,s1,".R0");
  40.     if (exist(s)) {
  41.       for (i=0;i<100;i++) {
  42.         sprintf(s,"%s%s.R%d",languagedir,s1,i);
  43.         if (exist(s))
  44.           ns++;
  45.         else
  46.           break;
  47.       }
  48.       sprintf(s,"%s%s.R%d",languagedir, s1, random(ns));
  49.     } else
  50.       sprintf(s,"%s%s%s",languagedir, s1, ".RIP");
  51.   } else
  52.     sprintf(s,"%s%s",s1,".ANS");
  53.   printfile(s);
  54. }
  55.  
  56. int usa_phone_convention(userrec *u)
  57. {
  58.   if ((strcmp(u->country,"USA")==0) ||
  59.       (strcmp(u->country,"CAN")==0) ||
  60.       (strcmp(u->country,"MEX")==0))
  61.     return(1);
  62.   return(0);
  63. }
  64.  
  65.  
  66. void getuser(void)
  67. {
  68.   char s[161],s2[161],s3[161],s4[161],*ss;
  69.   int ok,count,net_only,ans,i;
  70.   long l;
  71.   FILE *f;
  72.  
  73.   net_only=1;
  74.   if (syscfg.netlowtime!=syscfg.nethightime) {
  75.     if (syscfg.nethightime>syscfg.netlowtime) {
  76.       if ((timer()<=(syscfg.netlowtime*60.0))
  77.           || (timer()>=(syscfg.nethightime*60.0)))
  78.         net_only=0;
  79.     } else {
  80.       if ((timer()<=(syscfg.netlowtime*60.0))
  81.           && (timer()>=(syscfg.nethightime*60.0)))
  82.         net_only=0;
  83.     }
  84.   } else
  85.     net_only=0;
  86.   count=0;
  87.   ok=0;
  88.   checkit=1;
  89.   okmacro=0;
  90.   curconfsub=curconfdir=0;
  91.   actsl=syscfg.newusersl;
  92.   if ((!net_only) && (incom)) {
  93. #ifdef OLD
  94.     outstr(get_string(1168));
  95.     thisuser.sysstatus=0;
  96.     ans=yn();
  97. #else
  98.     ans=check_ansi();
  99. #endif
  100.     ripcode = 0;
  101.     if (sysinfo.flags & OP_FLAGS_RIP_SUPPORT)
  102.       rip_detect();
  103.     else
  104.       end_rip();
  105.     sprintf(s,"%sWELCOME.ANS",languagedir);
  106.     if (exist(s) || rip) {
  107.       nl();
  108.       if (ans>0 || rip) {
  109.         thisuser.sysstatus |= sysstatus_ansi;
  110.         thisuser.sysstatus |= sysstatus_color;
  111.         if (rip)
  112.           ripcode = 1;
  113.         random_screen("WELCOME");
  114.         if (rip)
  115.           ripcode = 0;
  116.       } else if (ans==0)
  117.         printfile("WELCOME.MSG");
  118.     } else {
  119.       if (ans) {
  120.         sprintf(s,"%sWELCOME.0",languagedir);
  121.         if (exist(s))
  122.           random_screen("WELCOME");
  123.         else
  124.           printfile("WELCOME.MSG");
  125.       } else
  126.         printfile("WELCOME.MSG");
  127.     }
  128.   }
  129.   if (curatr!=7)
  130.     reset_colors();
  131.   do {
  132.       nl();
  133.       if (net_only) {
  134.         pl(get_string(353));
  135.         pl(get_string(354));
  136.       } else
  137.         pl(get_string(355));
  138.  
  139.       outstr(get_string(356));
  140.       if (rip) {
  141.         if (rip_subset) {
  142.           printmenu(353);
  143.           pl("");
  144.         } else {
  145.           sprintf(s,"\1|1\x1b""0000$%s_ID$^m|#\r ", sysinfo.ripbbsid);
  146.           comstr(s);
  147. #ifdef RIPDRIVE
  148.           if (rd_on()) {
  149.             sprintf(s,"%sMENU353.LCL", sysinfo.ripdir);
  150.             rd_str("\x1b[30;47m");
  151.             rd_print(s);
  152.             rd_str("\x1b[30;47m\n");
  153.           }
  154. #endif
  155.         }
  156.       }
  157.  
  158.       input(s,30);
  159.       if (rip && rip_subset) {
  160.         rip_rtwpcb();
  161.         comstr("\x1b[37;40m");
  162.         comnl(get_string(1435));
  163.       }
  164. #ifdef RIPDRIVE
  165.       else if (rip && rd_on()) {
  166.     rd_str("\1|1\x1b""0000$RTW$$PCB$\r");
  167.     pl(s);
  168.       }
  169. #endif
  170.  
  171.     usernum=finduser(s);
  172.     if ((net_only) && (usernum!=-2))
  173.       usernum=0;
  174.     if (usernum>0) {
  175.       read_user(usernum,&thisuser);
  176.       read_qscn(usernum,qsc,0);
  177.       if (set_language(thisuser.language)) {
  178.         thisuser.language=0;
  179.         set_language(thisuser.language);
  180.       }
  181.       if ((thisuser.sl < 255) && (user_online(usernum, &i))) {
  182.         nl();
  183.         ansic(6);
  184.         outstr(get_string(1400));
  185.         npr("%d!",i);
  186.         nl();
  187.         continue;
  188.       }
  189.       ok=1;
  190.       actsl = syscfg.newusersl;
  191.       topscreen();
  192.       outstr(get_string(357));
  193.           if (rip_on()) {            /* Password dialog is special */
  194.         printmenu(355);
  195.         if (!rip_subset) {
  196.           comstr("\1|1F000000PASS.RIP|#\r ");   /* Check for PASS.RIP */
  197.           if (getkey() == '1')
  198.             comstr("\1|1R00000000PASS.RIP\r ");         /* and play if exists */
  199.         }
  200.         pl("\x1b[30;47m");
  201.       } 
  202.  
  203.       echo=0;
  204.       input(s,8);
  205.           if (rip_on()) {
  206.         rip_rtwpcb();
  207.         comstr("\x1b[37;40m");
  208.         comnl(get_string(1436));     //ripstring(2));
  209.       }
  210.  
  211.       if (strcmp(s,thisuser.pw)!=0)
  212.         ok=0;
  213.       if (((syscfg.sysconfig & sysconfig_free_phone)==0)) {
  214.         if (usa_phone_convention(&thisuser) || !thisuser.country[0]) {
  215.           outstr(get_string(358));
  216.                   if (rip_on()) {
  217.             if (rip_subset) {
  218.               printmenu(354);
  219.               pl("\x1b[30;47m");
  220.             } else {
  221.               if (rip_ver >= 20000)
  222.                             comstr("\1|1\x1b""0000$PHONE$^m|#\r ");
  223.               else
  224.                             comstr("\1|1\x1b""0000$PHONE_LAST4$^m|#\r ");
  225. #ifdef RIPDRIVE
  226.                           if (rd_on()) {
  227.                                 sprintf(s,"%sMENU354.LCL", sysinfo.ripdir);
  228.                 rd_print(s);
  229.                 rd_str("\x1b[30;47m\n");
  230.               }
  231. #endif
  232.             }
  233.           } 
  234.           echo=0;
  235.           input(s2,4);
  236.                   if (rip_on() && rip_subset) {
  237.             rip_rtwpcb();
  238.             comstr("");
  239.             comnl(get_string(1437));     //ripstring(3));
  240.           }
  241. #ifdef RIPDRIVE
  242.                   if (rip_on() && rd_on()) {
  243.             rd_str("\x1b[37;40m");
  244.             rd_str("\1|1\x1b""0000$RTW$$PCB$\r");
  245.             pl(s2);
  246.           }
  247. #endif
  248.  
  249.           if (strcmp(s2,&thisuser.phone[8])!=0) {
  250.             ok=0;
  251.             if ((strlen(s2)==4) && (s2[3]=='-')) {
  252.               nl();
  253.               pl(get_string(359));
  254.               nl();
  255.             }
  256.           }
  257.         }
  258.       }
  259.       if ((thisuser.sl==255) && (incom) && (ok)) {
  260.         outstr(get_string(616));
  261.                 if (rip_on()) {            /* Password dialog is special */
  262.           printmenu(356);
  263.           pl("\x1b[30;47m");
  264.         } 
  265.         echo=0;
  266.         input(s4,20);
  267.                 if (rip_on()) {
  268.           rip_rtwpcb();
  269.           comstr("");
  270.           comnl(get_string(1438));       //ripstring(4));
  271.         }
  272.         if (strcmp(s4,syscfg.systempw)!=0)
  273.           ok=0;
  274.       }
  275.       echo=1;
  276.       if (ok) {
  277.         reset_act_sl();
  278.         changedsl();
  279.       } else {
  280.         ++thisuser.illegal;
  281.         write_user(usernum,&thisuser);
  282.         nl();
  283.         pl(get_string(360));
  284.         nl();
  285.         sprintf(s3,get_stringx(1,21),
  286.           nam(&thisuser,usernum),ctim(timer()),s);
  287.         if (((syscfg.sysconfig & sysconfig_free_phone)==0) &&
  288.            (usa_phone_convention(&thisuser))) {
  289.           sprintf(s4,get_stringx(1,22),s2);
  290.           strcat(s3,s4);
  291.         }
  292.         sl1(0,"");
  293.         sl1(0,s3);
  294.         sl1(0,"");
  295.         usernum=0;
  296.       }
  297.     } else
  298.       if (usernum==-1) {
  299.         write_inst(INST_LOC_NEWUSER, 0, INST_FLAGS_NONE);
  300.         play_sdf("NEWUSER",0);
  301.                 checkit=0;
  302.         newuser();
  303.         ok=1;
  304.       } else
  305.             if (usernum==0) {
  306.               if (net_only)
  307.                     nl();
  308.               else
  309.                     pl(get_string(8));
  310.             } else
  311.               if ((usernum==-2) || (usernum==-3) || (usernum==-4)) {
  312.                 if (incom) {
  313.                   read_status();
  314.                   time(&l);
  315.                   s2[0]=0;
  316.                   switch(usernum) {
  317.                     case -2:
  318.                       if ((instance==1) || (status.net_version>=34)) {
  319.                             sprintf(s2,"NETWORK /B%u /T%ld /F%u",
  320.                               modem_speed, l, modem_flag);
  321.                             write_inst(INST_LOC_NET, 0, INST_FLAGS_NONE);
  322.                             extern_prog(s2, EFLAG_SHRINK);
  323.                             set_net_num(0);
  324.                       }
  325.                       break;
  326.                     case -3:
  327.                       sprintf(s2,"REMOTE /B%u /F%u",
  328.                             modem_speed, modem_flag);
  329.                       extern_prog(s2, EFLAG_SHRINK);
  330.                       break;
  331.                     case -4:
  332.                       s[8]=0;
  333.                       if (s[0]) {
  334.                         sprintf(s2,"%s /B%u /F%u",
  335.                           s, modem_speed, modem_flag);
  336.                         sprintf(s3,"%sREMOTES.DAT",syscfg.datadir);
  337.                         f=fsh_open(s3,"rt");
  338.                         if (f) {
  339.                           ok=0;
  340.                           while ((!ok) && (fgets(s3,80,f))) {
  341.                                 ss=strchr(s3,'\n');
  342.                                 if (ss)
  343.                                   *ss=0;
  344.                                 if (stricmp(s3,s)==0)
  345.                                   ok=1;
  346.                           }
  347.                           fsh_close(f);
  348.                           if (ok) {
  349.                                 extern_prog(s2, EFLAG_SHRINK);
  350.                           }
  351.                         }
  352.                       }
  353.                       break;
  354.                   }
  355.                   read_status();
  356.                   hangup=1;
  357.                   dtr(0);
  358.                   global_xx=0;
  359.                   Wait(1.0);
  360.                   dtr(1);
  361.                   Wait(0.1);
  362.                   cleanup_net();
  363.                   imodem(0);
  364.                 }
  365.                 hangup=1;
  366.               }
  367.   } while ((!hangup) && (!ok) && (++count<3));
  368.   if (count==3)
  369.     hangup=1;
  370.   checkit=0;
  371.   okmacro=1;
  372.   if ((!hangup) && (usernum>0) && (thisuser.restrict & restrict_logon) &&
  373.     (strcmp(date(),thisuser.laston)==0) && (thisuser.ontoday>0)) {
  374.     nl();
  375.     pl(get_string(361));
  376.     nl();
  377.     hangup=1;
  378.   }
  379. }
  380.  
  381.  
  382. void logon(void)
  383. {
  384.   char s[255],s1[181],s2[81],*ss;
  385.   char speed[40],ch;
  386.   int i,i1,dv,win,f;
  387.   long len,pos;
  388.   long l;
  389.  
  390.   if (usernum<1) {
  391.     hangup=1;
  392.     return;
  393.   }
  394.   useron=1;
  395.   write_inst(INST_LOC_LOGON,0,INST_FLAGS_NONE);
  396.   if (live_user) {
  397.     reset_colors();
  398.     ansic(0);
  399.     outchr(12);
  400.   }
  401.   if ((thisuser.num_extended) > sysinfo.max_extend_lines)
  402.     thisuser.num_extended=sysinfo.max_extend_lines;
  403.   if ((thisuser.colors[8]==0) || (thisuser.colors[9]==0)) {
  404.     thisuser.colors[8]=6;
  405.     thisuser.colors[9]=3;
  406.   }
  407.   if (incom && live_user) {
  408.         if (rip_on()) {
  409.       if (rip_subset) {
  410.         ripcode = 1;
  411.         random_screen("hello");
  412.       } else {
  413.         comstr("\1|1F000000HELLO.RIP|#\n");    /* Check for HELLO.RIP locally */
  414.         ch = getkey();
  415.         if (ch == '1') {                /* Local playback of HELLO if there */
  416.           comstr("\1|1R00000000HELLO.RIP\n");
  417.         } else {
  418.           ripcode = 1;
  419.           random_screen("hello");
  420.         }
  421.       }
  422.       ripcode = 0;
  423.     }
  424.     play_sdf("LOGON",0);
  425.     i=printfile("LOGON");
  426.     if ((!i) && (!(thisuser.sysstatus & sysstatus_pause_on_page)))
  427.       pausescr();
  428.   }
  429.   strcpy(xdate,date());
  430.   if (strcmp(xdate,thisuser.laston)==0)
  431.     ++thisuser.ontoday;
  432.   else {
  433.     thisuser.ontoday=1;
  434.     thisuser.timeontoday=0.0;
  435.     thisuser.extratime=0.0;
  436.     thisuser.posttoday=0;
  437.     thisuser.etoday=0;
  438.     thisuser.fsenttoday1=0;
  439.   }
  440.   ++thisuser.logons;
  441.   cursub=0;
  442.   msgreadlogon=0;
  443.   if ((udir[0].subnum==0) && (udir[1].subnum>0))
  444.     curdir=1;
  445.   else
  446.     curdir=0;
  447.   curdloads=0;
  448.   if (actsl!=255) {
  449.     lock_status();
  450.     ++status.callernum1;
  451.     ++status.callstoday;
  452.     save_status();
  453.   }
  454.   if (rip_on()) {
  455.     strcpy (speed, curspeed);
  456.     strcpy (curspeed, "RIP/");
  457.     strcat (curspeed, speed);
  458.   }
  459.   sprintf(s,"%ld: %s %s %s   %s - %d (%d)",
  460.     status.callernum1,
  461.     nam(&thisuser,usernum),
  462.     times(),
  463.     date(),
  464.     curspeed,
  465.     thisuser.ontoday,
  466.     instance);
  467.   sprintf(s2,"%sLASTON.TXT",syscfg.gfilesdir);
  468.   ss=get_file(s2,&len);
  469.   pos=0;
  470.   if (ss!=NULL) {
  471.     if (!cs())
  472.       for (i=0; i<4; i++)
  473.         copy_line(s1,ss,&pos,len);
  474.     i=1;
  475.     do {
  476.       copy_line(s1,ss,&pos,len);
  477.       if ((s1[0]) && live_user) {
  478.         if (i) {
  479.           nln(2);
  480.           pl(get_string(362));
  481.           nl();
  482.           if (sysinfo.flags & OP_FLAGS_SHOW_CITY_ST) {
  483.             if (syscfg.sysconfig & sysconfig_extended_info)
  484.               pl(get_string(1429));
  485.             else
  486.               pl(get_string(972));
  487.           } else {
  488.             pl(get_string(972));
  489.           }
  490.           ansic(7);
  491.           i=(okansi())?205:'=';
  492.           pl(charstr(79,i));
  493.           i=0;
  494.         }
  495.         pl(s1);
  496.       }
  497.     } while (pos<len);
  498.   }
  499.  
  500.   if ((actsl!=255) || (incom)) {
  501.     sl1(0,"");
  502.     sl1(0,stripcolors(s));
  503.     sl1(1,"");
  504.     if (cid_num[0]) {
  505.       sprintf(s,"CID NUM : %s", cid_num);
  506.       sysoplog(s);
  507.     }
  508.     if (cid_name[0]) {
  509.       sprintf(s,"CID NAME: %s", cid_name);
  510.       sysoplog(s);
  511.     }
  512.  
  513.     if (sysinfo.flags & OP_FLAGS_SHOW_CITY_ST) {
  514.       if (syscfg.sysconfig & sysconfig_extended_info)
  515.         sprintf(s,"1%-6ld %-25.25s %-5.5s %-5.5s %-15.15s %-2.2s %-3.3s %-8.8s %2d\r\n",
  516.           status.callernum1,
  517.           nam(&thisuser,usernum),
  518.           times(),
  519.           date(),
  520.           thisuser.city,
  521.           thisuser.state,
  522.           thisuser.country,
  523.           curspeed,
  524.           thisuser.ontoday);
  525.       else
  526.         sprintf(s,"1%-6ld %-25.25s %-10.10s %-5.5s %-5.5s %-20.20s %2d\r\n",
  527.           status.callernum1,
  528.           nam(&thisuser,usernum),
  529.           cur_lang_name,
  530.           times(),
  531.           date(),
  532.           curspeed,
  533.           thisuser.ontoday);
  534.     } else {
  535.       sprintf(s,"1%-6ld %-25.25s %-10.10s %-5.5s %-5.5s %-20.20s %2d\r\n",
  536.         status.callernum1,
  537.         nam(&thisuser,usernum),
  538.         cur_lang_name,
  539.         times(),
  540.         date(),
  541.         curspeed,
  542.         thisuser.ontoday);
  543.     }
  544.  
  545.     if (actsl!=255) {
  546.       sprintf(s1,"%sUSER.LOG",syscfg.gfilesdir);
  547.       f=sh_open(s1,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  548.       if (f>-1) {
  549.         sh_lseek(f,0L,SEEK_END);
  550.         sh_write(f,(void *)s,strlen(s));
  551.         sh_close(f);
  552.       }
  553.  
  554.       f=sh_open(s2,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  555.       if (f>-1) {
  556.         pos=0;
  557.         copy_line(s1,ss,&pos,len);
  558.         for (i=1; i<8; i++) {
  559.           copy_line(s1,ss,&pos,len);
  560.           strcat(s1,"\r\n");
  561.           sh_write(f,(void *)s1,strlen(s1));
  562.         }
  563.         sh_write(f,(void *)s,strlen(s));
  564.         sh_close(f);
  565.       }
  566.     }
  567.   }
  568.  
  569.   if (ss!=NULL)
  570.     bbsfree(ss);
  571.   if (live_user)
  572.     read_automessage();
  573.   timeon=timer();
  574.   if (live_user) {
  575.     topscreen();
  576.         if (rip_on())
  577.       rip_menus();
  578.   }
  579.   if ((syscfg.logon_c[0]) && live_user) {
  580.     nl();
  581.     stuff_in(s,syscfg.logon_c,create_chain_file(),"","","","");
  582.     extern_prog(s, sysinfo.spawn_opts[3]);
  583.         nln(2);
  584.   }
  585.   if (live_user) {
  586.     nl();
  587.  
  588.     outstr(get_string(237));
  589.     pl(nam(&thisuser,usernum));
  590.     outstr(get_string(363)); npr("%d\r\n", (int) ((nsl()+30)/60.0));
  591.     if (thisuser.illegal) {
  592.       outstr(get_string(364)); npr("%d\r\n",thisuser.illegal);
  593.     }
  594.     if (thisuser.waiting) {
  595.       outstr(get_string(365)); npr("%d\r\n",thisuser.waiting);
  596.     }
  597.     if (thisuser.ontoday==1) {
  598.       outstr(get_string(366)); pl(thisuser.laston);
  599.     } else {
  600.       outstr(get_string(367)); npr("%d\r\n",thisuser.ontoday);
  601.     }
  602.     outstr(get_string(368));
  603.     if (!sysop2())
  604.       outstr(get_string(112));
  605.     pl(get_string(315));
  606.  
  607. /****************************************************************************/
  608. /*
  609.  * Do NOT remove or modify this part of the code.  If the registration number
  610.  * (or an indicator that it is unregistered) is not printed out, it will
  611.  * be plainly obvious that this is a 'pirated' version of the source code.
  612.  */
  613.     if (syscfg.wwiv_reg_number)
  614.       sprintf(s,"(Reg #%ld)",syscfg.wwiv_reg_number);
  615.     else
  616.       strcpy(s,"(Unregistered)");
  617.     outstr(get_string(369));
  618.     npr("%s   %s\r\n",wwiv_version,s);
  619. /****************************************************************************/
  620.  
  621.     read_status();
  622.     for (i=0; i<net_num_max; i++) {
  623.       if (net_networks[i].sysnum) {
  624.         sprintf(s,"9%s %s0",net_networks[i].name, get_string(370));
  625.         strcat(s,charstr(18-strlen(stripcolors(s)),'.'));
  626.         strcat(s,"2");
  627.         sprintf(s1,"%s @%u",s,net_networks[i].sysnum);
  628.         if (i)
  629.           pl(s1);
  630.         else {
  631.           for (i1=strlen(s1); i1<26; i1++)
  632.             s1[i1]=' ';
  633.           s1[i1]=0;
  634.           npr("%s  (net%u)\r\n",s1,status.net_version);
  635.         }
  636.       }
  637.     }
  638.     if (multitasker) {
  639.       outstr(get_string(1169));
  640.       switch (multitasker) {
  641.         case 1 :
  642.           dv=get_dv_version();
  643.           npr("DESQView 1%d.%02d\r\n",dv/256,dv%256);
  644.         break;
  645.         case 2 :
  646.           win=get_win_version();
  647.           npr("Windows 1%d.%02d\r\n",win%256,win/256);
  648.         break;
  649.         case 3 :
  650.           win=get_win_version();
  651.           dv=get_dv_version();
  652.           npr("Win 1%d.%02d 9and 2DV 1%d.%02d\r\n",
  653.             win%256,win/256,dv/256,dv%256);
  654.         break;
  655.         case 4 :
  656.                 case 5 :
  657.                 case 6 :
  658.                 case 7 :
  659.                   if ((_osmajor/10==2) && (_osminor==30))
  660.                     npr("OS/2 3.0 1WARP\r\n");
  661.                   else
  662.                     npr("OS/2 1%d.%2.2d\r\n",_osmajor/10,_osminor);
  663.         break;
  664.         default:
  665.           pl(get_string(1170));
  666.       }
  667.     }
  668.     npr("%s%d\r\n",get_string(1171),instance);
  669.     nl();
  670.     if (thisuser.forwardusr) {
  671.       if (thisuser.forwardsys) {
  672.         set_net_num(thisuser.net_num);
  673.         if (!valid_system(thisuser.forwardsys)) {
  674.           thisuser.forwardusr=0;
  675.           thisuser.forwardsys=0;
  676.           strcpy(s1,get_string(371));
  677.         } else {
  678.           strcpy(s1,get_string(372));
  679.           if (net_num_max>1)
  680.             sprintf(s2,"%s #%u @%u.",
  681.                 net_name,thisuser.forwardusr,thisuser.forwardsys);
  682.           else
  683.             sprintf(s2,"#%u @%u.",
  684.                 thisuser.forwardusr,thisuser.forwardsys);
  685.           strcat(s1,s2);
  686.         }
  687.       } else {
  688.         if (thisuser.forwardusr==65535)
  689.           strcpy(s1,get_string(373));
  690.         else {
  691.           strcpy(s1,get_string(372));
  692.           sprintf(s2,"#%u.",thisuser.forwardusr);
  693.           strcat(s1,s2);
  694.         }
  695.       }
  696.       pl(s1);
  697.       nl();
  698.     }
  699.     if (ltime) {
  700.       nl();
  701.       pl(get_string(374));
  702.       nl();
  703.     }
  704.     fsenttoday=0;
  705.     if (thisuser.year) {
  706.       s[0]=years_old(thisuser.month,thisuser.day,thisuser.year);
  707.       if (thisuser.age!=s[0]) {
  708.         thisuser.age=s[0];
  709.         topscreen();
  710.       }
  711.     } else {
  712.       nl();
  713.       pl(get_string(375));
  714.       do {
  715.         nl();
  716.         input_age(&thisuser);
  717.         sprintf(s,"%02d/%02d/%02d",
  718.           (int) thisuser.month,
  719.           (int) thisuser.day,
  720.           (int) thisuser.year);
  721.         nl();
  722.         outstr(s);
  723.         outstr(get_string(376));
  724.         if (!yn())
  725.           thisuser.year=0;
  726.       } while ((!hangup) && (thisuser.year==0));
  727.     }
  728.     if (!thisuser.realname[0])
  729.       input_realname();
  730.     if (syscfg.sysconfig & sysconfig_extended_info) {
  731.       if (!thisuser.street[0])
  732.         input_street();
  733.       if (!thisuser.city[0])
  734.         input_city();
  735.       if (!thisuser.state[0])
  736.         input_state();
  737.       if (!thisuser.country[0])
  738.         input_country();
  739.       if (!thisuser.zipcode[0])
  740.         input_zipcode();
  741.       if (!thisuser.dataphone[0]) {
  742.         input_dataphone();
  743.       }
  744.       if (sysinfo.flags & OP_FLAGS_USER_REGIST) {
  745. #define SECS_PER_DAY 86400L
  746.         if (thisuser.registered != 0) {
  747.           time(&l);
  748.           if ((thisuser.expires < l+30*SECS_PER_DAY)
  749.             && (thisuser.expires > l+10*SECS_PER_DAY)) {
  750.             npr("%s%d %s.\r\n\r\n", get_string(1394),
  751.               (int)((thisuser.expires-l)/SECS_PER_DAY),get_string(1395));
  752.           } else if ((thisuser.expires > l) &&
  753.                      (thisuser.expires < l+10*SECS_PER_DAY)) {
  754.             ansic(6);
  755.             if ((int)((thisuser.expires-l)/SECS_PER_DAY) > 1) {
  756.               npr("%s%d %s.",get_string(1394),
  757.                 (int)((thisuser.expires-l)/SECS_PER_DAY),get_string(1395));
  758.             } else {
  759.               npr("%s%d %s.",get_string(1394),
  760.                 (int)((thisuser.expires-l)/3600L),get_string(1396));
  761.             }
  762.                         nln(2);
  763.             pausescr();
  764.           }
  765.           if (thisuser.expires < l) {
  766.             if (!so()) {
  767.               if ((thisuser.sl > syscfg.newusersl) ||
  768.                   (thisuser.dsl > syscfg.newuserdsl)) {
  769.                 thisuser.sl=syscfg.newusersl;
  770.                 thisuser.dsl=syscfg.newuserdsl;
  771.                 thisuser.exempt=0;
  772.                 sprintf(s1,"%s%s", nam(&thisuser,usernum),
  773.                     get_stringx(1,118));
  774.                 ssm(1,0,s1);
  775.                 write_user(usernum,&thisuser);
  776.                 reset_act_sl();
  777.                 changedsl();
  778.               }
  779.             }
  780.             ansic(6);
  781.             pl(get_string(1397));
  782.             nl();
  783.             pausescr();
  784.           }
  785.         }
  786.       }
  787.     }
  788.     topscreen();
  789.     create_chain_file();
  790.     rsm(usernum,&thisuser,1);
  791.     if (thisuser.waiting) {
  792.           if (menu_on()) {
  793.         printmenu(324);
  794.         rip_popup = 0;      /* Disable the Yes/No prompt */
  795.       } else
  796.         prt(5,get_string(377));
  797.       if (yn()) {
  798.                 if (rip_on()) {
  799.                   rip_cls();
  800.           //rmenu = 300;
  801.         }
  802.         readmail();
  803.       }
  804.     }
  805.   }
  806.   if (rip_on()) {
  807.         rip_popup = -1;      /* Re-enable */
  808.     cleared = -1;
  809.   }
  810.   nscandate=thisuser.daten;
  811.   batchtime=0.0;
  812.   numbatchdl=numbatch=0;
  813.   i1=0;
  814.   for (i=0; i<20; i++) {
  815.     if (questused[i]) {
  816.       if (thisuser.votes[i]==0) {
  817.         i1=1;
  818.       }
  819.     }
  820.   }
  821.   if (restrict_vote & thisuser.restrict)
  822.     i1=0;
  823.   if (actsl<=syscfg.newusersl)
  824.     i1=0;
  825.  
  826.   if (i1 && live_user) {
  827.     nl();
  828.     prt(3,get_string(378));
  829.     nl();
  830.   }
  831.   if ((incom) || (sysop1()))
  832.     broadcast(get_string(1172));
  833.   setiia(90);
  834.  
  835.   /* Handle case of first conf with no subs avail */
  836.   if ((usub[0].subnum==-1) && (okconf(&thisuser))) {
  837.     for (curconfsub=0;
  838.          (curconfsub<subconfnum) &&
  839.          (uconfsub[curconfsub].confnum!=-1);
  840.          curconfsub++) {
  841.       setuconf(CONF_SUBS, curconfsub, -1);
  842.       if (usub[0].subnum!=-1)
  843.         break;
  844.     }
  845.     if (usub[0].subnum==-1) {
  846.       curconfsub=0;
  847.       setuconf(CONF_SUBS, curconfsub, -1);
  848.     }
  849.   }
  850.   rip_cls();
  851.   autox = -1;
  852. }
  853.  
  854.  
  855. void logoff(void)
  856. {
  857.   long l;
  858.   int f,r,w,t,i, w1,i1;
  859.   char s[81];
  860.   mailrec m;
  861.   shortmsgrec sm;
  862.   double ton;
  863.  
  864.   if (incom)
  865.     play_sdf("LOGOFF",0);
  866.  
  867.   if (usernum>0) {
  868.     if ((incom) || (sysop1()))
  869.       broadcast(get_string(1173));
  870.   }
  871.   setiia(90);
  872.   dtr(0);
  873.   hangup=1;
  874.   if (usernum<1)
  875.     return;
  876.   thisuser.lastrate=modem_speed;
  877.   strcpy(thisuser.laston,xdate);
  878.   thisuser.illegal=0;
  879.   if ((timer()-timeon)<-30.0)
  880.     timeon-=24.0*3600.0;
  881.   ton=timer()-timeon;
  882.   thisuser.timeon += ton;
  883.   thisuser.timeontoday += (ton-extratimecall);
  884.   lock_status();
  885.   status.activetoday += (int) (ton/60.0);
  886.   save_status();
  887.   time(&l);
  888.   thisuser.daten=l;
  889.   sprintf(s,get_stringx(1,23),
  890.     msgreadlogon,
  891.     (int)((timer()-timeon)/60.0));
  892.   if ((incom) || (actsl!=255))
  893.     sl1(0,s);
  894.   if (mailcheck) {
  895.     f=open_email(1);
  896.     if (f!=-1) {
  897.       thisuser.waiting=0;
  898.       t=(int) (filelength(f)/sizeof(mailrec));
  899.       r=0;
  900.       w=0;
  901.       while (r<t) {
  902.         sh_lseek(f,(long)(sizeof(mailrec)) * (long)(r),SEEK_SET);
  903.         sh_read(f,(void *)&m,sizeof(mailrec));
  904.         if ((m.tosys!=0) || (m.touser!=0)) {
  905.           if ((m.tosys==0) && (m.touser==usernum)) {
  906.             if (thisuser.waiting!=255)
  907.               thisuser.waiting++;
  908.           }
  909.           if (r!=w) {
  910.             sh_lseek(f,(long)(sizeof(mailrec)) * (long)(w),SEEK_SET);
  911.             sh_write(f,(void *)&m,sizeof(mailrec));
  912.           }
  913.           ++w;
  914.         }
  915.         ++r;
  916.       }
  917.       if (r!=w) {
  918.         m.tosys=0;
  919.         m.touser=0;
  920.         for (w1=w; w1<r; w1++) {
  921.           sh_lseek(f,(long)(sizeof(mailrec)) * (long)(w1),SEEK_SET);
  922.           sh_write(f,(void *)&m,sizeof(mailrec));
  923.         }
  924.       }
  925.       chsize(f,(long)(sizeof(mailrec)) * (long)(w));
  926.       lock_status();
  927.       status.filechange[filechange_email]++;
  928.       save_status();
  929.       sh_close(f);
  930.     }
  931.   } else {
  932.     /* re-calculate mail waiting */
  933.     f=open_email(0);
  934.     if (f>0) {
  935.       i1=filelength(f)/sizeof(mailrec);
  936.       thisuser.waiting=0;
  937.       for (i=0; (i<i1); i++) {
  938.         read(f, &m, sizeof(mailrec));
  939.         if ((m.tosys==0) && (m.touser==usernum)) {
  940.           if (thisuser.waiting!=255)
  941.             thisuser.waiting++;
  942.         }
  943.       }
  944.       f=sh_close(f);
  945.     }
  946.   }
  947.   if (smwcheck) {
  948.     sprintf(s,"%sSMW.DAT",syscfg.datadir);
  949.     f=sh_open(s,O_RDWR|O_BINARY|O_CREAT,S_IREAD|S_IWRITE);
  950.     if (f!=-1) {
  951.       t=(int) (filelength(f)/sizeof(shortmsgrec));
  952.       r=0;
  953.       w=0;
  954.       while (r<t) {
  955.         sh_lseek(f,(long)(sizeof(shortmsgrec)) * (long)(r),SEEK_SET);
  956.         sh_read(f,(void *)&sm,sizeof(shortmsgrec));
  957.         if ((sm.tosys!=0) || (sm.touser!=0)) {
  958.           if ((sm.tosys==0) && (sm.touser==usernum))
  959.             thisuser.sysstatus |= sysstatus_smw;
  960.           if (r!=w) {
  961.             sh_lseek(f,(long)(sizeof(shortmsgrec)) * (long)(w),SEEK_SET);
  962.             sh_write(f,(void *)&sm,sizeof(shortmsgrec));
  963.           }
  964.           ++w;
  965.         }
  966.         ++r;
  967.       }
  968.       chsize(f,(long)(sizeof(shortmsgrec)) * (long)(w));
  969.       sh_close(f);
  970.     }
  971.   }
  972.   if (usernum==1)
  973.     fwaiting=thisuser.waiting;
  974.   write_user(usernum,&thisuser);
  975.   write_qscn(usernum,qsc,0);
  976.   remove_from_temp("*.*", syscfgovr.tempdir, 0);
  977.   remove_from_temp("*.*", syscfgovr.batchdir, 0);
  978.   if (numbatch && (numbatch != numbatchdl)) {
  979.     for (i=0; i<numbatch; i++) {
  980.       if (!batch[i].sending) {
  981.         didnt_upload(i);
  982.       }
  983.     }
  984.   }
  985.   numbatch=numbatchdl=0;
  986. }
  987.