00001
00002
00003
00004
00005
00006
00007 static char *rcsid="@(#)$Id$";
00008 #include <ctype.h>
00009 #include <sys/termios.h>
00010 #ifndef Darwin
00011 #include <termio.h>
00012 #endif
00013
00014
00015 #undef MAX
00016 #undef MIN
00017 #undef VMIN
00018 #undef VMAX
00019 #include "eus.h"
00020
00021 extern int errno;
00022
00023 static int getfd(x)
00024 pointer x;
00025 { if (isint(x)) return(intval(x));
00026 else if (isflt(x)) error(E_NOINT);
00027 else if (pisiostream(x)) x=x->c.iostream.in;
00028 else if (!pisfilestream(x)) error(E_STREAM);
00029 return(intval(x->c.fstream.fd));}
00030
00031 static pointer getbuf(n,x,bufsize)
00032 int n,bufsize;
00033 pointer x;
00034 { if (n<=1) x=makebuffer(bufsize);
00035 else if (!isstring(x)) error(E_NOSTRING);
00036 else if (strlength(x)<bufsize) error(E_VECINDEX);
00037 return(x);}
00038
00039 static pointer ioctl_struct(n,argv,ctlcode,bufsize)
00040 int n,bufsize;
00041 unsigned long ctlcode;
00042 pointer argv[];
00043 { int fd,stat;
00044 pointer buf;
00045 if (n==0 || n>2) error(E_MISMATCHARG);
00046 fd=getfd(argv[0]);
00047 buf=getbuf(n,argv[1],bufsize);
00048 stat=ioctl(fd,ctlcode,buf->c.str.chars);
00049 if (stat<0) return(makeint( (-errno)));
00050 else return(buf);}
00051
00052 static pointer ioctl_int(n,argv,ctlcode)
00053 int n;
00054 unsigned long ctlcode;
00055 pointer argv[];
00056 { int fd,stat,intarg;
00057 pointer buf;
00058 ckarg(2);
00059 fd=getfd(argv[0]);
00060 intarg=ckintval(argv[1]);
00061 stat=ioctl(fd,ctlcode, &intarg);
00062 if (stat<0) return(makeint(-errno));
00063 else return(makeint(intarg));}
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 #if !Darwin
00175 #if sun3 || sun4 || Linux || alpha || IRIX || Solaris2
00176
00177 pointer IOCTL_TCGETS(ctx,n,argv)
00178 register context *ctx;
00179 int n;
00180 pointer argv[];
00181 { return(ioctl_struct(n,argv,TCGETS,sizeof(struct termios)));}
00182
00183 pointer IOCTL_TCSETS(ctx,n,argv)
00184 register context *ctx;
00185 int n;
00186 pointer argv[];
00187 { return(ioctl_struct(n,argv,TCSETS,sizeof(struct termios)));}
00188
00189 pointer IOCTL_TCSETSW(ctx,n,argv)
00190 register context *ctx;
00191 int n;
00192 pointer argv[];
00193 { return(ioctl_struct(n,argv,TCSETSW,sizeof(struct termios)));}
00194
00195 pointer IOCTL_TCSETSF(ctx,n,argv)
00196 register context *ctx;
00197 int n;
00198 pointer argv[];
00199 { return(ioctl_struct(n,argv,TCSETSF,sizeof(struct termios)));}
00200 #endif
00201
00202 pointer IOCTL_TCGETA(ctx,n,argv)
00203 register context *ctx;
00204 int n;
00205 pointer argv[];
00206 { return(ioctl_struct(n,argv,TCGETA,sizeof(struct termio)));}
00207
00208 pointer IOCTL_TCSETA(ctx,n,argv)
00209 register context *ctx;
00210 int n;
00211 pointer argv[];
00212 { return(ioctl_struct(n,argv,TCSETA,sizeof(struct termio)));}
00213
00214 pointer IOCTL_TCSETAF(ctx,n,argv)
00215 register context *ctx;
00216 int n;
00217 pointer argv[];
00218 { return(ioctl_struct(n,argv,TCSETAF,sizeof(struct termio)));}
00219
00220 pointer IOCTL_TCSETAW(n,argv)
00221 int n;
00222 pointer argv[];
00223 { return(ioctl_struct(n,argv,TCSETAW,sizeof(struct termio)));}
00224 #endif
00225
00226 pointer TCGETATTR(ctx,n,argv)
00227 register context *ctx;
00228 int n;
00229 pointer argv[];
00230 { int stat;
00231 pointer buf;
00232 ckarg2(1,2);
00233 buf=getbuf(n,argv[1],sizeof(struct termios));
00234 stat=tcgetattr(getfd(argv[0]),(struct termios *)buf->c.str.chars);
00235 if (stat<0) return(makeint(-errno)); else return(buf);}
00236
00237 pointer TCSETATTR(ctx,n,argv)
00238 register context *ctx;
00239 int n;
00240 pointer argv[];
00241 { int stat,optact=0;
00242 pointer buf;
00243 ckarg2(1,3);
00244 buf=getbuf(n,argv[2],sizeof(struct termios));
00245 if (n>=2) optact=ckintval(argv[1]);
00246 stat=tcsetattr(getfd(argv[0]),optact,(struct termios *)buf->c.str.chars);
00247 if (stat<0) return(makeint(-errno)); else return(buf);}
00248
00249 void eusioctl(ctx,mod)
00250 register context *ctx;
00251 register pointer mod;
00252 {
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276 #if !Darwin
00277 #if sun3 || sun4 || Linux || alpha || IRIX || Solaris2
00278 defunpkg(ctx,"TCGETS",mod,IOCTL_TCGETS,unixpkg);
00279 defunpkg(ctx,"TCSETS",mod,IOCTL_TCSETS,unixpkg);
00280 defunpkg(ctx,"TCSETSW",mod,IOCTL_TCSETSW,unixpkg);
00281 defunpkg(ctx,"TCSETSF",mod,IOCTL_TCSETSF,unixpkg);
00282 #endif
00283 defunpkg(ctx,"TCGETA",mod,IOCTL_TCGETA,unixpkg);
00284 defunpkg(ctx,"TCSETA",mod,IOCTL_TCSETA,unixpkg);
00285 defunpkg(ctx,"TCSETAW",mod,IOCTL_TCSETAW,unixpkg);
00286 defunpkg(ctx,"TCSETAF",mod,IOCTL_TCSETAF,unixpkg);
00287 #endif
00288 defunpkg(ctx,"TCGETATTR",mod,TCGETATTR,unixpkg);
00289 defunpkg(ctx,"TCSETATTR",mod,TCSETATTR,unixpkg);
00290
00291 }