mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Cleanup of db-XXX.c
This commit is contained in:
parent
9f2da732e7
commit
40c1b22cd7
@ -1,5 +1,7 @@
|
||||
2011-06-15 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* nss/nss_db/db-XXX.c: Cleanup.
|
||||
|
||||
* nss/Makefile (libnss_db-dbs): Add db-initgroups.
|
||||
* nss/Versions [libnss_db]: Add _nss_db_initgroups_dyn for
|
||||
GLIBC_PRIVATE.
|
||||
|
@ -122,8 +122,6 @@ enum nss_status \
|
||||
_nss_db_get##name##_r (proto, struct STRUCTURE *result, \
|
||||
char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO)\
|
||||
{ \
|
||||
enum nss_status status = NSS_STATUS_SUCCESS; \
|
||||
struct nss_db_map state = { NULL, 0 }; \
|
||||
struct parser_data *data = (void *) buffer; \
|
||||
\
|
||||
if (buflen < sizeof *data) \
|
||||
@ -133,7 +131,8 @@ enum nss_status \
|
||||
return NSS_STATUS_TRYAGAIN; \
|
||||
} \
|
||||
\
|
||||
status = internal_setent (DBFILE, &state); \
|
||||
struct nss_db_map state = { NULL, 0 }; \
|
||||
enum nss_status status = internal_setent (DBFILE, &state); \
|
||||
if (status != NSS_STATUS_SUCCESS) \
|
||||
{ \
|
||||
*errnop = errno; \
|
||||
@ -141,77 +140,74 @@ enum nss_status \
|
||||
return status; \
|
||||
} \
|
||||
\
|
||||
if (status == NSS_STATUS_SUCCESS) \
|
||||
const struct nss_db_header *header = state.header; \
|
||||
int i; \
|
||||
for (i = 0; i < header->ndbs; ++i) \
|
||||
if (header->dbs[i].id == db_char) \
|
||||
break; \
|
||||
if (i == header->ndbs) \
|
||||
{ \
|
||||
const struct nss_db_header *header = state.header; \
|
||||
int i; \
|
||||
for (i = 0; i < header->ndbs; ++i) \
|
||||
if (header->dbs[i].id == db_char) \
|
||||
break; \
|
||||
if (i == header->ndbs) \
|
||||
{ \
|
||||
status = NSS_STATUS_UNAVAIL; \
|
||||
goto out; \
|
||||
} \
|
||||
\
|
||||
char *key; \
|
||||
if (db_char == '.') \
|
||||
key = (char *) IGNOREPATTERN keypattern; \
|
||||
else \
|
||||
{ \
|
||||
const size_t size = (keysize) + 1; \
|
||||
key = alloca (size); \
|
||||
\
|
||||
KEYPRINTF keypattern; \
|
||||
} \
|
||||
\
|
||||
const stridx_t *hashtable \
|
||||
= (const stridx_t *) ((const char *) header \
|
||||
+ header->dbs[i].hashoffset); \
|
||||
const char *valstrtab = (const char *) header + header->valstroffset; \
|
||||
uint32_t hashval = __hash_string (key); \
|
||||
size_t hidx = hashval % header->dbs[i].hashsize; \
|
||||
size_t hval2 = 1 + hashval % (header->dbs[i].hashsize - 2); \
|
||||
\
|
||||
status = NSS_STATUS_NOTFOUND; \
|
||||
while (hashtable[hidx] != ~((stridx_t) 0)) \
|
||||
{ \
|
||||
const char *valstr = valstrtab + hashtable[hidx]; \
|
||||
size_t len = strlen (valstr) + 1; \
|
||||
if (len > buflen) \
|
||||
{ \
|
||||
/* No room to copy the data to. */ \
|
||||
*errnop = ERANGE; \
|
||||
H_ERRNO_SET (NETDB_INTERNAL); \
|
||||
status = NSS_STATUS_TRYAGAIN; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Copy the string to a place where it can be modified. */ \
|
||||
char *p = memcpy (buffer, valstr, len); \
|
||||
\
|
||||
int err = parse_line (p, result, data, buflen, errnop \
|
||||
EXTRA_ARGS); \
|
||||
if (err > 0) \
|
||||
{ \
|
||||
status = NSS_STATUS_SUCCESS; \
|
||||
break_if_match; \
|
||||
status = NSS_STATUS_NOTFOUND; \
|
||||
} \
|
||||
else if (err == -1) \
|
||||
{ \
|
||||
H_ERRNO_SET (NETDB_INTERNAL); \
|
||||
status = NSS_STATUS_TRYAGAIN; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if ((hidx += hval2) >= header->dbs[i].hashsize) \
|
||||
hidx -= header->dbs[i].hashsize; \
|
||||
} \
|
||||
\
|
||||
if (status == NSS_STATUS_NOTFOUND) \
|
||||
H_ERRNO_SET (HOST_NOT_FOUND); \
|
||||
status = NSS_STATUS_UNAVAIL; \
|
||||
goto out; \
|
||||
} \
|
||||
\
|
||||
char *key; \
|
||||
if (db_char == '.') \
|
||||
key = (char *) IGNOREPATTERN keypattern; \
|
||||
else \
|
||||
{ \
|
||||
const size_t size = (keysize) + 1; \
|
||||
key = alloca (size); \
|
||||
\
|
||||
KEYPRINTF keypattern; \
|
||||
} \
|
||||
\
|
||||
const stridx_t *hashtable \
|
||||
= (const stridx_t *) ((const char *) header \
|
||||
+ header->dbs[i].hashoffset); \
|
||||
const char *valstrtab = (const char *) header + header->valstroffset; \
|
||||
uint32_t hashval = __hash_string (key); \
|
||||
size_t hidx = hashval % header->dbs[i].hashsize; \
|
||||
size_t hval2 = 1 + hashval % (header->dbs[i].hashsize - 2); \
|
||||
\
|
||||
status = NSS_STATUS_NOTFOUND; \
|
||||
while (hashtable[hidx] != ~((stridx_t) 0)) \
|
||||
{ \
|
||||
const char *valstr = valstrtab + hashtable[hidx]; \
|
||||
size_t len = strlen (valstr) + 1; \
|
||||
if (len > buflen) \
|
||||
{ \
|
||||
/* No room to copy the data to. */ \
|
||||
*errnop = ERANGE; \
|
||||
H_ERRNO_SET (NETDB_INTERNAL); \
|
||||
status = NSS_STATUS_TRYAGAIN; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Copy the string to a place where it can be modified. */ \
|
||||
char *p = memcpy (buffer, valstr, len); \
|
||||
\
|
||||
int err = parse_line (p, result, data, buflen, errnop EXTRA_ARGS); \
|
||||
if (err > 0) \
|
||||
{ \
|
||||
status = NSS_STATUS_SUCCESS; \
|
||||
break_if_match; \
|
||||
status = NSS_STATUS_NOTFOUND; \
|
||||
} \
|
||||
else if (err == -1) \
|
||||
{ \
|
||||
H_ERRNO_SET (NETDB_INTERNAL); \
|
||||
status = NSS_STATUS_TRYAGAIN; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if ((hidx += hval2) >= header->dbs[i].hashsize) \
|
||||
hidx -= header->dbs[i].hashsize; \
|
||||
} \
|
||||
\
|
||||
if (status == NSS_STATUS_NOTFOUND) \
|
||||
H_ERRNO_SET (HOST_NOT_FOUND); \
|
||||
\
|
||||
out: \
|
||||
internal_endent (&state); \
|
||||
\
|
||||
|
Loading…
Reference in New Issue
Block a user