[Asterisk-cvs] asterisk utils.c,NONE,1.1 Makefile,1.85,1.86 acl.c,1.18,1.19 asterisk.c,1.84,1.85

citats at lists.digium.com citats at lists.digium.com
Sun May 9 04:12:41 CDT 2004


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv28595

Modified Files:
	Makefile acl.c asterisk.c 
Added Files:
	utils.c 
Log Message:
Add new file utils.c, Move ast_gethostbyname to utils.c


--- NEW FILE: utils.c ---
/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * Utility functions
 *
 * Copyright (C) 2004, Digium
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License
 */

#include <asterisk/lock.h>
#include <asterisk/utils.h>

#if defined(__FreeBSD__)

/* duh? ERANGE value copied from web... */
#define ERANGE 34
#undef gethostbyname

int gethostbyname_r (const char *name, struct hostent *ret, char *buf,
			size_t buflen, struct hostent **result, 
			int *h_errnop) 
{
	int hsave;
	struct hostent *ph;
	static ast_mutex_t __mutex = AST_MUTEX_INITIALIZER;
	ast_mutex_lock(&__mutex); /* begin critical area */
	hsave = h_errno;

	ph = gethostbyname(name);
	*h_errnop = h_errno; /* copy h_errno to *h_herrnop */
	if (ph == NULL) {
		*result = NULL;
	} else {
		char **p, **q;
		char *pbuf;
		int nbytes=0;
		int naddr=0, naliases=0;
		/* determine if we have enough space in buf */

		/* count how many addresses */
		for (p = ph->h_addr_list; *p != 0; p++) {
			nbytes += ph->h_length; /* addresses */
			nbytes += sizeof(*p); /* pointers */
			naddr++;
		}
		nbytes += sizeof(*p); /* one more for the terminating NULL */

		/* count how many aliases, and total length of strings */
		for (p = ph->h_aliases; *p != 0; p++) {
			nbytes += (strlen(*p)+1); /* aliases */
			nbytes += sizeof(*p);  /* pointers */
			naliases++;
		}
		nbytes += sizeof(*p); /* one more for the terminating NULL */

		/* here nbytes is the number of bytes required in buffer */
		/* as a terminator must be there, the minimum value is ph->h_length */
		if(nbytes > buflen) {
			*result = NULL;
			ast_mutex_unlock(&__mutex); /* end critical area */
			return ERANGE; /* not enough space in buf!! */
		}

		/* There is enough space. Now we need to do a deep copy! */
		/* Allocation in buffer:
			from [0] to [(naddr-1) * sizeof(*p)]:
			pointers to addresses
			at [naddr * sizeof(*p)]:
			NULL
			from [(naddr+1) * sizeof(*p)] to [(naddr+naliases) * sizeof(*p)] :
			pointers to aliases
			at [(naddr+naliases+1) * sizeof(*p)]:
			NULL
			then naddr addresses (fixed length), and naliases aliases (asciiz).
		*/

		*ret = *ph;   /* copy whole structure (not its address!) */

		/* copy addresses */
		q = (char **)buf; /* pointer to pointers area (type: char **) */
		ret->h_addr_list = q; /* update pointer to address list */
		pbuf = buf + ((naddr+naliases+2)*sizeof(*p)); /* skip that area */
		for (p = ph->h_addr_list; *p != 0; p++) {
			memcpy(pbuf, *p, ph->h_length); /* copy address bytes */
			*q++ = pbuf; /* the pointer is the one inside buf... */
			pbuf += ph->h_length; /* advance pbuf */
		}
		*q++ = NULL; /* address list terminator */

		/* copy aliases */
		ret->h_aliases = q; /* update pointer to aliases list */
		for (p = ph->h_aliases; *p != 0; p++) {
			strcpy(pbuf, *p); /* copy alias strings */
			*q++ = pbuf; /* the pointer is the one inside buf... */
			pbuf += strlen(*p); /* advance pbuf */
			*pbuf++ = 0; /* string terminator */
		}
		*q++ = NULL; /* terminator */

		strcpy(pbuf, ph->h_name); /* copy alias strings */
		ret->h_name = pbuf;
		pbuf += strlen(ph->h_name); /* advance pbuf */
		*pbuf++ = 0; /* string terminator */

		*result = ret;  /* and let *result point to structure */

	}
	h_errno = hsave;  /* restore h_errno */
	ast_mutex_unlock(&__mutex); /* end critical area */

	return (*result != NULL);
}


#endif

struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp)
{
	int res;
	int herrno;
	struct hostent *result = NULL;

	res = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &result, &herrno);

	if (res || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0])
		return NULL;
	return &hp->hp;
}

Index: Makefile
===================================================================
RCS file: /usr/cvsroot/asterisk/Makefile,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -d -r1.85 -r1.86
--- Makefile	3 May 2004 00:54:15 -0000	1.85
+++ Makefile	9 May 2004 08:22:15 -0000	1.86
@@ -173,7 +173,8 @@
 	ulaw.o alaw.o callerid.o fskmodem.o image.o app.o \
 	cdr.o tdd.o acl.o rtp.o manager.o asterisk.o ast_expr.o \
 	dsp.o chanvars.o indications.o autoservice.o db.o privacy.o \
-	astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o
+	astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o \
+	utils.o 
 ifeq (${OSARCH},Darwin)
 OBJS+=poll.o dlfcn.o
 ASTLINK=-Wl,-dynamic

