home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / xsend / xget.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.4 KB  |  140 lines

  1. #include "xmail.h"
  2. #include "sys/types.h"
  3. #include "sys/dir.h"
  4. #include "ctype.h"
  5. #include "pwd.h"
  6. #include "sys/stat.h"
  7. char *myname;
  8. int uid;
  9. struct direct dbuf;
  10. char *maildir = "/usr/spool/secretmail/";
  11. FILE *kf, *mf, *df;
  12. MINT *x, *b, *one, *t45, *z, *q, *r;
  13. MINT *two, *t15, *mbuf;
  14. char buf[256], line[128];
  15. #define MXF 100
  16. int fnum[MXF], fcnt;
  17. struct stat stbuf;
  18. main()
  19. {    int i;
  20.     char *p;
  21.     uid = getuid();
  22.     myname = getlogin();
  23.     if(myname == NULL)
  24.         myname = getpwuid(uid)->pw_name;
  25.     comminit();
  26.     mbuf = itom(0);
  27.     files();
  28.     setup(getpass("Key: "));
  29.     mkb();
  30.     mkx();
  31. #ifndef debug
  32.     invert(x, b, x);
  33. #else
  34.     invert(x, b, z);
  35.     mult(x, z, z);
  36.     mdiv(z, b, q, z);
  37.     omout(z);
  38.     invert(x, b, x);
  39. #endif
  40.     for(i=0; i<fcnt; i++)
  41.     {    sprintf(line, "%s%s.%d", maildir, myname, fnum[i]);
  42.         if(stat(line, &stbuf)<0)
  43.         {    perror(line);
  44.             continue;
  45.         }
  46.         if(stbuf.st_size == 0)
  47.         {    printf("zero length mail file\n");
  48.             unlink(line);
  49.             continue;
  50.         }
  51.         if((mf = fopen(line, "r"))==NULL)
  52.         {    perror(line);
  53.             continue;
  54.         }
  55.         decipher(mf, stdout);
  56.     cmnd:
  57.         printf("? ");
  58.         fgets(buf, sizeof(buf), stdin);
  59.         if(feof(stdin)) exit(0);
  60.         switch(buf[0])
  61.         {
  62.         case 'q':
  63.             exit(0);
  64.         case 'n':
  65.         case 'd':
  66.         case '\n':
  67.             unlink(line);
  68.             fclose(mf);
  69.             break;
  70.         case '!':
  71.             system(buf+1);
  72.             printf("!\n");
  73.             goto cmnd;
  74.         case 's':
  75.         case 'w':
  76.             rewind(mf);
  77.             if(buf[1] == '\n' || buf[1] == '\0')
  78.                 strcpy(buf, "s mbox\n");
  79.             for(p=buf; !isspace(*p); p++);
  80.             for(; isspace(*p); p++);
  81.             p[strlen(p)-1] = 0;
  82.             kf = fopen(p, "a");
  83.             if(kf == NULL)
  84.             {    perror(p);
  85.                 break;
  86.             }
  87.             decipher(mf, kf);
  88.             fclose(mf);
  89.             fclose(kf);
  90.             unlink(line);
  91.             break;
  92.         }
  93.     }
  94.     exit(0);
  95. }
  96. icmp(a, b) int *a, *b;
  97. {
  98.     return(*a - *b);
  99. }
  100. files()
  101. {    int i;
  102.     if((df = fopen(maildir, "r")) == NULL)
  103.     {    perror(maildir);
  104.         exit(1);
  105.     }
  106.     strcpy(line, myname);
  107.     strcat(line, ".%d");
  108.     for(; !feof(df);)
  109.     {    fread(&dbuf, sizeof(dbuf), 1, df);
  110.         if(feof(df)) break;
  111.         if(dbuf.d_ino == 0) continue;
  112.         if(sscanf(dbuf.d_name, line, &i) != 1)
  113.             continue;
  114.         if(fcnt >= MXF)
  115.             break;
  116.         fnum[fcnt++] = i;
  117.     }
  118.     if(fcnt == 0)
  119.     {    printf("no secret mail\n");
  120.         exit(0);
  121.     }
  122.     qsort(fnum, fcnt, sizeof(int), icmp);
  123. }
  124. decipher(u, w) FILE *u, *w;
  125. {    int i;
  126.     short a;
  127.     for(;;)
  128.     {    nin(mbuf, u);
  129.         if(feof(u)) break;
  130.         mult(mbuf, x, mbuf);
  131.         mdiv(mbuf, b, q, mbuf);
  132.         for(i=1; i<=3; i++)
  133.         {    a = mbuf->val[i];
  134.             putc(a&0177, w);
  135.             a >>= 8;
  136.             putc(a&0177, w);
  137.         }
  138.     }
  139. }
  140.