| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 | /* * __sgetspent_r.c - Based on __getpwent_r.c *  *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Library General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Library General Public License for more details. * *  You should have received a copy of the GNU Library General Public *  License along with this library; if not, write to the Free *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdlib.h>#include <unistd.h>#include <string.h>#include "config.h"int __sgetspent_r(const char * string, struct spwd * spwd, char * line_buff, size_t buflen){	char *field_begin;	char *endptr;	char *lstchg_ptr=NULL;	char *min_ptr=NULL;	char *max_ptr=NULL;	char *warn_ptr=NULL;	char *inact_ptr=NULL;	char *expire_ptr=NULL;	char *flag_ptr=NULL;	int i;	if (string != line_buff) {		if (strlen(string) >= buflen)			return -1;		strcpy(line_buff, string);	}	if (*line_buff == '#' || *line_buff == ' ' || *line_buff == '\n' ||		*line_buff == '\t')		return -1;	field_begin = strchr(line_buff, '\n');	if (field_begin != NULL)		*field_begin = '\0';	/* We've read the line; now parse it. */	field_begin = line_buff;	for (i = 0; i < 9; i++) {		switch (i) {		case 0:			spwd->sp_namp = field_begin;			break;		case 1:			spwd->sp_pwdp = field_begin;			break;		case 2:			lstchg_ptr = field_begin;			break;		case 3:			min_ptr = field_begin;			break;		case 4:			max_ptr = field_begin;			break;		case 5:			warn_ptr = field_begin;			break;		case 6:			inact_ptr = field_begin;			break;		case 7:			expire_ptr = field_begin;			break;		case 8:			flag_ptr = field_begin;			break;		}		if (i < 8) {			field_begin = strchr(field_begin, ':');			if (field_begin == NULL) {				if (i==4 || i==7)					break;				return -1;			}			*field_begin++ = '\0';		}	}	if (*lstchg_ptr == '\0') {		spwd->sp_lstchg = -1;	} else {		spwd->sp_lstchg = (gid_t) strtoul(lstchg_ptr, &endptr, 10);		if (*endptr != '\0')			return -1;	}	if (*min_ptr == '\0') {		spwd->sp_min = -1;	} else {		spwd->sp_min = (gid_t) strtoul(min_ptr, &endptr, 10);		if (*endptr != '\0')			return -1;	}	if (*max_ptr == '\0') {		spwd->sp_max = -1;	} else {		spwd->sp_max = (gid_t) strtoul(max_ptr, &endptr, 10);		if (*endptr != '\0')			return -1;	}	if (warn_ptr == NULL) {		/* Support for old format */		spwd->sp_warn = -1;		spwd->sp_inact = -1;		spwd->sp_expire = -1;		spwd->sp_flag = 0;	}	else {		if (*warn_ptr == '\0') {			spwd->sp_warn = -1;		} else {			spwd->sp_warn = (gid_t) strtoul(warn_ptr, &endptr, 10);			if (*endptr != '\0')				return -1;		}		if (*inact_ptr == '\0') {			spwd->sp_inact = -1;		} else {			spwd->sp_inact = (gid_t) strtoul(inact_ptr, &endptr, 10);			if (*endptr != '\0')				return -1;		}		if (*expire_ptr == '\0') {			spwd->sp_expire = -1;		} else {			spwd->sp_expire = (gid_t) strtoul(expire_ptr, &endptr, 10);			if (*endptr != '\0')				return -1;		}		if (flag_ptr==NULL || *flag_ptr=='\0') {			spwd->sp_flag = ~0ul;		} else {			spwd->sp_flag = (gid_t) strtoul(flag_ptr, &endptr, 10);			if (*endptr != '\0')				return -1;		}	}	return 0;}
 |