home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 024 / psi110g.zip / MBOXCMD.C < prev    next >
C/C++ Source or Header  |  1994-09-05  |  44KB  |  1,645 lines

  1. /* NOTE: because of size, the previous 'mailbox.c' has been
  2.  * split in 3 parts:
  3.  * mboxcmd.c, containing the 'mbox' subcommands,
  4.  * mailbox.c, containing some user mailbox commands, and
  5.  * mailbox2.c, containing the remaining user commands.
  6.  * 921125 - WG7J
  7.  */
  8. /* There are only two functions in this mailbox code that depend on the
  9.  * underlying protocol, namely mbx_getname() and dochat(). All the other
  10.  * functions can hopefully be used without modification on other stream
  11.  * oriented protocols than AX.25 or NET/ROM.
  12.  *
  13.  * SM0RGV 890506, most work done previously by W9NK
  14.  *
  15.  *** Changed 900114 by KA9Q to use newline mapping features in stream socket
  16.  *      interface code; everything here uses C eol convention (\n)
  17.  *
  18.  *      Numerous new commands and other changes by SM0RGV, 900120
  19.  *
  20.  * Gateway function now support outgoing connects with the user's call
  21.  * with inverted ssid. Users can connect to system alias as well...
  22.  * See also several mods in socket.c,ax25.c and others
  23.  * 11/15/91, WG7J/PA3DIS
  24.  *
  25.  * Userlogging, RM,VM and KM commands, and R:-line interpretation
  26.  * added 920307 and later, Johan. K. Reinalda, WG7J/PA3DIS
  27.  *
  28.  * Inactivity timeout-disconnect added 920325 and later - WG7J
  29.  *
  30.  */
  31. #ifdef MSDOS
  32. #include <io.h>
  33. #endif
  34. #include <time.h>
  35. #include <ctype.h>
  36. #ifdef MSDOS
  37. #include <alloc.h>
  38. #endif
  39. #include <time.h>
  40. #ifdef  UNIX
  41. #include <sys/types.h>
  42. #endif
  43. #include <sys/stat.h>
  44. #ifdef MSDOS
  45. #include <dir.h>
  46. #include <dos.h>
  47. #endif
  48. #include "global.h"
  49. #ifdef MAILBOX
  50. #include "timer.h"
  51. #include "proc.h"
  52. #include "socket.h"
  53. #include "usock.h"
  54. #include "session.h"
  55. #include "smtp.h"
  56. #include "dirutil.h"
  57. #include "telnet.h"
  58. #include "ftp.h"
  59. #include "ftpserv.h"
  60. #include "commands.h"
  61. #include "netuser.h"
  62. #include "files.h"
  63. #include "bm.h"
  64. #include "pktdrvr.h"
  65. #include "ax25.h"
  66. #include "mailbox.h"
  67. #include "ax25mail.h"
  68. #include "nr4mail.h"
  69. #include "cmdparse.h"
  70. #include "mailfor.h"
  71.   
  72. /*
  73. #define MBDEBUG
  74. */
  75.   
  76. extern int dombmovemail __ARGS((int argc,char *argv[],void *p));
  77. extern char Myalias[];
  78.   
  79. extern struct mbx *Mbox;
  80. extern int BbsUsers;
  81. extern int Totallogins;
  82. char *Mtmsg;
  83. #ifdef TTYLINKSERVER
  84. int MAttended = 0;
  85. #endif
  86. char Mbpasswd[MAXPWDLEN+1] = "";
  87.   
  88. #ifdef MBFWD
  89. char *Mbzip = NULLCHAR;
  90. char *Mbqth = NULLCHAR;
  91. char *Mbhaddress = NULLCHAR;
  92. char *Mbfwdinfo = NULLCHAR;
  93. int Mbsmtptoo = 0;
  94. int Mtrace = 0;
  95. #endif
  96.   
  97. extern int MbSent;
  98. extern int MbRead;
  99. extern int MbRecvd;
  100. #ifdef MBFWD
  101. extern int MbForwarded;
  102. #endif
  103.   
  104. #ifdef AX25
  105. static char Uplink[] =     "Uplink   (%s)";
  106. static char Downlink[] =   "Downlink (%s)";
  107. #endif
  108. #ifdef NETROM
  109. static char incircuit[]  = "Circuit  (%s%s%s %s)";
  110. static char outcircuit[] = "Circuit  (%s%s%s)";
  111. #endif
  112. static char Telnet[] =     "Telnet   (%s @ %s)";
  113. static char Telnetdown[] = "Telnet   (%s)";
  114. static char Local[] =      "Local    (%s)";
  115.   
  116. static int doattend __ARGS((int argc,char *argv[],void *p));
  117. int dombusers __ARGS((int argc,char *argv[],void *p));
  118. extern int dombpast __ARGS((int argc,char *argv[],void *p));
  119. #ifdef MAILBOX
  120. #if ((defined AX25) || (defined NETROM))
  121. static int dombnrid __ARGS((int argc,char *argv[],void *p));
  122. #endif
  123. #endif
  124. static int dombpasswd __ARGS((int argc,char *argv[],void *p));
  125. static int dombsecure __ARGS((int argc,char *argv[],void *p));
  126. static int dombtrace __ARGS((int argc,char *argv[],void *p));
  127. static int dombzipcode __ARGS((int argc,char *argv[],void *p));
  128. static int dombfwdinfo __ARGS((int argc,char *argv[],void *p));
  129. static int dombqth __ARGS((int argc,char *argv[],void *p));
  130. static int dombhaddress __ARGS((int argc,char *argv[],void *p));
  131. static int dombsmtptoo __ARGS((int argc,char *argv[],void *p));
  132. static int dombutc __ARGS((int argc,char *argv[],void *p));
  133. extern int dombmailfor __ARGS((int argc,char *argv[],void *p));
  134. extern int dombstatus __ARGS((int argc,char *argv[],void *p));
  135. int dombmailstats __ARGS((int argc,char *argv[],void *p));
  136. static int dombtdisc __ARGS((int argc,char *argv[],void *p));
  137. static int dombtmsg __ARGS((int argc,char *argv[],void *p));
  138. static int dombconvers __ARGS((int argc,char *argv[],void *p));
  139. static int dombsendquery __ARGS((int argc,char *argv[],void *p));
  140. static int dombmport __ARGS((int argc,char *argv[],void *p));
  141. static int dombnewmail __ARGS((int argc,char *argv[],void *p));
  142. static int dombhideport __ARGS((int argc,char *argv[],void *p));
  143. static int dombheader __ARGS((int argc,char *argv[],void *p));
  144. static int dombnobid __ARGS((int argc,char *argv[],void *p));
  145. static int dombnoax25 __ARGS((int argc,char *argv[],void *p));
  146. static int dombbonly __ARGS((int argc,char *argv[],void *p));
  147. static int dombuonly __ARGS((int argc,char *argv[],void *p));
  148. static int dombsonly __ARGS((int argc,char *argv[],void *p));
  149. static int dombreset __ARGS((int argc,char *argv[],void *p));
  150. static int dombregister __ARGS((int argc,char *argv[],void *p));
  151. static int dombshowalias __ARGS((int argc,char *argv[],void *p));
  152. static struct pu *pu_lookup __ARGS((char *name));
  153.   
  154. int Usenrid;
  155. int MBSecure;
  156.   
  157. #ifdef REGISTER
  158. int MbRegister = 1;
  159. #endif
  160.   
  161. #ifdef MAILCMDS
  162. int Mbsendquery = 1;
  163. int NoBid;
  164. #ifdef USERLOG
  165. int Mbnewmail = 1;
  166. #endif
  167. #endif
  168.   
  169. int32 Mbtdiscinit;
  170.   
  171. /* mbox subcommand table */
  172. static struct cmds DFAR Mbtab[] = {
  173.     "alias",        doaliases,      0, 0, NULLCHAR,
  174. #ifdef TTYLINKSERVER
  175.     "attend",       doattend,       0, 0, NULLCHAR,
  176. #endif
  177. #ifdef CONVERS
  178.     "convers",  dombconvers,0, 0, NULLCHAR,
  179. #endif
  180. #ifdef MAILCMDS
  181. #ifdef MBFWD
  182.     "fwdinfo",  dombfwdinfo,0, 0, NULLCHAR,
  183.     "haddress", dombhaddress,0,0, NULLCHAR,
  184.     "header",   dombheader, 0, 0, NULLCHAR,
  185. #endif
  186. #endif
  187. #ifdef AX25
  188.     "hideport", dombhideport, 0,0, NULLCHAR,
  189. #ifdef MAILCMDS
  190. #ifdef MBFWD
  191. #ifdef RLINE
  192.     "kick",     dombkick,   0, 0, NULLCHAR,
  193. #endif
  194. #endif
  195. #endif
  196. #endif
  197. #ifdef MAILCMDS
  198. #ifdef MAILFOR
  199. #ifdef AX25
  200.     "mailfor",  dombmailfor,0, 0, NULLCHAR,
  201. #endif
  202. #endif
  203. #ifdef AX25
  204.     "mport",    dombmport,  0, 0, NULLCHAR,
  205. #ifdef USERLOG
  206.     "newmail",  dombnewmail,0, 0, NULLCHAR,
  207. #endif
  208. #endif /* MAILCMDS */
  209.     "nobid",  dombnobid,  0, 0, NULLCHAR,
  210. #ifdef AX25
  211.     "nrid",     dombnrid,   0, 0, NULLCHAR,
  212. #endif
  213. #endif
  214.     "past",     dombpast,   0, 0, NULLCHAR,
  215.     "password", dombpasswd, 0, 0, NULLCHAR,
  216. #ifdef MAILCMDS
  217.     "mailstats",dombmailstats,0,0,NULLCHAR,
  218. #ifdef MBFWD
  219.     "qth",      dombqth,    0, 0, NULLCHAR,
  220. #endif
  221. #ifdef REGISTER
  222.     "register", dombregister,0, 0,NULLCHAR,
  223. #endif
  224. #endif /* MAILCMDS */
  225.     "secure",   dombsecure, 0, 0, NULLCHAR,
  226. #ifdef MAILCMDS
  227.     "sendquery",dombsendquery,0,0,NULLCHAR,
  228. #ifdef MBFWD
  229.     "smtptoo",  dombsmtptoo,0, 0, NULLCHAR,
  230. #endif
  231. #endif
  232.     "status",   dombstatus,  0, 0, NULLCHAR,
  233.     "showalias",dombshowalias,0,0, NULLCHAR,
  234. #ifdef MAILCMDS
  235. #ifdef  AX25
  236. #ifdef MBFWD
  237.     "timer",        dombtimer,      0, 0, NULLCHAR,
  238. #endif
  239. #endif
  240. #endif
  241.     "tdisc",    dombtdisc,  0, 0, NULLCHAR,
  242.     "tmsg",     dombtmsg,   0, 0, NULLCHAR,
  243. #ifdef MAILCMDS
  244. #ifdef MBFWD
  245.     "trace",    dombtrace,  0, 0, NULLCHAR,
  246.     "utc",      dombutc,    0, 0, NULLCHAR,
  247.     "zipcode",  dombzipcode,0, 0, NULLCHAR,
  248. #endif
  249. #endif
  250. #ifdef MBOXRESET
  251.     "reset",    dombreset,  0, 0, NULLCHAR,
  252. #endif
  253.     "noax25",   dombnoax25, 0, 0, NULLCHAR,
  254.     "bbsonly",  dombbonly,  0, 0, NULLCHAR,
  255.     "usersonly",dombuonly,  0, 0, NULLCHAR,
  256.     "sysoponly",dombsonly, 0, 0, NULLCHAR,
  257.     NULLCHAR,
  258. };
  259.   
  260. struct alias *AliasList;
  261.   
  262. // add aliases to the list
  263. int
  264. doaliases(int argc,char *argv[],void *p) {
  265.     struct alias *a;
  266.     int len;
  267.   
  268.     if(argc < 2)    // show the aliases
  269.         return dombalias(0,NULL,NULL);
  270.   
  271.     if(argc == 2) {  // show a single alias, if any
  272.         for(a=AliasList;a;a=a->next)
  273.             if(!stricmp(a->name,argv[1])) {
  274.                 tprintf("%s\n",a->cmd);
  275.                 break;
  276.             }
  277.         if(!a)
  278.             tputs("not set!\n");
  279.         return 0;
  280.     }
  281.   
  282.     // now either delete or add an alias !
  283.     if((len=strlen(argv[2])) == 0) {  // delete an alias
  284.         struct alias *p = NULL;
  285.   
  286.         for(a=AliasList;a;p=a,a=a->next) {
  287.             if(!stricmp(a->name,argv[1])) {
  288.                 if(p)
  289.                     p->next = a->next;
  290.                 else
  291.                     AliasList = a->next;
  292.                 free(a->name);
  293.                 free(a->cmd);
  294.                 free(a);
  295.                 break;
  296.             }
  297.         }
  298.     } else {    // add a new alias or change an existing one
  299.         if(len > MBXLINE) {
  300.             puts("Alias too long!\n");
  301.             return 1;
  302.         }
  303.         for(a=AliasList;a;a=a->next)
  304.             if(!stricmp(a->name,argv[2]))
  305.                 break;
  306.         if(!a) {    // add a new one
  307.             a = mallocw(sizeof(struct alias));
  308.             a->next = AliasList;
  309.             AliasList = a;
  310.             a->name = strdup(argv[1]);
  311.             strupr(a->name);
  312.         } else
  313.             free(a->cmd);
  314.         a->cmd = strdup(argv[2]);
  315.     }
  316.     return 0;
  317. }
  318.   
  319.   
  320. int
  321. dombalias(int argc,char *argv[],void *p) {
  322.     struct alias *a;
  323.   
  324.     for(a=AliasList;a;a=a->next)
  325.         if(tprintf("%s: %s\n",a->name,a->cmd) == EOF)
  326.             return EOF;
  327.     return 0;
  328. }
  329.   
  330. struct alias *findalias(char *cmd) {
  331.     struct alias *a;
  332.   
  333.     // check with the alias list
  334.     for(a=AliasList;a;a=a->next)
  335.         if(!stricmp(a->name,cmd))
  336.             break;
  337.     return a;
  338. }
  339.   
  340.   
  341. char Mbnrid[20];
  342.   
  343. /*set the mailbox netrom id*/
  344. void
  345. setmbnrid() {
  346.     char tmp[AXBUF];
  347.     char tmp2[AXBUF];
  348. #ifndef AX25
  349.     char *cp;
  350. #endif
  351.   
  352. #ifdef NETROM
  353.     if(Nr_iface != NULLIF) { /* Use netrom call, and alias (if exists) */
  354.         if(*Myalias != '\0')
  355.             sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),
  356.             pax25(tmp2,Nr_iface->hwaddr));
  357.         else
  358.             sprintf(Mbnrid,"%s ",pax25(tmp,Nr_iface->hwaddr));
  359.         return;
  360.     }
  361.     /* Use Mycall, and alias (if exists) */
  362.     if(*Myalias != '\0')
  363.         sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),pax25(tmp2,Mycall));
  364.     else
  365. #endif
  366. #ifdef AX25
  367.         sprintf(Mbnrid,"%s ",pax25(tmp,Mycall));
  368. #else
  369.     strncpy(Mbnrid,Hostname,19);
  370.     if((cp = strchr(Mbnrid,'.')) != NULLCHAR)
  371.         *cp = '\0';
  372. #endif
  373.     return;
  374. }
  375.   
  376. /*This is a dummy called from the main command interpreter,
  377.  *setup a mbx structure so dombusers() works correct - WG7J
  378.  */
  379. int
  380. dombstatus(argc,argv,p)
  381. int argc;
  382. char *argv[];
  383. void *p;
  384. {
  385.     struct mbx m;
  386.   
  387.     m.privs = SYSOP_CMD;
  388.     m.stype = ' ';
  389.     return dombusers(0,NULL,&m);
  390. }
  391.   
  392. int
  393. dombox(argc,argv,p)
  394. int argc;
  395. char *argv[];
  396. void *p;
  397. {
  398.     if(argc == 1)
  399.         return dombstatus(0,NULL,NULL);
  400.     return subcmd(Mbtab,argc,argv,p);
  401. }
  402.   
  403. #ifdef REGISTER
  404. static int
  405. dombregister(argc,argv,p)
  406. int argc;
  407. char *argv[];
  408. void *p;
  409. {
  410.     return setbool(&MbRegister,"registration",argc,argv);
  411. }
  412. #endif
  413.   
  414. #ifdef AX25
  415.   
  416. static int
  417. dombhideport(int argc, char *argv[], void *p)
  418. {
  419.     return setflag(argc,argv[1],HIDE_PORT,argv[2]);
  420. }
  421.   
  422. static int
  423. dombnrid(argc,argv,p)
  424. int argc;
  425. char *argv[];
  426. void *p;
  427. {
  428.     return setbool(&Usenrid,"Netrom id prompt",argc,argv);
  429. }
  430.   
  431. #ifdef MAILCMDS
  432. static int
  433. dombmport(argc,argv,p)
  434. int argc;
  435. char *argv[];
  436. void *p;
  437. {
  438.     return setflag(argc,argv[1],MAIL_BEACON,argv[2]);
  439. }
  440. #endif
  441. #endif /* AX25 */
  442.   
  443. #ifdef MAILCMDS
  444.   
  445. static int
  446. dombnobid(argc,argv,p)
  447. int argc;
  448. char *argv[];
  449. void *p;
  450. {
  451.     return setbool(&NoBid,"Accept Buls without BID",argc,argv);
  452. }
  453.   
  454. static int
  455. dombsendquery(argc,argv,p)
  456. int argc;
  457. char *argv[];
  458. void *p;
  459. {
  460.     return setbool(&Mbsendquery,"query after send",argc,argv);
  461. }
  462.   
  463. #ifdef USERLOG
  464.   
  465. static int
  466. dombnewmail(argc,argv,p)
  467. int argc;
  468. char *argv[];
  469. void *p;
  470. {
  471.     return setbool(&Mbnewmail,"show new area mail",argc,argv);
  472. }
  473. #endif
  474. #endif
  475.   
  476. #ifdef CONVERS
  477. int Mbconverse = 1;
  478.   
  479. static int
  480. dombconvers(argc,argv,p)
  481. int argc;
  482. char *argv[];
  483. void *p;
  484. {
  485.     return setbool(&Mbconverse,"Mbox convers",argc,argv);
  486. }
  487. #endif
  488.   
  489. #ifdef TTYLINKSERVER
  490. /* if unattended mode is set, ax25, telnet and maybe other sessions will
  491.  * be restricted.
  492.  */
  493. static int
  494. doattend(argc,argv,p)
  495. int argc;
  496. char *argv[];
  497. void *p;
  498. {
  499.     return setbool(&MAttended,"Mailbox Attended flag",argc,argv);
  500. }
  501. #endif
  502.   
  503. /* Set mailbox redundancy timer */
  504. static int
  505. dombtdisc(argc,argv,p)
  506. int argc;
  507. char *argv[];
  508. void *p;
  509. {
  510.     return setlong(&Mbtdiscinit,"Mbox redundancy timer (sec)",argc,argv);
  511. }
  512.   
  513. #ifdef MAILCMDS
  514. #ifdef MBFWD
  515. int Mbheader;
  516.   
  517. extern int ThirdParty;
  518.   
  519. static int
  520. dombheader(argc,argv,p)
  521. int argc;
  522. char *argv[];
  523. void *p;
  524. {
  525.     int retval;
  526.   
  527.     retval = setbool(&Mbheader,"R: header",argc,argv);
  528.     if(!Mbheader)
  529.         ThirdParty = 0;
  530.     return retval;
  531. }
  532.   
  533. static int
  534. dombsmtptoo(argc,argv,p)
  535. int argc;
  536. char *argv[];
  537. void *p;
  538. {
  539.     return setbool(&Mbsmtptoo,"Bbs forwards SMTP headers",argc,argv);
  540. }
  541. #endif
  542. #endif
  543.   
  544. static int
  545. dombpasswd(argc,argv,p)
  546. int argc;
  547. char *argv[];
  548. void *p;
  549. {
  550.     int len;
  551.   
  552.     /*Only allowed from keyboard*/
  553.     if(Curproc->input != Command->input) {
  554.         tputs(Noperm);
  555.         return 0;
  556.     }
  557.     if(argc != 2) {
  558.         tputs("Usage: mbox password \"<sysop password>\"\n");
  559.         return 0;
  560.     }
  561.     if((len=strlen(argv[1])) == 0)
  562.         return 0;       /* zero length, don't reset */
  563.   
  564.     if(len > MAXPWDLEN) {
  565.         tputs("Too long\n");
  566.         return 0;
  567.     }
  568.     strcpy(Mbpasswd,argv[1]);
  569.     return 0;
  570. }
  571.   
  572. static int
  573. dombtmsg(argc,argv,p)
  574. int argc;
  575. char *argv[];
  576. void *p;
  577. {
  578.     if(argc > 2) {
  579.         tputs("Usage: mbox tmsgs \"<your message>\"\n");
  580.         return 0;
  581.     }
  582.   
  583.     if(argc < 2) {
  584.         if(Mtmsg != NULLCHAR)
  585.             tputs(Mtmsg);
  586.     }
  587.     else {
  588.         if(Mtmsg != NULLCHAR){
  589.             free(Mtmsg);
  590.             Mtmsg = NULLCHAR;   /* reset the pointer */
  591.         }
  592.         if(!strlen(argv[1]))
  593.             return 0;               /* clearing the buffer */
  594.         Mtmsg = mallocw(strlen(argv[1])+5);/* allow for the EOL char */
  595.         strcpy(Mtmsg, argv[1]);
  596.         strcat(Mtmsg, "\n");        /* add the EOL char */
  597.     }
  598.     return 0;
  599. }
  600.   
  601. #ifdef MAILCMDS
  602. #ifdef MBFWD
  603. signed int UtcOffset=0;
  604.   
  605. /*Set the difference between Local time, and UTC !*/
  606. static int
  607. dombutc(argc,argv,p)
  608. int argc;
  609. char *argv[];
  610. void *p;
  611. {
  612.     if(argc < 2) {
  613.         tputs("Local Time is UTC");
  614.         if(UtcOffset == 0)
  615.             tputc('\n');
  616.         else {
  617.             if(UtcOffset > 0)
  618.                 tputc('+');
  619.             tprintf("%d\n",UtcOffset);
  620.         }
  621.         return 0;
  622.     }
  623.     UtcOffset = atoi(argv[1]);
  624.     return 0;
  625. }
  626.   
  627. /*Set the ZIP to be used in the R: line when forwarding */
  628. static int
  629. dombzipcode(argc,argv,p)
  630. int argc;
  631. char *argv[];
  632. void *p;
  633. {
  634.     int len;
  635.   
  636.     if(argc > 2) {
  637.         tputs("Usage: mbox zipcode <your zip>\n");
  638.         return 0;
  639.     }
  640.   
  641.     if(argc < 2) {
  642.         if(Mbzip != NULLCHAR)
  643.             tprintf("%s\n",Mbzip);
  644.     }
  645.     else {
  646.         len = strlen(argv[1]);
  647. #ifdef notdef
  648.     /*check for a valid zip - this is for USA only!!! - WG7J*/
  649.         if( (len != 5) || !(atol(argv[1])) ){
  650.             tprintf("%s: Invalid, should be 5 digits!\n",argv[1]);
  651.             return 0;
  652.         }
  653. #endif
  654.         if(Mbzip != NULLCHAR){
  655.             free(Mbzip);
  656.             Mbzip = NULLCHAR;   /* reset the pointer */
  657.         }
  658.         if(len == 0)
  659.             return 0;               /* clearing the buffer */
  660.         Mbzip = mallocw(len+1); /* room for \0 */
  661.         strcpy(Mbzip, argv[1]);
  662.     }
  663.     return 0;
  664. }
  665.   
  666. /* Set the QTH to be used in R: line when forwarding*/
  667. static int
  668. dombqth(argc,argv,p)
  669. int argc;
  670. char *argv[];
  671. void *p;
  672. {
  673.     if(argc > 2) {
  674.         tputs("Usage: mbox qth <your qth> || \"<your qth, state>\"\n");
  675.         return 0;
  676.     }
  677.   
  678.     if(argc < 2) {
  679.         if(Mbqth != NULLCHAR)
  680.             tprintf("%s\n",Mbqth);
  681.     }
  682.     else {
  683.         if(Mbqth != NULLCHAR){
  684.             free(Mbqth);
  685.             Mbqth = NULLCHAR;   /* reset the pointer */
  686.         }
  687.         if(!strlen(argv[1]))
  688.             return 0;               /* clearing the buffer */
  689.         Mbqth = mallocw(strlen(argv[1]) + 1);
  690.         strcpy(Mbqth, argv[1]);
  691.     }
  692.     return 0;
  693. }
  694.   
  695. /*Set the hierachical address to be used in R: line when forwarding*/
  696. static int
  697. dombhaddress(argc,argv,p)
  698. int argc;
  699. char *argv[];
  700. void *p;
  701. {
  702.     if(argc > 2) {
  703.         tputs("Usage: mbox haddress <your H-address (WITH call)>\n");
  704.         return 0;
  705.     }
  706.   
  707.     if(argc < 2) {
  708.         if(Mbhaddress != NULLCHAR)
  709.             tprintf("%s\n",Mbhaddress);
  710.     }
  711.     else {
  712.         if(Mbhaddress != NULLCHAR){
  713.             free(Mbhaddress);
  714.             Mbhaddress = NULLCHAR;   /* reset the pointer */
  715.         }
  716.         if(!strlen(argv[1]))
  717.             return 0;               /* clearing the buffer */
  718.         Mbhaddress = mallocw(strlen(argv[1]) + 1);
  719.         strcpy(Mbhaddress, argv[1]);
  720.     /*make sure the're upper case*/
  721.         strupr(Mbhaddress);
  722.     }
  723.     return 0;
  724. }
  725.   
  726. /*Set the R: line [info] to be used when forwarding*/
  727. static int
  728. dombfwdinfo(argc,argv,p)
  729. int argc;
  730. char *argv[];
  731. void *p;
  732. {
  733.     if(argc > 2) {
  734.         tputs("Usage: mbox fwdinfo \"<your R:-line [info]>\"\n");
  735.         return 0;
  736.     }
  737.   
  738.     if(argc < 2) {
  739.         if(Mbfwdinfo != NULLCHAR)
  740.             tprintf("%s\n",Mbfwdinfo);
  741.     }
  742.     else {
  743.         if(Mbfwdinfo != NULLCHAR){
  744.             free(Mbfwdinfo);
  745.             Mbfwdinfo = NULLCHAR;   /* reset the pointer */
  746.         }
  747.         if(!strlen(argv[1]))
  748.             return 0;               /* clearing the buffer */
  749.         Mbfwdinfo = mallocw(strlen(argv[1]) + 1);
  750.         strcpy(Mbfwdinfo, argv[1]);
  751.     }
  752.     return 0;
  753. }
  754. #endif /*MBFWD*/
  755. #endif
  756.   
  757. /* Keep track of all past users */
  758. struct pu {
  759.     struct pu *next;    /* next one in list */
  760.     char name[20];              /* user name */
  761. #ifdef notdef
  762.     int family;                 /* how did user come in last */
  763. #endif
  764.     int32 time;                 /* When was the last login ? */
  765.     int number;                 /* Number of times logged in */
  766. };
  767. #define NULLPU (struct pu *)NULL
  768. struct pu *Pu = NULLPU;
  769.   
  770. /* Look up an entry in the users-list*/
  771. static
  772. struct pu *
  773. pu_lookup(name)
  774. char *name;
  775. {
  776.     struct pu *ppu;
  777.     struct pu *pulast = NULLPU;
  778.   
  779.     for(ppu = Pu;ppu != NULLPU;pulast = ppu,ppu = ppu->next){
  780.         if(!strcmp(name,ppu->name)){ /* found it! */
  781.             if(pulast != NULLPU){
  782.                 /* Move entry to top of list */
  783.                 pulast->next = ppu->next;
  784.                 ppu->next = Pu;
  785.                 Pu = ppu;
  786.             }
  787.             return ppu;
  788.         }
  789.     }
  790.     return NULLPU;
  791. }
  792.   
  793. /*Log all users of the mailbox*/
  794. /* This gets kept track of in the file name UDefaults */
  795. /* format is
  796. user datestamp options
  797. where options are separated by spaces
  798. M# - use more with # lines
  799. A - use area indication
  800. X - use expert status
  801. N - use netrom lookalike prompt
  802. R - send 'reply-to' header with mail
  803. */
  804.   
  805. #ifdef USERLOG
  806.   
  807. /* Write the new defaults - WG7J */
  808. void
  809. updatedefaults(m)
  810. struct mbx *m;
  811. {
  812.     FILE *Ufile, *tfile;
  813.     char buf[256];
  814.     char *cp;
  815.     time_t t;
  816.   
  817.     /* Save old defaults file to backup */
  818.     unlink(UDefbak);
  819.     if(rename(UDefaults,UDefbak))
  820.         return;
  821.   
  822.     /*Write all users back, but update this one!*/
  823.     if((Ufile = fopen(UDefaults,"w")) == NULLFILE) {
  824.         /* Can't create defaults file ??? */
  825.         rename(UDefbak,UDefaults);  /* undo */
  826.         return;
  827.     }
  828.   
  829.     if((tfile = fopen(UDefbak,"r")) == NULLFILE) {
  830.         /* What on earth happened ???? */
  831.         fclose(Ufile);
  832.         unlink(UDefaults);
  833.         rename(UDefbak,UDefaults);  /* undo */
  834.         return;
  835.     }
  836.     while(fgets(buf,sizeof(buf),tfile) != NULLCHAR) {
  837.         if((cp=strchr(buf,' ')) != NULLCHAR)
  838.             *cp = '\0';
  839.         if(!stricmp(m->name,buf)) {
  840.             /*found this user*/
  841.             time(&t);
  842.             /* KF5MG
  843.                the -n , -h and -e flags are for Name and Homebbs and email.
  844.                Existing USER.DAT files should work. No -n, -h or -e will be
  845.                found, so defaults will be used. The REGISTER command updates
  846.                the username and homebbs fields.
  847.             */
  848.             sprintf(buf,"%s %lu M%d %c %c %c %c -n%s -h%s -e%s C%c\n",
  849.             m->name,t,m->morerows,
  850.             (m->sid&MBX_REPLYADDR) ? 'R' : ' ',
  851.             (m->sid&MBX_AREA) ? 'A' : ' ' ,
  852.             (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  853.             (m->sid&MBX_NRID) ? 'N' : ' ',
  854.             m->username?m->username : "",
  855.             m->homebbs ? m->homebbs : "",
  856.             m->IPemail ? m->IPemail : "",
  857.             (m->family == AF_AX25) ? 'A' : \
  858.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  859.         } else
  860.             *cp = ' '; /* restore the space !*/
  861.         fputs(buf,Ufile);
  862.     }
  863.     fclose(tfile);
  864.     fclose(Ufile);
  865.     return;
  866. }
  867.   
  868. #ifdef MAILCMDS
  869. /* scan the areas file, looking for those with datestamps > m->last.
  870.  * these are areas that have new mail received since the user
  871.  * last logged in. - WG7J/N5KNX
  872.  */
  873. void listnewmail(struct mbx *m,int silent) {
  874.     FILE *fp;
  875.     char buf[LINELEN], path[FILE_PATH_SIZE];
  876.     struct stat statbuf;
  877.     long t;
  878.     int rval;
  879.     int firstone=1, column=0;
  880.  
  881.     if((fp = fopen(Arealist,READ_TEXT)) == NULLFILE)
  882.         return;
  883.     while(fgets(buf,sizeof(buf),fp) != NULLCHAR) {
  884.         pwait(NULL);
  885.         /* The first word on each line is all that matters */
  886.         firsttoken(buf);
  887.         dirformat(buf);
  888.     sprintf(path,"%s/%s.inf", Mailspool, buf);
  889.     dotformat(buf);
  890.     if ((rval = open(path, READBINARY)) == -1)
  891.          continue;
  892.     if (fstat(rval, &statbuf) != -1) {
  893.         /* Is there new mail here ? */
  894.             if(m->last < statbuf.st_mtime) {
  895.             if(firstone) {
  896.                      tprintf("New mail in: %s  ",buf);
  897.                      firstone = 0;
  898.                      column = 2;
  899.                 } else {
  900.                     tprintf("%s  ",buf);
  901.                     if(column++ == 6)
  902.                         tputc('\n');
  903.                 }
  904.             }
  905.     }
  906.     close(rval);
  907.     }
  908.     fclose(fp);
  909.     if(!firstone)
  910.         tputc('\n');
  911.     else if(!silent)
  912.         tputs("No new bulletins since last login\n");
  913.     return;
  914. }
  915. #endif MAILCMDS
  916.   
  917. #endif /* USERLOG */
  918.   
  919. int DiffUsers;
  920.   
  921. void
  922. loguser(m)
  923. struct mbx *m;
  924. {
  925.     struct pu *pu;
  926. #ifdef USERLOG
  927.     FILE *Ufile;
  928.     char buf[256];
  929.     char *cp,*cp2;
  930.     int found=0;
  931.     int xpert = 0;
  932. #endif
  933.   
  934.     if((pu = pu_lookup(m->name)) == NULLPU) {   /* not 'known' user */
  935.         pu = (struct pu *)callocw(1,sizeof(struct pu));
  936.         strcpy(pu->name,m->name);
  937.         pu->next = Pu;
  938.         Pu = pu;
  939.         DiffUsers++;    /* A new guy */
  940.     }
  941. #ifdef notdef
  942.     pu->family = m->family;
  943. #endif
  944.     pu->time = secclock();
  945.     pu->number++;
  946.   
  947. #ifdef USERLOG
  948.     /* In case these are already set, clear them */
  949.     free(m->homebbs);
  950.     free(m->IPemail);
  951.     free(m->username);
  952.     m->username = m->IPemail = m->homebbs = NULLCHAR;
  953.   
  954.     /* Now get options from the userdefaults file, and add timestamp */
  955.     if(!(m->sid&MBX_SID)) { /* only if not a bbs */
  956.         sprintf(buf,"%s",UDefaults);
  957.         if ((Ufile = fopen(buf,"r+")) == NULLFILE) {
  958.             /* default file doesn't exist, create it */
  959.             if((Ufile = fopen(buf,"w")) == NULLFILE)
  960.                 return;
  961.             /* Add this user as first one */
  962.             sprintf(buf,"%s 0 M%d A %c %c C%c\n",
  963.             m->name,m->morerows,
  964.             (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  965.             (m->sid&MBX_NRID) ? 'N' : ' ',
  966.             (m->family == AF_AX25) ? 'A' : \
  967.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  968.             fputs(buf,Ufile);
  969.             fclose(Ufile);
  970.             m->sid |= MBX_AREA;
  971.             m->last = 0L;
  972.             if(Usenrid)
  973.                 m->sid |= MBX_NRID;
  974.             return;
  975.         }
  976.         /* Find user in the default file */
  977.         while(!found) {
  978.             if(fgets(buf,sizeof(buf),Ufile) == NULLCHAR)
  979.                 break;
  980.             /* single out the name */
  981.             if((cp=strchr(buf,' ')) != NULLCHAR)
  982.                 *cp++ = '\0';
  983.             /* compare the name */
  984.             if(!stricmp(m->name,buf)) {
  985.                 /* found user, now scan the options used */
  986.                 found = 1;
  987.                 fclose(Ufile);
  988.                 /* first read last login time */
  989.                 m->last = atol(cp);
  990.                 while(*cp != '\0') {
  991.                     while(*cp == ' ')   /*skip blanks*/
  992.                         cp++;
  993.                     switch(*cp){
  994.                         case 'C':
  995.                         /* All options end BEFORE the CT/CN or CA */
  996.                             *(cp+1) = '\0';
  997.                             break;
  998.                         case 'R':
  999.                             m->sid |= MBX_REPLYADDR;
  1000.                             break;
  1001.                         case 'M':
  1002.                             cp++;
  1003.                             m->morerows = atoi(cp);
  1004.                             break;
  1005.                         case 'A':
  1006.                             m->sid |= MBX_AREA;
  1007.                             break;
  1008.                         case 'X':
  1009.                             m->sid |= MBX_EXPERT;
  1010.                             xpert = 1;
  1011.                             break;
  1012.                         case 'N':
  1013.                             m->sid |= MBX_NRID;
  1014.                             break;
  1015.                         case '-':
  1016.                             cp++;
  1017.                             cp2 = cp++;     /* cp2 point to option,
  1018.                                          * cp to beginning of option-data */
  1019.                             while(*cp != ' ')   /* find end of option-data */
  1020.                                 cp++;
  1021.                             *cp = '\0';
  1022.                             switch(*cp2++){
  1023.                                 case 'h':
  1024.                                     if(*cp2)
  1025.                                         m->homebbs  = strdup(cp2);
  1026.                                     break;
  1027.                                 case 'e':
  1028.                                     if(*cp2)
  1029.                                         m->IPemail  = strdup(cp2);
  1030.                                     break;
  1031.                                 case 'n':
  1032.                                     if(*cp2)
  1033.                                         m->username = strdup(cp2);
  1034.                                     break;
  1035.                             }
  1036.                             break;
  1037.                     }
  1038.                     cp++;
  1039.                 }
  1040.             }
  1041.         } /* while(!found)*/
  1042.         if(found) {
  1043.             /* add the new timestamp to the defaults file */
  1044.             if(!xpert)
  1045.                 m->sid &= ~MBX_EXPERT;
  1046.         } else {
  1047.             /* a new one, add to the end (where we now should be!)*/
  1048.             m->last = 0L;
  1049.             sprintf(buf,"%s 0 M%d A %c %c C%c\n",
  1050.             m->name,m->morerows,
  1051.             (m->sid & MBX_EXPERT) ? 'X' : ' ' ,
  1052.             (Usenrid) ? 'N' : ' ' ,
  1053.             (m->family == AF_AX25) ? 'A' : \
  1054.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  1055.             fputs(buf,Ufile);
  1056.             fclose(Ufile);
  1057.             m->sid |= MBX_AREA;
  1058.             if(Usenrid)
  1059.                 m->sid |= MBX_NRID;
  1060.         }
  1061.     }/* if not bbs */
  1062. #endif /* USERLOG */
  1063.   
  1064. }
  1065.   
  1066. /*List all past users of the mailbox */
  1067. extern int
  1068. dombpast(argc,argv,p)
  1069. int argc;
  1070. char *argv[];
  1071. void *p;
  1072. {
  1073.   
  1074.     struct pu *pu;
  1075.     int col = 0;
  1076.     int max=10000;      /* Large enough :-) */
  1077.     int count=0;
  1078.   
  1079.     if(argc>1)
  1080.         max = atoi(argv[1])-1;
  1081.   
  1082.     tputs("Past users:\n"
  1083.     "User       Logins  Time since last   "
  1084.     "User       Logins  Time since last\n");
  1085.     for (pu=Pu;pu!=NULLPU;pu=pu->next) {
  1086.         if(col)
  1087.             tputs(" : ");
  1088.         tprintf("%-10s    %-4d    %12s",pu->name,pu->number,\
  1089.         tformat(secclock() - pu->time));
  1090.         count++;
  1091.         if(count>max)
  1092.             break;
  1093.         if(col) {
  1094.             col = 0;
  1095.             tputc('\n');
  1096.         } else
  1097.             col = 1;
  1098.     }
  1099.     if(col)
  1100.         tputc('\n');
  1101.     tputc('\n');
  1102.     return 0;
  1103. }
  1104.   
  1105. int
  1106. dombmailstats(argc,argv,p)
  1107. int argc;
  1108. char *argv[];
  1109. void *p;
  1110. {
  1111.     tprintf(
  1112.     "Version: %s\n"
  1113.     "Compile: %s\n"  
  1114.     "Core: %lu\n"
  1115.     "Up: %s\n"
  1116.     "Logins: %d\n"
  1117.     "Users: %d\n"
  1118.     "Count: %d\n",
  1119.     shortversion,whofor,farcoreleft(),tformat(secclock()),
  1120.     Totallogins,BbsUsers,DiffUsers);
  1121.   
  1122. #ifdef MAILCMDS
  1123. #ifdef MBFWD
  1124.     tprintf("Sent: %d\n"
  1125.     "Read: %d\n"
  1126.     "Rcvd: %d\n"
  1127.     "Fwd: %d\n\n",\
  1128.     MbSent,MbRead,MbRecvd,MbForwarded);
  1129. #else
  1130.     tprintf("Sent: %d\n"
  1131.     "Read: %d\n"
  1132.     "Rcvd: %d\n\n",MbSent,MbRead,MbRecvd);
  1133. #endif
  1134. #endif
  1135.     return 0;
  1136. }
  1137.   
  1138. #ifdef USERLOG
  1139.   
  1140. /* Search for info on a certain user in the users.dat file */
  1141. int
  1142. dombuserinfo(argc,argv,p)
  1143. int argc;
  1144. char *argv[];
  1145. void *p;
  1146. {
  1147.     FILE *Ufile;
  1148.     char buf[MBXLINE];
  1149.     int found = 0;
  1150.     time_t t;
  1151.     struct tm *lt;
  1152.     char *cp;
  1153.     char *cp2;
  1154.     char *cp3;
  1155.   
  1156.     char *username = NULL;
  1157.     char *homebbs = NULL;
  1158.     char *IPemail = NULL;
  1159.   
  1160.     cp3 = "TELNET";
  1161.   
  1162.     if((Ufile = fopen(UDefaults,"r")) == NULLFILE) {
  1163.         tputs("Can't find user data\n");
  1164.         return 0;
  1165.     }
  1166.   
  1167.     while(!found) {
  1168.         if(fgets(buf,sizeof(buf),Ufile) == NULLCHAR)
  1169.             break;
  1170.          /* single out the name */
  1171.         if((cp=strchr(buf,' ')) != NULLCHAR)
  1172.             *cp++ = '\0';
  1173.          /* compare the name */
  1174.         if(!stricmp(argv[1],buf)) {
  1175.             /* found user, now scan the options used */
  1176.             found = 1;
  1177.             /* read last login time */
  1178.             t = atol(cp);
  1179.             lt = localtime(&t);
  1180.             while(*cp != '\0') {
  1181.                 while(*cp == ' ')   /*skip blanks*/
  1182.                     cp++;
  1183.                 switch(*cp){
  1184.                     case 'C':
  1185.                         cp++;
  1186.                     switch(*cp){
  1187.                         /* All options end BEFORE the CT/CN or CA */
  1188.                         case 'A':
  1189.                             cp3 = "AX.25";
  1190.                             break;
  1191.                         case 'N':
  1192.                             cp3 = "NETROM";
  1193.                             break;
  1194.                     }
  1195.                         *(cp+1) = '\0';
  1196.                         break;
  1197.                     case '-':
  1198.                         cp++;
  1199.                     switch(*cp){
  1200.                         case 'h':
  1201.                             cp++;
  1202.                             cp2 = cp;
  1203.                             while(*cp != ' ')   /*skip blanks*/
  1204.                                 cp++;
  1205.                             *cp = '\0';
  1206.                             free(homebbs);
  1207.                             homebbs = strdup(cp2);
  1208.                             break;
  1209.                         case 'e':
  1210.                             cp++;
  1211.                             cp2 = cp;
  1212.                             while(*cp != ' ')   /*skip blanks*/
  1213.                                 cp++;
  1214.                             *cp = '\0';
  1215.                             free(IPemail);
  1216.                             IPemail = strdup(cp2);
  1217.                             break;
  1218.                         case 'n':
  1219.                             cp++;
  1220.                             cp2 = cp;
  1221.                             while(*cp != ' ')   /*skip blanks*/
  1222.                                 cp++;
  1223.                             *cp = '\0';
  1224.                             free(username);
  1225.                             username = strdup(cp2);
  1226.                             break;
  1227.                     }
  1228.                         break;
  1229.                 }
  1230.                 cp++;
  1231.             }
  1232.   
  1233.             tprintf("%s last connected via %s on %s",argv[1],cp3,asctime(lt));
  1234.             if(username  && (IPemail || homebbs)) {
  1235.                 tprintf("%s can be reached at:\n",username);
  1236.                 if(homebbs)
  1237.                     tprintf("AX.25 BBS: %s\n", homebbs);
  1238.                 if(IPemail)
  1239.                     tprintf("Internet:  %s\n", IPemail);
  1240.             }
  1241.         } /* while(!found)*/
  1242.     }
  1243.     if(!found)
  1244.         tprintf("%s never connected\n",argv[1]);
  1245.   
  1246.     fclose(Ufile);
  1247.     return 0;
  1248. }
  1249.   
  1250. #endif
  1251.  
  1252. #ifdef MBOXRESET
  1253. dombreset(argc,argv,p)
  1254. int argc;
  1255. char *argv[];
  1256. void *p;
  1257. {
  1258.     int j;
  1259.     struct mbx *m;
  1260.     for(m=Mbox;m;m=m->next) {
  1261.         if (argc == 1)
  1262.          tprintf("%s\n",m->name);
  1263.     else for (j=1;j<=argc;j++){
  1264.             if (!strcmp(argv[j],m->name)) {
  1265.         tprintf ("mbox user %s reset\n",m->name);
  1266.         close_s(m->user);
  1267.         }
  1268.     }
  1269.     }
  1270.     return 0;
  1271. }
  1272. #endif
  1273.  
  1274.  
  1275.   
  1276. int
  1277. dombusers(argc,argv,p)
  1278. int argc;
  1279. char *argv[];
  1280. void *p;
  1281. {
  1282.     struct mbx *m,*caller;
  1283.     int len;
  1284.     char *cp, *cp1, fsocket[MAXSOCKSIZE];
  1285.     char upl[40], down[40];
  1286.   
  1287.     struct usock *up, *up1;
  1288.     int s;
  1289.   
  1290. #ifdef NETROM
  1291.     struct nrroute_tab *np;
  1292.     char temp[AXBUF], *cp2, *cp3;
  1293. #endif
  1294.   
  1295.     caller = (struct mbx *) p;
  1296.   
  1297.     if(caller->stype == 'S')
  1298.         return dombmailstats(argc,argv,p);
  1299.   
  1300. #ifdef MAILCMDS
  1301.     if(((caller->stype == 'M') || (caller->stype == 'C')) &&
  1302.         (caller->privs & SYSOP_CMD))
  1303.         return dombmovemail(argc,argv,p);
  1304. #endif
  1305.   
  1306.     if(caller->stype == 'L')
  1307. #ifdef USERLOG
  1308.         if((argc > 1) && (atoi(argv[1]) == 0))
  1309.             return dombuserinfo(argc,argv,p);
  1310.         else
  1311. #endif
  1312.             return dombpast(argc,argv,p);
  1313.   
  1314.     tputs("Users:\n");
  1315.   
  1316.     for(m=Mbox;m;m=m->next) {
  1317.         len = MAXSOCKSIZE;
  1318.         getpeername(m->user,fsocket,&len);
  1319.         cp = strdup(psocket(fsocket));
  1320.   
  1321.         upl[0] = '\0';
  1322.         down[0] = '\0';
  1323.   
  1324.         switch(m->family) {     /* UPLINK */
  1325. #ifdef AX25
  1326.             case AF_AX25:
  1327.                 sprintf(upl,Uplink,cp);
  1328.                 break;
  1329. #endif
  1330. #ifdef NETROM
  1331.             case AF_NETROM:
  1332.                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1333.                     *cp1 = '\0';
  1334.                 cp1 += 3;
  1335.                 setcall(temp,cp1);
  1336.                 np = find_nrroute(temp);
  1337.                 cp2 = strdup(np->alias);
  1338.                 if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1339.                     *cp3 = '\0';
  1340.     /*
  1341.         if(*cp2 == '#' || *cp2 == '\0')
  1342.         sprintf(upl,incircuit,"","",cp1,cp);
  1343.         else
  1344.      */
  1345.      /* show correct user name when outgoing forward over netrom
  1346.       * problem caused by use of the '.C xxx' lines.
  1347.       */
  1348.                 if(m->state == MBX_TRYING || m->state == MBX_FORWARD)
  1349.                     sprintf(upl,incircuit,cp2,":",cp1,m->name);
  1350.                 else
  1351.                     sprintf(upl,incircuit,cp2,":",cp1,cp);
  1352.                 free(cp2);
  1353.                 break;
  1354. #endif
  1355.             case AF_INET:
  1356.                 if((cp1 = strchr(cp,':')) != NULLCHAR)
  1357.                     *cp1 = '\0';
  1358.                 sprintf(upl,Telnet,m->name ? m->name : "unknown",cp);
  1359.                 break;
  1360.             case AF_LOCAL:
  1361.                 sprintf(upl,Local,(m->type==TIP_LINK) ? m->name : Hostname);
  1362.                 break;
  1363.             default:
  1364.                 strcpy(upl,"Connect");
  1365.                 break;
  1366.         }
  1367.         free(cp);
  1368.         tprintf("%-36s",upl);
  1369.   
  1370.     /* Now show what they are doing - WG7J */
  1371.         if(m->state != MBX_GATEWAY)
  1372.             tputs("  -> ");
  1373.         switch(m->state){
  1374.             case MBX_GATEWAY:
  1375.                 up1 = itop(m->user);
  1376.                 s = 0;
  1377.                 while((s=getnextsocket(s)) != -1) {
  1378.                     if(s == m->user || (up = itop(s)) == NULLUSOCK )
  1379.                         continue;
  1380.                     if(up->owner == up1->owner) {
  1381.                         getpeername(s,fsocket,&len);
  1382.                         cp = strdup(psocket(fsocket));
  1383.                         switch(up->type) {
  1384.                             case TYPE_TCP:
  1385.                                 sprintf(down,Telnetdown,cp);
  1386.                                 break;
  1387. #ifdef AX25
  1388.                             case TYPE_AX25I:
  1389.                                 sprintf(down,Downlink,cp);
  1390.                                 break;
  1391. #endif
  1392. #ifdef NETROM
  1393.                             case TYPE_NETROML4:
  1394.                     /*get rid of usercall*/
  1395.                                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1396.                                     *cp1 = '\0';
  1397.                                 cp1 += 3;   /*get rid of ' @ '*/
  1398.                                 setcall(temp,cp1);      /*get node call*/
  1399.                                 np = find_nrroute(temp);/*find alias, if any*/
  1400.                                 cp2 = strdup(np->alias);
  1401.                                 if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1402.                                     *cp3 = '\0';
  1403.                                 sprintf(down,outcircuit,cp2,":",cp1);
  1404.                                 free(cp2);
  1405.                                 break;
  1406. #endif
  1407.                             case TYPE_LOCAL_STREAM:
  1408.                             case TYPE_LOCAL_DGRAM:
  1409.                                 sprintf(down,Local,Hostname);
  1410.                                 break;
  1411.                             default:
  1412.                                 strcpy(down,"Connect");
  1413.                                 break;
  1414.                         }
  1415.                         free(cp);
  1416.                         tprintf("<--> %s\n",down);
  1417.                         break;
  1418.                     }
  1419.                 }
  1420.                 break;
  1421.             case MBX_LOGIN:
  1422.                 tputs("Logging in\n");
  1423.                 break;
  1424.             case MBX_CMD:
  1425.                 tputs("Idle\n");
  1426.                 break;
  1427. #ifdef MAILCMDS
  1428.             case MBX_SUBJ:
  1429.             case MBX_DATA:
  1430.                 tputs("Sending message\n");
  1431.                 break;
  1432. #ifdef MBFWD
  1433.             case MBX_REVFWD:
  1434.                 tputs("Reverse Forwarding\n");
  1435.                 break;
  1436.             case MBX_TRYING:
  1437.                 tputs("Attempting Forward\n");
  1438.                 break;
  1439.             case MBX_FORWARD:
  1440.                 tputs("Forwarding\n");
  1441.                 break;
  1442. #endif
  1443.             case MBX_READ:
  1444.                 tputs("Reading message\n");
  1445.                 break;
  1446. #endif
  1447.             case MBX_UPLOAD:
  1448.                 tputs("Uploading file\n");
  1449.                 break;
  1450.             case MBX_DOWNLOAD:
  1451.                 tputs("Downloading file\n");
  1452.                 break;
  1453. #ifdef CONVERS
  1454.             case MBX_CONVERS:
  1455.                 tputs("Convers mode\n");
  1456.                 break;
  1457. #endif
  1458.             case MBX_CHAT:
  1459.                 tputs("Chatting with sysop\n");
  1460.                 break;
  1461.             case MBX_WHAT:
  1462.                 tputs("Listing files\n");
  1463.                 break;
  1464. #ifdef XMODEM
  1465.             case MBX_XMODEM_RX:
  1466.                 tputs("Xmodem Receiving\n");
  1467.                 break;
  1468.             case MBX_XMODEM_TX:
  1469.                 tputs("Xmodem Sending\n");
  1470.                 break;
  1471. #endif
  1472.         }
  1473.     /* Only show callers with sysop-privs who is sysop-mode!
  1474.      * This prevents users from easily learning who's
  1475.      * got SYSOP privs
  1476.      */
  1477.         if(m->state == MBX_SYSOPTRY) {
  1478.             if(caller->privs & SYSOP_CMD)
  1479.                 tputs("Attempting Sysop mode\n");
  1480.             else
  1481.                 tputs("Idle\n");
  1482.         } else {
  1483.             if(m->state == MBX_SYSOP) {
  1484.                 if(caller->privs & SYSOP_CMD)
  1485.                     tputs("Sysop mode\n");
  1486.                 else
  1487.                     tputs("Idle\n");
  1488.             }
  1489.         }
  1490.     }
  1491.     tputc('\n');
  1492.     return 0;
  1493. }
  1494.   
  1495. #ifdef MBFWD
  1496. static int
  1497. dombtrace(argc,argv,p)
  1498. int argc;
  1499. char *argv[];
  1500. void *p;
  1501. {
  1502.     return setbool(&Mtrace,"Mailbox trace flag",argc,argv);
  1503. }
  1504. #endif
  1505.   
  1506. static int
  1507. dombsecure(argc,argv,p)
  1508. int argc;
  1509. char *argv[];
  1510. void *p;
  1511. {
  1512.     return setbool(&MBSecure,"Mailbox gateway secure flag",argc,argv);
  1513. }
  1514.   
  1515. static int
  1516. dombnoax25(argc,argv,p)
  1517. int argc;
  1518. char *argv[];
  1519. void *p;
  1520. {
  1521.     return setflag(argc,argv[1],NO_AX25,argv[2]);
  1522. }
  1523.   
  1524. static int
  1525. dombbonly(argc,argv,p)
  1526. int argc;
  1527. char *argv[];
  1528. void *p;
  1529. {
  1530.     return setflag(argc,argv[1],BBS_ONLY,argv[2]);
  1531. }
  1532.   
  1533. static int
  1534. dombuonly(argc,argv,p)
  1535. int argc;
  1536. char *argv[];
  1537. void *p;
  1538. {
  1539.     return setflag(argc,argv[1],USERS_ONLY,argv[2]);
  1540. }
  1541.   
  1542. static int
  1543. dombsonly(argc,argv,p)
  1544. int argc;
  1545. char *argv[];
  1546. void *p;
  1547. {
  1548.     return setflag(argc,argv[1],SYSOP_ONLY,argv[2]);
  1549. }
  1550.   
  1551. #if defined USERLOG && defined REGISTER
  1552. int doregister(argc,argv,p)
  1553. int argc;
  1554. char *argv[];
  1555. void *p;
  1556. {
  1557.     FILE *fp;
  1558.     struct mbx *m = (struct mbx *) p;
  1559.   
  1560.     /* Is there a registration file? */
  1561.     if((fp = fopen(Mregfile,READ_TEXT)) != NULLFILE) {
  1562.         sendfile(fp,m->user,ASCII_TYPE,0,m);
  1563.         fclose(fp);
  1564.     }
  1565.   
  1566.     tprintf("Your current settings are:\nName = %s\n", (m->username == NULL) ? "Unknown": m->username);
  1567.     tprintf("AX.25 Homebbs Address  = %s\n", (m->homebbs == NULL) ? "Unknown" : m->homebbs);
  1568.     tprintf("Internet Email Address = %s\n\n", (m->IPemail == NULL) ? "Unknown" : m->IPemail);
  1569.   
  1570.     tputs("First name.(CR=cancel)\n");
  1571.     usflush(m->user);
  1572.     if(mbxrecvline(m) == 0)
  1573.         return 0;
  1574.     rip(m->line);
  1575.     free(m->username);
  1576.     m->username = strdup(m->line);
  1577.   
  1578.     tputs("AX.25 homebbs.(CR=cancel all)\n");
  1579.     usflush(m->user);
  1580.     if(mbxrecvline(m) == 0)
  1581.         return 0;
  1582.     rip(m->line);
  1583.     free(m->homebbs);
  1584.     m->homebbs = strdup(m->line);
  1585.     strupr(m->homebbs);
  1586.   
  1587.     tputs("Internet Email.(CR=ignore)\n");
  1588.     usflush(m->user);
  1589.     if(mbxrecvline(m) > 0) {
  1590.         rip(m->line);
  1591.         free(m->IPemail);
  1592.         m->IPemail = strdup(m->line);
  1593.     }
  1594.   
  1595.     log(m->user,"User %s - %s (AX.25 - %s) (Internet - %s) has registered.",
  1596.     m->name, m->username, m->homebbs,m->IPemail);
  1597. #ifdef notdef
  1598. /* save some dgroup space */
  1599.     if(m->username)
  1600.         tprintf("You (%s - %s) have specified:\n",m->name,m->username);
  1601.     if(m->homebbs)
  1602.         tprintf("%s as your AX.25 homebbs address\nand\n",m->homebbs);
  1603.     if(m->IPemail)
  1604.         tprintf("%s as your Internet email address.\n",m->IPemail);
  1605. /* The following should be part of the register message file */
  1606.     tputs("\nThanks for registering.\nPlease send a note to the sysop if you have any questions.\n");
  1607. #endif
  1608.     return 0;
  1609. }
  1610. #endif /* USERLOG && REGISTER */
  1611.   
  1612. char *cmd_line(int argc,char *argv[],char stype) {
  1613.     static char line[MBXLINE+1];
  1614.     int i;
  1615.     char *cp;
  1616.   
  1617.   
  1618.     cp = line;
  1619.     sprintf(cp,"%s ",argv[0]);
  1620.     cp+=strlen(cp);
  1621.     if(stype != ' ') {
  1622.         --cp;
  1623.         sprintf(cp,"%c ",stype);
  1624.         cp += 2;
  1625.     }
  1626.     for(i=1;i<argc;i++) {
  1627.         sprintf(cp,"%s ",argv[i]);
  1628.         cp += strlen(cp);
  1629.     }
  1630.     return line;
  1631. }
  1632.   
  1633. int MbShowAliases;
  1634.   
  1635. int dombshowalias(argc,argv,p)
  1636. int argc;
  1637. char *argv[];
  1638. void *p;
  1639. {
  1640.     return setbool(&MbShowAliases,"Show aliases in prompts",argc,argv);
  1641. }
  1642.   
  1643.   
  1644. #endif /* MAILBOX */
  1645.