>> Delete No. 1688 article
No. 급합니다. c로 짜여진것데, 뭐하는 프로그램인지?

등록 2000-08-04 14:09:00 By localhost     조회 2
이름 bluesea    

		* In this file are defined the functions to operate on /etc/shadow file
* No NIS support, no DBM/NDBM/DB support. These extensions should go
* into a separate file, separate functions.
*/
 #include "../_pwdb_internal.h"
 static FILE *shadow;
static char spwbuf[BUFSIZ];
static struct __pwdb_spwd spwd;
 static int shadow_file_end=1; /* XXX: AGM added this */
 #define FIELDS 9
#define OFIELDS 5
 /*
* setspent - initialize access to shadow text
*/
 void __pwdb_setspent (void)
{
if (shadow)
rewind(shadow);
else
shadow = fopen(__PWDB_SHADOW_FILE, "r");
 return;
}
 /*
* endspent - terminate access to shadow text
*/
 void __pwdb_endspent (void)
{
if (shadow)
(void) fclose (shadow);
 shadow = (FILE *) 0;
 return;
}
 /*
* sgetspent - convert string in shadow file format to (struct spwd *)
*/
 struct __pwdb_spwd *__pwdb_sgetspent (const char *string)
{
char *fields[FIELDS];
char *cp;
char *cpp;
int i;
 /*
* Copy string to local buffer. It has to be tokenized and we
* have to do that to our private copy.
*/
 strncpy (spwbuf, string, BUFSIZ-1);
spwbuf[BUFSIZ-1] = ''; 
 if ((cp = strrchr (spwbuf, ''))) 
*cp = ''; 
 /* 
* Tokenize the string into colon separated 
fields. Allow up to 
* FIELDS different fields. 
*/ 
 for (cp = spwbuf, i = 0;*cp && i < FIELDS;i++) { 
fields[i] = cp; 

while (*cp && *cp != ':') 
cp++; 
 if (*cp) 
*cp++ = ''; 
} 
 /* 
* It is acceptable for the last SVR4 field to be bla
nk. This 
* results in the loop being terminated early. In which case, 
* we just make the last field be blank and be do
ne with it. 
*/ 
 if (i == (FIELDS-1)) 
fields[i++] = cp; 
 if ((cp && *cp) || (i != FIELDS && i != OFIELDS)) 
return 0;
 
 /* 
* Start populating the structure. The fields are all in 
* static storage, as is the structure we pass back. If w
e 
* ever see a name with '+' as the first character, we try 
* to turn on NIS processing. 
*/ 
 spwd.sp_namp = fields[0
]; 
spwd.sp_pwdp = fields[1]; 
 /* 
* Get the last changed date. For all of the integer fields, 
* we check for proper f
ormat. It is an error to have an 
* incorrectly formatted number, unless we are using NIS. 
*/ 
 if ((spwd.sp_lstchg = s
trtol (fields[2], &cpp, 10)) == 0 && *cpp) { 
return 0; 
} else if (fields[2][0] == '') 
spwd.sp_lstchg = -1; 
 /* 
* G
et the minimum period between password changes. 
*/ 
 if ((spwd.sp_min = strtol (fields[3], &cpp, 10)) == 0 && *cpp) { 

return 0; 
} else if (fields[3][0] == '') 
spwd.sp_min = -1; 
 /* 
* Get the maximum number of days a password is valid
. 
*/ 
 if ((spwd.sp_max = strtol (fields[4], &cpp, 10)) == 0 && *cpp) { 
return 0; 
} else if (fields[4][0] == '') 
sp
wd.sp_max = -1; 
 if (i == OFIELDS) { 
spwd.sp_warn = spwd.sp_inact = spwd.sp_expire = 
spwd.sp_flag = -1; 
 return &spw
d; 
} 
 /* 
* Get the number of days of password expiry warning. 
*/ 
 if ((spwd.sp_warn = strtol (fields[5], &cpp, 10))
 == 0 && *cpp) { 
return 0; 
} else if (fields[5][0] == '') 
spwd.sp_warn = -1; 
 /* 
* Get the number of days of inact
ivity before an account is 
* disabled. 
*/ 
 if ((spwd.sp_inact = strtol (fields[6], &cpp, 10)) == 0 && *cpp) { 
return
 0; 
} else if (fields[6][0] == '') 
spwd.sp_inact = -1; 
 /* 
* Get the number of days after the epoch before the acco
unt is 
* set to expire. 
*/ 
 if ((spwd.sp_expire = strtol (fields[7], &cpp, 10)) == 0 && *cpp) { 
return 0; 
} else if
 (fields[7][0] == '') 
spwd.sp_expire = -1; 
 /* 
* This field is reserved for future use. But it isn't supposed 
* to 
have anything other than a valid integer in it. 
*/ 
 if ((spwd.sp_flag = strtol (fields[8], &cpp, 10)) == 0 && *cpp) { 

return 0; 
} else if (fields[8][0] == '') 
spwd.sp_flag = -1; 
 return (&spwd); 
} 
 /* 
* fgetspent - get an entry fr
om a /etc/shadow formatted stream 
*/ 
 struct __pwdb_spwd * __pwdb_fgetspent (FILE *fp) 
{ 
char buf[BUFSIZ]; 
char *cp
; 
 shadow_file_end = 1; /* safety first */ 
if (! fp) 
return (0); 
 if (fgets (buf, sizeof buf, fp) != (char *) 0) 
{ 

if ((cp = strchr (buf, ''))) 
*cp = ''; 
shadow_file_end = 0; /* we read something */ 
return (__pwdb_sgetspent (buf))
; 
} 
return 0; 
} 
 /* 
* getspent - get a (struct spwd *) from the current shadow file 
*/ 
 struct __pwdb_spwd * __pw
db_getspent () 
{ 
if (! shadow) 
__pwdb_setspent (); 
 return (__pwdb_fgetspent (shadow)); 
} 
 /* 
* putspent - Output
 a (struct spwd) in character format 
* 
* putspent() writes out a (struct spwd) in the format it appears 
* in in flat 
ASCII files. 
*/ 
 int __pwdb_putspent(const struct __pwdb_spwd *sp, FILE *stream) 
{ 
if (! stream || ! sp) 
return -1;
 
 return (fprintf(stream, "%s:%s:%ld:%ld:%ld:%ld:%ld:%ld:%ld", 
sp->sp_namp, 
sp->sp_pwdp, 
sp->sp_lstchg, 
sp->sp_min,
 
sp->sp_max, 
sp->sp_warn, 
sp->sp_inact, 
sp->sp_expire, 
sp->sp_flag 
) < 0); 
} 
 /* 
* getspnam - get a shadow entr
y by name 
*/ 
 struct __pwdb_spwd * __pwdb_getspnam (const char *name) 
{ 
struct __pwdb_spwd *sp; 
 __pwdb_setspent();
 /* rewind shadow file */ 
 /* loop through entries until correct one found or end of 
* file reached 
*/ 
do { 
sp = __
pwdb_getspent(); 
if (sp && (strcmp(name, sp->sp_namp) == 0) ) 
break; 
} while ( sp || !shadow_file_end ); 
 __pwdb_end
spent(); /* close shadow file */ 
return (sp); /* return entry found (?) */ 
}
[관리자] 패스워드를 입력 하십시오. 답장이 존재하면 함께 삭제됩니다.[ 목록 | 이전 ]
패스워드:    

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved