PERFORCE change 79562 for review
soc-bushman
soc-bushman at FreeBSD.org
Mon Jul 4 15:25:14 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=79562
Change 79562 by soc-bushman at soc-bushman_stinger on 2005/07/04 15:24:11
getservent sandbox test completed
Affected files ...
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/getservent.c#4 edit
Differences ...
==== //depot/projects/soc2005/nsswitch_cached/tests/getservent/getservent.c#4 (text+ko) ====
@@ -188,8 +188,10 @@
enum constants
{
- SETSERVENT,
- ENDSERVENT,
+ SETSERVENT = 1,
+ ENDSERVENT = 2,
+ SERVENT_STORAGE_INITIAL = 1 << 10, /* 1 KByte */
+ SERVENT_STORAGE_MAX = 1 << 20, /* 1 MByte */
};
struct servent_mdata
@@ -201,7 +203,7 @@
static const ns_src defaultsrc[] = {
//{ NSSRC_COMPAT, NS_SUCCESS },
//{ NSSRC_FILES, NS_SUCCESS },
- { NSSRC_FILES, NS_SUCCESS },
+ { NSSRC_COMPAT, NS_SUCCESS },
{ NULL, 0 }
};
@@ -244,6 +246,22 @@
static int compat_servent(void *, void *, va_list);
static int compat_setservent(void *, void *, va_list);
+struct servent_state {
+ struct servent serv;
+ char * buffer;
+ size_t bufsize;
+};
+static void servent_endstate(void *);
+NSS_TLS_HANDLING(servent);
+
+struct key {
+ char * proto;
+ union {
+ char * name;
+ int port;
+ };
+};
+
/* nsswitch part - end */
static int
@@ -335,16 +353,6 @@
TRACE_OUT(servent_init);
}
-#define SERVENT_BUFFER_UNPACK(buffer, buffer_size, line, line_size, aliases) \
- aliases=(char **)(_ALIGN((char **)buffer)); \
- line=(char *)aliases+sizeof(char *)*_MAXALIASES; \
- if (line>buffer+buffer_size) \
- return (NS_UNAVAIL); \
- line_size=buffer+buffer_size-line; \
- if (line_size<_MAXLINELEN+1) \
- return (NS_TRYAGAIN);
- /* TODO - must check the alignment here */
-
#define SERVENT_BUFFER_SIZE sizeof(char*)*_MAXALIASES+_ALIGNBYTES+_MAXLINELEN
/* files backend implementation - begin */
@@ -415,6 +423,7 @@
if (line_size<_MAXLINELEN+1)
return (NS_TRYAGAIN);*/
+ TRACE_IN(files_servent);
TRACE_POINT();
TRACE_INT(((struct servent_mdata *)mdata)->how);
@@ -449,10 +458,15 @@
bufsize = va_arg(ap, size_t);
errnop = va_arg(ap,int *);
- TRACE_IN(files_servent);
+ TRACE_POINT();
+
*errnop = files_getstate(&st);
- if (*errnop != 0)
+ TRACE_POINT();
+ if (*errnop != 0) {
+ TRACE_INT(*errnop);
return (NS_UNAVAIL);
+ }
+ TRACE_POINT();
/* SERVENT_BUFFER_UNPACK(buffer, buffer_size,line,line_size,aliases)
TRACE_PTR(buffer);
@@ -492,6 +506,7 @@
break;
}
+ TRACE_POINT();
if (*line=='+')
st->compat_mode_active = 1;
else {
@@ -509,11 +524,11 @@
}
memcpy(buffer,line,linesize);
- line[linesize]='\0';
+ buffer[linesize]='\0';
}
}
-
+ TRACE_POINT();
/* TRACE_POINT();
if (!st->compat_mode_active && *p=='+') {
st->compat_mode_active=1;
@@ -556,8 +571,10 @@
rv = servent_unpack(line,serv,aliases,aliases_size,errnop);
if (rv !=0 ) {
- if (*errnop == 0)
+ if (*errnop == 0) {
+ rv = NS_NOTFOUND;
continue;
+ }
else {
rv = NS_RETURN;
break;
@@ -860,19 +877,22 @@
bufsize = va_arg(ap, size_t);
errnop = va_arg(ap,int *);
+ TRACE_POINT();
*errnop = nis_getstate(&st);
- if (errnop != 0) {
+ if (*errnop != 0) {
TRACE_OUT(nis_servent);
return (NS_UNAVAIL);
}
- if (!st->yp_domain[0]) {
+ TRACE_POINT();
+ if (st->yp_domain[0] == '\0') {
if (getdomainname(st->yp_domain,sizeof st->yp_domain)) {
*errnop=errno;
TRACE_OUT(nis_servent);
return (NS_UNAVAIL);
}
}
+ TRACE_POINT();
TRACE_POINT();
do {
@@ -971,7 +991,8 @@
else
rv = NS_RETURN;
}
- free(resultbuf);
+ free(resultbuf);
+ rv = NS_SUCCESS;
TRACE_INT(rv);
TRACE_INT(!(rv & NS_TERMINATE));
@@ -1415,6 +1436,115 @@
(void) nsdispatch(NULL, dtab, NSDB_SERVICES, "endservent", defaultsrc);
}
+static void
+servent_endstate(void *p)
+{
+ TRACE_IN(servent_endstate);
+
+ if (p == NULL)
+ return;
+
+ free(((struct servent_state *)p)->buffer);
+ free(p);
+
+ TRACE_OUT(files_endstate);
+}
+
+
+static int
+wrap_getservbyname_r(struct key key, struct servent *serv, char *buffer, size_t bufsize,
+ struct servent **res)
+{
+ return (my_getservbyname_r(key.name, key.proto, serv, buffer, bufsize, res));
+}
+
+static int
+wrap_getservbyport_r(struct key key, struct servent *serv, char *buffer, size_t bufsize,
+ struct servent **res)
+{
+ return (my_getservbyport_r(key.port, key.proto, serv, buffer, bufsize, res));
+}
+
+static int
+wrap_getservent_r(struct key key, struct servent *serv, char *buffer, size_t bufsize,
+ struct servent **res)
+{
+ return (my_getservent_r(serv, buffer, bufsize, res));
+}
+
+static struct servent *
+getserv(int (*fn)(struct key, struct servent *, char *, size_t, struct servent **),
+ struct key key)
+{
+ int rv;
+ struct servent *res;
+ struct servent_state * st;
+
+ rv=servent_getstate(&st);
+ if (rv != 0) {
+ errno = rv;
+ return NULL;
+ }
+
+ if (st->buffer == NULL) {
+ st->buffer = malloc(SERVENT_STORAGE_INITIAL);
+ if (st->buffer == NULL)
+ return (NULL);
+ st->bufsize = SERVENT_STORAGE_INITIAL;
+ }
+ do {
+ rv = fn(key, &st->serv, st->buffer, st->bufsize, &res);
+ if (res == NULL && rv == ERANGE) {
+ free(st->buffer);
+ if ((st->bufsize << 1) > SERVENT_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 servent *
+my_getservbyname(char * name, char * proto)
+{
+ struct key key;
+
+ key.name=name;
+ key.proto=proto;
+
+ return (getserv(wrap_getservbyname_r,key));
+}
+
+struct servent *
+my_getservbyport(int port, char * proto)
+{
+ struct key key;
+
+ key.port=port;
+ key.proto=proto;
+
+ return (getserv(wrap_getservbyport_r,key));
+}
+
+struct servent *
+my_getservent()
+{
+ struct key key;
+
+ key.proto=NULL;
+ key.port=0;
+
+ return (getserv(wrap_getservent_r,key));
+}
+
/*
static struct servdata servdata;
static thread_key_t servdata_key;
@@ -1897,13 +2027,66 @@
printf("\nFAILURE\n");
}
+static void
+ent_test2()
+{
+ struct servent * result;
+
+ int rv;
+
+ printf("\ntesting getservent_r function - simple iteration\n");
+ my_setservent(1);
+ do
+ {
+ //TRACE_OFF();
+ result=my_getservent();
+ result_info(errno,result);
+ //TRACE_ON();
+ } while (result!=NULL );
+
+ if (errno == 0)
+ printf("\nSUCCESS\n");
+ else
+ printf("\nFAILURE\n");
+}
+
int main()
{
+ int i;
printf("getserv* functions sandbox test (02.07.05)\n");
-// byname_test1_r();
-// byport_test1_r();
+ for (;i<10;++i) {
+ byname_test1_r();
+ byport_test1_r();
+ ent_test2();
+ ent_test2_r();
+ byname_test1_r();
+ ent_test1_r();
+ byport_test1_r();
+ ent_test2_r();
+ byname_test1_r();
+ ent_test2();
+ ent_test2();
+ ent_test1_r();
+ byname_test1_r();
+ byport_test1_r();
+ ent_test1_r();
+ ent_test2_r();
+ ent_test2();
+ }
+ /*
+ byname_test1_r();
+ byport_test1_r();
+ ent_test2_r();
+ byname_test1_r();
+ ent_test1_r();
+ byport_test1_r();
ent_test2_r();
-// ent_test1_r();
+ byname_test1_r();
+ ent_test1_r();
+ byname_test1_r();
+ byport_test1_r();
+ ent_test1_r();
+ ent_test2_r();*/
return 0;
}
More information about the p4-projects
mailing list