1/* vi: set sw=4 ts=4: */ 2/* Copyright (C) 2003 Manuel Novoa III 3 * 4 * Licensed under GPL v2, or later. See file LICENSE in this tarball. 5 */ 6 7/* Nov 6, 2003 Initial version. 8 * 9 * NOTE: This implementation is quite strict about requiring all 10 * field seperators. It also does not allow leading whitespace 11 * except when processing the numeric fields. glibc is more 12 * lenient. See the various glibc difference comments below. 13 * 14 * TODO: 15 * Move to dynamic allocation of (currently statically allocated) 16 * buffers; especially for the group-related functions since 17 * large group member lists will cause error returns. 18 * 19 */ 20 21#ifndef GETXXKEY_R_FUNC 22#error GETXXKEY_R_FUNC is not defined! 23#endif 24 25int GETXXKEY_R_FUNC(GETXXKEY_R_KEYTYPE key, 26 GETXXKEY_R_ENTTYPE *__restrict resultbuf, 27 char *__restrict buffer, size_t buflen, 28 GETXXKEY_R_ENTTYPE **__restrict result) 29{ 30 FILE *stream; 31 int rv; 32 33 *result = NULL; 34 35 stream = fopen(GETXXKEY_R_PATHNAME, "r"); 36 if (!stream) 37 return errno; 38 while (1) { 39 rv = bb__pgsreader(GETXXKEY_R_PARSER, resultbuf, buffer, buflen, stream); 40 if (!rv) { 41 if (GETXXKEY_R_TEST(resultbuf)) { /* Found key? */ 42 *result = resultbuf; 43 break; 44 } 45 } else { 46 if (rv == ENOENT) { /* end-of-file encountered. */ 47 rv = 0; 48 } 49 break; 50 } 51 } 52 fclose(stream); 53 54 return rv; 55} 56 57#undef GETXXKEY_R_FUNC 58#undef GETXXKEY_R_PARSER 59#undef GETXXKEY_R_ENTTYPE 60#undef GETXXKEY_R_TEST 61#undef GETXXKEY_R_KEYTYPE 62#undef GETXXKEY_R_PATHNAME 63