diff options
Diffstat (limited to 'do/getsockname')
| -rw-r--r-- | do/getsockname | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/do/getsockname b/do/getsockname new file mode 100644 index 0000000000..b899400321 --- /dev/null +++ b/do/getsockname @@ -0,0 +1,45 @@ +int +do_getsockname(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; + + if (!stab) + goto nuts; + + stio = stab_io(stab); + if (!stio || !stio->ifp) + goto nuts; + + st[sp] = str_2mortal(Str_new(22,257)); + st[sp]->str_cur = 256; + st[sp]->str_pok = 1; + fd = fileno(stio->ifp); + switch (optype) { + case O_GETSOCKNAME: + if (getsockname(fd, st[sp]->str_ptr, (int*)&st[sp]->str_cur) < 0) + goto nuts2; + break; + case O_GETPEERNAME: + if (getpeername(fd, st[sp]->str_ptr, (int*)&st[sp]->str_cur) < 0) + goto nuts2; + break; + } + + return sp; + +nuts: + if (dowarn) + warn("get{sock,peer}name() on closed fd"); + errno = EBADF; +nuts2: + st[sp] = &str_undef; + return sp; + +} + |
