|
|
1.1 root 1: static char *sccsid = "@(#)fpipe.c 34.2 10/18/80";
2:
3: #include "global.h"
4: #include <signal.h>
5: FILE *_dofpip(iodes)
6: int iodes;
7: {
8: register FILE *p;
9:
10: for(p=_iob; (p->_flag&(_IOWRT|_IOREAD))!=0; p++)
11: if (p >= _iob+_NFILE)
12: return(NULL);
13: p->_file = iodes;
14: p->_cnt = 0;
15: p->_base = p->_ptr = NULL;
16: return(p);
17: }
18:
19: FILE * fpipe(info)
20: FILE *info[2];
21: {
22: register FILE *p;
23: int descrips[2];
24:
25: if(0 > pipe(descrips)) return( (FILE *) -1);
26:
27: if(NULL==(p = _dofpip(descrips[0]))) return( (FILE *) -1);
28: p->_flag = (_IONBF|_IOREAD);
29: info[0] = p;
30:
31: if(NULL==(p = _dofpip(descrips[1]))) return( (FILE *) -1);
32: p->_flag = _IOWRT;
33: info[1] = p;
34: return((FILE *) 2); /*indicate sucess*/
35: }
36: #ifndef VMS
37: /*C library -- write
38: nwritten = write(file, buffer, count);
39: nwritten == -1 means error
40: */
41: write(file, buffer, count)
42: char *buffer;
43: {
44: register lispval handy;
45: int retval;
46: if((file != 1) || (Vcntlw->a.clb == nil)) goto top;
47: /* since ^w is non nil, we do not want to print to the terminal,
48: but we must be sure to return a correct value from the write
49: in case there is no write to ptport
50: */
51: asm(" movl 12(ap),-4(fp) ") /* retval = count */
52: goto skipit;
53:
54: top:
55:
56: asm(" .set write,4 ");
57: asm(" chmk $write ");
58: asm(" bcc noerror ");
59: asm(" jmp cerror ");
60: asm("noerror: ");
61: asm(" movl r0,-4(fp)");
62:
63: skipit:
64: if(file==1) {
65: handy = Vptport->a.clb;
66: if(handy!=nil && TYPE(handy)==PORT && handy->p->_file!=1) {
67: fflush(handy->p);
68: file = handy->p->_file;
69: goto top;
70: }
71: }
72: return(retval);
73: }
74:
75: /*
76: # C library -- read
77:
78: # nread = read(file, buffer, count);
79: #
80: # nread ==0 means eof; nread == -1 means error
81: */
82: read(file,buffer,count)
83: {
84: asm(" .set read,3 ");
85: asm(" .set eintr,4 "); /* from /usr/include/errno.h */
86: again:
87: asm(" chmk $read ");
88: asm(" bcs error ");
89: asm(" ret ");
90: asm("error: ");
91: asm(" cmpl r0,$eintr ");
92: asm(" jeql intseen ");
93: asm(" jmp cerror ");
94: asm(" intseen: ");
95: if(sigintcnt > 0) sigcall(SIGINT);
96: goto again;
97: }
98: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.