Put an entry into the shadow password database
#include <sys/types.h> #include <shadow.h> int putspent( const struct spwd* p, FILE* fp );
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The putspent() function writes a shadow password entry into the specified file. This function is the inverse of getspent().
Given a pointer to a spwd structure created by the getspent() or the getspnam() routine, putspent() writes a line on the stream fp, which matches the format of </etc/shadow>. The spwd structure contains the following members:
char *sp_namp; /* name */ char *sp_pwdp; /* encrypted password */ long sp_lstchg; /* last changed */ long sp_max; /* #days (min) to change */ long sp_min; /* #days (max) to change */ long sp_warn; /* #days to warn */ long sp_inact; /* #days of inactivity */ long sp_expire; /* date to auto-expire */ long sp_flag; /* reserved */
If the sp_min, sp_max, sp_lstchg, sp_warn, sp_inact, or sp_expire field of the structure is -1, or if sp_flag = 0, the corresponding </etc/shadow> field is cleared.
Zero.
The putspent() function uses the following functions, and as a result errno can be set to an error for any of these calls:
#include <stdio.h> #include <stdlib.h> #include <pwd.h> #include <shadow.h> /* * This program adds a user and password to * a temporary file which can then be used with * fgetspent() (of course the password * string should be encrypted already etc.) */ int main( int argc, char** argv ) { FILE* fp; struct spwd sp; char pwbuf[80], nambuf[80]; memset(&sp, 0, sizeof(sp)); if (argc < 2) { printf("%s filename \n", argv[0]); return(EXIT_FAILURE); } if (!(fp = fopen(argv[1], "w"))) { fprintf(stderr, "Can't open file %s \n", argv[1]); perror("Problem "); return(1); } printf("Enter a userid: "); if (!gets(nambuf)) { fprintf(stderr, "Can't get username string\n"); } sp.sp_namp = nambuf; printf("Enter a password: "); if (!gets(pwbuf)) { fprintf(stderr, "Can't get username password\n"); } sp.sp_pwdp = pwbuf; putspent(&sp, fp); fclose(fp); return( EXIT_SUCCESS ); }
Safety: | |
---|---|
Cancellation point | Yes |
Interrupt handler | No |
Signal handler | No |
Thread | No |
errno, getgrent(), getlogin(), getpwnam(), getpwuid(), getspent(), getspnam(), setspent()