home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / EXECFUNC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  20.9 KB  |  666 lines

  1. #line 1 "EXECFUNC.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6. #include "cmdshell.h"
  7.  
  8. int exec_function(csi_t *csi)
  9. {
  10.     uchar    str[256],tmp2[128],ch,*p;
  11.     int     i,j,k,s,file;
  12.     long    l;
  13.     stats_t stats;
  14.     node_t    node;
  15.     file_t    f;
  16.     time_t    t;
  17.  
  18. switch(*(csi->ip++)) {
  19.  
  20.  
  21.     case CS_PRINTFILE_STR:
  22.         printfile(csi->str,P_NOATCODES);
  23.         return(0);
  24.  
  25. /********************************/
  26. /* General Main Menu Type Stuff */
  27. /********************************/
  28.     case CS_AUTO_MESSAGE:
  29.         automsg();
  30.         return(0);
  31.     case CS_MINUTE_BANK:
  32.         if(sys_misc&SM_TIMEBANK) {    /* Allow users to deposit free time */
  33.             s=(level_timeperday[useron.level]-useron.ttoday)+useron.textra;
  34.             if(s<0) s=0;
  35.             if(s>level_timepercall[useron.level])
  36.                 s=level_timepercall[useron.level];
  37.             s-=(now-starttime)/60;
  38.             if(s<0) s=0;
  39.             bprintf(text[FreeMinLeft],s);
  40.             bprintf(text[UserMinutes],ultoac(useron.min,tmp));
  41.             if(max_minutes && useron.min>=max_minutes) {
  42.                 bputs(text[YouHaveTooManyMinutes]);
  43.                 return(0); }
  44.             if(max_minutes)
  45.                 while(s>0 && s+useron.min>max_minutes) s--;
  46.             bprintf(text[FreeMinToDeposit],s);
  47.             s=getnum(s);
  48.             if(s>0) {
  49.                 logline("  ","Minute Bank Deposit");
  50.                 useron.min=adjustuserrec(useron.number,U_MIN,10,s);
  51.                 useron.ttoday=adjustuserrec(useron.number,U_TTODAY,10,s);
  52.                 sprintf(str,"Minute Adjustment: %u",s*cdt_min_value);
  53.                 logline("*+",str); } }
  54.  
  55.         if(!(sys_misc&SM_NOCDTCVT)) {
  56.             bprintf(text[ConversionRate],cdt_min_value);
  57.             bprintf(text[UserCredits]
  58.                 ,ultoac(useron.cdt,tmp)
  59.                 ,ultoac(useron.freecdt,tmp2)
  60.                 ,ultoac(level_freecdtperday[useron.level],str));
  61.             bprintf(text[UserMinutes],ultoac(useron.min,tmp));
  62.             if(useron.cdt/102400L<1L) {
  63.                 bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt,tmp));
  64.                 return(0); }
  65.             if(max_minutes && useron.min>=max_minutes) {
  66.                 bputs(text[YouHaveTooManyMinutes]);
  67.                 return(0); }
  68.             s=useron.cdt/102400L;
  69.             if(max_minutes)
  70.                 while(s>0 && (s*cdt_min_value)+useron.min>max_minutes) s--;
  71.             bprintf(text[CreditsToMin],s);
  72.             s=getnum(s);
  73.             if(s>0) {
  74.                 logline("  ","Credit to Minute Conversion");
  75.                 useron.cdt=adjustuserrec(useron.number,U_CDT,10,-(s*102400L));
  76.                 useron.min=adjustuserrec(useron.number,U_MIN,10,s*cdt_min_value);
  77.                 sprintf(str,"Credit Adjustment: %ld",-(s*102400L));
  78.                 logline("$-",str);
  79.                 sprintf(str,"Minute Adjustment: %u",s*cdt_min_value);
  80.                 logline("*+",str); } }
  81.         return(0);
  82.     case CS_CHAT_SECTION:
  83.         if(useron.rest&FLAG('C'))
  84.             bputs(text[R_Chat]);
  85.         else
  86.             chatsection();
  87.         return(0);
  88.     case CS_USER_DEFAULTS:
  89.         maindflts(useron);
  90.         if(!(useron.rest&FLAG('G')))    /* not guest */
  91.             getuserdat(&useron);
  92.         return(0);
  93.     case CS_TEXT_FILE_SECTION:
  94.         text_sec();
  95.         return(0);
  96.     case CS_INFO_SYSTEM:   /* System information */
  97.         bputs(text[SiHdr]);
  98.         getstats(0,&stats);
  99.         bprintf(text[SiSysName],sys_name);
  100.         bprintf(text[SiSysID],sys_id);    /* QWK ID */
  101.         for(i=0;i<total_faddrs;i++)
  102.             bprintf(text[SiSysFaddr],faddrtoa(faddr[i]));
  103.         if(sys_psname[0])                /* PostLink/PCRelay */
  104.             bprintf(text[SiSysPsite],sys_psname,sys_psnum);
  105.         bprintf(text[SiSysLocation],sys_location);
  106.         bprintf(text[SiSysop],sys_op);
  107.         bprintf(text[SiSysNodes],sys_nodes);
  108.         bprintf(text[SiNodeNumberName],node_num,node_name);
  109.         bprintf(text[SiNodePhone],node_phone);
  110.         bprintf(text[SiTotalLogons],ultoac(stats.logons,tmp));
  111.         bprintf(text[SiLogonsToday],ultoac(stats.ltoday,tmp));
  112.         bprintf(text[SiTotalTime],ultoac(stats.timeon,tmp));
  113.         bprintf(text[SiTimeToday],ultoac(stats.ttoday,tmp));
  114.         ver();
  115.         if(yesno(text[ViewSysInfoFileQ])) {
  116.             CLS;
  117.             sprintf(str,"%sSYSTEM.MSG",text_dir);
  118.             printfile(str,0); }
  119.         if(yesno(text[ViewLogonMsgQ])) {
  120.             CLS;
  121.             menu("LOGON"); }
  122.         return(0);
  123.     case CS_INFO_SUBBOARD:     /* Sub-board information */
  124.         if(!usrgrps) return(0);
  125.         subinfo(usrsub[curgrp][cursub[curgrp]]);
  126.         return(0);
  127.     case CS_INFO_DIRECTORY:   /* Sub-board information */
  128.         if(!usrlibs) return(0);
  129.         dirinfo(usrdir[curlib][curdir[curlib]]);
  130.         return(0);
  131.     case CS_INFO_VERSION:    /* Version */
  132.         ver();
  133.         return(0);
  134.     case CS_INFO_USER:     /* User's statistics */
  135.         bprintf(text[UserStats],useron.alias,useron.number);
  136.         unixtodos(useron.laston,&date,&curtime);
  137.         bprintf(text[UserDates]
  138.             ,unixtodstr(useron.firston,str)
  139.             ,unixtodstr(useron.expire,tmp)
  140.             ,unixtodstr(useron.laston,tmp2)
  141.             ,curtime.ti_hour,curtime.ti_min);
  142.         bprintf(text[UserTimes]
  143.             ,useron.timeon,useron.ttoday
  144.             ,level_timeperday[useron.level]
  145.             ,useron.tlast
  146.             ,level_timepercall[useron.level]
  147.             ,useron.textra);
  148.         bprintf(text[UserLogons]
  149.             ,useron.logons,useron.ltoday
  150.             ,level_callsperday[useron.level],useron.posts
  151.             ,i ? 100/i : useron.posts>useron.logons ? 100 : 0
  152.             ,useron.ptoday);
  153.         bprintf(text[UserEmails]
  154.             ,useron.emails,useron.fbacks
  155.             ,getmail(useron.number,0),useron.etoday);
  156.         CRLF;
  157.         bprintf(text[UserUploads]
  158.             ,ultoac(useron.ulb,tmp),useron.uls);
  159.         bprintf(text[UserDownloads]
  160.             ,ultoac(useron.dlb,tmp),useron.dls,nulstr);
  161.         bprintf(text[UserCredits],ultoac(useron.cdt,tmp)
  162.             ,ultoac(useron.freecdt,tmp2)
  163.             ,ultoac(level_freecdtperday[useron.level],str));
  164.         bprintf(text[UserMinutes],ultoac(useron.min,tmp));
  165.         return(0);
  166.     case CS_INFO_XFER_POLICY:
  167.         if(!usrlibs) return(0);
  168.         sprintf(str,"%sMENU\\TPOLICY.*",text_dir);
  169.         if(fexist(str))
  170.             menu("TPOLICY");
  171.         else {
  172.             bprintf(text[TransferPolicyHdr],sys_name);
  173.             bprintf(text[TpUpload]
  174.                 ,dir[usrdir[curlib][curdir[curlib]]]->up_pct);
  175.             bprintf(text[TpDownload]
  176.                 ,dir[usrdir[curlib][curdir[curlib]]]->dn_pct);
  177.             }
  178.         return(0);
  179.     case CS_XTRN_EXEC:
  180.         csi->logic=LOGIC_TRUE;
  181.         for(i=0;i<total_xtrns;i++)
  182.             if(!stricmp(xtrn[i]->code,csi->str))
  183.                 break;
  184.         if(i<total_xtrns)
  185.             exec_xtrn(i);
  186.         else
  187.             csi->logic=LOGIC_FALSE;
  188.         return(0);
  189.     case CS_XTRN_SECTION:
  190.         if(useron.rest&FLAG('X'))
  191.             bputs(text[R_ExternalPrograms]);
  192.         else
  193.             xtrn_sec();     /* If external available, don't pause */
  194.         return(0);
  195.     case CS_LOGOFF:
  196.         if(!noyes(text[LogOffQ])) {
  197.             if(logoff_mod[0])
  198.                 exec_bin(logoff_mod,csi);
  199.             user_event(EVENT_LOGOFF);
  200.             menu("LOGOFF");
  201.             SYNC;
  202.             hangup(); }
  203.         return(0);
  204.     case CS_LOGOFF_FAST:
  205.         SYNC;
  206.         if(online==ON_REMOTE && !(mdm_misc&MDM_NODTR))
  207.             dtr(0);
  208.         hangup();
  209.         return(0);
  210.     case CS_NODELIST_ALL:
  211.         CRLF;
  212.         bputs(text[NodeLstHdr]);
  213.         for(i=1;i<=sys_nodes && i<=sys_lastnode;i++) {
  214.             getnodedat(i,&node,0);
  215.             printnodedat(i,node); }
  216.         return(0);
  217.     case CS_NODELIST_USERS:
  218.         whos_online(1);
  219.         return(0);
  220.     case CS_USERLIST_SUB:
  221.         userlist(UL_SUB);
  222.         return(0);
  223.     case CS_USERLIST_DIR:
  224.         userlist(UL_DIR);
  225.         return(0);
  226.     case CS_USERLIST_ALL:
  227.         userlist(UL_ALL);
  228.         return(0);
  229.     case CS_USERLIST_LOGONS:
  230.         sprintf(str,"%sLOGON.LST",data_dir);
  231.         if(flength(str)<1) {
  232.             bputs("\r\n\r\n");
  233.             bputs(text[NoOneHasLoggedOnToday]); }
  234.         else {
  235.             bputs(text[CallersToday]);
  236.             printfile(str,P_NOATCODES|P_OPENCLOSE);
  237.             CRLF; }
  238.         return(0);
  239.     case CS_PAGE_SYSOP:
  240.         ch=kbd_state();      /* Check scroll lock */
  241.         if(ch&16 || (sys_chat_ar[0] && chk_ar(sys_chat_ar,useron))
  242.             || useron.exempt&FLAG('C')) {
  243.             sysop_page();
  244.             return(0); }
  245.         bprintf(text[SysopIsNotAvailable],sys_op);
  246.         return(0);
  247.     case CS_PAGE_GURU:
  248.         csi->logic=LOGIC_FALSE;
  249.         for(i=0;i<total_gurus;i++)
  250.             if(!stricmp(csi->str,guru[i]->code)
  251.                 && chk_ar(guru[i]->ar,useron))
  252.                 break;
  253.         if(i>=total_gurus)
  254.             return(0);
  255.         sprintf(str,"%s%s.DAT",ctrl_dir,guru[i]->code);
  256.         if((file=nopen(str,O_RDONLY))==-1) {
  257.             errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
  258.             return(0); }
  259.         if((p=MALLOC(filelength(file)+1))==NULL) {
  260.             close(file);
  261.             errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1);
  262.             return(0); }
  263.         read(file,p,filelength(file));
  264.         p[filelength(file)]=0;
  265.         close(file);
  266.         localguru(p,i);
  267.         FREE(p);
  268.         csi->logic=LOGIC_TRUE;
  269.         return(0);
  270.     case CS_PRIVATE_CHAT:
  271.         privchat();
  272.         return(0);
  273.     case CS_PRIVATE_MESSAGE:
  274.         nodemsg();
  275.         return(0);
  276.  
  277. /*******************/
  278. /* Sysop Functions */
  279. /*******************/
  280.     case CS_USER_EDIT:
  281.         useredit(csi->str[0] ? finduser(csi->str) : 0,0);
  282.         return(0);
  283.  
  284.  
  285. /******************/
  286. /* Mail Functions */
  287. /******************/
  288.  
  289.     case CS_MAIL_READ:     /* Read E-mail */
  290.         readmail(useron.number,MAIL_YOUR);
  291.         return(0);
  292.     case CS_MAIL_READ_SENT:       /* Kill/read sent mail */
  293.         if(useron.rest&FLAG('K'))
  294.             bputs(text[R_ReadSentMail]);
  295.         else
  296.             readmail(useron.number,MAIL_SENT);
  297.         return(0);
  298.     case CS_MAIL_READ_ALL:
  299.         readmail(useron.number,MAIL_ALL);
  300.         return(0);
  301.     case CS_MAIL_SEND:         /* Send E-mail */
  302.         if(strchr(csi->str,'@')) {
  303.             i=1;
  304.             netmail(csi->str,nulstr,0); }
  305.         else if((i=finduser(csi->str))!=0)
  306.             email(i,nulstr,nulstr,WM_EMAIL);
  307.         csi->logic=!i;
  308.         return(0);
  309.     case CS_MAIL_SEND_FEEDBACK:       /* Feedback */
  310.         if((i=finduser(csi->str))!=0)
  311.             email(i,text[ReFeedback],nulstr,WM_EMAIL);
  312.         csi->logic=!i;
  313.         return(0);
  314.     case CS_MAIL_SEND_NETMAIL:
  315.         bputs(text[EnterNetMailAddress]);
  316.         if(getstr(str,60,K_LINE)) {
  317.             netmail(str,nulstr,0);
  318.             csi->logic=LOGIC_TRUE; }
  319.         else
  320.             csi->logic=LOGIC_FALSE;
  321.         return(0);
  322.  
  323.     case CS_MAIL_SEND_NETFILE:
  324.         bputs(text[EnterNetMailAddress]);
  325.         if(getstr(str,60,K_LINE)) {
  326.             netmail(str,nulstr,WM_FILE);
  327.             csi->logic=LOGIC_TRUE; }
  328.         else
  329.             csi->logic=LOGIC_FALSE;
  330.         return(0);
  331.  
  332.     case CS_MAIL_SEND_FILE:   /* Upload Attached File to E-mail */
  333.         if(strchr(csi->str,'@')) {
  334.             i=1;
  335.             netmail(csi->str,nulstr,WM_FILE); }
  336.         else if((i=finduser(csi->str))!=0)
  337.             email(i,nulstr,nulstr,WM_EMAIL|WM_FILE);
  338.         csi->logic=!i;
  339.         return(0);
  340.     case CS_MAIL_SEND_BULK:
  341.         if(csi->str[0])
  342.             p=arstr(0,csi->str);
  343.         else
  344.             p=nulstr;
  345.         bulkmail(p);
  346.         if(p && p[0])
  347.             FREE(p);
  348.         return(0);
  349.  
  350.     case CS_INC_MAIN_CMDS:
  351.         main_cmds++;
  352.         return(0);
  353.  
  354.     case CS_INC_FILE_CMDS:
  355.         xfer_cmds++;
  356.         return(0);
  357.  
  358.     case CS_SYSTEM_LOG:                 /* System log */
  359.         if(!chksyspass(0))
  360.             return(0);
  361.         unixtodos(now,&date,&curtime);
  362.         sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG",data_dir
  363.             ,date.da_mon,date.da_day,date.da_year-1900);
  364.         printfile(str,0);
  365.         return(0);
  366.     case CS_SYSTEM_YLOG:                /* Yesterday's log */
  367.         if(!chksyspass(0))
  368.             return(0);
  369.         now-=(ulong)60L*24L*60L;
  370.         unixtodos(now,&date,&curtime);
  371.         sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG",data_dir
  372.             ,date.da_mon,date.da_day,date.da_year-1900);
  373.         printfile(str,0);
  374.         return(0);
  375.     case CS_SYSTEM_STATS:               /* System Statistics */
  376.         bputs(text[SystemStatsHdr]);
  377.         getstats(0,&stats);
  378.         bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp));
  379.         bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp));
  380.         bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp));
  381.         bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp));
  382.         bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp)
  383.             ,stats.uls);
  384.         bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp)
  385.             ,stats.dls);
  386.         bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp));
  387.         bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp));
  388.         bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp));
  389.         return(0);
  390.     case CS_NODE_STATS:              /* Node Statistics */
  391.         i=atoi(csi->str);
  392.         if(i>sys_nodes) {
  393.             bputs(text[InvalidNode]);
  394.             return(0); }
  395.         if(!i) i=node_num;
  396.         bprintf(text[NodeStatsHdr],i);
  397.         getstats(i,&stats);
  398.         bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp));
  399.         bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp));
  400.         bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp));
  401.         bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp));
  402.         bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp)
  403.             ,stats.uls);
  404.         bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp)
  405.             ,stats.dls);
  406.         bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp));
  407.         bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp));
  408.         bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp));
  409.         return(0);
  410.     case CS_CHANGE_USER:                 /* Change to another user */
  411.         if(!chksyspass(0))
  412.             return(0);
  413.         bputs(text[ChUserPrompt]);
  414.         if(!getstr(str,LEN_ALIAS,K_UPPER))
  415.             return(0);
  416.         if((i=finduser(str))==0)
  417.             return(0);
  418.         if(online==ON_REMOTE) {
  419.             getuserrec(i,U_LEVEL,2,str);
  420.             if(atoi(str)>logon_ml) {
  421.                 getuserrec(i,U_PASS,8,tmp);
  422.                 bputs(text[ChUserPwPrompt]);
  423.                 console|=CON_R_ECHOX;
  424.                 if(!(sys_misc&SM_ECHO_PW))
  425.                     console|=CON_L_ECHOX;
  426.                 getstr(str,8,K_UPPER);
  427.                 console&=~(CON_R_ECHOX|CON_L_ECHOX);
  428.                 if(strcmp(str,tmp))
  429.                     return(0); } }
  430.         putmsgptrs();
  431.         putuserrec(useron.number,U_CURSUB,8
  432.             ,sub[usrsub[curgrp][cursub[curgrp]]]->code);
  433.         putuserrec(useron.number,U_CURDIR,8
  434.             ,dir[usrdir[curlib][curdir[curlib]]]->code);
  435.         useron.number=i;
  436.         getuserdat(&useron);
  437.         getnodedat(node_num,&thisnode,1);
  438.         thisnode.useron=useron.number;
  439.         putnodedat(node_num,thisnode);
  440.         getmsgptrs();
  441.         if(REALSYSOP) sys_status&=~SS_TMPSYSOP;
  442.         else sys_status|=SS_TMPSYSOP;
  443.         statline=sys_def_stat;
  444.         statusline();
  445.         sprintf(str,"Changed into %s #%u",useron.alias,useron.number);
  446.         logline("S+",str);
  447.         return(0);
  448.     case CS_SHOW_MEM:
  449. #ifdef __MSDOS__
  450.          bprintf(text[NBytesFreeMemory],farcoreleft());
  451. #endif
  452.         return(0);
  453.     case CS_ERROR_LOG:
  454.         sprintf(str,"%sERROR.LOG",data_dir);
  455.         if(fexist(str)) {
  456.             bputs(text[ErrorLogHdr]);
  457.             printfile(str,0);
  458.             if(!noyes(text[DeleteErrorLogQ]))
  459.                 remove(str); }
  460.         else
  461.             bputs(text[NoErrorLogExists]);
  462.         for(i=1;i<=sys_nodes;i++) {
  463.             getnodedat(i,&node,0);
  464.             if(node.errors)
  465.                 break; }
  466.         if(i<=sys_nodes || criterrs) {
  467.             if(!noyes(text[ClearErrCounter])) {
  468.                 for(i=1;i<=sys_nodes;i++) {
  469.                     getnodedat(i,&node,1);
  470.                     node.errors=0;
  471.                     putnodedat(i,node); }
  472.                 criterrs=0; } }
  473.         return(0);
  474.     case CS_ANSI_CAPTURE:           /* Capture ANSI codes */
  475.         sys_status^=SS_ANSCAP;
  476.         bprintf(text[ANSICaptureIsNow]
  477.             ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]);
  478.         return(0);
  479.     case CS_LIST_TEXT_FILE:              /* View ASCII/ANSI/Ctrl-A file */
  480.         if(!chksyspass(0))
  481.             return(0);
  482.         bputs(text[Filename]);
  483.         if(getstr(str,60,K_UPPER))
  484.             printfile(str,0);
  485.         return(0);
  486.     case CS_EDIT_TEXT_FILE:              /* Edit ASCII/Ctrl-A file */
  487.         if(!chksyspass(0))
  488.             return(0);
  489.         bputs(text[Filename]);
  490.         if(getstr(str,60,K_UPPER))
  491.             editfile(str);
  492.         return(0);
  493.     case CS_GURU_LOG:
  494.         sprintf(str,"%sGURU.LOG",data_dir);
  495.         if(fexist(str)) {
  496.             printfile(str,0);
  497.             CRLF;
  498.             if(!noyes(text[DeleteGuruLogQ]))
  499.                 remove(str); }
  500.         return(0);
  501.     case CS_FILE_SET_ALT_PATH:
  502.         altul=atoi(csi->str);
  503.         if(altul>altpaths)
  504.             altul=0;
  505.         bprintf(text[AltULPathIsNow],altul ? altpath[altul-1] : text[OFF]);
  506.         return(0);
  507.     case CS_FILE_RESORT_DIRECTORY:
  508.         for(i=1;i<=sys_nodes;i++)
  509.             if(i!=node_num) {
  510.                 getnodedat(i,&node,0);
  511.                 if(node.status==NODE_INUSE
  512.                     || node.status==NODE_QUIET)
  513.                     break; }
  514.  
  515.         if(i<=sys_nodes) {
  516.             bputs(text[ResortWarning]);
  517.             return(0); }
  518.  
  519.         if(!stricmp(csi->str,"ALL")) {     /* all libraries */
  520.             for(i=0;i<usrlibs;i++)
  521.                 for(j=0;j<usrdirs[i];j++)
  522.                     resort(usrdir[i][j]);
  523.             return(0); }
  524.         if(!stricmp(csi->str,"LIB")) {     /* current library */
  525.             for(i=0;i<usrdirs[curlib];i++)
  526.                 resort(usrdir[curlib][i]);
  527.             return(0); }
  528.         resort(usrdir[curlib][curdir[curlib]]);
  529.         return(0);
  530.  
  531.     case CS_FILE_GET:
  532.  
  533.         if(!fexist(csi->str)) {
  534.             bputs(text[FileNotFound]);
  535.             return(0); }
  536.         if(!chksyspass(0))
  537.             return(0);
  538.  
  539.     case CS_FILE_SEND:
  540.  
  541.         menu("DLPROT");
  542.         mnemonics(text[ProtocolOrQuit]);
  543.         strcpy(str,"Q");
  544.         for(i=0;i<total_prots;i++)
  545.             if(prot[i]->dlcmd[0] && chk_ar(prot[i]->ar,useron)) {
  546.                 sprintf(tmp,"%c",prot[i]->mnemonic);
  547.                 strcat(str,tmp); }
  548.         ch=getkeys(str,0);
  549.         if(ch=='Q' || sys_status&SS_ABORT) {
  550.             return(0); }
  551.         for(i=0;i<total_prots;i++)
  552.             if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron))
  553.                 break;
  554.         if(i<total_prots) {
  555.             protocol(cmdstr(prot[i]->dlcmd,csi->str,csi->str,str),0);
  556.             autohangup(); }
  557.         return(0);
  558.  
  559.     case CS_FILE_PUT:
  560.         if(!chksyspass(0))
  561.             return(0);
  562.         menu("ULPROT");
  563.         mnemonics(text[ProtocolOrQuit]);
  564.         strcpy(str,"Q");
  565.         for(i=0;i<total_prots;i++)
  566.             if(prot[i]->ulcmd[0] && chk_ar(prot[i]->ar,useron)) {
  567.                 sprintf(tmp,"%c",prot[i]->mnemonic);
  568.                 strcat(str,tmp); }
  569.         ch=getkeys(str,0);
  570.         if(ch=='Q' || sys_status&SS_ABORT) {
  571.             lncntr=0;
  572.             return(0); }
  573.         for(i=0;i<total_prots;i++)
  574.             if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron))
  575.                 break;
  576.         if(i<total_prots) {
  577.             protocol(cmdstr(prot[i]->ulcmd,csi->str,csi->str,str),0);
  578.             autohangup(); }
  579.         return(0);
  580.  
  581.     case CS_FILE_UPLOAD_BULK:
  582.  
  583.         if(!usrlibs) return(0);
  584.  
  585.         if(!stricmp(csi->str,"ALL")) {     /* all libraries */
  586.             for(i=0;i<usrlibs;i++)
  587.                 for(j=0;j<usrdirs[i];j++) {
  588.                     if(lib[i]->offline_dir==usrdir[i][j])
  589.                         continue;
  590.                     if(bulkupload(usrdir[i][j])) return(0); }
  591.             return(0); }
  592.         if(!stricmp(csi->str,"LIB")) {     /* current library */
  593.             for(i=0;i<usrdirs[curlib];i++) {
  594.                 if(lib[usrlib[curlib]]->offline_dir
  595.                     ==usrdir[curlib][i])
  596.                     continue;
  597.                 if(bulkupload(usrdir[curlib][i])) return(0); }
  598.             return(0); }
  599.         bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */
  600.         return(0);
  601.  
  602.     case CS_FILE_FIND_OLD:
  603.     case CS_FILE_FIND_OPEN:
  604.     case CS_FILE_FIND_OFFLINE:
  605.     case CS_FILE_FIND_OLD_UPLOADS:
  606.         if(!usrlibs) return(0);
  607.         if(!getfilespec(tmp))
  608.             return(0);
  609.         padfname(tmp,str);
  610.         k=0;
  611.         bputs("\r\nSearching ");
  612.         if(!stricmp(csi->str,"ALL"))
  613.             bputs("all libraries");
  614.         else if(!stricmp(csi->str,"LIB"))
  615.             bputs("library");
  616.         else
  617.             bputs("directory");
  618.         bputs(" for files ");
  619.         if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) {
  620.             l=FI_OLDUL;
  621.             bprintf("uploaded before %s\r\n",timestr(&ns_time)); }
  622.         else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */
  623.             l=FI_OLD;
  624.             bprintf("not downloaded since %s\r\n",timestr(&ns_time)); }
  625.         else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) {
  626.             l=FI_OFFLINE;
  627.             bputs("not online...\r\n"); }
  628.         else {
  629.             l=FI_CLOSE;
  630.             bputs("currently open...\r\n"); }
  631.         if(!stricmp(csi->str,"ALL")) {
  632.             for(i=0;i<usrlibs;i++)
  633.                 for(j=0;j<usrdirs[i];j++) {
  634.                     if(lib[i]->offline_dir==usrdir[i][j])
  635.                         continue;
  636.                     if((s=listfileinfo(usrdir[i][j],str,l))==-1)
  637.                         return(0);
  638.                     else k+=s; } }
  639.         else if(!stricmp(csi->str,"LIB")) {
  640.             for(i=0;i<usrdirs[curlib];i++) {
  641.                 if(lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i])
  642.                         continue;
  643.                 if((s=listfileinfo(usrdir[curlib][i],str,l))==-1)
  644.                     return(0);
  645.                 else k+=s; } }
  646.         else {
  647.             s=listfileinfo(usrdir[curlib][curdir[curlib]],str,l);
  648.             if(s==-1)
  649.                 return(0);
  650.             k=s; }
  651.         if(k>1) {
  652.             bprintf(text[NFilesListed],k); }
  653.         return(0); }
  654.  
  655. if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) {
  656.     csi->ip--;
  657.     return(execmsg(csi)); }
  658.  
  659. if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_UNUSED1) {
  660.     csi->ip--;
  661.     return(execfile(csi)); }
  662.  
  663. errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
  664. return(0);
  665. }
  666.