5 typedef struct Mode Mode;
71 int getmode(int, Termios*);
72 int setmode(int, Termios*);
99 for(i = 0; cc[i].name; i++) {
104 print("%s %d ", cc[i].name, t->cc[i]);
107 print("%s %s ", cc[i].name, ctlchar(t->cc[i]));
113 for(i = 0; ou[i].name; i++)
114 if(ou[i].bit & t->oflag)
115 print("%s ", ou[i].name);
117 for(i = 0; in[i].name; i++)
118 if(in[i].bit & t->iflag)
119 print("%s ", in[i].name);
122 for(i = 0; lo[i].name; i++)
123 if(lo[i].bit & t->lflag)
124 print("%s ", lo[i].name);
129 setreset(char *mode, int *bits, Mode *t)
138 for(i = 0; t[i].name; i++) {
139 if(strcmp(mode, t[i].name) == 0) {
156 for(i = 0; cc[i].name; i++)
157 if(strcmp(cc[i].name, name) == 0)
164 main(int argc, char **argv)
167 int i, stdin, wmo, cc;
169 /* Try and get a seek pointer */
170 stdin = open("/fd/0", ORDWR);
174 if(getmode(stdin, &t) < 0) {
175 fprint(2, "stty: tiocget %r\n");
180 fprint(2, "usage: stty [-a|-g] modes...\n");
184 for(i = 1; i < argc; i++) {
185 if(strcmp(argv[i], "-a") == 0) {
189 if(setreset(argv[i], &t.iflag, in)) {
193 if(setreset(argv[i], &t.lflag, lo)) {
197 if(setreset(argv[i], &t.oflag, ou)) {
201 cc = ccname(argv[i]);
202 if(cc != -1 && i+1 < argc) {
204 t.cc[cc] = argv[++i][0];
207 fprint(2, "stty: bad option/mode %s\n", argv[i]);
212 if(setmode(stdin, &t) < 0) {
213 fprint(2, "stty: cant set mode %r\n");
222 setmode(int fd, Termios *t)
227 n = sprint(buf, "IOW %4.4ux %4.4ux %4.4ux %4.4ux ",
228 t->iflag, t->oflag, t->cflag, t->lflag);
229 for(i = 0; i < NCCS; i++)
230 n += sprint(buf+n, "%2.2ux ", t->cc[i]);
232 if(seek(fd, -2, 0) != -2)
235 n = write(fd, buf, n);
242 * Format is: IOR iiii oooo cccc llll xx xx xx xx ...
245 getmode(int fd, Termios *t)
250 if(seek(fd, -2, 0) != -2)
253 n = read(fd, buf, 57);
257 t->iflag = strtoul(buf+4, 0, 16);
258 t->oflag = strtoul(buf+9, 0, 16);
259 t->cflag = strtoul(buf+14, 0, 16);
260 t->lflag = strtoul(buf+19, 0, 16);
262 for(n = 0; n < NCCS; n++)
263 t->cc[n] = strtoul(buf+24+(n*3), 0, 16);