libpwdgrp: code shrink
function old new delta parse_common 206 205 -1 getgrouplist_internal 229 225 -4 bb_internal_getpwent_r 182 173 -9 getXXnam 232 222 -10 getXXnam_r 216 176 -40 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/5 up/down: 0/-64) Total: -64 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
12fc869560
commit
5acf1346b4
@ -186,8 +186,7 @@ static int tokenize(char *buffer, int ch)
|
|||||||
/* Returns !NULL on success and matching line broken up in fields by '\0' in buf.
|
/* Returns !NULL on success and matching line broken up in fields by '\0' in buf.
|
||||||
* We require the expected number of fields to be found.
|
* We require the expected number of fields to be found.
|
||||||
*/
|
*/
|
||||||
static char *parse_common(FILE *fp, const char *filename,
|
static char *parse_common(FILE *fp, struct passdb *db,
|
||||||
int n_fields,
|
|
||||||
const char *key, int field_pos)
|
const char *key, int field_pos)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
@ -198,9 +197,9 @@ static char *parse_common(FILE *fp, const char *filename,
|
|||||||
/* Skip empty lines, comment lines */
|
/* Skip empty lines, comment lines */
|
||||||
if (buf[0] == '\0' || buf[0] == '#')
|
if (buf[0] == '\0' || buf[0] == '#')
|
||||||
goto free_and_next;
|
goto free_and_next;
|
||||||
if (tokenize(buf, ':') != n_fields) {
|
if (tokenize(buf, ':') != db->numfields) {
|
||||||
/* number of fields is wrong */
|
/* number of fields is wrong */
|
||||||
bb_error_msg("bad record at %s:%u", filename, count);
|
bb_error_msg("bad record at %s:%u", db->filename, count);
|
||||||
goto free_and_next;
|
goto free_and_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +222,7 @@ static char *parse_common(FILE *fp, const char *filename,
|
|||||||
* for 3 pointers: alignment padding, group name, NULL.
|
* for 3 pointers: alignment padding, group name, NULL.
|
||||||
* +1 for every additional group.
|
* +1 for every additional group.
|
||||||
*/
|
*/
|
||||||
if (buf && n_fields == sizeof(GR_DEF)-1) { /* if we read group file... */
|
if (buf && db->numfields == sizeof(GR_DEF)-1) { /* if we read group file... */
|
||||||
int cnt = 3;
|
int cnt = 3;
|
||||||
char *p = buf;
|
char *p = buf;
|
||||||
while (p < S.tokenize_end)
|
while (p < S.tokenize_end)
|
||||||
@ -237,15 +236,14 @@ static char *parse_common(FILE *fp, const char *filename,
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *parse_file(const char *filename,
|
static char *parse_file(struct passdb *db,
|
||||||
int n_fields,
|
|
||||||
const char *key, int field_pos)
|
const char *key, int field_pos)
|
||||||
{
|
{
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
FILE *fp = fopen_for_read(filename);
|
FILE *fp = fopen_for_read(db->filename);
|
||||||
|
|
||||||
if (fp) {
|
if (fp) {
|
||||||
buf = parse_common(fp, filename, n_fields, key, field_pos);
|
buf = parse_common(fp, db, key, field_pos);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
@ -326,12 +324,10 @@ static int FAST_FUNC getXXnam_r(const char *name, uintptr_t db_and_field_pos,
|
|||||||
{
|
{
|
||||||
void *struct_buf = *(void**)result;
|
void *struct_buf = *(void**)result;
|
||||||
char *buf;
|
char *buf;
|
||||||
struct passdb *db;
|
struct passdb *db = &get_S()->db[db_and_field_pos >> 2];
|
||||||
get_S();
|
|
||||||
db = &S.db[db_and_field_pos >> 2];
|
|
||||||
|
|
||||||
*(void**)result = NULL;
|
*(void**)result = NULL;
|
||||||
buf = parse_file(db->filename, db->numfields, name, 0 /*db_and_field_pos & 3*/);
|
buf = parse_file(db, name, 0 /*db_and_field_pos & 3*/);
|
||||||
/* "db_and_field_pos & 3" is commented out since so far we don't implement
|
/* "db_and_field_pos & 3" is commented out since so far we don't implement
|
||||||
* getXXXid_r() functions which would use that to pass 2 here */
|
* getXXXid_r() functions which would use that to pass 2 here */
|
||||||
if (buf) {
|
if (buf) {
|
||||||
@ -378,9 +374,7 @@ static int FAST_FUNC getXXent_r(void *struct_buf, char *buffer, size_t buflen,
|
|||||||
unsigned db_idx)
|
unsigned db_idx)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
struct passdb *db;
|
struct passdb *db = &get_S()->db[db_idx];
|
||||||
get_S();
|
|
||||||
db = &S.db[db_idx];
|
|
||||||
|
|
||||||
*(void**)result = NULL;
|
*(void**)result = NULL;
|
||||||
|
|
||||||
@ -392,7 +386,7 @@ static int FAST_FUNC getXXent_r(void *struct_buf, char *buffer, size_t buflen,
|
|||||||
close_on_exec_on(fileno(db->fp));
|
close_on_exec_on(fileno(db->fp));
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = parse_common(db->fp, db->filename, db->numfields, /*no search key:*/ NULL, 0);
|
buf = parse_common(db->fp, db, /*no search key:*/ NULL, 0);
|
||||||
if (buf) {
|
if (buf) {
|
||||||
size_t size = S.tokenize_end - buf;
|
size_t size = S.tokenize_end - buf;
|
||||||
if (size > buflen) {
|
if (size > buflen) {
|
||||||
@ -421,9 +415,7 @@ static void* FAST_FUNC getXXnam(const char *name, unsigned db_and_field_pos)
|
|||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
void *result;
|
void *result;
|
||||||
struct passdb *db;
|
struct passdb *db = &get_S()->db[db_and_field_pos >> 2];
|
||||||
get_S();
|
|
||||||
db = &S.db[db_and_field_pos >> 2];
|
|
||||||
|
|
||||||
result = NULL;
|
result = NULL;
|
||||||
|
|
||||||
@ -435,7 +427,7 @@ static void* FAST_FUNC getXXnam(const char *name, unsigned db_and_field_pos)
|
|||||||
close_on_exec_on(fileno(db->fp));
|
close_on_exec_on(fileno(db->fp));
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = parse_common(db->fp, db->filename, db->numfields, name, db_and_field_pos & 3);
|
buf = parse_common(db->fp, db, name, db_and_field_pos & 3);
|
||||||
if (buf) {
|
if (buf) {
|
||||||
free(db->malloced);
|
free(db->malloced);
|
||||||
/* We enlarge buf and move string data up, freeing space
|
/* We enlarge buf and move string data up, freeing space
|
||||||
@ -499,8 +491,6 @@ static gid_t* FAST_FUNC getgrouplist_internal(int *ngroups_ptr,
|
|||||||
gid_t *group_list;
|
gid_t *group_list;
|
||||||
int ngroups;
|
int ngroups;
|
||||||
|
|
||||||
get_S();
|
|
||||||
|
|
||||||
/* We alloc space for 8 gids at a time. */
|
/* We alloc space for 8 gids at a time. */
|
||||||
group_list = xzalloc(8 * sizeof(group_list[0]));
|
group_list = xzalloc(8 * sizeof(group_list[0]));
|
||||||
group_list[0] = gid;
|
group_list[0] = gid;
|
||||||
@ -508,11 +498,12 @@ static gid_t* FAST_FUNC getgrouplist_internal(int *ngroups_ptr,
|
|||||||
|
|
||||||
fp = fopen_for_read(_PATH_GROUP);
|
fp = fopen_for_read(_PATH_GROUP);
|
||||||
if (fp) {
|
if (fp) {
|
||||||
|
struct passdb *db = &get_S()->db[1];
|
||||||
char *buf;
|
char *buf;
|
||||||
while ((buf = parse_common(fp, _PATH_GROUP, sizeof(GR_DEF)-1, NULL, 0)) != NULL) {
|
while ((buf = parse_common(fp, db, NULL, 0)) != NULL) {
|
||||||
char **m;
|
char **m;
|
||||||
struct group group;
|
struct group group;
|
||||||
if (!convert_to_struct(&S.db[1], buf, &group))
|
if (!convert_to_struct(db, buf, &group))
|
||||||
goto next;
|
goto next;
|
||||||
if (group.gr_gid == gid)
|
if (group.gr_gid == gid)
|
||||||
goto next;
|
goto next;
|
||||||
|
Loading…
Reference in New Issue
Block a user