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 |