2 #include <sys/socket.h>
3 #include <netinet/in.h>
10 #define ALIGN (sizeof(struct { char a; char *b; }) - sizeof(char *))
12 int getservbyname_r(const char *name
, const char *prots
,
13 struct servent
*se
, char *buf
, size_t buflen
, struct servent
**res
)
15 struct service servs
[MAXSERVS
];
16 int cnt
, proto
, align
;
21 align
= -(uintptr_t)buf
& ALIGN
-1;
22 if (buflen
< 2*sizeof(char *)+align
)
26 if (!prots
) proto
= 0;
27 else if (!strcmp(prots
, "tcp")) proto
= IPPROTO_TCP
;
28 else if (!strcmp(prots
, "udp")) proto
= IPPROTO_UDP
;
31 cnt
= __lookup_serv(servs
, name
, proto
, 0, 0);
32 if (cnt
<0) switch (cnt
) {
40 se
->s_name
= (char *)name
;
41 se
->s_aliases
= (void *)buf
;
42 se
->s_aliases
[0] = se
->s_name
;
44 se
->s_port
= htons(servs
[0].port
);
45 se
->s_proto
= servs
[0].proto
== IPPROTO_TCP
? "tcp" : "udp";