Blame


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>
4 53db2d0f 2004-04-21 devnull
5 53db2d0f 2004-04-21 devnull #define DEF 22 /* lines in chunk: 3*DEF == 66, #lines per nroff page */
6 53db2d0f 2004-04-21 devnull
7 53db2d0f 2004-04-21 devnull Biobuf *cons;
8 53db2d0f 2004-04-21 devnull Biobuf bout;
9 53db2d0f 2004-04-21 devnull
10 53db2d0f 2004-04-21 devnull int pglen = DEF;
11 53db2d0f 2004-04-21 devnull
12 53db2d0f 2004-04-21 devnull void printfile(int);
13 53db2d0f 2004-04-21 devnull
14 53db2d0f 2004-04-21 devnull void
15 53db2d0f 2004-04-21 devnull main(int argc, char *argv[])
16 53db2d0f 2004-04-21 devnull {
17 53db2d0f 2004-04-21 devnull int n;
18 53db2d0f 2004-04-21 devnull int f;
19 53db2d0f 2004-04-21 devnull
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");
23 53db2d0f 2004-04-21 devnull }
24 53db2d0f 2004-04-21 devnull Binit(&bout, 1, OWRITE);
25 53db2d0f 2004-04-21 devnull n = 0;
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;
32 53db2d0f 2004-04-21 devnull } else {
33 53db2d0f 2004-04-21 devnull n++;
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;
38 53db2d0f 2004-04-21 devnull }
39 53db2d0f 2004-04-21 devnull printfile(f);
40 53db2d0f 2004-04-21 devnull close(f);
41 53db2d0f 2004-04-21 devnull }
42 53db2d0f 2004-04-21 devnull }
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);
46 53db2d0f 2004-04-21 devnull }
47 53db2d0f 2004-04-21 devnull
48 53db2d0f 2004-04-21 devnull void
49 53db2d0f 2004-04-21 devnull printfile(int f)
50 53db2d0f 2004-04-21 devnull {
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;
54 53db2d0f 2004-04-21 devnull
55 53db2d0f 2004-04-21 devnull b = malloc(sizeof(Biobuf));
56 53db2d0f 2004-04-21 devnull Binit(b, f, OREAD);
57 53db2d0f 2004-04-21 devnull for(;;){
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 */
66 53db2d0f 2004-04-21 devnull free(b);
67 53db2d0f 2004-04-21 devnull return;
68 53db2d0f 2004-04-21 devnull }
69 53db2d0f 2004-04-21 devnull }else{
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);
73 53db2d0f 2004-04-21 devnull }
74 53db2d0f 2004-04-21 devnull }
75 53db2d0f 2004-04-21 devnull Bflush(&bout);
76 53db2d0f 2004-04-21 devnull getcmd:
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);
85 53db2d0f 2004-04-21 devnull }
86 53db2d0f 2004-04-21 devnull waitpid();
87 53db2d0f 2004-04-21 devnull goto getcmd;
88 53db2d0f 2004-04-21 devnull }
89 53db2d0f 2004-04-21 devnull }
90 53db2d0f 2004-04-21 devnull }