home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / hamradio / s920603.zip / FINGERD.C < prev    next >
C/C++ Source or Header  |  1992-05-03  |  2KB  |  112 lines

  1. /* Internet Finger server
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "global.h"
  7. #include "files.h"
  8. #include "mbuf.h"
  9. #include "socket.h"
  10. #include "session.h"
  11. #include "proc.h"
  12. #include "dirutil.h"
  13. #include "commands.h"
  14. #include "mailbox.h"
  15.  
  16. static int Sfinger = -1;    /* Prototype socket for service */
  17.  
  18. static void fingerd __ARGS((int s,void *unused,void *p));
  19.  
  20. /* Start up finger service */
  21. int
  22. finstart(argc,argv,p)
  23. int argc;
  24. char *argv[];
  25. void *p;
  26. {
  27.     struct sockaddr_in lsocket;
  28.     int s;
  29.     FILE *network;
  30.  
  31.     if(Sfinger != -1){
  32.         return 0;
  33.     }
  34.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  35.     chname(Curproc,"Finger listener");
  36.  
  37.     lsocket.sin_family = AF_INET;
  38.     lsocket.sin_addr.s_addr = INADDR_ANY;
  39.     if(argc < 2)
  40.         lsocket.sin_port = IPPORT_FINGER;
  41.     else
  42.         lsocket.sin_port = atoi(argv[1]);
  43.  
  44.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  45.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  46.     listen(Sfinger,1);
  47.     for(;;){
  48.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  49.             break;    /* Service is shutting down */
  50.  
  51.         network = fdopen(s,"r+t");
  52.         /* Spawn a server */
  53.         newproc("fingerd",512,fingerd,s,(void *)network,NULL,0);
  54.     }
  55.     return 0;
  56. }
  57. static void
  58. fingerd(s,n,p)
  59. int s;
  60. void *n;
  61. void *p;
  62. {
  63.     char user[80];
  64.     FILE *fp;
  65.     char *file,*cp;
  66.     FILE *network;
  67.  
  68.     network = (FILE *)n;
  69.     sockowner(fileno(network),Curproc);
  70.     log(fileno(network),"open Finger");
  71.     fgets(user,sizeof(user),network);
  72.     rip(user);
  73.     if(strlen(user) == 0){
  74.         fp = dir(Fdir,0);
  75.         if(fp == NULLFILE)
  76.             fprintf(network,"No finger information available\n");
  77.         else
  78.             fprintf(network,"Known users on this system:\n");
  79.     } else {
  80.         file = pathname(Fdir,user);
  81.         cp = pathname(Fdir,"");
  82.         /* Check for attempted security violation (e.g., somebody
  83.          * might be trying to finger "../ftpusers"!)
  84.          */
  85.         if(strncmp(file,cp,strlen(cp)) != 0){
  86.             fp = NULLFILE;
  87.             fprintf(network,"Invalid user name %s\n",user);
  88.         } else if((fp = fopen(file,READ_TEXT)) == NULLFILE)
  89.             fprintf(network,"User %s not known\n",user);
  90.         free(cp);
  91.         free(file);
  92.     }
  93.     if(fp != NULLFILE){
  94.         sendfile(fp,network,ASCII_TYPE,0);
  95.         fclose(fp);
  96.     }
  97.     if(strlen(user) == 0 && Listusers != NULL)
  98.         (*Listusers)(network);
  99.     fclose(network);
  100.     log(fileno(network),"close Finger");
  101. }
  102. int
  103. fin0(argc,argv,p)
  104. int argc;
  105. char *argv[];
  106. void *p;
  107. {
  108.     close_s(Sfinger);
  109.     Sfinger = -1;
  110.     return 0;
  111. }
  112.