db4a570c7347076d483784499eea0d8d12045065
[perl.git] / do / ghent
1 int
2 do_ghent(which,gimme,arglast)
3 int which;
4 int gimme;
5 int *arglast;
6 {
7     register ARRAY *ary = stack;
8     register int sp = arglast[0];
9     register char **elem;
10     register STR *TARG;
11     struct hostent *gethostbyname();
12     struct hostent *gethostbyaddr();
13 #ifdef HAS_GETHOSTENT
14     struct hostent *gethostent();
15 #endif
16     struct hostent *hent;
17     unsigned long len;
18
19     if (which == O_GHBYNAME) {
20         char *name = str_get(ary->ary_array[sp+1]);
21
22         hent = gethostbyname(name);
23     }
24     else if (which == O_GHBYADDR) {
25         STR *addrstr = ary->ary_array[sp+1];
26         int addrtype = (int)str_gnum(ary->ary_array[sp+2]);
27         char *addr = str_get(addrstr);
28
29         hent = gethostbyaddr(addr,addrstr->str_cur,addrtype);
30     }
31     else
32 #ifdef HAS_GETHOSTENT
33         hent = gethostent();
34 #else
35         fatal("gethostent not implemented");
36 #endif
37
38 #ifdef HOST_NOT_FOUND
39     if (!hent)
40         statusvalue = (unsigned short)h_errno & 0xffff;
41 #endif
42
43     if (gimme != G_ARRAY) {
44         astore(ary, ++sp, TARG = str_mortal(&str_undef));
45         if (hent) {
46             if (which == O_GHBYNAME) {
47 #ifdef h_addr
48                 str_nset(TARG, *hent->h_addr, hent->h_length);
49 #else
50                 str_nset(TARG, hent->h_addr, hent->h_length);
51 #endif
52             }
53             else
54                 str_set(TARG, hent->h_name);
55         }
56         return sp;
57     }
58
59     if (hent) {
60 #ifndef lint
61         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
62         str_set(TARG, hent->h_name);
63         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
64         for (elem = hent->h_aliases; *elem; elem++) {
65             str_cat(TARG, *elem);
66             if (elem[1])
67                 str_ncat(TARG," ",1);
68         }
69         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
70         str_numset(TARG, (double)hent->h_addrtype);
71         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
72         len = hent->h_length;
73         str_numset(TARG, (double)len);
74 #ifdef h_addr
75         for (elem = hent->h_addr_list; *elem; elem++) {
76             (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
77             str_nset(TARG, *elem, len);
78         }
79 #else
80         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
81         str_nset(TARG, hent->h_addr, len);
82 #endif /* h_addr */
83 #else /* lint */
84         elem = Nullch;
85         elem = elem;
86         (void)astore(ary, ++sp, str_mortal(&str_no));
87 #endif /* lint */
88     }
89
90     return sp;
91 }
92