[uClibc-cvs] uClibc/libc/inet getnetent.c, 1.5, 1.6 getproto.c, 1.6, 1.7 getservice.c, 1.8, 1.9

Erik Andersen andersen at uclibc.org
Thu Mar 18 11:12:35 UTC 2004


Update of /var/cvs/uClibc/libc/inet
In directory nail:/tmp/cvs-serv7322/libc/inet

Modified Files:
	getnetent.c getproto.c getservice.c 
Log Message:
Reduce memory used by static buffers and allocate that memory dynamicly
instead.  Based on an initial patch from Tobias Anderberg, but reworked.  I
asked Tobias to look into doing something more like what is done in busybox,
but that proved to be a pain.

One possible concern is that these buffers will probably show up as
memory leaks i.e. with valgrind.  Perhaps we should add in an atexit
call to free this memory right after we allocate it?


Index: getservice.c
===================================================================
RCS file: /var/cvs/uClibc/libc/inet/getservice.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- a/getservice.c	28 Dec 2003 08:25:16 -0000	1.8
+++ b/getservice.c	18 Mar 2004 11:12:33 -0000	1.9
@@ -81,12 +81,22 @@
 
 
 #define	MAXALIASES	35
+#define SBUFSIZE	(BUFSIZ + 1 + (sizeof(char *) * MAXALIASES))
 
 static FILE *servf = NULL;
 static struct servent serv;
-static char buf[BUFSIZ+1 + sizeof(char *)*MAXALIASES];
+static char *buf = NULL;
 static int serv_stayopen;
 
+static void __initbuf(void)
+{
+    if (!buf) {
+	buf = malloc(SBUFSIZE);
+	if (!buf)
+	    abort();
+    }
+}
+
 void setservent(int f)
 {
     LOCK;
@@ -112,7 +122,9 @@
 struct servent * getservent(void)
 {
     struct servent *result;
-    getservent_r(&serv, buf, sizeof(buf), &result);
+
+    __initbuf();
+    getservent_r(&serv, buf, SBUFSIZE, &result);
     return result;
 }
 
@@ -120,7 +132,9 @@
 struct servent *getservbyname(const char *name, const char *proto)
 {
     struct servent *result;
-    getservbyname_r(name, proto, &serv, buf, sizeof(buf), &result);
+
+    __initbuf();
+    getservbyname_r(name, proto, &serv, buf, SBUFSIZE, &result);
     return result;
 }
 
@@ -128,7 +142,9 @@
 struct servent * getservbyport(int port, const char *proto)
 {
     struct servent *result;
-    getservbyport_r(port, proto, &serv, buf, sizeof(buf), &result);
+
+    __initbuf();
+    getservbyport_r(port, proto, &serv, buf, SBUFSIZE, &result);
     return result;
 }
 

Index: getproto.c
===================================================================
RCS file: /var/cvs/uClibc/libc/inet/getproto.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- a/getproto.c	27 Dec 2003 23:30:31 -0000	1.6
+++ b/getproto.c	18 Mar 2004 11:12:33 -0000	1.7
@@ -75,12 +75,22 @@
 
 
 #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 @@
 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 @@
 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 @@
 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;
 }
 

Index: getnetent.c
===================================================================
RCS file: /var/cvs/uClibc/libc/inet/getnetent.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- a/getnetent.c	27 Dec 2003 23:30:31 -0000	1.5
+++ b/getnetent.c	18 Mar 2004 11:12:33 -0000	1.6
@@ -37,7 +37,7 @@
 #define	MAXALIASES	35
 static const char NETDB[] = _PATH_NETWORKS;
 static FILE *netf = NULL;
-static char line[BUFSIZ+1];
+static char *line = NULL;
 static struct netent net;
 static char *net_aliases[MAXALIASES];
 
@@ -90,6 +90,13 @@
 	return (NULL);
     }
 again:
+
+    if (!line) {
+	line = malloc(BUFSIZ + 1);
+	if (!line)
+	    abort();
+    }
+
     p = fgets(line, BUFSIZ, netf);
     if (p == NULL) {
 	UNLOCK;
@@ -114,7 +121,7 @@
     net.n_net = inet_network(cp);
     net.n_addrtype = AF_INET;
     q = net.n_aliases = net_aliases;
-    if (p != NULL) 
+    if (p != NULL)
 	cp = p;
     while (cp && *cp) {
 	if (*cp == ' ' || *cp == '\t') {




More information about the uClibc-cvs mailing list