home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / util / csh-5.39.lha / Csh / src / comm3.c < prev    next >
C/C++ Source or Header  |  1994-09-06  |  59KB  |  2,857 lines

  1. /*
  2.  * COMM3.C
  3.  *
  4.  * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  5.  * Version 5.00L by Urban Mueller 17-Feb-91
  6.  * Version 5.20L by Andreas M. Kirchwitz (Fri, 13 Mar 1992)
  7.  *
  8.  */
  9.  
  10. #include "shell.h"
  11.  
  12. /* comm3.c */
  13. static void doassign(char *log, char *phy);
  14. static void assignlist(void);
  15. static int strings_in_file(long mask, char *s, char *path);
  16. static int htype_a_file   (long mask, char *s, char *path);
  17. static void install_menu(char **mav, int mac);
  18. static int line_filter( char *(*line)(char *) );
  19.  
  20.  
  21. /* Casting conveniences */
  22. #define BPTR_TO_C(strtag, var)  ((struct strtag *)(BADDR( (ULONG) var)))
  23. #define PROC(task)              ((struct Process *)task)
  24. #define CLI(proc)               (BPTR_TO_C(CommandLineInterface, proc->pr_CLI))
  25.  
  26.  
  27. int do_ln(void)
  28. {
  29.     char *linkname;
  30.     long link_type;
  31.     long dest_data;
  32.     BOOL success;
  33.  
  34.     if( ac!=2 && ac!=3 ) {
  35.         show_usage( NULL );
  36.         return 20;
  37.     }
  38.  
  39.     if (ac==2)
  40.         linkname = FilePart(av[1]);
  41.     else
  42.         linkname = av[2];
  43.  
  44.     if (options&1) {
  45.         link_type = LINK_SOFT;
  46.         dest_data = (long)av[1];
  47.     }
  48.     else {
  49.         link_type = LINK_HARD;
  50.         if (!( dest_data = (long)Lock(av[1],ACCESS_READ) )) {
  51.             pError(av[1]);
  52.             return 20;
  53.         }
  54.     }
  55.  
  56.     success = MakeLink(linkname,dest_data,link_type);
  57.  
  58.     if (link_type==LINK_HARD)
  59.         UnLock((BPTR)dest_data);
  60.  
  61.     if (!success) {
  62.         pError(linkname);
  63.         return 20;
  64.     }
  65.  
  66.     return 0;
  67. }
  68.  
  69.  
  70. do_tee( void )
  71. {
  72.     char buf[256];
  73.     FILE *out;
  74.  
  75.     prepscroll( ac==1 );
  76.     if( ac>2 ) { ierror( av[2], 500 ); return 20; }
  77.     if( ac==1 ) out=stderr;
  78.     else if( !(out=fopen( av[1], "w" ))) { pError( av[1] ); return 20; }
  79.     while (safegets(buf,stdin)) {
  80.         puts(buf);
  81.         quickscroll();
  82.         fprintf(out,"%s\n",buf);
  83.     }
  84.     if( ac!=1 ) fclose( out );
  85.     return 0;
  86. }
  87.  
  88. do_head( char *garbage, int com )
  89. {
  90.     FILE *f;
  91.     int i, n = 10;
  92.     char buf[256];
  93.  
  94.     if (ac==1) {                    /* use stdin */
  95.         f = stdin;
  96.     }
  97.     else {
  98.         f=fopen(av[1],"r");
  99.         if (f==NULL) {
  100.             if (ac==2 && isnum(av[1])) {    /* use stdin */
  101.                 f = stdin;
  102.                 n = atol(av[1]);
  103.             }
  104.             else {
  105.                 pError(av[1]);
  106.                 return 20;
  107.             }
  108.         }
  109.     }
  110.  
  111.     if (ac>2) {
  112.         if (!isnum(av[2])) {   /* AMK: IoErr() replaced by isnum() */
  113.             ierror(av[2],511);
  114.             return 20;
  115.         }
  116.         n=(int)atol(av[2]);
  117.     }
  118.  
  119.     if (com) {    /* tail specific part */
  120.         i=0;
  121.         while (fgets(buf, 256, f) && ! dobreak()) i++;
  122.         rewind(f);
  123.         if (n>i) n=i;
  124.         i=i-n;
  125.         while (i-- && fgets(buf, 256, f) && ! dobreak()) ;
  126.     }
  127.  
  128.     for (i=1; i<=n && fgets(buf, 256, f) && ! dobreak(); i++)
  129.         printf("%s", buf);
  130.  
  131.     if (f!=stdin)
  132.         fclose(f);
  133.  
  134.     return 0;
  135. }
  136.  
  137. #if 0
  138. do_head( char *garbage, int com )
  139. {
  140.     int i, n;
  141.     FILE *f;
  142.     char buf[256];
  143.  
  144.     if (ac>2) {
  145.         if (!isnum(av[2])) {   /* AMK: IoErr() replaced by isnum() */
  146.             ierror(av[2],511);
  147.             return 20;
  148.         }
  149.         n=(int)atol(av[2]);
  150.     } else n=10;
  151.  
  152.     f=fopen(av[1], "r");
  153.     if (f==NULL) {
  154.         pError(av[1]);
  155.         return 20;
  156.     }
  157.     if (com) {    /* tail specific part */
  158.         i=0;
  159.         while (fgets(buf, 256, f) && ! dobreak()) i++;
  160.         rewind(f);
  161.         if (n>i) n=i;
  162.         i=i-n;
  163.         while (i-- && fgets(buf, 256, f) && ! dobreak()) ;
  164.     }
  165.     for (i=1; i<=n && fgets(buf, 256, f) && ! dobreak(); i++)
  166.         printf("%s", buf);
  167.     fclose(f);
  168.     return 0;
  169. }
  170. #endif
  171.  
  172. static int
  173. exword( char **src, char *buf )
  174. {
  175.     *buf=0;
  176.     if( **src==0 ) return 0;
  177.     while( **src && **src!=0xA0 )
  178.         *buf++ = *(*src)++;
  179.     *buf=0;
  180.     if( **src ) (*src)++;
  181.     return 1;
  182. }
  183.  
  184. static char helpfound=0;
  185.  
  186. void
  187. man (FILE *f, char *s)
  188. {
  189.     char buf[140], entry[100];
  190.     int  len = sprintf (entry, "    %s", s);
  191.     char *example = "    ";
  192.  
  193.     prepscroll (0);
  194.     rewind (f);
  195.     do {                        /* look for required argument */
  196.         if (fgets (buf, sizeof(buf), f)==NULL || dobreak())
  197.             return;                /* GMD */
  198.     } while (strnicmp (entry, buf, len)) ;
  199.     helpfound = 1;
  200.  
  201.     do {                /* display help */
  202.         if (dobreak())
  203.             return;
  204.         quickscroll ();
  205.         printf ("%s", buf);
  206.         if (fgets (buf, sizeof(buf), f) == NULL)
  207.             return;
  208.     } while ((!isalphanum (*buf)) && strncmp (buf, example, strlen(example))) ;
  209. }
  210.  
  211.  
  212. do_man( void )
  213. {
  214.     FILE *f;
  215.     int i;
  216.     char buf[200], name[60], *src, *var, docfound=0;
  217.  
  218.     buf[0]=0;
  219.     if( var=get_var(LEVEL_SET,"_man" ) )
  220.         strcpy(buf,var);
  221.  
  222.     if (ac==1) ac=2, av[1]="MAN";
  223.     for (i=1; i<ac; i++) {
  224.         src=buf, helpfound=0;
  225.         while( exword( &src, name) )
  226.             if( f=fopen(name, "r") ) {
  227.                 docfound=1;
  228.                 man(f, av[i]);
  229.                 fclose(f);
  230.                 if( helpfound )
  231.                     break;
  232.             }
  233.         if( !docfound )
  234.             fprintf(stderr,"%s not found\n",buf);
  235.         else if( !helpfound )
  236.             fprintf(stderr, "Help not found for %s\n", av[i]);
  237.     }
  238.     return 0;
  239. }
  240.  
  241.  
  242.  
  243. do_assign( void )
  244. {
  245.     int i;
  246.  
  247.     if     (  ac==1  ) assignlist();
  248.     else if(  ac==2  ) doassign(av[1], NULL);
  249.     else if( !(ac&1) ) ierror(NULL, 500);
  250.     else
  251.         for( i=1; i<ac; i+=2 )
  252.             doassign( av[i],av[i+1] );
  253.     return 0;
  254. }
  255.  
  256.  
  257. /* AMK: rewritten code, removed bug when strlen(log) was 0 */
  258. static void
  259. doassign(char *log, char *phy)
  260. {
  261.     int last=strlen(log);
  262.  
  263.     if (last<2 || log[last-1] != ':') fprintf(stderr, "Bad name %s\n", log);
  264.     else {
  265.         int succ=0;
  266.  
  267.         log[last-1] = 0;
  268.  
  269.         if (!phy)
  270.             succ=AssignLock(log,NULL);
  271.         else if (options&1) {   /* add assign, CLI: assign ADD */
  272.             BPTR lock;
  273.             if( lock=Lock(phy,ACCESS_READ) )
  274.                 if( !(succ=AssignAdd(log,lock)))
  275.                     UnLock(lock);
  276.         }
  277.  
  278.         /* late-binding assign, CLI: assign DEFER */
  279.         else if (options&2 || options&8)
  280.             succ=AssignLate(log,phy);
  281.  
  282.         /* non-binding assign, CLI: assign PATH */
  283.         else if (options&4 || options&16)
  284.             succ=AssignPath(log,phy);
  285.         else if (!options) {
  286.             BPTR lock;
  287.             if( lock=Lock(phy,ACCESS_READ) )
  288.                 if( !(succ=AssignLock(log,lock)))
  289.                     UnLock(lock);
  290.         }
  291.  
  292.         if( !succ )
  293.             pError( log );
  294.     }
  295. }
  296.  
  297.  
  298. static void
  299. assignlist()
  300. {
  301.     char *ptr;
  302.     struct DosList *dl;
  303.     struct AssignList *path;
  304.     ULONG flags;
  305.     char fmt[256],devname[256];
  306.     char **dev_list;
  307.     long dev_num,i,cnt;
  308.  
  309.     dev_list = NULL;
  310.     dev_num  = 0;
  311.     flags    = LDF_VOLUMES|LDF_READ;
  312.  
  313.     Myprocess->pr_WindowPtr = (APTR)(-1);
  314.  
  315.     if (dl=LockDosList(flags)) {
  316.         while (dl=NextDosEntry(dl,flags)) {
  317.             BtoCStr(devname,dl->dol_Name,254L);  /* 256 - '\0' + ':' */
  318.             sprintf(fmt,"%s%s",devname,
  319.                     dl->dol_misc.dol_volume.dol_LockList?"":" [Mounted]");
  320.             add_array_list(&dev_list,&dev_num,fmt);
  321.         }
  322.         UnLockDosList(flags);
  323.     }
  324.  
  325.     Myprocess->pr_WindowPtr = o_noreq ? (APTR) -1L : 0L/*Mywindow*/;
  326.  
  327.     QuickSort(dev_list,dev_num);
  328.     printf("Volumes:\n");
  329.     for(i=0; i<dev_num; i++)
  330.         printf("%s\n",dev_list[i]);
  331.     free_array_list(dev_list,dev_num);
  332.  
  333.     if (dobreak())
  334.         return;
  335.  
  336.     dev_list = NULL;
  337.     dev_num  = 0;
  338.     flags    = LDF_ASSIGNS|LDF_READ;
  339.  
  340.     Myprocess->pr_WindowPtr = (APTR)(-1);
  341.  
  342.     if (dl=LockDosList(flags)) {
  343.         while (dl=NextDosEntry(dl,flags)) {
  344.             BtoCStr(devname,dl->dol_Name,254L);  /* 256 - '\0' + ':' */
  345.  
  346.             sprintf(fmt,"%-14s ",devname);
  347.             ptr = fmt+strlen(fmt);
  348.  
  349.             switch (dl->dol_Type) {
  350.                 case DLT_DIRECTORY :
  351.                     if(dl->dol_Lock) {
  352.                         if (!NameFromLock(dl->dol_Lock,ptr,200L)) {
  353.                             struct FileLock *fl_tmp = BADDR(dl->dol_Lock);
  354.                             /* get volume name of assign to an unmounted volume */
  355.                             if (fl_tmp->fl_Volume) {
  356.                                 struct DosList *dl_tmp = BADDR(fl_tmp->fl_Volume);
  357.                                 if (dl_tmp->dol_Name) {
  358.                                     BtoCStr(devname,dl_tmp->dol_Name,254L);  /* 256 - '\0' + ':' */
  359.                                     sprintf(ptr,"Volume: %s",devname);
  360.                                 }
  361.                                 else
  362.                                     strcpy(ptr,"n/a");
  363.                             }
  364.                             else
  365.                                 strcpy(ptr,"n/a");
  366.                             /*fprintf(stderr,"csh.assignlist.1: NameFromLock() failed\n");*/
  367.                             /*strcpy(ptr,"Lock's name too long");*/
  368.                         }
  369.                     }
  370.                     else
  371.                         strcpy(ptr,"Nonexisting lock");
  372. /* --- */
  373.                     if (path=dl->dol_misc.dol_assign.dol_List) {
  374.                         char **ass_list=NULL;
  375.                         long ass_num=0,str_len=0;
  376.                         char *ass_str;
  377.  
  378.                         add_array_list(&ass_list,&ass_num,fmt);
  379.                         str_len += strlen(fmt);
  380.  
  381.                         for (; path; path=path->al_Next) {
  382.                             sprintf(fmt,"%-13s+ ","");
  383.                             ptr = fmt+strlen(fmt);
  384.                             if (path->al_Lock) {
  385.                                 if (!NameFromLock(path->al_Lock,ptr,200L)) {
  386.                                     struct FileLock *fl_tmp = BADDR(path->al_Lock);
  387.                                     /* get volume name of assign to an unmounted volume */
  388.                                     if (fl_tmp->fl_Volume) {
  389.                                         struct DosList *dl_tmp = BADDR(fl_tmp->fl_Volume);
  390.                                         if (dl_tmp->dol_Name) {
  391.                                             BtoCStr(devname,dl_tmp->dol_Name,254L);  /* 256 - '\0' + ':' */
  392.                                             sprintf(ptr,"Volume: %s",devname);
  393.                                         }
  394.                                         else
  395.                                             strcpy(ptr,"n/a");
  396.                                     }
  397.