439f3e2b5de2748a5f5118a5cedf959de94aaa5f
[perl.git] / do / sopt
1 int
2 do_sopt(optype, stab, arglast)
3 int optype;
4 STAB *stab;
5 int *arglast;
6 {
7     register STR **st = stack->ary_array;
8     register int sp = arglast[1];
9     register STIO *stio;
10     int fd;
11     unsigned int lvl;
12     unsigned int optname;
13
14     if (!stab)
15         goto nuts;
16
17     stio = stab_io(stab);
18     if (!stio || !stio->ifp)
19         goto nuts;
20
21     fd = fileno(stio->ifp);
22     lvl = (unsigned int)str_gnum(st[sp+1]);
23     optname = (unsigned int)str_gnum(st[sp+2]);
24     switch (optype) {
25     case O_GSOCKOPT:
26         st[sp] = str_2mortal(Str_new(22,257));
27         st[sp]->str_cur = 256;
28         st[sp]->str_pok = 1;
29         if (getsockopt(fd, lvl, optname, st[sp]->str_ptr,
30                         (int*)&st[sp]->str_cur) < 0)
31             goto nuts;
32         break;
33     case O_SSOCKOPT:
34         st[sp] = st[sp+3];
35         if (setsockopt(fd, lvl, optname, st[sp]->str_ptr, st[sp]->str_cur) < 0)
36             goto nuts;
37         st[sp] = &str_yes;
38         break;
39     }
40     
41     return sp;
42
43 nuts:
44     if (dowarn)
45         warn("[gs]etsockopt() on closed fd");
46     st[sp] = &str_undef;
47     errno = EBADF;
48     return sp;
49
50 }
51