home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 024 / psi110g.zip / F.C < prev    next >
C/C++ Source or Header  |  1994-04-17  |  5KB  |  189 lines

  1. /* Internet Finger server */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "files.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "session.h"
  9. #include "proc.h"
  10. #include "dirutil.h"
  11. #include "commands.h"
  12. #include "mailbox.h"
  13.   
  14. extern int ShowConfUsers(int s,int quick);
  15. extern int ShowConfLinks(int s,int full);
  16. extern int doipheard(int argc,char *argv[],void *p);
  17. extern int Sconv;
  18.   
  19. static int Sfinger = -1;    /* Prototype socket for service */
  20. static void fingerd __ARGS((int s,void *unused,void *p));
  21.   
  22. /* Start up finger service */
  23. int
  24. finstart(argc,argv,p)
  25. int argc;
  26. char *argv[];
  27. void *p;
  28. {
  29.     struct sockaddr_in lsocket;
  30.     int s;
  31.   
  32.     if(Sfinger != -1){
  33.         return 0;
  34.     }
  35.     psignal(Curproc,0); /* Don't keep the parser waiting */
  36.     chname(Curproc,"Finger listener");
  37.   
  38.     lsocket.sin_family = AF_INET;
  39.     lsocket.sin_addr.s_addr = INADDR_ANY;
  40.     if(argc < 2)
  41.         lsocket.sin_port = IPPORT_FINGER;
  42.     else
  43.         lsocket.sin_port = atoi(argv[1]);
  44.   
  45.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  46.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  47.     listen(Sfinger,1);
  48.     for(;;){
  49.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  50.             break;  /* Service is shutting down */
  51.   
  52.         /* Spawn a server */
  53.         if(newproc("fingerd",1024,fingerd,s,NULL,NULL,0) == NULLPROC)
  54.             close_s(s);
  55.     }
  56.     return 0;
  57. }
  58.   
  59. #define FLINE 128
  60.   
  61. struct finfo {
  62.     char *name;
  63.     int (*func) __ARGS((int argc,char *argv[],void *p));
  64. };
  65.   
  66. struct finfo Finfo[] = {
  67.     "iheard", doipheard,
  68.     "mstat", dombmailstats,
  69.     "info", doinfo,
  70.     "ax25", doaxstat,
  71.     "netrom", donrstatus,
  72.     "tcpview", doview,
  73.     "memstat", dostat,
  74.     "socket", dosock,
  75. #ifdef ASY
  76.     "asystat",doasystat,
  77. #endif
  78.     "ifconfig", doifconfig,
  79. #ifdef RIP
  80.     "rip", doripstat,
  81. #endif
  82.     NULL,
  83. };
  84.   
  85.   
  86. static void
  87. fingerd(s,unused,p)
  88. int s;
  89. void *unused;
  90. void *p;
  91. {
  92.     char user[80];
  93.     int ulen,found;
  94.     struct finfo *fi;
  95.     FILE *fp;
  96.     char *file,*cp;
  97.     char line[FLINE+1];
  98.     int outsave;
  99. #ifdef USERLOG
  100.     char *newargv[2];
  101. #endif
  102.   
  103.     sockmode(s,SOCK_ASCII);
  104.     sockowner(s,Curproc);
  105.     log(s,"open Finger");
  106.     recvline(s,user,80);
  107.     rip(user);
  108.     ulen = strlen(user);
  109.   
  110.     if(ulen) {
  111. #ifdef CONVERS
  112.         if(!stricmp(user,"conf"))
  113.             ShowConfUsers(s,0);
  114.         else if(!stricmp(user,"links"))
  115.             ShowConfLinks(s,1);
  116.         else
  117. #endif
  118.             for(fi=Finfo;fi->name;fi++) {
  119.                 if(!stricmp(fi->name,user)) {
  120.                     outsave = Curproc->output;
  121.                     Curproc->output = s;
  122.                     fi->func(1,NULL,NULL);
  123.                     Curproc->output = outsave;
  124.                     break;
  125.                 }
  126.             }
  127.     } else {
  128.         if(ulen == 0){
  129.             fp = dir(Fdir,0);
  130.             if(fp == NULLFILE)
  131.                 usputs(s,"No finger information available\n");
  132.             else
  133.                 usputs(s,"Known users on this system:\n");
  134.         } else {
  135. #ifdef USERLOG
  136.             outsave = Curproc->output;
  137.             Curproc->output = s;
  138.             newargv[1] = user;
  139.             dombuserinfo(0,newargv,NULL);
  140.             Curproc->output = outsave;
  141. #endif
  142.             file = pathname(Fdir,user);
  143.             cp = pathname(Fdir,"");
  144.             /* Check for attempted security violation (e.g., somebody
  145.              * might be trying to finger "../ftpusers"!)
  146.              */
  147.             if(strncmp(file,cp,strlen(cp)) != 0){
  148.                 fp = NULLFILE;
  149.                 usprintf(s,"Invalid user name %s\n",user);
  150.             } else if((fp = fopen(file,READ_TEXT)) == NULLFILE) {
  151.                 /* Now search the finger database file for this user - WG7J */
  152.                 found = 0;
  153.                 if((fp = fopen(Fdbase,READ_TEXT)) != NULLFILE) {
  154.                     while(fgets(line,FLINE,fp) != NULLCHAR)
  155.                         if(!strncmp(line,user,ulen)) {
  156.                             usputs(s,line);
  157.                             found = 1;
  158.                             break;
  159.                         }
  160.                     fclose(fp);
  161.                     fp = NULLFILE;
  162.                 }
  163.                 if(!found)
  164.                     usprintf(s,"No user info for %s\n",user);
  165.             }
  166.             free(cp);
  167.             free(file);
  168.         }
  169.         if(fp != NULLFILE){
  170.             sendfile(fp,s,ASCII_TYPE,0);
  171.             fclose(fp);
  172.         }
  173.     }
  174.     if(ulen == 0 && Listusers != NULL)
  175.         (*Listusers)(s);
  176.     close_s(s);
  177.     log(s,"close Finger");
  178. }
  179. int
  180. fin0(argc,argv,p)
  181. int argc;
  182. char *argv[];
  183. void *p;
  184. {
  185.     close_s(Sfinger);
  186.     Sfinger = -1;
  187.     return 0;
  188. }
  189.