PERFORCE change 80270 for review
soc-bushman
soc-bushman at FreeBSD.org
Fri Jul 15 15:45:52 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=80270
Change 80270 by soc-bushman at soc-bushman_stinger on 2005/07/15 15:45:26
protocols test version finished, some syntax errors corrected
Affected files ...
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservent.c#12 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/Makefile#2 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getproto.c#2 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getprotoent.c#2 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getprotoent.h#2 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getprotoent_test.c#2 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getprotoname.c#2 edit
Differences ...
==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservent.c#12 (text+ko) ====
@@ -699,7 +699,7 @@
}
int
-getservbyport_r)(int port, const char *proto, struct servent *serv, char *buffer,
+getservbyport_r(int port, const char *proto, struct servent *serv, char *buffer,
size_t bufsize, struct servent **result)
{
static const struct servent_mdata mdata = { nss_lt_id, 0 };
@@ -813,7 +813,7 @@
wrap_getservent_r(struct key key, struct servent *serv, char *buffer, size_t bufsize,
struct servent **res)
{
- return getservent_r(serv, buffer, bufsize, res));
+ return (getservent_r(serv, buffer, bufsize, res));
}
static struct servent *
==== //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/Makefile#2 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getproto.c#2 (text+ko) ====
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/net/getproto.c,v 1.4 2005/04/19 14:41:13 ume Exp $");
-#include <netdb.h>
+/*#include <netdb.h>
#include "netdb_private.h"
int
@@ -65,3 +65,4 @@
return (NULL);
return (&pd->proto);
}
+*/
==== //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getprotoent.c#2 (text+ko) ====
@@ -37,18 +37,491 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/net/getprotoent.c,v 1.5 2005/04/28 15:32:55 ume Exp $");
+#include "getprotoent.h"
+
#include <sys/types.h>
#include <sys/socket.h>
+#include <errno.h>
#include <netdb.h>
+#include <nsswitch.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "namespace.h"
+#include "nss_tls.h"
#include "reentrant.h"
#include "un-namespace.h"
-#include "netdb_private.h"
+//#include "netdb_private.h"
+
+/* nsswitch declarations */
+enum constants
+{
+ SETPROTOENT = 1,
+ ENDPROTOENT = 2,
+ PROTOENT_STORAGE_INITIAL = 1 << 10, /* 1 KByte */
+ PROTOENT_STORAGE_MAX = 1 << 20, /* 1 MByte */
+};
+
+static const ns_src defaultsrc[] = {
+ { NSSRC_FILES, NS_SUCCESS },
+ { NULL, 0 }
+};
+
+/* files backend declarations */
+struct files_state
+{
+ FILE *fp;
+ int stayopen;
+};
+static void files_endstate(void *);
+NSS_TLS_HANDLING(files);
+
+static int files_protoent(void *, void *, va_list);
+static int files_setprotoent(void *, void *, va_list);
+
+/* get** wrappers for get**_r functions declarations */
+struct protoent_state {
+ struct protoent pe;
+ char *buffer;
+ size_t bufsize;
+};
+static void protoent_endstate(void *);
+NSS_TLS_HANDLING(protoent);
+
+union key {
+ const char *name;
+ int proto;
+};
+
+static int wrap_getprotobyname_r(union key, struct protoent *, char *,
+ size_t, struct protoent **);
+static int wrap_getprotobynumber_r(union key, struct protoent *, char *,
+ size_t, struct protoent **);
+static int wrap_getprotoent_r(union key, struct protoent *, char *,
+ size_t, struct protoent **);
+static struct protoent *getpe(int (*fn)(union key, struct protoent *, char *,
+ size_t, struct protoent **), union key);
+
+static int
+protoent_unpack(char *p, struct protoent *pe, char **aliases,
+ size_t aliases_size, int *errnop)
+{
+ char *cp, **q, *endp;
+ long l;
+
+ if (*p == '#')
+ return (-1);
+ cp = strpbrk(p, "#\n");
+ if (cp != NULL)
+ *cp = '\0';
+ pe->p_name = p;
+ cp = strpbrk(p, " \t");
+ if (cp == NULL)
+ return (-1);
+ *cp++ = '\0';
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ p = strpbrk(cp, " \t");
+ if (p != NULL)
+ *p++ = '\0';
+ l = strtol(cp, &endp, 10);
+ if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX)
+ return -1;
+ pe->p_proto = l;
+ q = pe->p_aliases = aliases;
+ if (p != NULL) {
+ cp = p;
+ while (cp && *cp) {
+ if (*cp == ' ' || *cp == '\t') {
+ cp++;
+ continue;
+ }
+ if (q < &(aliases[aliases_size - 1]))
+ *q++ = cp;
+ else {
+ *errnop = ERANGE;
+ return -1;
+ }
+ cp = strpbrk(cp, " \t");
+ if (cp != NULL)
+ *cp++ = '\0';
+ }
+ }
+ *q = NULL;
+ return (0);
+}
+
+/* files backend implementation */
+static void
+files_endstate(void *p)
+{
+ FILE * f;
+
+ if (p == NULL)
+ return;
+
+ f = ((struct files_state *)p)->fp;
+ if (f != NULL)
+ fclose(f);
+
+ free(p);
+}
+
+static int
+files_protoent(void *retval, void *mdata, va_list ap)
+{
+ char *name;
+ int number;
+ struct protoent *pe;
+ char *buffer;
+ size_t bufsize;
+ int *errnop;
+
+ char *line;
+ size_t linesize;
+ char **aliases;
+ int aliases_size;
+ char **rp;
+
+ struct files_state *st;
+ int rv;
+ int stayopen;
+ enum nss_lookup_type how;
+
+ how = (enum nss_lookup_type)mdata;
+ switch (how)
+ {
+ case nss_lt_name:
+ name = va_arg(ap, char *);
+ break;
+ case nss_lt_id:
+ number = va_arg(ap, int);
+ break;
+ case nss_lt_all:
+ break;
+ default:
+ return (NS_NOTFOUND);
+ }
+
+ pe = va_arg(ap, struct protoent *);
+ buffer = va_arg(ap, char *);
+ bufsize = va_arg(ap, size_t);
+ errnop = va_arg(ap, int *);
+
+ *errnop = files_getstate(&st);
+ if (*errnop != 0)
+ return (NS_UNAVAIL);
+
+ if (st->fp == NULL && (st->fp = fopen(_PATH_PROTOCOLS, "r")) == NULL) {
+ *errnop = errno;
+ return (NS_UNAVAIL);
+ }
+
+ if (how == nss_lt_all)
+ stayopen = 1;
+ else {
+ rewind(st->fp);
+ stayopen = st->stayopen;
+ }
+
+ do {
+ if ((line = fgetln(st->fp, &linesize)) == NULL) {
+ *errnop = errno;
+ rv = NS_RETURN;
+ break;
+ }
+
+ if (bufsize <= linesize + _ALIGNBYTES + sizeof(char *)) {
+ *errnop = ERANGE;
+ rv = NS_RETURN;
+ break;
+ }
+
+ aliases = (char **)_ALIGN(&buffer[linesize+1]);
+ aliases_size = (buffer + bufsize - (char *)aliases)/sizeof(char *);
+ if (aliases_size < 1) {
+ *errnop = ERANGE;
+ rv = NS_RETURN;
+ break;
+ }
+
+ memcpy(buffer, line, linesize);
+ buffer[linesize] = '\0';
+
+ rv = protoent_unpack(buffer, pe, aliases, aliases_size, errnop);
+ if (rv != 0) {
+ if (*errnop == 0) {
+ rv = NS_NOTFOUND;
+ continue;
+ }
+ else {
+ rv = NS_RETURN;
+ break;
+ }
+ }
+
+ switch (how)
+ {
+ case nss_lt_name:
+ if (strcmp(pe->p_name, name) == 0)
+ goto done;
+ for (rp = pe->p_aliases; *rp != NULL; rp++) {
+ if (strcmp(*rp, name) == 0)
+ goto done;
+ }
+ rv = NS_NOTFOUND;
+ continue;
+done:
+ rv = NS_SUCCESS;
+ break;
+ case nss_lt_id:
+ rv = (pe->p_proto == number) ? NS_SUCCESS : NS_NOTFOUND;
+ break;
+ case nss_lt_all:
+ rv = NS_SUCCESS;
+ break;
+ }
+
+ } while (!(rv & NS_TERMINATE));
+
+ if (!stayopen && st->fp!=NULL) {
+ fclose(st->fp);
+ st->fp = NULL;
+ }
+
+ if ((rv == NS_SUCCESS) && (retval != NULL))
+ *((struct protoent **)retval) = pe;
+
+ return (rv);
+}
+
+static int
+files_setprotoent(void *retval, void *mdata, va_list ap)
+{
+ struct files_state *st;
+ int rv;
+ int f;
+
+ rv = files_getstate(&st);
+ if (rv != 0)
+ return (NS_UNAVAIL);
+
+ switch ((enum constants)mdata)
+ {
+ case SETPROTOENT:
+ f = va_arg(ap,int);
+ if (st->fp == NULL)
+ st->fp = fopen(_PATH_PROTOCOLS, "r");
+ else
+ rewind(st->fp);
+ st->stayopen |= f;
+ break;
+ case ENDPROTOENT:
+ if (st->fp != NULL) {
+ fclose(st->fp);
+ st->fp = NULL;
+ }
+ st->stayopen = 0;
+ break;
+ default:
+ break;
+ }
+
+ return (NS_UNAVAIL);
+}
+
+/* get**_r functions implementation */
+int
+DECORATED(getprotobyname_r)(const char *name, struct protoent *pe, char *buffer,
+ size_t bufsize, struct protoent **result)
+{
+ static const ns_dtab dtab[] = {
+ { NSSRC_FILES, files_protoent, (void *)nss_lt_name },
+ { NULL, NULL, NULL }
+ };
+
+ int rv, ret_errno;
+
+ ret_errno = 0;
+ *result = NULL;
+ rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotobyname_r", defaultsrc,
+ name, pe, buffer, bufsize, &ret_errno);
+
+ if (rv == NS_SUCCESS)
+ return (0);
+ else
+ return (ret_errno);
+}
+
+int
+DECORATED(getprotobynumber_r)(int number, struct protoent *pe, char *buffer,
+ size_t bufsize, struct protoent **result)
+{
+ static const ns_dtab dtab[] = {
+ { NSSRC_FILES, files_protoent, (void *)nss_lt_id },
+ { NULL, NULL, NULL }
+ };
+ int rv, ret_errno;
+
+ ret_errno = 0;
+ *result = NULL;
+ rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotobynumber_r", defaultsrc,
+ number, pe, buffer, bufsize, &ret_errno);
+
+ if (rv == NS_SUCCESS)
+ return (0);
+ else
+ return (ret_errno);
+}
+
+int
+DECORATED(getprotoent_r)(struct protoent *pe, char *buffer, size_t bufsize,
+ struct protoent **result)
+{
+ static const ns_dtab dtab[] = {
+ { NSSRC_FILES, files_protoent, (void *)nss_lt_all },
+ { NULL, NULL, NULL }
+ };
+ int rv, ret_errno;
+
+ ret_errno = 0;
+ *result = NULL;
+ rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotoent_r", defaultsrc,
+ pe, buffer, bufsize, &ret_errno);
+
+ if (rv == NS_SUCCESS)
+ return (0);
+ else
+ return (ret_errno);
+}
+
+void
+DECORATED(setprotoent)(int stayopen)
+{
+ static const ns_dtab dtab[] = {
+ { NSSRC_FILES, files_setprotoent, (void *)SETPROTOENT },
+ { NULL, NULL, NULL }
+ };
+
+ (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "setprotoent", defaultsrc, stayopen);
+}
+
+void
+DECORATED(endprotoent)()
+{
+ static const ns_dtab dtab[] = {
+ { NSSRC_FILES, files_setprotoent, (void *)ENDPROTOENT },
+ { NULL, NULL, NULL }
+ };
+
+ (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "endprotoent", defaultsrc);
+}
+
+/* get** wrappers for get**_r functions implementation */
+static void
+protoent_endstate(void *p)
+{
+ if (p == NULL)
+ return;
+
+ free(((struct protoent_state *)p)->buffer);
+ free(p);
+}
+
+static int
+wrap_getprotobyname_r(union key key, struct protoent *pe, char *buffer, size_t bufsize,
+ struct protoent **res)
+{
+ return (DECORATED(getprotobyname_r)(key.name, pe, buffer, bufsize, res));
+}
+
+static int
+wrap_getprotobynumber_r(union key key, struct protoent *pe, char *buffer, size_t bufsize,
+ struct protoent **res)
+{
+ return (DECORATED(getprotobynumber_r)(key.proto, pe, buffer, bufsize, res));
+}
+
+static int
+wrap_getprotoent_r(union key key, struct protoent *pe, char *buffer, size_t bufsize,
+ struct protoent **res)
+{
+ return (DECORATED(getprotoent_r)(pe, buffer, bufsize, res));
+}
+
+static struct protoent *
+getpe(int (*fn)(union key, struct protoent *, char *, size_t, struct protoent **),
+ union key key)
+{
+ int rv;
+ struct protoent *res;
+ struct protoent_state * st;
+
+ rv=protoent_getstate(&st);
+ if (rv != 0) {
+ errno = rv;
+ return NULL;
+ }
+
+ if (st->buffer == NULL) {
+ st->buffer = malloc(PROTOENT_STORAGE_INITIAL);
+ if (st->buffer == NULL)
+ return (NULL);
+ st->bufsize = PROTOENT_STORAGE_INITIAL;
+ }
+ do {
+ rv = fn(key, &st->pe, st->buffer, st->bufsize, &res);
+ if (res == NULL && rv == ERANGE) {
+ free(st->buffer);
+ if ((st->bufsize << 1) > PROTOENT_STORAGE_MAX) {
+ st->buffer = NULL;
+ errno = ERANGE;
+ return (NULL);
+ }
+ st->bufsize <<= 1;
+ st->buffer = malloc(st->bufsize);
+ if (st->buffer == NULL)
+ return (NULL);
+ }
+ } while (res == NULL && rv == ERANGE);
+ if (rv != 0)
+ errno = rv;
+
+ return (res);
+}
+
+struct protoent *
+DECORATED(getprotobyname)(const char *name)
+{
+ union key key;
+
+ key.name = name;
+
+ return (getpe(wrap_getprotobyname_r, key));
+}
+
+struct protoent *
+DECORATED(getprotobynumber)(int number)
+{
+ union key key;
+
+ key.proto = number;
+
+ return (getpe(wrap_getprotobynumber_r, key));
+}
+
+struct protoent *
+DECORATED(getprotoent)()
+{
+ union key key;
+
+ key.proto = 0; /* not used */
+
+ return (getpe(wrap_getprotoent_r, key));
+}
+
-static struct protodata protodata;
+/*static struct protodata protodata;
static thread_key_t protodata_key;
static once_t protodata_init_once = ONCE_INITIALIZER;
static int protodata_thr_keycreated = 0;
@@ -201,3 +674,4 @@
return (NULL);
return (&pd->proto);
}
+*/
==== //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getprotoent.h#2 (text+ko) ====
@@ -1,0 +1,21 @@
+#ifndef __NSSWITCH_CACHED_GETPROTOENT_H__
+#define __NSSWITCH_CACHED_GETPROTOENT_H__
+
+#include "../common/test.h"
+#include "../common/debug.h"
+#include <netdb.h>
+
+int DECORATED(getprotobyname_r)(const char *, struct protoent *, char *,
+ size_t, struct protoent **);
+int DECORATED(getprotobynumber_r)(int, struct protoent *, char *,
+ size_t, struct protoent **);
+int DECORATED(getprotoent_r)(struct protoent *, char *, size_t,
+ struct protoent **);
+
+struct protoent *DECORATED(getprotobyname)(const char *);
+struct protoent *DECORATED(getprotobynumber)(int);
+struct protoent *DECORATED(getprotoent)();
+void DECORATED(setprotoent)(int);
+void DECORATED(endprotoent)();
+
+#endif
==== //depot/projects/soc2005/nsswitch_cached/tests/getprotoent_test/getprotoent_test.c#2 (text+ko) ====
@@ -1,6 +1,6 @@
#include "../common/test.h"
#include "../common/debug.h"
-#include "getrpcent.h"
+#include "getprotoent.h"
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
@@ -9,8 +9,402 @@
#include <stdlib.h>
#include <string.h>
+static struct protoent *
+clone_protoent(struct protoent *proto)
+{
+ struct protoent *res;
+ char **cp;
+ int aliases_num;
+
+ if (proto == NULL)
+ return (NULL);
+
+ res = (struct protoent *)malloc(sizeof(struct protoent));
+ assert(res != NULL);
+ memset(res, 0, sizeof(struct protoent));
+
+ res->p_name = strdup(proto->p_name);
+ assert(res->p_name != NULL);
+ res->p_proto = proto->p_proto;
+
+ aliases_num = 0;
+ for (cp = proto->p_aliases; *cp; ++cp)
+ ++aliases_num;
+
+ res->p_aliases = (char **)malloc((aliases_num+1) * (sizeof(char *)));
+ assert(res->p_aliases != NULL);
+ memset(res->p_aliases, 0, (aliases_num+1) * (sizeof(char *)));
+
+ for (cp = proto->p_aliases; *cp; ++cp) {
+ res->p_aliases[cp - proto->p_aliases] = strdup(*cp);
+ assert(res->p_aliases[cp - proto->p_aliases] != NULL);
+ }
+
+ return res;
+}
+
+static void
+free_protoent(struct protoent *proto)
+{
+ char **cp;
+
+ if (proto == NULL)
+ return;
+
+ free(proto->p_name);
+
+ for (cp = proto->p_aliases; *cp; ++cp)
+ free(*cp);
+
+ free(proto);
+}
+
+static void
+result_info(int rv, struct protoent *result)
+{
+ if (rv == 0) {
+ if (result == NULL)
+ __test_log2("success: entry was not found\n");
+ else {
+ __test_log2("success: entry was found\n");
+ __test_log2("name: %s\n", result->p_name);
+ __test_log2("proto: %d\n", htons(result->p_proto));
+
+ if (*(result->p_aliases)!='\0') {
+ char ** cp;
+
+ __test_log2("aliases:\n");
+ for (cp=result->p_aliases; *cp; ++cp)
+ __test_log2("\t\t%s\n",*cp);
+ } else
+ __test_log2("\tno aliases\n");
+ }
+ } else
+ __test_log2("failure: code=%d, details='%s'",rv,strerror(rv));
+}
+
+static int
+result_compare(struct protoent *proto1, struct protoent *proto2)
+{
+ char **c1, **c2;
+
+ if (proto1 == proto2)
+ return 0;
+
+ if ((proto1 == NULL) || (proto2 == NULL))
+ return -1;
+
+ if ( (strcmp(proto1->p_name,proto2->p_name)!=0) ||
+ (proto1->p_proto != proto2->p_proto))
+ return -1;
+
+ c1=proto1->p_aliases;
+ c2=proto2->p_aliases;
+ for (;*c1 && *c2; ++c1, ++c2)
+ if (strcmp(*c1,*c2)!=0)
+ return -1;
+
+ if ((*c1!='\0') || (*c2!='\0'))
+ return -1;
+
+ return 0;
+}
+
+static enum __test_result
+getprotoent_test1()
+{
+ struct protoent *result1;
+ struct protoent *result2;
+
+ int rv;
+
+ rv = 0;
+ DECORATED(setprotoent)(1);
+ setprotoent(1);
+ do
+ {
+ //TRACE_OFF();
+ result1 = DECORATED(getprotoent)();
+ result2 = getprotoent();
+
+ rv = result_compare(result1, result2);
+
+ result_info(0, result1);
+ result_info(0, result2);
+ //TRACE_ON();
+ } while (((result1 != NULL) || (result2 != NULL) )&& (rv == 0));
+
+ return (rv == 0) ? T_PASSED : T_FAILED;
+}
+
+struct protoent *
+trivial_getprotobyname(const char *name)
+{
+ char **cp;
+ struct protoent *result;
+
+ DECORATED(setprotoent)(1);
+ while ( (result = DECORATED(getprotoent)()) != NULL) {
+ if (strcmp(result->p_name, name) == 0)
+ goto fin;
+
+ for (cp=result->p_aliases; *cp; ++cp)
+ if (strcmp(*cp, name) == 0)
+ goto fin;
+ }
+
+fin:
+ DECORATED(endprotoent)();
+ return (result);
+}
+
+struct protoent *
+trivial_getprotobynumber(int number)
+{
+ struct protoent *result;
+
+ DECORATED(setprotoent)(1);
+ while ( (result = DECORATED(getprotoent)()) != NULL) {
+ if (result->p_proto == number)
+ break;
+ }
+
+ DECORATED(endprotoent)();
+ return (result);
+}
+
+static enum __test_result
+getprotobyname_test1()
+{
+ struct protoent *result_model;
+ struct protoent *result1;
+ struct protoent *result2;
+
+ int rv;
+ char **cp;
+
+ setprotoent(1);
+ while ( (result_model = getprotoent()) != NULL) {
+ __test_log2("trying name: %s\n", result_model->p_name);
+
+ result1 = clone_protoent( DECORATED(getprotobyname)(result_model->p_name) );
+ result2 = clone_protoent( trivial_getprotobyname(result_model->p_name) );
+
+ rv = result_compare(result1, result2);
+ result_info(0, result1);
+ result_info(0, result2);
+ free_protoent(result1);
+ free_protoent(result2);
+ if (rv != 0)
+ break;
+
+ for (cp = result_model->p_aliases; *cp; ++cp)
+ {
+ __test_log2("trying name: %s\n", *cp);
+
+ result1 = clone_protoent( DECORATED(getprotobyname)(*cp) );
+ result2 = clone_protoent( trivial_getprotobyname(*cp) );
+
+ rv = result_compare(result1, result2);
+ free_protoent(result1);
+ free_protoent(result2);
+ if (rv != 0)
+ break;
+ }
+
+ if (rv != 0)
+ break;
+ }
+
+ endprotoent();
+ return (rv == 0) ? T_PASSED : T_FAILED;
+}
+
+static enum __test_result
+getprotobynumber_test1()
+{
+ struct protoent *result_model;
+ struct protoent *result1;
+ struct protoent *result2;
+
+ int rv;
+
+ setprotoent(1);
+ while ( (result_model = getprotoent()) != NULL) {
+ __test_log2("trying number: %d\n", result_model->p_proto);
+
+ result1 = clone_protoent( DECORATED(getprotobynumber)(result_model->p_proto) );
+ result2 = clone_protoent( trivial_getprotobynumber(result_model->p_proto) );
+
+ rv = result_compare(result1, result2);
+ free_protoent(result1);
+ free_protoent(result2);
+ if (rv != 0)
+ break;
+ }
+
+ endprotoent();
+ return (rv == 0) ? T_PASSED : T_FAILED;
+}
+
+static enum __test_result
+getprotobyname_test2()
+{
+ struct protoent *result_model;
+ struct protoent *result1;
+ struct protoent *result2;
+
+ int counter;
+ int rv;
+ char **cp;
+
+ counter = 0;
+ setprotoent(1);
+ while ( (result_model = getprotoent()) != NULL) {
+ switch (counter % 2)
+ {
+ case 0:
+ break;
+ case 1:
+ result_model->p_name[0]='a';
+ break;
+ };
+
+ __test_log2("trying name: %s\n", result_model->p_name);
+
+ result1 = clone_protoent( DECORATED(getprotobyname)(result_model->p_name) );
+ result2 = clone_protoent( trivial_getprotobyname(result_model->p_name) );
+
+ rv = result_compare(result1, result2);
+ free_protoent(result1);
+ free_protoent(result2);
+ if (rv != 0)
+ break;
+
+ for (cp = result_model->p_aliases; *cp; ++cp)
+ {
+ switch (counter % 2)
+ {
+ case 0:
+ break;
+ case 1:
+ (*cp)[0]='a';
+ break;
+ };
+ __test_log2("trying name: %s\n", *cp);
+
+ result1 = clone_protoent( DECORATED(getprotobyname)(*cp) );
+ result2 = clone_protoent( trivial_getprotobyname(*cp) );
+
+ rv = result_compare(result1, result2);
+ free_protoent(result1);
+ free_protoent(result2);
+ if (rv != 0)
+ break;
+ }
+
+ if (rv != 0)
+ break;
+
+ ++counter;
+ }
+
+ endprotoent();
+ return (rv == 0) ? T_PASSED : T_FAILED;
+}
+
+static enum __test_result
+getprotobynumber_test2()
+{
+ struct protoent *result_model;
+ struct protoent *result1;
+ struct protoent *result2;
+
+ int counter;
+ int rv;
+
+ counter = 0;
+ setprotoent(1);
+ while ( (result_model = getprotoent()) != NULL) {
+ switch (counter % 2)
+ {
+ case 0:
+ break;
+ case 1:
+ result_model->p_proto = htonl(result_model->p_proto);
+ break;
+ }
+ __test_log2("trying number: %d\n", result_model->p_proto);
+
+ result1 = clone_protoent( DECORATED(getprotobynumber)(result_model->p_proto) );
+ result2 = clone_protoent( trivial_getprotobynumber(result_model->p_proto) );
+
+ rv = result_compare(result1, result2);
+ free_protoent(result1);
+ free_protoent(result2);
+ if (rv != 0)
+ break;
+
+ ++counter;
+ }
+
+ endprotoent();
+ return (rv == 0) ? T_PASSED : T_FAILED;
+}
+
+static enum __test_result
+protoent_stress_test()
+{
+ const size_t bigsize = 65000;
+ char *bigname;
+
+ (void)DECORATED(getprotobyname)("");
+ (void)DECORATED(getprotobynumber)(-1);
+
+ bigname = (char *)malloc(bigsize);
+ assert(bigname != NULL);
+ memset(bigname, 'a', bigsize - 1);
+ bigname[bigsize - 1] = '\0';
+
+ (void)DECORATED(getprotobyname)(bigname);
+
+ return (T_PASSED);
+}
+
int
main(int argc, char *argv[])
-{
- return (0);
+{
+ struct test_system *tsystem;
+ struct test_info *tinfo;
+
+ tsystem = __init_test_system("getproto* nsswitch testing");
+ assert(tsystem != NULL);
+
+ tinfo = __create_test_info("getprotoent_test1", getprotoent_test1, 0);
+ assert(tinfo != NULL);
+ __register_test_info(tsystem, tinfo);
+
+ tinfo = __create_test_info("getprotobyname_test1", getprotobyname_test1, 1);
+ assert(tinfo != NULL);
+ __register_test_info(tsystem, tinfo);
+
+ tinfo = __create_test_info("getprotobynumber_test1", getprotobynumber_test1, 1);
+ assert(tinfo != NULL);
+ __register_test_info(tsystem, tinfo);
+
+ tinfo = __create_test_info("getprotobyname_test2", getprotobyname_test2, 1);
+ assert(tinfo != NULL);
+ __register_test_info(tsystem, tinfo);
+
+ tinfo = __create_test_info("getprotobynumber_test2", getprotobynumber_test2, 1);
+ assert(tinfo != NULL);
+ __register_test_info(tsystem, tinfo);
+
+ tinfo = __create_test_info("protoent_stress_test", protoent_stress_test, 1);
+ assert(tinfo != NULL);
+ __register_test_info(tsystem, tinfo);
+
+ __process_tests(tsystem, NULL, NULL);
+ __destroy_test_system(tsystem);
+ return 0;
}
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list