home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / stg_v4.lzh / pm_util.c < prev    next >
C/C++ Source or Header  |  1994-11-11  |  2KB  |  161 lines

  1. /*
  2.  * postman utility functions
  3.  *
  4.  * _pm_addr(s) - split address into component parts
  5.  * _pm_test(s) - test validity of address (does user/service/system exist?)
  6. */
  7.  
  8. #include "stglib.h"
  9.  
  10. #include "pm_util.h"
  11. #include "pwd.h"
  12.  
  13. /* calling process must define hostname */
  14. extern char hostname[];
  15.  
  16. /* fields used for _pm_addr() */
  17. char A_care[PM_CARE_LEN];
  18. char A_user[PM_NAME_LEN];
  19. char A_host[PM_NAME_LEN];
  20.  
  21. /* create temporary name from time/pid combination (8 chars of a-z,a-z/0-9) */
  22. _pm_temp(s)
  23. char *s;
  24. {
  25.     long lTime;
  26.     int i,d,p;
  27.  
  28.     sleep(1);
  29.     time(&lTime);
  30.  
  31. #define AZ(x) (x>=10?x-10+'a':x+'0')
  32.  
  33.     /* first six chars from lTime */
  34.     i=6;
  35.     s+=6;
  36.     while (i--)
  37.     {
  38.         d=lTime%36;
  39.         lTime/=36;
  40.         *--s=AZ(d);
  41.     }
  42.     s+=6;
  43.  
  44.     /* next two chars from pid */
  45.     p=getpid();
  46.     p%=1296;
  47.     d=p/36;
  48.     *s++=AZ(d);
  49.     d=p%36;
  50.     *s++=AZ(d);
  51.  
  52.     *s=0;
  53.     return(0);
  54. }
  55.  
  56. /* split given address into fields from form 'care%user@host' */
  57. _pm_addr(s)
  58. char *s;
  59. {
  60.     char *pCare,*pUser,*pHost;
  61.     int n;
  62.  
  63.     pCare=pUser=s;
  64.     pHost=0;
  65.  
  66.     while (*s && *s>' ')
  67.     {
  68.         if (*s=='%')
  69.             pUser=s;
  70.         if (*s=='@')
  71.             pHost=s;
  72.         s++;
  73.     }
  74.  
  75.     n=pUser-pCare;
  76.     if (!n)
  77.         *A_care=0;
  78.     else
  79.     {
  80.         if (n>=PM_CARE_LEN)
  81.             return(ERR);
  82.         strncpy(A_care,pCare,n);
  83.         A_care[n]=0;
  84.         pUser++;
  85.     }
  86.  
  87.     if (!pHost)
  88.     {
  89.         n=s-pUser;
  90.         if (n>=PM_NAME_LEN)
  91.             return(ERR);
  92.         strncpy(A_user,pUser,n);
  93.         A_user[n]=0;
  94.         *A_host=0;
  95.     }
  96.     else
  97.     {
  98.         n=pHost-pUser;
  99.         if (n>=PM_NAME_LEN)
  100.             return(ERR);
  101.         strncpy(A_user,pUser,n);
  102.         A_user[n]=0;
  103.  
  104.         pHost++;
  105.         n=s-pHost;
  106.         if (n>=PM_NAME_LEN)
  107.             return(ERR);
  108.         strncpy(A_host,pHost,n);
  109.         A_host[n]=0;
  110.     }
  111.     return(0);
  112. }
  113.  
  114. _pm_test(s)
  115. char *s;
  116. {
  117.     struct passwd *pw;
  118.     struct service *sv;
  119.     int uid;
  120.  
  121.     if (_pm_addr(s)==ERR)
  122.         return(PM_BADFMT);
  123.  
  124.     if (!*hostname && *A_host)
  125.         return(PM_NONODE);
  126.  
  127.     if (*A_host)
  128.     {
  129.         /* not checking node yet */
  130.     /*        return(PM_NONODE);*/
  131.  
  132.         return(0);
  133.     }
  134.  
  135.     pw=getpwnam(A_user);
  136.     if (!pw)
  137.         return(PM_NOUSER);
  138.  
  139.     /* don't check for existance of user's dir for service */
  140.     if (*pw->pw_shell=='!')
  141.         return(0);
  142.  
  143.     if (!pw->pw_dir || *pw->pw_dir!='/')
  144.         return(PM_NOMAIL);
  145.  
  146.     uid=getuid();
  147.     setuid(0);
  148. #ifdef _OS9
  149.     if (access(pw->pw_dir,O_DIR|O_RDWR)==ERR)
  150. #else
  151.     if (access(pw->pw_dir,R_OK)==ERR)
  152. #endif
  153.     {
  154.         setuid(uid);
  155.         return(PM_NOMAIL);
  156.     }
  157.     setuid(uid);
  158.  
  159.     return(0);
  160. }
  161.