bbslocalmail.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:2k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #include <pwd.h>
  3. /*#define BBSUSERONLY 
  4. /**/ 
  5. #ifdef BBSUSERONLY
  6. char *localusers[] = { "root","daemon", NULL};
  7. char *localpasswd = "/etc/localpasswd";
  8. #endif
  9. #define BINMAIL "/bin/mail"
  10. #define BBSMAIL "/usr/local/sendmail/bbs/bbsmail"
  11. extern int errno;
  12. void main(argc,argv)
  13. int argc;
  14. char *argv[];
  15. {
  16.    extern int optind;
  17.    int c;
  18.    while ((c = getopt(argc, argv, "df:r:")) != EOF)
  19.         switch(c) {
  20.    case 'd':               
  21.    case 'f':
  22.    case 'r':                  
  23.    case '?':
  24.    default:
  25.    break;
  26.         }
  27.    if (argv[argc] != NULL) 
  28.        argv[argc] = NULL;
  29.    mailit(optind,argv);
  30.    perror("mailit");
  31.    exit(errno);
  32. }
  33. char *mygetpwnam(name)
  34. char *name;
  35. {
  36. #ifdef BBSUSERONLY
  37.   char **ptr = localusers;
  38.   FILE *fp;
  39.   while (*ptr) {
  40.     if (!strcmp(name,*ptr)) return *ptr;
  41.     ptr++;
  42.   }
  43.   fp = fopen(localpasswd,"r");
  44.   if (fp != NULL) {
  45.       char entry[256];
  46.       char *pentry;
  47.       while (fgets(entry,255,fp) != NULL) {
  48. if ((pentry= (char*)strchr(entry,':')) != NULL) {
  49.     *pentry = NULL;
  50. }
  51.         if (!strcmp(name,entry)) return name;
  52.       }
  53.   }
  54.   return NULL;
  55. #else
  56.   return (char*)getpwnam(name);
  57. #endif
  58. }
  59. mailit(optind,argv)
  60. int optind;
  61. char *argv[];
  62. {
  63.    char *name = argv[optind];
  64.    char *rfc931name = argv[optind+1];
  65.    int dobinmail=0;
  66.     
  67.    if (!name) dobinmail = 1;
  68.    if (name && mygetpwnam(name)) dobinmail = 1;
  69.    if (dobinmail) {
  70.       argv[0] = BINMAIL;
  71.       if (rfc931name != NULL) {
  72.  argv[optind+1] = NULL;
  73.       }
  74.       execv(BINMAIL,argv);
  75.       perror("execv");
  76.       exit(errno);
  77.    } else {
  78.       int len = strlen(name);
  79.       if ((len>4 && strcmp(&name[len-4],".bbs")) || len <= 4) {
  80.          char *bbsusername;
  81.          bbsusername = (char*)malloc( len + sizeof(".bbs") + 1);
  82.          sprintf(bbsusername,"%s.bbs",name);
  83.          argv[optind] = bbsusername;
  84.       } 
  85.       argv[0] = BBSMAIL;
  86.       execv(BBSMAIL,argv);
  87.       perror("execv");
  88.       exit(errno);
  89.    }
  90. }