home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 341b.lha / uucp1_v1.03d / src / dmail / commands.c < prev    next >
C/C++ Source or Header  |  1990-01-28  |  10KB  |  567 lines

  1.  
  2. /*
  3.  * COMMANDS.C
  4.  *
  5.  *  (C) Copyright 1985-1990 by Matthew Dillon,  All Rights Reserved.
  6.  *
  7.  *  Global Routines:    DO_QUIT()
  8.  *            DO_EXIT()
  9.  *            DO_CD()
  10.  *            DO_ECHO()
  11.  *            DO_GO()
  12.  *            DO_SOURCE()
  13.  *            DO_SHELL()
  14.  *            DO_WRITE()
  15.  *            DO_DELNEXT()
  16.  *            DO_NUMBER()
  17.  *            DO_NEXT()
  18.  *            DO_HEADER()
  19.  *            DO_TYPE()
  20.  *            DO_DELETE()
  21.  *            DO_UNDELETE()
  22.  *            DO_MARK()
  23.  *        DO_BREAK()
  24.  *
  25.  *  Static Routines:    None.
  26.  *
  27.  */
  28.  
  29. #include <stdio.h>
  30. #include <sys/file.h>
  31. #include "dmail.h"
  32.  
  33. #define LAST_TYPE   0
  34. #define LAST_HEADER 1
  35.  
  36. static int Last_operation;
  37. static int Last_deleted = -1;
  38. static char ScrBuf[1024];
  39.  
  40. void
  41. do_quit(garbage, com)
  42. char *garbage;
  43. {
  44.     int fd, r, back;
  45.     char *str;
  46.  
  47.     push_break();
  48.     if (get_inode (mail_file) == get_inode (output_file)) {
  49.     back = save_file (0, 0, ST_DELETED | ST_STORED);
  50.     } else {
  51.     r = write_file (output_file, O_CREAT, ST_READ, ST_DELETED | ST_STORED);
  52.     if (r < 0) {
  53.         printf ("Unable to write to %s\n", output_file);
  54.         back = save_file (0, 0, ST_DELETED | ST_STORED);
  55.     } else {
  56.         back = save_file (0, 0, ST_READ | ST_DELETED | ST_STORED);
  57.     }
  58.     }
  59.     if (back < 0)
  60.     printf ("Unable to update %s\n", mail_file);
  61.     if (back > 0)
  62.     printf ("%d  kept in %s\n", back, mail_file);
  63.     sleep (1);
  64.     if ((fd = open (mail_file, O_RDONLY, 0)) >= 0) {
  65.     read (fd, Buf, 1);
  66.     close (fd);
  67.     }
  68.     if (!com)
  69.     done (0);
  70.     free_entry();
  71.     if (av[1] == 0) {
  72.     if (!Silence)
  73.         puts ("NO FROM FILE SPECIFIED");
  74.     av[1] = mail_file;
  75.     av[2] = NULL;
  76.     }
  77.     Did_cd = 0;
  78.     mail_file = realloc (mail_file, strlen(av[1]) + 1);
  79.     strcpy (mail_file, av[1]);
  80.     str = (av[2]) ? av[2] : mail_file;
  81.     output_file = realloc (output_file, strlen(str) + 1);
  82.     strcpy (output_file, str);
  83.     initial_load_mail();
  84.     m_select (Nulav, M_RESET);
  85.     pop_break();
  86.     if (!Silence)
  87.     printf ("\nRF %-20s   WF %-20s\n", mail_file, output_file);
  88. }
  89.  
  90. void
  91. do_exit(garbage, com)
  92. char *garbage;
  93. {
  94.     char *str;
  95.  
  96.     if (!com)
  97.     done (0);
  98.     push_break();
  99.     free_entry();
  100.     if (av[1] == 0) {
  101.     if (!Silence)
  102.         puts ("NO FROM FILE SPECIFIED");
  103.     av[1] = mail_file;
  104.     av[2] = NULL;
  105.     }
  106.     mail_file = realloc (mail_file, strlen(av[1]) + 1);
  107.     strcpy (mail_file, av[1]);
  108.     str = (av[2]) ? av[2] : mail_file;
  109.     output_file = realloc (output_file, strlen(str) + 1);
  110.     strcpy (output_file, str);
  111.     initial_load_mail();
  112.     m_select (Nulav, M_RESET);
  113.     pop_break();
  114.     if (!Silence)
  115.     printf ("\nRF %-20s   WF %-20s\n", mail_file, output_file);
  116. }
  117.  
  118.  
  119. do_cd()
  120. {
  121.     char *dir = (ac < 2) ? home_dir : av[1];
  122.  
  123.     if (chdir(dir) < 0) {
  124.     printf ("Cannot CD to %s\n", dir);
  125.     return (-1);
  126.     }
  127.     ++Did_cd;
  128.     return (1);
  129. }
  130.  
  131.  
  132. do_echo(str)
  133. char *str;
  134. {
  135.     puts (next_word(str));
  136.     fflush(stdout);
  137.     return (1);
  138. }
  139.  
  140.  
  141. do_go()
  142. {
  143.     int i;
  144.  
  145.     if (ac < 2) {
  146.     puts ("go to which article?");
  147.     }
  148.     rewind_range (1);
  149.     i = get_range();
  150.     if (i < 0) {
  151.     if (!Silence)
  152.         printf ("Message #%d does not exist\n", i);
  153.     return (-1);
  154.     }
  155.     if (i == 0) {
  156.     if (!Silence)
  157.         puts ("No Message");
  158.     return (-1);
  159.     }
  160.     Current = indexof(i);
  161.     return (1);
  162. }
  163.  
  164.  
  165. do_source(scratch, overide)
  166. char *scratch;
  167. {
  168.     char *comline = malloc(1024);
  169.     FILE *fi = NULL;
  170.  
  171.     if (ac < 2) {
  172.     puts ("No file argument to source");
  173.     free(comline);
  174.     return (-1);
  175.     }
  176.     if (push_base()) {
  177.     push_break();
  178.     pop_base();
  179.     if (fi != NULL)
  180.         fclose (fi);
  181.     pop_break();
  182.     free(comline);
  183.     return (-1);
  184.     }
  185.     push_break();
  186.     fi = fopen (av[1], "r");
  187.     pop_break();
  188.     if (fi == NULL) {
  189.     if (!overide)
  190.         printf ("Cannot open %s\n", av[1]);
  191.     free(comline);
  192.     return (-1);
  193.     }
  194.     while (fgets (comline, 1024, fi) != NULL) {
  195.     comline[strlen(comline) - 1] = '\0';
  196.     if (comline[0] != '#')
  197.         exec_command (comline);
  198.     }
  199.     push_break();
  200.     fclose (fi);
  201.     fi = NULL;
  202.     free(comline);
  203.     pop_break();
  204.     pop_base();
  205.     return (1);
  206. }
  207.  
  208.  
  209. do_shell(str)
  210. char *str;
  211. {
  212. #ifdef UNIX
  213.     int pid, ret;
  214. #endif
  215.     char *shell, *ptr;
  216.     char *args;
  217.  
  218. #ifdef AMIGA
  219.     shell = "";
  220. #else
  221.     shell = getenv("SHELL");
  222. #endif
  223.     if (shell == NULL)
  224.     shell = "/bin/sh";
  225.     ptr = shell + strlen(shell) - 1;
  226.     while (ptr > shell && *ptr && *ptr != '/')
  227.     --ptr;
  228.     args = (strcmp(ptr, "/sh"))? "-fc" : "-c";
  229.     push_break();
  230.     str = next_word (str);
  231. #ifdef UNIX
  232.     if (strlen (str)) {
  233.     if ((pid = vfork()) == 0) {
  234.         execl (shell, shell, args, str, NULL);
  235.         _exit (1);
  236.     }
  237.     } else {
  238.     if ((pid = vfork()) == 0) {
  239.         execl (shell, shell, NULL);
  240.         _exit (1);
  241.     }
  242.     }
  243.     while ((ret = wait(0)) > 0) {
  244.     if (ret == pid)
  245.         break;
  246.     }
  247. #endif
  248. #ifdef AMIGA
  249.     Execute(str, NULL, NULL);
  250. #endif
  251.     pop_break();
  252.     return (1);
  253. }
  254.  
  255.  
  256. do_write()
  257. {
  258.     char *file;
  259.     int r, count = 0;
  260.     register int i, j;
  261.  
  262.     if (ac < 2) {
  263.     puts ("You must specify at least a file-name");
  264.     return (-1);
  265.     }
  266.     file = av[1];
  267.     rewind_range (2);
  268.     push_break();
  269.     while (i = get_range()) {
  270.     j = indexof (i);
  271.     if (j >= 0  &&  !(Entry[j].status & ST_DELETED)) {
  272.         Entry[j].status |= ST_STORED | ST_SCR;
  273.         ++count;
  274.     }
  275.     }
  276.     r = write_file (file, O_CREAT, ST_SCR, 0);
  277.     rewind_range (2);
  278.     if (r > 0) {
  279.     while (i = get_range()) {
  280.         j = indexof (i);
  281.         if (j >= 0)
  282.         Entry[j].status &= ~ST_SCR;
  283.     }
  284.     if (!Silence)
  285.         printf ("%d Items written\n", count);
  286.     } else {
  287.     while (i = get_range()) {
  288.         j = indexof (i);
  289.         if (j >= 0)
  290.         Entry[j].status &= ~(ST_SCR | ST_STORED);
  291.     }
  292.     printf ("Could not write to file %s\n", file);
  293.     }
  294.     pop_break();
  295.     return (1);
  296. }
  297.  
  298. /*
  299.  * DB, added 3 Oct 1988
  300.  */
  301.  
  302. do_delprev()
  303. {
  304.     do_mark("", ST_DELETED);
  305.     if (Current)
  306.     return(do_next("", -1));
  307.     return(-1);
  308. }
  309.  
  310. do_delnext()
  311. {
  312.     static int warning;
  313.  
  314.     if (!warning  &&  Last_operation == LAST_HEADER) {
  315.     ++warning;
  316.     puts ("Note that the next command is displaying headers only at");
  317.     puts ("this point.  (one-time warning, NOTHING deleted");
  318.     return (-1);
  319.     }
  320.     if (do_mark("", ST_DELETED) > 0)
  321.     return (do_next("", 1));
  322.     return (-1);
  323. }
  324.  
  325.  
  326. do_number(str, com)
  327. char *str;
  328. int com;
  329. {
  330.     int x;
  331.  
  332.     x = indexof (atoi(str));
  333.     if (x < 0) {
  334.     puts ("Non existant message");
  335.     return (-1);
  336.     }
  337.     Current = x;
  338.     switch (Last_operation) {
  339.     case LAST_TYPE:
  340.     return (do_type());
  341.     case LAST_HEADER:
  342.     return (do_header());
  343.     default:
  344.     puts ("Internal Error NEXT");
  345.     return (-1);
  346.     }
  347. }
  348.  
  349.  
  350. do_next(str, com)
  351. char *str;
  352. {
  353.     int ok;
  354.  
  355.     push_break();
  356.     if (com > 0) {
  357.     if (++Current > Entries)
  358.         Current = Entries;
  359.     if (fix() < 0) {
  360.         puts ("End of file");
  361.         pop_break();
  362.         return (-1);
  363.     }
  364.     --com;
  365.     }
  366.     if (com < 0) {
  367.     ++com;
  368.     ok = 0;
  369.     while (--Current >= 0) {
  370.         if (Entry[Current].no  &&  !(Entry[Current].status & ST_DELETED)) {
  371.         ok = 1;
  372.         break;
  373.         }
  374.     }
  375.     if (!ok) {
  376.         puts ("Start of file");
  377.     Current = 0;
  378.         fix();
  379.         pop_break();
  380.         return (-1);
  381.     }
  382.     }
  383.     pop_break();
  384.     if (!com) {
  385.     switch (Last_operation) {
  386.     case LAST_TYPE:
  387.         return (do_type());
  388.     case LAST_HEADER:
  389.         return (do_header());
  390.     }
  391.     }
  392.     return (1);
  393. }
  394.  
  395.  
  396. do_header()
  397. {
  398.     Last_operation = LAST_HEADER;
  399.     if (push_base()) {
  400.     push_break();
  401.     pop_base();
  402.     PAGER (-1);
  403.     fseek (m_fi, 0, 0);
  404.     fflush (stdout);
  405.     pop_break();
  406.     return (-1);
  407.     }
  408.     if (single_position() < 0)
  409.     return (-1);
  410.     if (Current < 0) {
  411.     puts("Software error #commands.0");
  412.     exit(1);
  413.     }
  414.     PAGER (0);
  415.     sprintf (Puf, "MESSAGE HEADER #%d (%d) %s\n",
  416.         Entry[Current].no,
  417.         Current + 1,
  418.         (Entry[Current].status & ST_DELETED) ? "  DELETED" : "");
  419.     PAGER (Puf);
  420.     sprintf (Puf, "From %s\n", Entry[Current].from);
  421.     PAGER (Puf);
  422.     while (fgets (ScrBuf, 1024, m_fi) != NULL) {
  423.     FPAGER (ScrBuf);
  424.     if (*ScrBuf == '\n') {
  425.         PAGER (-1);
  426.         pop_base();
  427.         return (1);
  428.     }
  429.     }
  430.     PAGER ("END OF FILE ENCOUNTERED");
  431.     PAGER (-1);
  432.     pop_base();
  433.     return (-1);
  434. }
  435.  
  436. do_type()
  437. {
  438.     int i;
  439.  
  440.     Last_operation = LAST_TYPE;
  441.     if (push_base()) {
  442.     push_break();
  443.     pop_base();
  444.     PAGER (-1);
  445.     fseek (m_fi, 0, 0);
  446.     fflush (stdout);
  447.     pop_break();
  448.     return (-1);
  449.     }
  450.     if (single_position() < 0)
  451.     return (-1);
  452.     if (Current < 0) {
  453.     puts("Software Error #commands.1");
  454.     exit(1);
  455.     }
  456.     if (skip_to_data (m_fi) < 0) {
  457.     printf ("Cannot find data for message %d\n", Entry[Current].no);
  458.     return (-1);
  459.     }
  460.     PAGER (0);
  461.     sprintf (Puf, "MESSAGE TEXT #%d (%d) %s\n",
  462.         Entry[Current].no,
  463.         Current + 1,
  464.         (Entry[Current].status & ST_DELETED) ? "  DELETED" : "");
  465.     PAGER (Puf);
  466.     for (i = 0; i < Listsize; ++i) {
  467.     if (*Entry[Current].fields[header[i]]) {
  468.         sprintf (Puf, "%-10s %s",
  469.             Find[header[i]].search,
  470.             Entry[Current].fields[header[i]]);
  471.         PAGER (Puf);
  472.     }
  473.     }
  474.     PAGER ("");
  475.     while ((fgets (ScrBuf, 1024, m_fi) != NULL)  &&  strncmp (ScrBuf, "From ", 5))
  476.     FPAGER (ScrBuf);
  477.     Entry[Current].status |= ST_READ;
  478.     PAGER (-1);
  479.     pop_base();
  480.     return (1);
  481. }
  482.  
  483.  
  484. do_mark(garbage, mask)
  485. char *garbage;
  486. {
  487.     int count = 0;
  488.     register int i, j;
  489.  
  490.     rewind_range (1);
  491.     push_break();
  492.     while (i = get_range()) {
  493.     j = indexof (i);
  494.     if (j >= 0) {
  495.         if (mask & ST_DELETED)
  496.         Last_deleted = j;
  497.         if ((Entry[j].status & mask) != mask) {
  498.         Entry[j].status |= mask;
  499.         if (Entry[j].status & ST_DELETED)
  500.             Entry[j].status &= ~(ST_STORED | ST_READ | ST_TAG);
  501.         ++count;
  502.         }
  503.     }
  504.     }
  505.     if (!Silence)
  506.     printf ("%d  Items\n", count);
  507.     pop_break();
  508.     return (1);
  509. }
  510.  
  511.  
  512. do_unmark(garbage, mask)
  513. char *garbage;
  514. {
  515.     int count = 0;
  516.     register int i, j;
  517.     register struct ENTRY *en;
  518.  
  519.     push_break();
  520.     if (ac == 1 && (mask & ST_DELETED) && Last_deleted != -1)  {
  521.     en = &Entry[Last_deleted];
  522.     if (en->no) {
  523.         en->status &= ~mask;
  524.         printf ("Undeleted last deleted message (# %d)\n", en->no);
  525.         Current = Last_deleted;
  526.         Last_deleted = -1;
  527.     } else {
  528.         puts ("Last deleted message not within current select bounds");
  529.         pop_break();
  530.         return (-1);
  531.     }
  532.     pop_break();
  533.     return (1);
  534.     }
  535.     rewind_range (1);
  536.     while (i = get_range()) {
  537.     j = indexof (i);
  538.     if (j >= 0) {
  539.         if (Entry[j].status & mask) {
  540.         Entry[j].status &= ~mask;
  541.         ++count;
  542.         }
  543.     }
  544.     }
  545.     if (!Silence)
  546.     printf ("%d  Items\n", count);
  547.     pop_break();
  548.     return ((count) ? 1 : -1);
  549. }
  550.  
  551. do_break(garbage, mask)
  552. char *garbage;
  553. {
  554.     if (mask)
  555.     pop_break();
  556.     else
  557.     push_break();
  558.     return (1);
  559. }
  560.  
  561. void
  562. do_ver()
  563. {
  564.     puts (DVERSION);
  565. }
  566.  
  567.