summaryrefslogtreecommitdiffstats
path: root/source/passdb/smbpass.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/passdb/smbpass.c')
-rw-r--r--source/passdb/smbpass.c81
1 files changed, 54 insertions, 27 deletions
diff --git a/source/passdb/smbpass.c b/source/passdb/smbpass.c
index aa3a694567c..2ab21f78ef7 100644
--- a/source/passdb/smbpass.c
+++ b/source/passdb/smbpass.c
@@ -80,7 +80,7 @@ static BOOL pw_file_lock(int fd, int type, int secs, int *plock_depth)
(*plock_depth)++;
if(pw_file_lock_depth == 0) {
- if (do_pw_lock(fd, secs, type)) {
+ if (!do_pw_lock(fd, secs, type)) {
DEBUG(10,("pw_file_lock: locking file failed, error = %s.\n",
strerror(errno)));
return False;
@@ -135,7 +135,7 @@ void *startsmbpwent(BOOL update)
/* Set a 16k buffer to do more efficient reads */
setvbuf(fp, s_readbuf, _IOFBF, sizeof(s_readbuf));
- if (!pw_file_lock(fileno(fp), F_RDLCK | (update ? F_WRLCK : 0), 5, &pw_file_lock_depth))
+ if (!pw_file_lock(fileno(fp), (update ? F_WRLCK : F_RDLCK), 5, &pw_file_lock_depth))
{
DEBUG(0, ("startsmbpwent: unable to lock file %s\n", pfile));
fclose(fp);
@@ -774,7 +774,7 @@ BOOL mod_smbpwd_entry(struct smb_passwd* pwd)
lockfd = fileno(fp);
- if (!pw_file_lock(lockfd, F_RDLCK | F_WRLCK, 5, &pw_file_lock_depth)) {
+ if (!pw_file_lock(lockfd, F_WRLCK, 5, &pw_file_lock_depth)) {
DEBUG(0, ("mod_smbpwd_entry: unable to lock file %s\n", pfile));
fclose(fp);
return False;
@@ -1076,48 +1076,63 @@ BOOL mod_smbpwd_entry(struct smb_passwd* pwd)
static int mach_passwd_lock_depth;
/************************************************************************
- Routine to lock the machine account password file for a domain.
+ Routine to get the name for a machine account file.
************************************************************************/
-void *machine_password_lock( char *domain, char *name, BOOL update)
+static void get_machine_account_file_name( char *domain, char *name, char *mac_file)
{
- FILE *fp;
- pstring mac_file;
unsigned int mac_file_len;
char *p;
- if(mach_passwd_lock_depth == 0) {
+ pstrcpy(mac_file, lp_smb_passwd_file());
+ p = strrchr(mac_file, '/');
+ if(p != NULL)
+ *++p = '\0';
- pstrcpy(mac_file, lp_smb_passwd_file());
- p = strrchr(mac_file, '/');
+ mac_file_len = strlen(mac_file);
- if(p != NULL)
- *++p = '\0';
+ if (sizeof(pstring) - mac_file_len - strlen(domain) - strlen(name) - 6 < 0)
+ {
+ DEBUG(0,("machine_password_lock: path %s too long to add machine details.\n",
+ mac_file));
+ return;
+ }
- mac_file_len = strlen(mac_file);
+ strcat(mac_file, domain);
+ strcat(mac_file, ".");
+ strcat(mac_file, name);
+ strcat(mac_file, ".mac");
+}
+
+/************************************************************************
+ Routine to lock the machine account password file for a domain.
+************************************************************************/
- if (sizeof(pstring) - mac_file_len - strlen(domain) - strlen(name) - 6 < 0)
- {
- DEBUG(0,("machine_password_lock: path %s too long to add machine details.\n",
- mac_file));
- return NULL;
- }
+void *machine_password_lock( char *domain, char *name, BOOL update)
+{
+ FILE *fp;
+ pstring mac_file;
+
+ if(mach_passwd_lock_depth == 0) {
- strcat(mac_file, domain);
- strcat(mac_file, ".");
- strcat(mac_file, name);
- strcat(mac_file, ".mac");
+ get_machine_account_file_name( domain, name, mac_file);
if((fp = fopen(mac_file, "r+b")) == NULL) {
- DEBUG(0,("machine_password_lock: cannot open file %s - Error was %s.\n",
- mac_file, strerror(errno) ));
- return NULL;
+ if(errno == ENOENT && update) {
+ fp = fopen(mac_file, "w+b");
+ }
+
+ if(fp == NULL) {
+ DEBUG(0,("machine_password_lock: cannot open file %s - Error was %s.\n",
+ mac_file, strerror(errno) ));
+ return NULL;
+ }
}
chmod(mac_file, 0600);
}
- if(!pw_file_lock(fileno(fp), F_RDLCK | (update ? F_WRLCK : 0),
+ if(!pw_file_lock(fileno(fp), (update ? F_WRLCK : F_RDLCK),
60, &mach_passwd_lock_depth))
{
DEBUG(0,("machine_password_lock: cannot lock file %s\n", mac_file));
@@ -1142,6 +1157,18 @@ BOOL machine_password_unlock( void *token )
}
/************************************************************************
+ Routine to delete the machine account password file for a domain.
+************************************************************************/
+
+BOOL machine_password_delete( char *domain, char *name )
+{
+ pstring mac_file;
+
+ get_machine_account_file_name( domain, name, mac_file);
+ return (unlink( mac_file ) == 0);
+}
+
+/************************************************************************
Routine to get the machine account password for a domain.
The user of this function must have locked the machine password file.
************************************************************************/