1 53db2d0f 2004-04-21 devnull #include <u.h>
2 53db2d0f 2004-04-21 devnull #include <libc.h>
3 53db2d0f 2004-04-21 devnull #include <bio.h>
5 53db2d0f 2004-04-21 devnull #define DEF 22 /* lines in chunk: 3*DEF == 66, #lines per nroff page */
7 53db2d0f 2004-04-21 devnull Biobuf *cons;
8 53db2d0f 2004-04-21 devnull Biobuf bout;
10 53db2d0f 2004-04-21 devnull int pglen = DEF;
12 53db2d0f 2004-04-21 devnull void printfile(int);
15 53db2d0f 2004-04-21 devnull main(int argc, char *argv[])
20 97dafe41 2004-04-24 devnull if((cons = Bopen("/dev/tty", OREAD)) == 0) {
21 97dafe41 2004-04-24 devnull fprint(2, "p: can't open /dev/tty\n");
22 97dafe41 2004-04-24 devnull exits("missing /dev/tty");
24 53db2d0f 2004-04-21 devnull Binit(&bout, 1, OWRITE);
26 53db2d0f 2004-04-21 devnull while(argc > 1) {
27 53db2d0f 2004-04-21 devnull --argc; argv++;
28 53db2d0f 2004-04-21 devnull if(*argv[0] == '-'){
29 53db2d0f 2004-04-21 devnull pglen = atoi(&argv[0][1]);
30 53db2d0f 2004-04-21 devnull if(pglen <= 0)
31 53db2d0f 2004-04-21 devnull pglen = DEF;
34 53db2d0f 2004-04-21 devnull f = open(argv[0], OREAD);
35 53db2d0f 2004-04-21 devnull if(f < 0){
36 53db2d0f 2004-04-21 devnull fprint(2, "p: can't open %s\n", argv[0]);
37 53db2d0f 2004-04-21 devnull continue;
39 53db2d0f 2004-04-21 devnull printfile(f);
40 53db2d0f 2004-04-21 devnull close(f);
43 53db2d0f 2004-04-21 devnull if(n == 0)
44 53db2d0f 2004-04-21 devnull printfile(0);
45 53db2d0f 2004-04-21 devnull exits(0);
49 53db2d0f 2004-04-21 devnull printfile(int f)
51 53db2d0f 2004-04-21 devnull int i, j, n;
52 53db2d0f 2004-04-21 devnull char *s, *cmd;
53 53db2d0f 2004-04-21 devnull Biobuf *b;
55 53db2d0f 2004-04-21 devnull b = malloc(sizeof(Biobuf));
56 53db2d0f 2004-04-21 devnull Binit(b, f, OREAD);
58 53db2d0f 2004-04-21 devnull for(i=1; i <= pglen; i++) {
59 53db2d0f 2004-04-21 devnull s = Brdline(b, '\n');
60 53db2d0f 2004-04-21 devnull if(s == 0){
61 53db2d0f 2004-04-21 devnull n = Blinelen(b);
62 53db2d0f 2004-04-21 devnull if(n > 0) /* line too long for Brdline */
63 53db2d0f 2004-04-21 devnull for(j=0; j<n; j++)
64 53db2d0f 2004-04-21 devnull Bputc(&bout, Bgetc(b));
65 53db2d0f 2004-04-21 devnull else{ /* true EOF */
70 53db2d0f 2004-04-21 devnull Bwrite(&bout, s, Blinelen(b)-1);
71 53db2d0f 2004-04-21 devnull if(i < pglen)
72 53db2d0f 2004-04-21 devnull Bwrite(&bout, "\n", 1);
75 53db2d0f 2004-04-21 devnull Bflush(&bout);
77 53db2d0f 2004-04-21 devnull cmd = Brdline(cons, '\n');
78 53db2d0f 2004-04-21 devnull if(cmd == 0 || *cmd == 'q')
79 53db2d0f 2004-04-21 devnull exits(0);
80 53db2d0f 2004-04-21 devnull cmd[Blinelen(cons)-1] = 0;
81 53db2d0f 2004-04-21 devnull if(*cmd == '!'){
82 53db2d0f 2004-04-21 devnull if(fork() == 0){
83 53db2d0f 2004-04-21 devnull dup(Bfildes(cons), 0);
84 53db2d0f 2004-04-21 devnull execl("/bin/rc", "rc", "-c", cmd+1, 0);
86 53db2d0f 2004-04-21 devnull waitpid();
87 53db2d0f 2004-04-21 devnull goto getcmd;