r16945: Sync trunk -> 3.0 for 3.0.24 code. Still need
[vlendec/samba-autobuild/.git] / source3 / passdb / pdb_smbpasswd.c
index a8a42196d48ac331a71e8a7be1f003faa2a5db04..aec1db48b5dffb94b608978f8bbf17c37c651e77 100644 (file)
@@ -584,7 +584,8 @@ static char *format_new_smbpasswd_entry(const struct smb_passwd *newpwd)
  Routine to add an entry to the smbpasswd file.
 *************************************************************************/
 
-static BOOL add_smbfilepwd_entry(struct smbpasswd_privates *smbpasswd_state, struct smb_passwd *newpwd)
+static NTSTATUS add_smbfilepwd_entry(struct smbpasswd_privates *smbpasswd_state,
+                                    struct smb_passwd *newpwd)
 {
        const char *pfile = smbpasswd_state->smbpasswd_file;
        struct smb_passwd *pwd = NULL;
@@ -605,7 +606,7 @@ static BOOL add_smbfilepwd_entry(struct smbpasswd_privates *smbpasswd_state, str
 
        if (fp == NULL) {
                DEBUG(0, ("add_smbfilepwd_entry: unable to open file.\n"));
-               return False;
+               return map_nt_error_from_unix(errno);
        }
 
        /*
@@ -616,7 +617,7 @@ static BOOL add_smbfilepwd_entry(struct smbpasswd_privates *smbpasswd_state, str
                if (strequal(newpwd->smb_name, pwd->smb_name)) {
                        DEBUG(0, ("add_smbfilepwd_entry: entry with name %s already exists\n", pwd->smb_name));
                        endsmbfilepwent(fp, &smbpasswd_state->pw_file_lock_depth);
-                       return False;
+                       return NT_STATUS_USER_EXISTS;
                }
        }
 
@@ -630,17 +631,18 @@ static BOOL add_smbfilepwd_entry(struct smbpasswd_privates *smbpasswd_state, str
        fd = fileno(fp);
 
        if((offpos = sys_lseek(fd, 0, SEEK_END)) == -1) {
+               NTSTATUS result = map_nt_error_from_unix(errno);
                DEBUG(0, ("add_smbfilepwd_entry(sys_lseek): Failed to add entry for user %s to file %s. \
 Error was %s\n", newpwd->smb_name, pfile, strerror(errno)));
                endsmbfilepwent(fp, &smbpasswd_state->pw_file_lock_depth);
-               return False;
+               return result;
        }
 
        if((new_entry = format_new_smbpasswd_entry(newpwd)) == NULL) {
                DEBUG(0, ("add_smbfilepwd_entry(malloc): Failed to add entry for user %s to file %s. \
 Error was %s\n", newpwd->smb_name, pfile, strerror(errno)));
                endsmbfilepwent(fp, &smbpasswd_state->pw_file_lock_depth);
-               return False;
+               return NT_STATUS_NO_MEMORY;
        }
 
        new_entry_length = strlen(new_entry);
@@ -651,6 +653,7 @@ Error was %s\n", newpwd->smb_name, pfile, strerror(errno)));
 #endif
 
        if ((wr_len = write(fd, new_entry, new_entry_length)) != new_entry_length) {
+               NTSTATUS result = map_nt_error_from_unix(errno);
                DEBUG(0, ("add_smbfilepwd_entry(write): %d Failed to add entry for user %s to file %s. \
 Error was %s\n", wr_len, newpwd->smb_name, pfile, strerror(errno)));
 
@@ -663,12 +666,12 @@ Error was %s. Password file may be corrupt ! Please examine by hand !\n",
 
                endsmbfilepwent(fp, &smbpasswd_state->pw_file_lock_depth);
                free(new_entry);
-               return False;
+               return result;
        }
 
        free(new_entry);
        endsmbfilepwent(fp, &smbpasswd_state->pw_file_lock_depth);
-       return True;
+       return NT_STATUS_OK;
 }
 
 /************************************************************************
@@ -1308,7 +1311,7 @@ static NTSTATUS smbpasswd_getsampwnam(struct pdb_methods *my_methods,
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
        struct smbpasswd_privates *smbpasswd_state = (struct smbpasswd_privates*)my_methods->private_data;
        struct smb_passwd *smb_pw;
-       void *fp = NULL;
+       FILE *fp = NULL;
 
        DEBUG(10, ("getsampwnam (smbpasswd): search by name: %s\n", username));
 
@@ -1352,7 +1355,7 @@ static NTSTATUS smbpasswd_getsampwsid(struct pdb_methods *my_methods, struct sam
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
        struct smbpasswd_privates *smbpasswd_state = (struct smbpasswd_privates*)my_methods->private_data;
        struct smb_passwd *smb_pw;
-       void *fp = NULL;
+       FILE *fp = NULL;
        fstring sid_str;
        uint32 rid;
        
@@ -1423,11 +1426,7 @@ static NTSTATUS smbpasswd_add_sam_account(struct pdb_methods *my_methods, struct
        }
        
        /* add the entry */
-       if(!add_smbfilepwd_entry(smbpasswd_state, &smb_pw)) {
-               return NT_STATUS_UNSUCCESSFUL;
-       }
-       
-       return NT_STATUS_OK;
+       return add_smbfilepwd_entry(smbpasswd_state, &smb_pw);
 }
 
 static NTSTATUS smbpasswd_update_sam_account(struct pdb_methods *my_methods, struct samu *sampass)