Index: acl.c
===================================================================
RCS file: /usr/cvsroot/asterisk/acl.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- acl.c	28 Apr 2004 17:28:35 -0000	1.18
+++ acl.c	9 May 2004 08:22:15 -0000	1.19
@@ -22,6 +22,7 @@
 #include <asterisk/acl.h>
 #include <asterisk/logger.h>
 #include <asterisk/channel.h>
+#include <asterisk/utils.h>
 #include <arpa/inet.h>
 #include <sys/socket.h>
 #include <netdb.h>

Index: asterisk.c
===================================================================
RCS file: /usr/cvsroot/asterisk/asterisk.c,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- asterisk.c	7 May 2004 20:18:55 -0000	1.84
+++ asterisk.c	9 May 2004 08:22:15 -0000	1.85
@@ -1723,135 +1723,3 @@
 	}
 	return 0;
 }
-
-
-#if  defined(__FreeBSD__)
-
-/* duh? ERANGE value copied from web... */
-#define ERANGE 34
-#undef gethostbyname
-
-int gethostbyname_r (const char *name,
-		     struct hostent *ret,
-		     char *buf,
-		     size_t buflen,
-		     struct hostent **result,
-		     int *h_errnop);
-
-int gethostbyname_r (const char *name,
-		     struct hostent *ret,
-		     char *buf,
-		     size_t buflen,
-		     struct hostent **result,
-		     int *h_errnop) {
-
-  int hsave;
-  struct hostent *ph;
-  static ast_mutex_t __mutex = AST_MUTEX_INITIALIZER;
-  ast_mutex_lock(&__mutex); /* begin critical area */
-  hsave = h_errno;
-
-  ph = gethostbyname(name);
-  *h_errnop = h_errno; /* copy h_errno to *h_herrnop */
-  if (ph == NULL) {
-    *result = NULL;
-  } else {
-    char **p, **q;
-    char *pbuf;
-    int nbytes=0;
-    int naddr=0, naliases=0;
-    /* determine if we have enough space in buf */
-
-    /* count how many addresses */
-    for (p = ph->h_addr_list; *p != 0; p++) {
-      nbytes += ph->h_length; /* addresses */
-      nbytes += sizeof(*p); /* pointers */
-      naddr++;
-    }
-    nbytes += sizeof(*p); /* one more for the terminating NULL */
-
-    /* count how many aliases, and total length of strings */
-
-    for (p = ph->h_aliases; *p != 0; p++) {
-      nbytes += (strlen(*p)+1); /* aliases */
-      nbytes += sizeof(*p);  /* pointers */
-      naliases++;
-    }
-    nbytes += sizeof(*p); /* one more for the terminating NULL */
-
-    /* here nbytes is the number of bytes required in buffer */
-    /* as a terminator must be there, the minimum value is ph->h_length */
-    if(nbytes > buflen) {
-      *result = NULL;
-      pthread_mutex_unlock(&__mutex); /* end critical area */
-      return ERANGE; /* not enough space in buf!! */
-    }
-
-    /* There is enough space. Now we need to do a deep copy! */
-    /* Allocation in buffer:
-       from [0] to [(naddr-1) * sizeof(*p)]:
-       pointers to addresses
-       at [naddr * sizeof(*p)]:
-       NULL
-       from [(naddr+1) * sizeof(*p)] to [(naddr+naliases) * sizeof(*p)] :
-       pointers to aliases
-       at [(naddr+naliases+1) * sizeof(*p)]:
-       NULL
-       then naddr addresses (fixed length), and naliases aliases (asciiz).
-    */
-
-    *ret = *ph;   /* copy whole structure (not its address!) */
-
-    /* copy addresses */
-    q = (char **)buf; /* pointer to pointers area (type: char **) */
-    ret->h_addr_list = q; /* update pointer to address list */
-    pbuf = buf + ((naddr+naliases+2)*sizeof(*p)); /* skip that area */
-    for (p = ph->h_addr_list; *p != 0; p++) {
-      memcpy(pbuf, *p, ph->h_length); /* copy address bytes */
-      *q++ = pbuf; /* the pointer is the one inside buf... */
-      pbuf += ph->h_length; /* advance pbuf */
-    }
-    *q++ = NULL; /* address list terminator */
-
-    /* copy aliases */
-
-    ret->h_aliases = q; /* update pointer to aliases list */
-    for (p = ph->h_aliases; *p != 0; p++) {
-      strcpy(pbuf, *p); /* copy alias strings */
-      *q++ = pbuf; /* the pointer is the one inside buf... */
-      pbuf += strlen(*p); /* advance pbuf */
-      *pbuf++ = 0; /* string terminator */
-    }
-    *q++ = NULL; /* terminator */
-
-    strcpy(pbuf, ph->h_name); /* copy alias strings */
-    ret->h_name = pbuf;
-    pbuf += strlen(ph->h_name); /* advance pbuf */
-    *pbuf++ = 0; /* string terminator */
-
-    *result = ret;  /* and let *result point to structure */
-
-  }
-  h_errno = hsave;  /* restore h_errno */
-
-  ast_mutex_unlock(&__mutex); /* end critical area */
-
-  return (*result != NULL);
-
-}
-
-
-#endif
-
-struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp)
-{
-	int res;
-	int herrno;
-	struct hostent *result = NULL;
-
-	res = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &result, &herrno);
-
-	if (res || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0])
-		return NULL;
-	return &hp->hp;
-}




More information about the svn-commits mailing list