diff options
Diffstat (limited to 'do/sopt')
| -rw-r--r-- | do/sopt | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/do/sopt b/do/sopt new file mode 100644 index 0000000000..439f3e2b5d --- /dev/null +++ b/do/sopt @@ -0,0 +1,51 @@ +int +do_sopt(optype, stab, arglast) +int optype; +STAB *stab; +int *arglast; +{ + register STR **st = stack->ary_array; + register int sp = arglast[1]; + register STIO *stio; + int fd; + unsigned int lvl; + unsigned int optname; + + if (!stab) + goto nuts; + + stio = stab_io(stab); + if (!stio || !stio->ifp) + goto nuts; + + fd = fileno(stio->ifp); + lvl = (unsigned int)str_gnum(st[sp+1]); + optname = (unsigned int)str_gnum(st[sp+2]); + switch (optype) { + case O_GSOCKOPT: + st[sp] = str_2mortal(Str_new(22,257)); + st[sp]->str_cur = 256; + st[sp]->str_pok = 1; + if (getsockopt(fd, lvl, optname, st[sp]->str_ptr, + (int*)&st[sp]->str_cur) < 0) + goto nuts; + break; + case O_SSOCKOPT: + st[sp] = st[sp+3]; + if (setsockopt(fd, lvl, optname, st[sp]->str_ptr, st[sp]->str_cur) < 0) + goto nuts; + st[sp] = &str_yes; + break; + } + + return sp; + +nuts: + if (dowarn) + warn("[gs]etsockopt() on closed fd"); + st[sp] = &str_undef; + errno = EBADF; + return sp; + +} + |
