89 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * Copy the files given as arguments to the standard output.  The file
 | 
						|
 * name "-" refers to the standard input.
 | 
						|
 *
 | 
						|
 * Copyright (C) 1989 by Kenneth Almquist.  All rights reserved.
 | 
						|
 * This file is part of ash, which is distributed under the terms specified
 | 
						|
 * by the Ash General Public License.  See the file named LICENSE.
 | 
						|
 */
 | 
						|
 | 
						|
#define main catfcmd
 | 
						|
 | 
						|
#include "bltin.h"
 | 
						|
#include "../error.h"
 | 
						|
#include <sys/param.h>
 | 
						|
#include <fcntl.h>
 | 
						|
 | 
						|
 | 
						|
#ifdef SBUFSIZE
 | 
						|
#define BUFSIZE() SBUFSIZE
 | 
						|
#else
 | 
						|
#ifdef MAXBSIZE
 | 
						|
#define BUFSIZE() MAXBSIZE
 | 
						|
#else
 | 
						|
#define BUFSIZE() BSIZE
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
main(argc, argv)  char **argv; {
 | 
						|
      char *filename;
 | 
						|
      char *buf = stalloc(BUFSIZE());
 | 
						|
      int fd;
 | 
						|
      int i;
 | 
						|
#ifdef SHELL
 | 
						|
      volatile int input;
 | 
						|
      struct jmploc jmploc;
 | 
						|
      struct jmploc *volatile savehandler;
 | 
						|
#endif
 | 
						|
 | 
						|
      INITARGS(argv);
 | 
						|
#ifdef SHELL
 | 
						|
      input = -1;
 | 
						|
      if (setjmp(jmploc.loc)) {
 | 
						|
	    close(input);
 | 
						|
	    handler = savehandler;
 | 
						|
	    longjmp(handler, 1);
 | 
						|
      }
 | 
						|
      savehandler = handler;
 | 
						|
      handler = &jmploc;
 | 
						|
#endif
 | 
						|
      while ((filename = *++argv) != NULL) {
 | 
						|
	    if (filename[0] == '-' && filename[1] == '\0') {
 | 
						|
		  fd = 0;
 | 
						|
	    } else {
 | 
						|
#ifdef SHELL
 | 
						|
		  INTOFF;
 | 
						|
		  if ((fd = open(filename, O_RDONLY)) < 0)
 | 
						|
			error("Can't open %s", filename);
 | 
						|
		  input = fd;
 | 
						|
		  INTON;
 | 
						|
#else
 | 
						|
		  if ((fd = open(filename, O_RDONLY)) < 0) {
 | 
						|
			fprintf(stderr, "catf: Can't open %s\n", filename);
 | 
						|
			exit(2);
 | 
						|
		  }
 | 
						|
#endif
 | 
						|
	    }
 | 
						|
	    while ((i = read(fd, buf, BUFSIZE())) > 0) {
 | 
						|
#ifdef SHELL
 | 
						|
		  if (out1 == &memout) {
 | 
						|
			register char *p;
 | 
						|
			for (p = buf ; --i >= 0 ; p++) {
 | 
						|
			      outc(*p, &memout);
 | 
						|
			}
 | 
						|
		  } else {
 | 
						|
			write(1, buf, i);
 | 
						|
		  }
 | 
						|
#else
 | 
						|
		  write(1, buf, i);
 | 
						|
#endif
 | 
						|
	    }
 | 
						|
	    if (fd != 0)
 | 
						|
		  close(fd);
 | 
						|
      }
 | 
						|
#ifdef SHELL
 | 
						|
      handler = savehandler;
 | 
						|
#endif
 | 
						|
}
 |