Whant to write an entry in /etc/passwd (putpwent)

Hi i try to use the function putpwent to write a simple
entry in "/etc/passwd" putpwnet returns 0 as it works but
notething writes to /etc/passwd. What have i missed?

My os
--------

root@nighter-laptop:/home/nighter/labb# uname -a
Linux nighter-laptop 2.6.22-14-generic #1 SMP Sun Oct 14 23:05:12 GMT 2007 i686 GNU/Linux          

( Ubuntu )

My code
----

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>



int main()
{
   struct passwd p;
   long m=900;

   FILE *fd;
   memset(&p,0x00,sizeof(p));

   fd=fopen("/etc/passwd ","a");

        p.pw_name="kalle";
        p.pw_passwd="kalle";
        p.pw_uid=m;
        p.pw_gid=m;
        p.pw_gecos="Test account";
        p.pw_dir="/home/kalle";
        p.pw_shell="/bin/bash";

        int value = putpwent(&p,fd);

        printf("%i",value);


return 0;
}

------------------------

After opening /etc/passwd you need to seek to the end of the file i..e

fseek(fd, 0, SEEK_END);

You also need to close the file after writing the entry

fclose(fd);

I think there is no need of opening the passwd file with fopen when using functions from pwd.h

Actaully it was not that who where the problem!
But now it works! Don't understand why. But it do.

Hi i just whant to update an password entry in /etc/shadow.
But dosen't get it to work. Something is wrong! in this code.

What i try do do is if user kalle exist in shadow.
I whant it to update it's password for just that entry.

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
#include <shadow.h>
//#include <userpw.h>

int main()
{
     // -------------------------- //
     // ------- passwd file ------ //
     // -------------------------- //
     FILE* fp;
     struct passwd *p;

     memset(&p, 0, sizeof(p));

     if (!(fp = fopen("/etc/passwd", "a"))) {
           perror("Problem ");
           return(1);
     }

     // --------------------------- //
     // ----- Password Crypt ------ //
     // --------------------------- //
     char salt[2];
     char password[8] = "password";
     char t[11];

     salt[0] = 'W'; salt[1] = 'M';
     strcpy(t,(char *)crypt(password, salt));

    // --------------------------- //
     // ------ shadow file -------- //
     // --------------------------- //

     FILE* fps;
     struct spwd *sp;
     memset(&sp, 0, sizeof(sp));
     if (!(fps = fopen("/etc/shadow", "rw"))) {
        perror("Problem");
        return(1);
     }

     char user[20] = "kalle";

     /* Loop thru passwd file */
     while ((p = getpwent()) != NULL) {
                printf("%s\n",p->pw_name);

                //IF user found 
                if (strcmp(p->pw_name, user) == 0 ) {

                        if(!(sp=getspnam(p->pw_name))){
                                printf("user missing in shadow file");
                        } else {
                                strcpy(sp->sp_pwdp,t);
                                prinf("run the train %s\n",sp->sp_pwdp);
                                putspent(sp,fps);
                        }

                    
                }

    }

       
    fclose(fps);
  
 return( EXIT_SUCCESS );
}

wrong button it was intended to be a new threat.