summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/lib/util_file.c23
-rw-r--r--source3/smbd/groupname.c15
-rw-r--r--source3/smbd/password.c17
4 files changed, 41 insertions, 15 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index dc9d9c389e..27711f2ed4 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -383,6 +383,7 @@ char *file_load(char *fname, size_t *size);
char **file_lines_load(char *fname, int *numlines);
char **file_lines_pload(char *syscmd, int *numlines);
void file_lines_free(char **lines);
+void file_lines_slashcont(char **lines);
/*The following definitions come from lib/util_sec.c */
diff --git a/source3/lib/util_file.c b/source3/lib/util_file.c
index 1ef713b105..f3e2879587 100644
--- a/source3/lib/util_file.c
+++ b/source3/lib/util_file.c
@@ -473,3 +473,26 @@ void file_lines_free(char **lines)
free(lines);
}
+
+/****************************************************************************
+take a lislist of lines and modify them to produce a list where \ continues
+a line
+****************************************************************************/
+void file_lines_slashcont(char **lines)
+{
+ int i, j;
+
+ for (i=0; lines[i];) {
+ int len = strlen(lines[i]);
+ if (lines[i][len-1] == '\\') {
+ lines[i][len-1] = ' ';
+ if (lines[i+1]) {
+ char *p = &lines[i][len];
+ while (p < lines[i+1]) *p++ = ' ';
+ for (j = i+1; lines[j]; j++) lines[j] = lines[j+1];
+ }
+ } else {
+ i++;
+ }
+ }
+}
diff --git a/source3/smbd/groupname.c b/source3/smbd/groupname.c
index 4dadfaa939..fcbf5dd778 100644
--- a/source3/smbd/groupname.c
+++ b/source3/smbd/groupname.c
@@ -71,9 +71,8 @@ void load_groupname_map(void)
static BOOL initialized = False;
char *groupname_map_file = lp_groupname_map();
SMB_STRUCT_STAT st;
- FILE *fp;
- char *s;
- pstring buf;
+ char **lines;
+ int i;
groupname_map_entry *new_ep;
if(!initialized) {
@@ -102,12 +101,13 @@ void load_groupname_map(void)
* Load the file.
*/
- fp = sys_fopen(groupname_map_file,"r");
- if (!fp) {
+ lines = file_lines_load(groupname_map_file,NULL);
+ if (!lines) {
DEBUG(0,("load_groupname_map: can't open groupname map %s. Error was %s\n",
groupname_map_file, strerror(errno)));
return;
}
+ file_lines_slashcont(lines);
/*
* Throw away any previous list.
@@ -116,11 +116,12 @@ void load_groupname_map(void)
DEBUG(4,("load_groupname_map: Scanning groupname map %s\n",groupname_map_file));
- while((s=fgets_slash(buf,sizeof(buf),fp))!=NULL) {
+ for (i=0; lines[i]; i++) {
pstring unixname;
pstring windows_name;
struct group *gptr;
DOM_SID tmp_sid;
+ char *s = lines[i];
DEBUG(10,("load_groupname_map: Read line |%s|\n", s));
@@ -202,7 +203,7 @@ Error was %s.\n", unixname, strerror(errno) ));
DEBUG(10,("load_groupname_map: Added %ld entries to groupname map.\n",
ubi_slCount(&groupname_map_list)));
- fclose(fp);
+ file_lines_free(lines);
}
/***********************************************************
diff --git a/source3/smbd/password.c b/source3/smbd/password.c
index 208dbd2bff..f92d31718c 100644
--- a/source3/smbd/password.c
+++ b/source3/smbd/password.c
@@ -828,15 +828,16 @@ allows this user from this machine
****************************************************************************/
static BOOL check_user_equiv(char *user, char *remote, char *equiv_file)
{
- pstring buf;
int plus_allowed = 1;
char *file_host;
char *file_user;
- FILE *fp = sys_fopen(equiv_file, "r");
+ char **lines = file_lines_load(equiv_file, NULL);
+ int i;
+
DEBUG(5, ("check_user_equiv %s %s %s\n", user, remote, equiv_file));
- if (! fp) return False;
- while(fgets(buf, sizeof(buf), fp))
- {
+ if (! lines) return False;
+ for (i=0; lines[i]; i++) {
+ char *buf = lines[i];
trim_string(buf," "," ");
if (buf[0] != '#' && buf[0] != '\n')
@@ -857,7 +858,7 @@ static BOOL check_user_equiv(char *user, char *remote, char *equiv_file)
{
/* a bare plus means everbody allowed */
DEBUG(6, ("check_user_equiv everybody allowed\n"));
- fclose(fp);
+ file_lines_free(lines);
return True;
}
}
@@ -912,17 +913,17 @@ static BOOL check_user_equiv(char *user, char *remote, char *equiv_file)
/* is it this user */
if (file_user == 0 || strequal(user, file_user))
{
- fclose(fp);
DEBUG(5, ("check_user_equiv matched %s%s %s\n",
(plus ? "+" : "-"), file_host,
(file_user ? file_user : "")));
+ file_lines_free(lines);
return (plus ? True : False);
}
}
}
}
}
- fclose(fp);
+ file_lines_free(lines);
return False;
}