home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3462 < prev    next >
Internet Message Format  |  1991-06-07  |  22KB

  1. From: erc@Apple.COM (Ed Carp)
  2. Newsgroups: alt.sources
  3. Subject: facility for sending/reading encrypted mail
  4. Message-ID: <53771@apple.Apple.COM>
  5. Date: 7 Jun 91 22:43:39 GMT
  6.  
  7. Since there's been a lot of discussion on the net about the
  8. privacy of mail, I decided to post a little hack I did about 3
  9. years ago for sending encrypted mail using des(1).  I've updated
  10. it a little - it not does compression/decompression on your
  11. message, so the mailer doesn't have to work quite so hard...:)
  12.  
  13. This thing uses uudecode/uuencode, compress/zcat, and des (if you
  14. don't have a version of des for your system, there's one floating
  15. around on uunet in comp.sources.unix, I think.  I'm using Phil
  16. Karn's excellent implementation posted to the net several years back.)
  17.  
  18. Sophisticated users/programmers will wonder why I didn't do
  19. this in a shell script.  I wonder that, myself...:)  Mainly
  20. so that casual users (whatever that means) won't poke around in
  21. the guts and possibly work around it.  It could easily have
  22. been done in a shell script.
  23.  
  24. Besides, I hate shell scripts! :)
  25.  
  26. Have fun with it -- I've gotten a lot of mileage out of it.  It's
  27. particularly useful for talking about your boss/sysadmin behind
  28. his/her/its back. :)
  29.  
  30. The code is pretty self-explanatory -- one thing you might want
  31. to change is MAILCMD in sendmail.c - it's set for "mailx" at
  32. the moment.
  33.  
  34. If there are potential employers/job shops/contractors/whatever
  35. out there, don't look at this as an example of programming
  36. style.  Just look at as just another one of those pesky tools
  37. written by Mr. ToolCrafter himself.  :)
  38. --------------------------  cut here  ---------------------------
  39. #! /bin/sh
  40. #
  41. # Created by edshar, version 0.4 - 06/01/90
  42. #
  43. # This is a shell archive, meaning:
  44. # 1. Remove everything about the #! /bin/sh line.
  45. # 2. Save the resulting text in a file.
  46. # 3. Execute the file with /bin/sh to create:
  47. #
  48. #        length  name
  49. #        ------  -------------------------------------
  50. #           791  Makefile
  51. #          1186  readsecret.1
  52. #          1395  readsecret.c
  53. #          1567  secretmail.1
  54. #          4995  secretmail.c
  55. #          3580  uudecode.c
  56. #          1993  uuencode.c
  57. #
  58.  
  59. #
  60. # Archive number 1
  61. # This archive created Fri Jun  7 16:34:43 1991
  62. #
  63.  
  64. echo "shar: extracting Makefile - (791 characters)"
  65. if test -f 'Makefile'
  66. then
  67.    echo shar: will not over-write existing file Makefile
  68. else
  69. sed 's/^X//' << \SHAR_EOF > 'Makefile'
  70. XCFLAGS = -s -O
  71. XSOURCES = readsecret.c secretmail.c uudecode.c uuencode.c 
  72. XOBJECTS = readsecret.o secretmail.o uudecode.o uuencode.o 
  73. XPROGRAMS = readsecret secretmail uudecode uuencode 
  74. X
  75. Xall: $(OBJECTS) $(PROGRAMS) 
  76. X
  77. Xreadsecret: readsecret.o
  78. X    $(CC) $(CFLAGS) -o readsecret readsecret.o $(LDFLAGS) -O
  79. X    chmod 755 readsecret
  80. X
  81. Xreadsecret.o: readsecret.c
  82. X
  83. Xsecretmail: secretmail.o
  84. X    $(CC) $(CFLAGS) -o secretmail secretmail.o $(LDFLAGS) -O
  85. X    chmod 755 secretmail
  86. X
  87. Xsecretmail.o: secretmail.c
  88. X
  89. Xuudecode: uudecode.o
  90. X    $(CC) $(CFLAGS) -o uudecode uudecode.o $(LDFLAGS) -O
  91. X    chmod 755 uudecode
  92. X
  93. Xuudecode.o: uudecode.c
  94. X
  95. Xuuencode: uuencode.o
  96. X    $(CC) $(CFLAGS) -o uuencode uuencode.o $(LDFLAGS) -O
  97. X    chmod 755 uuencode
  98. X
  99. Xuuencode.o: uuencode.c
  100. X
  101. Xclean:
  102. X    rm -f $(OBJECTS)
  103. X
  104. Xclobber:
  105. X    rm -f $(PROGRAMS) $(OBJECTS) 
  106. X
  107. SHAR_EOF
  108. if test 791 -ne "`wc -c < 'Makefile'`"
  109. then
  110.    echo "shar: ***** error transmitting file Makefile (should have been 791 characters, but was "`wc -c < 'Makefile'`" characters) *****"
  111. fi
  112. fi
  113.  
  114. touch 0607160891 Makefile
  115. chmod 0644 Makefile
  116.  
  117. echo "shar: extracting readsecret.1 - (1186 characters)"
  118. if test -f 'readsecret.1'
  119. then
  120.    echo shar: will not over-write existing file readsecret.1
  121. else
  122. sed 's/^X//' << \SHAR_EOF > 'readsecret.1'
  123. X.TH READSECRET 1L "June 7, 1991"
  124. X.SH NAME
  125. Xreadsecret \- read a secret mail message
  126. X.SH SYNOPSIS
  127. Xreadsecret
  128. X.I file
  129. X.SH DESCRIPTION
  130. X.I readsecret
  131. Xreads a secret mail message sent by
  132. X.I secretmail(l).
  133. X.PP
  134. XTo read a secret mail message, the message itself must be saved in a
  135. Xunique file.  Then
  136. X.I readsecret
  137. Xis called to uudecode, uncompress and decrypt the secret mail message.
  138. XFinally, the
  139. Xfile may be deleted.  For example, if a secret mail message has been saved
  140. Xin a file called
  141. X.I oneshot,
  142. Xthe command
  143. X.PP
  144. Xreadsecret oneshot
  145. X.PP
  146. Xwould display the secret message (after asking for a password).  After
  147. Xthe message has been read, the file
  148. X.I oneshot
  149. Xmay be deleted.
  150. X.SH FILES
  151. Xsecret.let    work file
  152. X.SH CREDITS
  153. XThis utility was written by Edwin R. Carp.
  154. X.SH BUGS
  155. XThe non-EDITOR interface to mail is not the best in the world.
  156. X.PP
  157. XThere is no way to indicate to the user that an incorrect password
  158. Xhas been entered.
  159. X.PP
  160. XThe file is read in as "./secret.let".  This can be disruptive to other
  161. Xfiles in the current directory called "secret.let".
  162. X.PP
  163. XThe current version of
  164. X.I readsecret(1)
  165. Xand
  166. X.I secretmail(1)
  167. Xis not compatible with previous versions.
  168. X.SH SEE ALSO
  169. X.I
  170. Xdes(1), secretmail(1)
  171. SHAR_EOF
  172. if test 1186 -ne "`wc -c < 'readsecret.1'`"
  173. then
  174.    echo "shar: ***** error transmitting file readsecret.1 (should have been 1186 characters, but was "`wc -c < 'readsecret.1'`" characters) *****"
  175. fi
  176. fi
  177.  
  178. touch 0607162591 readsecret.1
  179. chmod 0644 readsecret.1
  180.  
  181. echo "shar: extracting readsecret.c - (1395 characters)"
  182. if test -f 'readsecret.c'
  183. then
  184.    echo shar: will not over-write existing file readsecret.c
  185. else
  186. sed 's/^X//' << \SHAR_EOF > 'readsecret.c'
  187. X/*
  188. X*
  189. X* readsecret - read secret messages sent by secretmail
  190. X*
  191. X* usage:  readsecret file
  192. X*
  193. X* assumes that you've used mail(1) to save away the encrypted mail in a file
  194. X*
  195. X* REQUIRES:  decrypt uudecode  in /usr/local/bin
  196. X*
  197. X*
  198. X* Written 01/24/88 by Edwin R. Carp
  199. X*
  200. X* Version     Date     Comments
  201. X*
  202. X*   0.2     01/25/88   Do an fflush(stdin) before getting password
  203. X*                      Do not allow blank passwords
  204. X*
  205. X*   0.3     03/16/88   Added DES encryption for BSD systems
  206. X*
  207. X*   0.4     03/30/88   Changed to allow DES encryption for ALL systems
  208. X*
  209. X*   0.5     06/07/91   Added decompression
  210. X*
  211. X*/
  212. Xstatic char *reds_vers = "readsecret version 0.5  06/07/91";
  213. Xstatic char *reds_cpyw = "Copyright 1988, by Edwin R. Carp";
  214. X
  215. X#include <stdio.h>
  216. Xmain(argc, argv)
  217. Xint argc;
  218. Xchar **argv;
  219. X{
  220. X   char password[128], *getpass();
  221. X   char work[128];
  222. X
  223. X   if(argc != 2)
  224. X   {
  225. X      printf("usage:  readsecret file\n");
  226. X      exit(1);
  227. X   }
  228. X   sprintf(work, "uudecode %s", argv[1]);
  229. X   system(work);
  230. X   password[0] = NULL;
  231. X   if(access("secret.let", 4) != NULL)
  232. X   {
  233. X      perror("secret.let");
  234. X      exit(1);
  235. X   }
  236. X   /* while(0 == strlen(password)) */
  237. X      /* strcpy(password, getpass("Password: ")); */
  238. X   /* sprintf(work, */
  239. X       /* "/usr/local/bin/decrypt %s <secret.let | more -c", password); */
  240. X   sprintf(work, "des -d secret.let | zcat | more -c;stty echo");
  241. X   system(work);
  242. X   unlink("secret.let");
  243. X}
  244. SHAR_EOF
  245. if test 1395 -ne "`wc -c < 'readsecret.c'`"
  246. then
  247.    echo "shar: ***** error transmitting file readsecret.c (should have been 1395 characters, but was "`wc -c < 'readsecret.c'`" characters) *****"
  248. fi
  249. fi
  250.  
  251. touch 0607161591 readsecret.c
  252. chmod 0644 readsecret.c
  253.  
  254. echo "shar: extracting secretmail.1 - (1567 characters)"
  255. if test -f 'secretmail.1'
  256. then
  257.    echo shar: will not over-write existing file secretmail.1
  258. else
  259. sed 's/^X//' << \SHAR_EOF > 'secretmail.1'
  260. X.TH SECRETMAIL 1 "June 7, 1991"
  261. X.SH NAME
  262. Xsecretmail \- send mail via secure communications channel
  263. X.SH SYNOPSIS
  264. Xsecretmail [
  265. X.I -puyr
  266. X] [
  267. X.I -s subject
  268. X]
  269. X.I user(s)
  270. X.SH DESCRIPTION
  271. X.I secretmail
  272. Ximplements a secure communications conduit for
  273. X.I mail(1)
  274. Xusing the standard DES algorithm.  It is primarily useful
  275. Xfor sending confidential information that need not be readable by
  276. Xa priviliged user.  Only the user for which the mail is intended
  277. X(has the password) may read the mail.
  278. X.PP
  279. X.I secretmail
  280. Xprompts for the subject of the message, then runs
  281. Xwhatever editor is set up in the environment variable EDITOR.
  282. XIf EDITOR is not set, then
  283. X.I secretmail
  284. Xuses a mail-like interface.
  285. XAfter ending input with a control-D, the screen is scrolled up 25 lines
  286. Xand the user is prompted for a password (or key).  The mail is then
  287. Xcompressed, encrypted, uuencoded, and sent.
  288. X.SH OPTIONS
  289. X.IP r
  290. XThis option is used to send routine mail, and is the default.
  291. X.IP u
  292. XThis option is used to send urgent mail to be read as soon as possible.
  293. X.IP p
  294. XThis options is used to send mail of the highest priority (to be read
  295. Ximmediately).
  296. X.IP y
  297. XThis options is used to send mail that is intended to be read by the
  298. Xrecepient only.
  299. X.SH BUGS
  300. XThe file is sent out as a uuencoded file and decrypted as "./secret.let".
  301. XThis can be disruptive to any files called "secret.let" in the current
  302. Xdirectory.
  303. X.PP
  304. XThe current version of
  305. X.I readsecret(1)
  306. Xand
  307. X.I secretmail(1)
  308. Xis not compatible with previous versions.
  309. X.SH CREDITS
  310. XThis utility was written by Edwin R. Carp.
  311. X.SH SEE ALSO
  312. X.I
  313. Xdes(1), readsecret(1)
  314. SHAR_EOF
  315. if test 1567 -ne "`wc -c < 'secretmail.1'`"
  316. then
  317.    echo "shar: ***** error transmitting file secretmail.1 (should have been 1567 characters, but was "`wc -c < 'secretmail.1'`" characters) *****"
  318. fi
  319. fi
  320.  
  321. touch 0607162691 secretmail.1
  322. chmod 0644 secretmail.1
  323.  
  324. echo "shar: extracting secretmail.c - (4995 characters)"
  325. if test -f 'secretmail.c'
  326. then
  327.    echo shar: will not over-write existing file secretmail.c
  328. else
  329. sed 's/^X//' << \SHAR_EOF > 'secretmail.c'
  330. X/*
  331. X*
  332. X* secretmail - implement a secure communications channel
  333. X*
  334. X* usage:  secretmail  [-puyr] [-s subject] user(s)...
  335. X*
  336. X*         -p - priority one message
  337. X*         -u - urgent message
  338. X*         -y - eyes-only (sensitive contents)
  339. X*         -r - routine message (default)
  340. X*
  341. X* uses env variable EDITOR to edit file
  342. X* if EDITOR not present in env, uses gets() calls to get message
  343. X*
  344. X* REQUIRES:  encrypt uuencode  in /usr/local/bin
  345. X*
  346. X* assumes your mail supports the "-s" option
  347. X*
  348. X*
  349. X* Written 01/24/88 by Edwin R. Carp
  350. X*
  351. X* Version     Date     Comments
  352. X*
  353. X*   0.2     01/25/88   Did an fflush(stdin) before asking for password
  354. X*                      Don't allow blank passwords
  355. X*
  356. X*   0.3     03/01/88   Fixed bugs.
  357. X*
  358. X*   0.4     03/03/88   scrolled screen to blank it before entering password
  359. X*
  360. X*   0.5     03/04/88   Added a >From line
  361. X*
  362. X*   0.6     03/16/88   Added DES encryption for BSD systems
  363. X*
  364. X*   0.7     03/30/88   Added DES encryption for ALL systems
  365. X*
  366. X*   0.8     05/14/88   Added P, U, Y, S options
  367. X*
  368. X*   0.9     06/07/91   Added compression
  369. X*
  370. X*/
  371. Xstatic char *secm_vers = "secretmail version 0.9  06/07/91";
  372. Xstatic char *secm_cpyw = "Copyright 1988, by Edwin R. Carp";
  373. X
  374. X#include <stdio.h>
  375. X#ifdef BSD
  376. X#define MAILCMD "/usr/ucb/mail"
  377. X#else
  378. X#define MAILCMD "/usr/bin/mailx"
  379. X#endif
  380. X
  381. Xextern char *optarg;
  382. Xextern int optind;
  383. X
  384. Xmain(argc, argv)
  385. Xint argc;
  386. Xchar **argv;
  387. X{
  388. X   char user[128], password[128], *ctime(), *getenv(), *getpass();
  389. X   char line[130], *editor, work[128], tolist[512], *getlogin();
  390. X   char subject[128], filename[15], filename2[15], precedence[70];
  391. X   FILE *tempfile;
  392. X   int i;
  393. X   int rflag=1, pflag=0, uflag=0, sflag=0, yflag=0;
  394. X   long secs;
  395. X
  396. X   if(argc < 2)
  397. X   {
  398. X      printf("usage:  secretmail [-puyr] [-s subject] user(s)...\n");
  399. X      exit(1);
  400. X   }
  401. X   while((i=getopt(argc, argv, "puyrs:")) != EOF)
  402. X   {
  403. X      switch(i)
  404. X      {
  405. X      case 'p':
  406. X         uflag = rflag = 0;
  407. X         pflag = 1;
  408. X         break;
  409. X
  410. X      case 'u':
  411. X         pflag = rflag = 0;
  412. X         uflag = 1;
  413. X         break;
  414. X
  415. X      case 'y':
  416. X         yflag = 1;
  417. X         break;
  418. X
  419. X      case 'r':
  420. X         rflag = 1;
  421. X         uflag = pflag = 0;
  422. X         break;
  423. X
  424. X      case 's':
  425. X         sflag = 1;
  426. X         strcpy(subject, optarg);
  427. X         break;
  428. X      }
  429. X   }
  430. X
  431. X      if(pflag == 1)
  432. X         strcpy(precedence, "PRIORITY ONE MESSAGE - READ IMMEDIATELY");
  433. X      if(uflag == 1)
  434. X         strcpy(precedence, "Urgent Message - Read ASAP");
  435. X      if(rflag == 1)
  436. X         strcpy(precedence, "Routine Message");
  437. X      if(yflag == 1)
  438. X         strcat(precedence, " - For Your Eyes Only");
  439. X   sprintf(filename,  "%s%d.tmp", "secm", getpid());
  440. X   sprintf(filename2, "%s%d.tmp", "sect", getpid());
  441. X   if((tempfile=fopen(filename, "w")) == (FILE *)NULL)
  442. X   {
  443. X      perror(filename);
  444. X      exit(1);
  445. X   }
  446. X   tolist[0] = NULL;
  447. X   for(i=optind; i<argc; i++)
  448. X   {
  449. X      strcat(tolist, argv[i]);
  450. X      strcat(tolist, " ");
  451. X   }
  452. X   editor = getenv("EDITOR");
  453. X   /* get message, either from keyboard or from editing tempfile */
  454. X   if(editor == (char *)NULL)
  455. X   /* editor = "vi"; */
  456. X   {
  457. X      printf("From:     ");
  458. X      printf(getlogin());
  459. X      printf("\nTo:       ");
  460. X      printf(tolist);
  461. X      printf("\nDate:     ");
  462. X      time(&secs);
  463. X      printf(ctime(&secs));
  464. X      fprintf(tempfile, "From:     ");
  465. X      fprintf(tempfile, getlogin());
  466. X      fprintf(tempfile, "\nTo:       ");
  467. X      fprintf(tempfile, tolist);
  468. X      fprintf(tempfile, "\nDate:     ");
  469. X      fprintf(tempfile, ctime(&secs));
  470. X      fprintf(tempfile, "\nSubject:  ");
  471. X      printf("\nSubject:  ");
  472. X      if(sflag == 0) gets(subject);
  473. X      else puts(subject);
  474. X      fprintf(tempfile, " (%s)\n\n", subject);
  475. X      while(fgets(line, 128, stdin) != (char *)NULL)
  476. X         fprintf(tempfile, line);
  477. X      fclose(tempfile);
  478. X   }
  479. X   else
  480. X   {
  481. X      fprintf(tempfile, "From:     ");
  482. X      fprintf(tempfile, getlogin());
  483. X      fprintf(tempfile, "\nTo:       ");
  484. X      fprintf(tempfile, tolist);
  485. X      fprintf(tempfile, "\nDate:     ");
  486. X      time(&secs);
  487. X      fprintf(tempfile, ctime(&secs));
  488. X      fprintf(tempfile, "\nSubject:  ");
  489. X      printf("\nSubject:  ");
  490. X      if(sflag == 0) gets(subject);
  491. X      else puts(subject);
  492. X      fprintf(tempfile, "%s (%s)\n\n", precedence, subject);
  493. X      fclose(tempfile);
  494. X      sprintf(work, "%s %s", editor, filename);
  495. X      printf("Calling editor - please wait\n");
  496. X      system(work);
  497. X   }
  498. X   for(i=0; i<30; i++) puts("\n");
  499. X   /* message is now in the tempfile.  now pipe it to des */
  500. X   sprintf(work, "compress -f %s;mv %s.Z %s;des -e %s %s;stty echo",
  501. X      filename, filename, filename, filename, filename2);
  502. X   printf("Encrypting file...\n");
  503. X   system(work);
  504. X   unlink(filename); /* delete the original file */
  505. X#ifndef MSDOS
  506. X   chmod(filename2, 0666);
  507. X#endif
  508. X   /* uuencode it and pipe it to mail */
  509. X   sprintf(work,
  510. X       "uuencode %s secret.let | %s -s \"%s (%s)\" %s",
  511. X       filename2, MAILCMD, precedence, subject, tolist);
  512. X   printf("Mailing encrypted file...\n");
  513. X   system(work);
  514. X   unlink(filename2);
  515. X}
  516. SHAR_EOF
  517. if test 4995 -ne "`wc -c < 'secretmail.c'`"
  518. then
  519.    echo "shar: ***** error transmitting file secretmail.c (should have been 4995 characters, but was "`wc -c < 'secretmail.c'`" characters) *****"
  520. fi
  521. fi
  522.  
  523. touch 0607161891 secretmail.c
  524. chmod 0644 secretmail.c
  525.  
  526. echo "shar: extracting uudecode.c - (3580 characters)"
  527. if test -f 'uudecode.c'
  528. then
  529.    echo shar: will not over-write existing file uudecode.c
  530. else
  531. sed 's/^X//' << \SHAR_EOF > 'uudecode.c'
  532. X#ifndef lint
  533. Xstatic char sccsid[] = "@(#)uudecode.c   5.1 (Berkeley) 7/2/83";
  534. X#endif
  535. X
  536. X/*
  537. X * uudecode [input]
  538. X *
  539. X * create the specified file, decoding as you go.
  540. X * used with uuencode.
  541. X */
  542. X#include <stdio.h>
  543. X#ifndef MSDOS
  544. X#include <pwd.h>
  545. X#endif
  546. X#include <sys/types.h>
  547. X#include <sys/stat.h>
  548. X#ifdef MSDOS
  549. X#include <fcntl.h>
  550. X#endif
  551. X
  552. X/* single character decode */
  553. X#define DEC(c)   (((c) - ' ') & 077)
  554. X
  555. Xmain(argc, argv)
  556. Xchar **argv;
  557. X{
  558. X   FILE *in, *out;
  559. X   struct stat sbuf;
  560. X   int mode;
  561. X   char dest[128];
  562. X   char buf[80];
  563. X
  564. X   /* optional input arg */
  565. X   if (argc > 1) {
  566. X      if ((in = fopen(argv[1], "r")) == NULL) {
  567. X         perror(argv[1]);
  568. X         exit(1);
  569. X      }
  570. X      argv++; 
  571. X      argc--;
  572. X   } else
  573. X      in = stdin;
  574. X
  575. X   if (argc != 1) {
  576. X      printf("Usage: uudecode [infile]\n");
  577. X      exit(2);
  578. X   }
  579. X
  580. X   /* search for header line */
  581. X   for (;;) {
  582. X      if (fgets(buf, sizeof buf, in) == NULL) {
  583. X         fprintf(stderr, "No begin line\n");
  584. X         exit(3);
  585. X      }
  586. X      if (strncmp(buf, "begin ", 6) == 0)
  587. X         break;
  588. X   }
  589. X   sscanf(buf, "begin %o %s", &mode, dest);
  590. X   fprintf(stderr, "begin %o %s\n", mode, dest);
  591. X
  592. X#ifndef MSDOS
  593. X   /* handle ~user/file format */
  594. X   if (dest[0] == '~') {
  595. X      char *sl;
  596. X      struct passwd *getpwnam();
  597. X      char *index();
  598. X      struct passwd *user;
  599. X      char dnbuf[100];
  600. X
  601. X      sl = index(dest, '/');
  602. X      if (sl == NULL) {
  603. X         fprintf(stderr, "Illegal ~user\n");
  604. X         exit(3);
  605. X      }
  606. X      *sl++ = 0;
  607. X      user = getpwnam(dest+1);
  608. X      if (user == NULL) {
  609. X         fprintf(stderr, "No such user as %s\n", dest);
  610. X         exit(4);
  611. X      }
  612. X      strcpy(dnbuf, user->pw_dir);
  613. X      strcat(dnbuf, "/");
  614. X      strcat(dnbuf, sl);
  615. X      strcpy(dest, dnbuf);
  616. X   }
  617. X#endif
  618. X
  619. X   /* create output file */
  620. X   out = fopen(dest, "w");
  621. X   if (out == NULL) {
  622. X      perror(dest);
  623. X      exit(4);
  624. X   }
  625. X#ifdef MSDOS
  626. Xif(EOF == setmode(fileno(out), O_BINARY)) perror("output file");
  627. X#endif
  628. X   chmod(dest, mode);
  629. X
  630. X   decode(in, out);
  631. X
  632. X   if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) {
  633. X      fprintf(stderr, "No end line\n");
  634. X      exit(5);
  635. X   }
  636. X   exit(0);
  637. X}
  638. X
  639. X/*
  640. X * copy from in to out, decoding as you go along.
  641. X */
  642. Xdecode(in, out)
  643. XFILE *in;
  644. XFILE *out;
  645. X{
  646. X   char buf[80];
  647. X   char *bp;
  648. X   int n;
  649. X
  650. X   for (;;) {
  651. X      /* for each input line */
  652. X      if (fgets(buf, sizeof buf, in) == NULL) {
  653. X         printf("Short file\n");
  654. X         exit(10);
  655. X      }
  656. X      n = DEC(buf[0]);
  657. X      if (n <= 0)
  658. X         break;
  659. X
  660. X      bp = &buf[1];
  661. X      while (n > 0) {
  662. X         outdec(bp, out, n);
  663. X         bp += 4;
  664. X         n -= 3;
  665. X      }
  666. X   }
  667. X}
  668. X
  669. X/*
  670. X * output a group of 3 bytes (4 input characters).
  671. X * the input chars are pointed to by p, they are to
  672. X * be output to file f.  n is used to tell us not to
  673. X * output all of them at the end of the file.
  674. X */
  675. Xoutdec(p, f, n)
  676. Xchar *p;
  677. XFILE *f;
  678. X{
  679. X   int c1, c2, c3;
  680. X
  681. X   c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
  682. X   c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
  683. X   c3 = DEC(p[2]) << 6 | DEC(p[3]);
  684. X   if (n >= 1)
  685. X      putc(c1, f);
  686. X   if (n >= 2)
  687. X      putc(c2, f);
  688. X   if (n >= 3)
  689. X      putc(c3, f);
  690. X}
  691. X
  692. X
  693. X/* fr: like read but stdio */
  694. Xint
  695. Xfr(fd, buf, cnt)
  696. XFILE *fd;
  697. Xchar *buf;
  698. Xint cnt;
  699. X{
  700. X   int c, i;
  701. X
  702. X   for (i=0; i<cnt; i++) {
  703. X      c = getc(fd);
  704. X      if (c == EOF)
  705. X         return(i);
  706. X      buf[i] = c;
  707. X   }
  708. X   return (cnt);
  709. X}
  710. X
  711. X/*
  712. X * Return the ptr in sp at which the character c appears;
  713. X * NULL if not found
  714. X */
  715. X
  716. X#ifdef NULL
  717. X#undef NULL
  718. X#endif
  719. X
  720. X#define   NULL   0
  721. X
  722. Xchar *
  723. Xindex(sp, c)
  724. Xregister char *sp, c;
  725. X{
  726. X   do {
  727. X      if (*sp == c)
  728. X         return(sp);
  729. X   } while (*sp++);
  730. X   return(NULL);
  731. X}
  732. X
  733. SHAR_EOF
  734. if test 3580 -ne "`wc -c < 'uudecode.c'`"
  735. then
  736.    echo "shar: ***** error transmitting file uudecode.c (should have been 3580 characters, but was "`wc -c < 'uudecode.c'`" characters) *****"
  737. fi
  738. fi
  739.  
  740. touch 0301144488 uudecode.c
  741. chmod 0644 uudecode.c
  742.  
  743. echo "shar: extracting uuencode.c - (1993 characters)"
  744. if test -f 'uuencode.c'
  745. then
  746.    echo shar: will not over-write existing file uuencode.c
  747. else
  748. sed 's/^X//' << \SHAR_EOF > 'uuencode.c'
  749. X#ifndef lint
  750. Xstatic char sccsid[] = "@(#)uuencode.c   5.1 (Berkeley) 7/2/83";
  751. X#endif
  752. X
  753. X/*
  754. X * uuencode [input] output
  755. X *
  756. X * Encode a file so it can be mailed to a remote system.
  757. X */
  758. X#include <stdio.h>
  759. X#include <sys/types.h>
  760. X#include <sys/stat.h>
  761. X#ifdef MSDOS
  762. X#include <fcntl.h>
  763. X#endif
  764. X
  765. X/* ENC is the basic 1 character encoding function to make a char printing */
  766. X#define ENC(c) (((c) & 077) + ' ')
  767. X
  768. Xmain(argc, argv)
  769. Xchar **argv;
  770. X{
  771. X   FILE *in;
  772. X   struct stat sbuf;
  773. X   int mode;
  774. X
  775. X   /* optional 1st argument */
  776. X   if (argc > 2) {
  777. X      if ((in = fopen(argv[1], "r")) == NULL) {
  778. X         perror(argv[1]);
  779. X         exit(1);
  780. X      }
  781. X      argv++; 
  782. X      argc--;
  783. X   } else
  784. X      in = stdin;
  785. X
  786. X   if (argc != 2) {
  787. X      printf("Usage: uuencode [infile] remotefile\n");
  788. X      exit(2);
  789. X   }
  790. X
  791. X#ifdef MSDOS
  792. Xif(EOF == setmode(fileno(in), O_BINARY)) perror("input file");
  793. X#endif
  794. X   /* figure out the input file mode */
  795. X   fstat(fileno(in), &sbuf);
  796. X   mode = sbuf.st_mode & 0777;
  797. X   printf("begin %o %s\n", mode, argv[1]);
  798. X
  799. X   encode(in, stdout);
  800. X
  801. X   printf("end\n");
  802. X   exit(0);
  803. X}
  804. X
  805. X/*
  806. X * copy from in to out, encoding as you go along.
  807. X */
  808. Xencode(in, out)
  809. XFILE *in;
  810. XFILE *out;
  811. X{
  812. X   char buf[80];
  813. X   int i, n;
  814. X
  815. X   for (;;) {
  816. X      /* 1 (up to) 45 character line */
  817. X      n = fr(in, buf, 45);
  818. X      putc(ENC(n), out);
  819. X
  820. X      for (i=0; i<n; i += 3)
  821. X         outdec(&buf[i], out);
  822. X
  823. X      putc('\n', out);
  824. X      if (n <= 0)
  825. X         break;
  826. X   }
  827. X}
  828. X
  829. X/*
  830. X * output one group of 3 bytes, pointed at by p, on file f.
  831. X */
  832. Xoutdec(p, f)
  833. Xchar *p;
  834. XFILE *f;
  835. X{
  836. X   int c1, c2, c3, c4;
  837. X
  838. X   c1 = *p >> 2;
  839. X   c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
  840. X   c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
  841. X   c4 = p[2] & 077;
  842. X   putc(ENC(c1), f);
  843. X   putc(ENC(c2), f);
  844. X   putc(ENC(c3), f);
  845. X   putc(ENC(c4), f);
  846. X}
  847. X
  848. X/* fr: like read but stdio */
  849. Xint
  850. Xfr(fd, buf, cnt)
  851. XFILE *fd;
  852. Xchar *buf;
  853. Xint cnt;
  854. X{
  855. X   int c, i;
  856. X
  857. X   for (i=0; i<cnt; i++) {
  858. X      c = getc(fd);
  859. X      if (c == EOF)
  860. X         return(i);
  861. X      buf[i] = c;
  862. X   }
  863. X   return (cnt);
  864. X}
  865. X
  866. SHAR_EOF
  867. if test 1993 -ne "`wc -c < 'uuencode.c'`"
  868. then
  869.    echo "shar: ***** error transmitting file uuencode.c (should have been 1993 characters, but was "`wc -c < 'uuencode.c'`" characters) *****"
  870. fi
  871. fi
  872.  
  873. touch 0218202788 uuencode.c
  874. chmod 0644 uuencode.c
  875. echo End of all shell archives
  876. exit 0
  877. --
  878. Ed Carp  N7EKG/6    erc@khijol.UUCP        ...uunet!khijol!erc
  879. Packet:  N7EKG @ N6IIU.#NOCAL.CA.US
  880. UUWEST Consulting    Alameda, CA        415/814-0550
  881.  
  882. Computers HAVE caused a revolution in how much information we
  883. can safely ignore!    --robs@ux1.cso.uiuc.edu (Rob Schaeffer)
  884.  
  885. -- Absolutely unabashed Gates McFadden groupie! --
  886. -- 
  887. Ed Carp  N7EKG/6    erc@khijol.UUCP        ...uunet!khijol!erc
  888. Packet:  N7EKG @ N6IIU.#NOCAL.CA.US
  889. UUWEST Consulting    Alameda, CA        415/814-0550
  890.  
  891. Computers HAVE caused a revolution in how much information we
  892. can safely ignore!    --robs@ux1.cso.uiuc.edu (Rob Schaeffer)
  893.  
  894. -- Absolutely unabashed Gates McFadden groupie! --
  895.