summaryrefslogtreecommitdiff
path: root/libc/inet/getproto.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/inet/getproto.c')
-rw-r--r--libc/inet/getproto.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/libc/inet/getproto.c b/libc/inet/getproto.c
index 1d3a5eff5..c9f35f149 100644
--- a/libc/inet/getproto.c
+++ b/libc/inet/getproto.c
@@ -75,12 +75,22 @@ static pthread_mutex_t mylock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
#define MAXALIASES 35
+#define SBUFSIZE (BUFSIZ + 1 + (sizeof(char *) * MAXALIASES))
static FILE *protof = NULL;
static struct protoent proto;
-static char static_aliases[BUFSIZ+1 + sizeof(char *)*MAXALIASES];
+static char *static_aliases = NULL;
static int proto_stayopen;
+static void __initbuf(void)
+{
+ if (!static_aliases) {
+ static_aliases = malloc(SBUFSIZE);
+ if (!static_aliases)
+ abort();
+ }
+}
+
void setprotoent(int f)
{
LOCK;
@@ -183,7 +193,9 @@ again:
struct protoent * getprotoent(void)
{
struct protoent *result;
- getprotoent_r(&proto, static_aliases, sizeof(static_aliases), &result);
+
+ __initbuf();
+ getprotoent_r(&proto, static_aliases, SBUFSIZE, &result);
return result;
}
@@ -216,7 +228,9 @@ found:
struct protoent * getprotobyname(const char *name)
{
struct protoent *result;
- getprotobyname_r(name, &proto, static_aliases, sizeof(static_aliases), &result);
+
+ __initbuf();
+ getprotobyname_r(name, &proto, static_aliases, SBUFSIZE, &result);
return result;
}
@@ -242,7 +256,10 @@ int getprotobynumber_r (int proto_num,
struct protoent * getprotobynumber(int proto_num)
{
struct protoent *result;
- getprotobynumber_r(proto_num, &proto, static_aliases, sizeof(static_aliases), &result);
+
+ __initbuf();
+ getprotobynumber_r(proto_num, &proto, static_aliases,
+ SBUFSIZE, &result);
return result;
}