Annotation of gforth/wordlibs/unixlib.pri, revision 1.2
1.1 jwilke 1: alarm u -- unixlib
2: alarm(u);
3:
4: timeusec -- u_usec u_sec unixlib
5: struct timeval tv;
6: struct timezone zone1;
7: gettimeofday(&tv,&zone1);
8: u_usec=tv.tv_usec;
9: u_sec=tv.tv_sec;
10:
11: time -- u1 unixlib
12: u1=(long) time(NULL);
13:
14: \ Serial Interface
15:
16: setttyspeed u u2 -- wior unixlib
17: struct termios tm;
18: int BT[]={
19: 0,B0,50,B50,75,B75,110,B110,134,B134,150,B150,200,B200,300,B300,
20: 600,B600,1200,B1200,1800,B1800,2400,B2400,4800,B4800,9600,B9600,19200,B19200,38400,B38400,
21: #ifdef B57600
22: 57600,B57600,
23: #endif
24: #ifdef B115200
25: 115200,B115200,
26: #endif
27: #ifdef B230400
28: 230400,B230400,
29: #endif
30: 1};
31: speed_t br;
32: int i;
33: i=0; br=0;
34: while (BT[i]!=1)
35: { if (BT[i]==u)
36: { br=BT[i+1];
37: break;
38: }
39: i=i+2;
40: }
41: if (BT[i]!=1)
42: { tcgetattr(u2,&tm);
43: cfsetispeed(&tm, br);
44: cfsetospeed(&tm, br);
45: tcsetattr(u2,TCSANOW,&tm);
46: wior=0;
47: } else
48: { wior=-1;
49: }
50:
51: setttyraw u -- wior unixlib
52: struct termios tm;
53: tcgetattr(u,&tm);
1.2 ! jwilke 54: /* cfmakeraw(&tm); !!!!???? worked with linux, but nut on solaris */
1.1 jwilke 55: tcsetattr(u,TCSANOW,&tm);
56: wior=0;
57:
58: ttytostd c_addr1 u1 -- wior unixlib
59: int i;
60: wior=0;
61: close(0);
62: close(1);
63: close(2);
64: i=open(cstr(c_addr1,u1,0),O_RDWR|O_NOCTTY);
65: if ((i==-1) || (i!=0))
66: { wior=-1;
67: } else
68: { i= dup(0);
69: i= dup(0);
70: i=open("/dev/tty",O_RDWR);
71: if (i>=0) {
72: ioctl(i,TIOCNOTTY,0);
73: (void) close(i);
74: }
75: }
76:
77: uopen c_addr u uflags umode -- w2 wior file
78: w2 = open(tilde_cstr(c_addr, u, 1), uflags , (mode_t) umode);
79: if (w2 == -1) {
80: wior = -37;
81: } else {
82: wior = 0;
83: }
84:
85: uread c_addr u u1 -- u3 wior new
86: wior=0;
87: if ((u3 = read(u1, c_addr, u))==-1)
88: { if (errno==EWOULDBLOCK) u3=0;
89: else wior=-37;
90: } else
91: { if (u3==0) wior=-39;
92: }
93:
94: uwrite c_addr u u1 -- u3 wior new
95: wior=0;
96: if ((u3 = write(u1, c_addr, u))==-1)
97: { if (errno==EAGAIN) u3=0;
98: else wior=-37;
99: }
100:
101: uclose u -- wior new
102: wior=0;
103: if (close(u)) wior=-37;
104:
105: nonblock u1 -- wior new
106: fcntl(u1,F_SETFL,O_NONBLOCK);
107: wior=0;
108:
109: get_cconst c_addr u -- u1 wior new
110: static char CONST_NAMES[][32]={
111: "O_RDONLY",
112: "O_WRONLY",
113: "O_RDWR",
114: ""};
115: static unsigned int CONST_VALUES[]={
116: O_RDONLY,
117: O_WRONLY,
118: O_RDWR};
119: int i=0;
120: int contd=1;
121: u1=0;
122: wior=-1;
123: while (CONST_NAMES[i] && contd) {
124: if (strcmp(CONST_NAMES[i],cstr(c_addr,u,1))==0) {
125: contd=0; u1=CONST_VALUES[i]; wior=0;} ;
126: i++;
127: }
128:
129: fork -- u new
130: u=fork();
131:
132: wait a_addr -- u new I_wait
133: u=wait((int *) a_addr);
134:
135: waitpid u a_addr u2 -- u3 new I_waitpid
136: u3=waitpid((pid_t) u,(int *) a_addr,u2);
137:
138: execv c_addr1 u1 c_addr2 -- new
139: char *s1=cstr(c_addr1, u1, 0);
140: execv(s1, (void *) c_addr2);
141:
142: errno -- u new
143: u=errno;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>