[gforth] / gforth / wordlibs / unixlib.pri  

gforth: gforth/wordlibs/unixlib.pri


1 : jwilke 1.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);
54 : jwilke 1.2 /* cfmakeraw(&tm); !!!!???? worked with linux, but nut on solaris */
55 : jwilke 1.1 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;

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help