13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier #define DEF 22 /* lines in chunk: 3*DEF == 66, #lines per nroff page */
63e12c5d1SDavid du Colombier
73e12c5d1SDavid du Colombier Biobuf *cons;
83e12c5d1SDavid du Colombier Biobuf bout;
93e12c5d1SDavid du Colombier
103e12c5d1SDavid du Colombier int pglen = DEF;
113e12c5d1SDavid du Colombier
123e12c5d1SDavid du Colombier void printfile(int);
133e12c5d1SDavid du Colombier
143e12c5d1SDavid du Colombier void
main(int argc,char * argv[])153e12c5d1SDavid du Colombier main(int argc, char *argv[])
163e12c5d1SDavid du Colombier {
173e12c5d1SDavid du Colombier int n;
183e12c5d1SDavid du Colombier int f;
193e12c5d1SDavid du Colombier
203e12c5d1SDavid du Colombier if((cons = Bopen("/dev/cons", OREAD)) == 0) {
213e12c5d1SDavid du Colombier fprint(2, "p: can't open /dev/cons\n");
223e12c5d1SDavid du Colombier exits("missing /dev/cons");
233e12c5d1SDavid du Colombier }
243e12c5d1SDavid du Colombier Binit(&bout, 1, OWRITE);
253e12c5d1SDavid du Colombier n = 0;
263e12c5d1SDavid du Colombier while(argc > 1) {
273e12c5d1SDavid du Colombier --argc; argv++;
283e12c5d1SDavid du Colombier if(*argv[0] == '-'){
293e12c5d1SDavid du Colombier pglen = atoi(&argv[0][1]);
303e12c5d1SDavid du Colombier if(pglen <= 0)
313e12c5d1SDavid du Colombier pglen = DEF;
323e12c5d1SDavid du Colombier } else {
333e12c5d1SDavid du Colombier n++;
343e12c5d1SDavid du Colombier f = open(argv[0], OREAD);
353e12c5d1SDavid du Colombier if(f < 0){
3613c0d2ddSDavid du Colombier fprint(2, "p: can't open %s - %r\n", argv[0]);
373e12c5d1SDavid du Colombier continue;
383e12c5d1SDavid du Colombier }
393e12c5d1SDavid du Colombier printfile(f);
40a5ecd27eSDavid du Colombier close(f);
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier }
433e12c5d1SDavid du Colombier if(n == 0)
443e12c5d1SDavid du Colombier printfile(0);
457dd7cddfSDavid du Colombier exits(0);
463e12c5d1SDavid du Colombier }
473e12c5d1SDavid du Colombier
483e12c5d1SDavid du Colombier void
printfile(int f)493e12c5d1SDavid du Colombier printfile(int f)
503e12c5d1SDavid du Colombier {
513e12c5d1SDavid du Colombier int i, j, n;
523e12c5d1SDavid du Colombier char *s, *cmd;
533e12c5d1SDavid du Colombier Biobuf *b;
543e12c5d1SDavid du Colombier
553e12c5d1SDavid du Colombier b = malloc(sizeof(Biobuf));
563e12c5d1SDavid du Colombier Binit(b, f, OREAD);
573e12c5d1SDavid du Colombier for(;;){
583e12c5d1SDavid du Colombier for(i=1; i <= pglen; i++) {
593e12c5d1SDavid du Colombier s = Brdline(b, '\n');
603e12c5d1SDavid du Colombier if(s == 0){
617dd7cddfSDavid du Colombier n = Blinelen(b);
623e12c5d1SDavid du Colombier if(n > 0) /* line too long for Brdline */
633e12c5d1SDavid du Colombier for(j=0; j<n; j++)
643e12c5d1SDavid du Colombier Bputc(&bout, Bgetc(b));
65a5ecd27eSDavid du Colombier else{ /* true EOF */
66a5ecd27eSDavid du Colombier free(b);
673e12c5d1SDavid du Colombier return;
68a5ecd27eSDavid du Colombier }
693e12c5d1SDavid du Colombier }else{
703e12c5d1SDavid du Colombier Bwrite(&bout, s, Blinelen(b)-1);
713e12c5d1SDavid du Colombier if(i < pglen)
723e12c5d1SDavid du Colombier Bwrite(&bout, "\n", 1);
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier }
753e12c5d1SDavid du Colombier Bflush(&bout);
763e12c5d1SDavid du Colombier getcmd:
773e12c5d1SDavid du Colombier cmd = Brdline(cons, '\n');
783e12c5d1SDavid du Colombier if(cmd == 0 || *cmd == 'q')
793e12c5d1SDavid du Colombier exits(0);
803e12c5d1SDavid du Colombier cmd[Blinelen(cons)-1] = 0;
813e12c5d1SDavid du Colombier if(*cmd == '!'){
823e12c5d1SDavid du Colombier if(fork() == 0){
833e12c5d1SDavid du Colombier dup(Bfildes(cons), 0);
84*f19e7b74SDavid du Colombier execl("/bin/rc", "rc", "-c", cmd+1, nil);
853e12c5d1SDavid du Colombier }
869a747e4fSDavid du Colombier waitpid();
873e12c5d1SDavid du Colombier goto getcmd;
883e12c5d1SDavid du Colombier }
893e12c5d1SDavid du Colombier }
903e12c5d1SDavid du Colombier }
91