home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume28 / ssh-1.2 / part01 / ssh.c < prev   
C/C++ Source or Header  |  1992-03-15  |  6KB  |  224 lines

  1. /* @(#)ssh.c 1.20 92/03/11 (HaB)
  2.  *
  3.  * NAME:
  4.  *    ssh
  5.  *
  6.  * SYNTAX:
  7.  *    ssh [-h]
  8.  *        [-x] < shar_archive
  9.  *        [-v] 
  10.  *
  11.  * OPTIONS:
  12.  *    -h    Display usage information.
  13.  *
  14.  *    -x    Extract files in archive instead
  15.  *          of spliting it into parts. 
  16.  *
  17.  *    -v    Display version information. 
  18.  *
  19.  *    Without any options ssh splits archives
  20.  *    into extractable 'PartXX' files.
  21.  *
  22.  * DESCRIPTION:
  23.  *    Splits, strips and extracts appended shell
  24.  *    archives and stores the result in 'PartXX'
  25.  *    files (not when extracting). 
  26.  *
  27.  * NOTES:
  28.  *    The program should work on all archives created
  29.  *    using 'shar' (or equals) provided that they have
  30.  *    not been changed since they were first generated.  
  31.  *
  32.  * BUGS:
  33.  *    I have noticed that when the archives contains
  34.  *    archives themselves (happens sometimes) it does 
  35.  *    not work properly.
  36.  *
  37.  * DATE:
  38.  *    1992-03-11
  39.  *
  40.  * AUTHOR:
  41.  *    Hans C. Beckerus
  42.  *    etxerus@james.ericsson.se
  43.  *
  44.  * DISCLAIMER:
  45.  *    This program is free to distribute to anyone aslong 
  46.  *    as the code is not changed in anyway without me
  47.  *    knowing about it.  
  48.  *
  49.  *                                            /HaB :-)
  50.  */
  51.  
  52. #include <stdio.h>
  53. #include <string.h>
  54. #include <malloc.h>
  55.  
  56. #define SEARCH   0
  57. #define START    1
  58. #define INSIDE   2
  59. #define MSTEP    80     /* Allocation steps       */
  60. #define SEARCHP  5      /* No. of search patterns */ 
  61.  
  62. #ifndef SHELL
  63. #define SHELL  "/bin/sh"     /* Just in case... */
  64. #endif
  65.  
  66. #ifdef SYSV     /* HPUX/SYSV */
  67. #define nl_fprintf  fprintf
  68. #define nl_sprintf  sprintf
  69. #define nl_strcmp   strcmp
  70. size_t msize;
  71. #endif
  72.  
  73. #ifdef SUN     /* SunOS/Berkeley */
  74. unsigned int msize;
  75. #endif
  76.  
  77. #ifdef SCCSID
  78. char sccsid[] = "@(#)ssh.c 1.20  92/03/11 (HaB)  etxerus@james.ericsson.se";
  79. #endif
  80.  
  81. enum boolean {     /* Boolean constants */
  82.     FALSE,
  83.     TRUE
  84. };
  85.  
  86. char *pattern[] = {                 /* Add more patterns here if needed.   */ 
  87.     "# this is a shell archive",    /* NOTE! Remember to increase SEARCHP. */ 
  88.     "# this is part", 
  89.     "#!/bin/sh",
  90.     "# !/bin/sh",
  91.     "#! /bin/sh"
  92. };
  93.  
  94. /* usage:
  95.  * 
  96.  * Display usage information and exit with status rc.
  97.  *
  98.  */
  99.  
  100. void usage (rc) 
  101.  
  102. int rc;     /* Return code */
  103.  
  104. {
  105.     puts ("\nUsage: ssh [-h]");
  106.     puts ("           [-x] < shar_archive");
  107.     puts ("           [-v]\n");
  108.     puts ("Options:");
  109.     puts ("  -h       - This help text.");
  110.     puts ("  -x       - Extract files in archive instead");
  111.     puts ("             of spliting it into parts.");
  112.     puts ("  -v       - Display version information.\n");
  113.     puts ("  Without any options ssh splits archives");
  114.     puts ("  into extractable 'PartXX' files.\n");
  115.     exit (rc);
  116. }
  117.  
  118. void main (argn, argv)
  119.  
  120. int   argn;
  121. char *argv[];
  122.  
  123. {
  124.     FILE     *fr = stdin;          /* Input filepointer  */
  125.     FILE     *fw;                  /* Output filepointer */
  126.     FILE     *pipe;                /* Stream pipe        */
  127.     int       state = SEARCH;      /* The current state  */
  128.     int       fc = 0;              /* File part counter  */
  129.     int       extract = FALSE;     /* Extract/write flag */
  130.     char     *s;                   /* Read line          */
  131.     char      fout[7];             /* Output filenames   */
  132.     register  j = 0;               /* Counter            */
  133.     register  c;                   /* Read character     */
  134.  
  135.     /* Check the arguments if any */
  136.     while (--argn) {
  137.         argv++;
  138.         if (!(strcmp (*argv, "-h", 2))) {     /* Help screen */
  139.             if (!(argn-1))     /* Single option */
  140.                 usage (0);
  141.         }
  142.         else if (!(strcmp (*argv, "-x"))) {     /* Extract files */ 
  143.             if (!(argn-1)) {     /* Single option */
  144.                 extract = TRUE;
  145.                 continue;
  146.             }
  147.         }
  148.         else if (!(strcmp (*argv, "-v"))) {
  149.             if (!(argn-1)) {     /* Single option */
  150.                 puts ("ssh 1.20  (bugs to etxerus@james.ericsson.se)");
  151.                 exit (0);
  152.             }
  153.         }
  154.         usage (1);
  155.     }  
  156.  
  157.     msize = MSTEP;
  158.     s = malloc (msize);     /* Allocate buffer */
  159.  
  160.     while ((c = getc (fr)) != EOF) {
  161.     if (c != '\n') {     /* Check for EOL */
  162.         s[j++] = c;
  163.             if (j == msize) {
  164.                 msize += MSTEP;
  165.                 if ((s = realloc (s, msize)) == NULL) {
  166.                     fprintf (stderr, "ssh: Allocation error, cannot continue.\n");
  167.                     exit (1);
  168.                 }
  169.             }
  170.         }
  171.     else {
  172.         s[j] = '\0';     /* One line has been read */
  173.         switch (state) {
  174.         case SEARCH:
  175.                     for (j = 0; j < SEARCHP; j++) {
  176.                         if (!(strncasecmp (s, pattern[j], strlen (pattern[j])))) {
  177.                             state = START;
  178.                             break;    
  179.                         }
  180.                     }
  181.                     if (state != START)
  182.                         break;
  183.  
  184.         case START:     /* Start writing or extracting */
  185.                     if (!extract) {
  186.                 sprintf (fout, "Part%.2d", ++fc);
  187.                 fw = fopen (fout, "w");
  188.                         fprintf (fw, "%s\n", s);
  189.                     }
  190.                     else {
  191.                         if ((pipe = popen (SHELL, "w")) == NULL) {
  192.                             puts ("ssh: Cannot create process.\n");
  193.                             exit (1);
  194.                         }
  195.                         fprintf (pipe, "%s\n", s);
  196.                     }
  197.                     state = INSIDE;
  198.             break;
  199.  
  200.                 case INSIDE:
  201.             if (!(strcmp (s, "exit 0"))) {     /* Look for end */
  202.                         if (!extract) {
  203.                             fprintf (fw, "%s\n", s);
  204.                             fclose (fw);
  205.                         }
  206.                         else {
  207.                             fprintf (pipe, "%s\n", s);
  208.                             pclose (pipe);
  209.                         }
  210.                         state = SEARCH;
  211.                     }
  212.                     else {
  213.                         if (extract)
  214.                             fprintf (pipe, "%s\n", s);
  215.                         else
  216.                 fprintf (fw, "%s\n", s);
  217.                     }
  218.             break;
  219.             }
  220.             j = 0;    /* Reset counter */
  221.         }
  222.     }
  223. }
  224.