[Prev][Next][Index][Thread]

putpwent() Question



Greetings - 

While this may not be specific to Alpha OSF/1, it may be due to our running
Enhanced Security also, and there may be some interrelations I don't know 
about...

I have a routine which is intending to modify information in /etc/passwd for
an account.  The problem is that after I call putpwent, I end up with two
entries for the account in question (only in /etc/passwd).  Below is a code 
fragment.  What am I missing?   BTW, I have no problems with the tcb database 
modifications.

thanks.  Summary pending responses.

Randy M. Hayman
haymanr@xxxxxxxxxxxxxxxxx


...
#define PWD_FILE "/etc/passwd"
FILE    *pw_fil;

...
        pw_fil = fopen(PWD_FILE, "r+");
        setpwent();
...

/*--------------------username exist?-----------------------------------*/
        if (NULL == (upr = getpwnam(name)) )            /* /etc/passwd  */
        {
                fprintf(stderr, "Error getting entry for %s. User likely doesn't 
exist (passwd).\n", name);
                exit(1);
        }

        if (NULL == (pr = getprpwnam(name)) )           /* tcb database */
        {
                fprintf(stderr, "Error getting entry for %s. User likely doesn't 
exist (tcb).\n", name);
                exit(1);
        }

...
/*--------------------get user data and change it-----------------------*/

        upr = getpwnam(name);           /* /etc/passwd structure        */
        pr = getprpwnam(name);          /* tcb database structure       */

        strcpy(old_home, upr->pw_dir);
        old_uid = upr->pw_uid;
        if (old_uid != pr->ufld.fd_uid)
        {
                fprintf(stderr, "/etc/passwd uid field %u does not match tcb uid 
field %u\n", old_uid, pr->ufld.fd_uid);
                exit(1);
        }

...
/*--------------------write it out now----------------------------------*/
/*--------------------to both /etc/passwd and tcb database--------------*/

        if (0 == putprpwnam(name, pr))
        {
                fprintf(stdout, "\n\t***Failure to Update Account (tcb)***");
                exit(1);
        }
        else
        {
                fprintf(stdout, "\ntcb Account: %s   Old UID: %u   New UID: 
%u\n", name, old_uid, new_uid);
        }


        if (NULL != putpwent(upr, pw_fil))
        {
                fprintf(stdout, "\n\t***Failure to Update Account 
(passwd)***\n");
                exit(1);
        }
        else
        {
                endpwent();
                fprintf(stdout, "\npasswd Account: %s   Old UID: %u   New UID: 
%u   \n\tOld Home: %s   New Home: %s\n",
                        name, old_uid, new_uid, old_home, new_home);
        }

...