- don't use env variables for passwords and usernames (yeah!)
authorAndrew Tridgell <tridge@samba.org>
Mon, 19 Oct 1998 01:03:00 +0000 (01:03 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 19 Oct 1998 01:03:00 +0000 (01:03 +0000)
- added a shared variable area based on a unlinked open file, and
  implement a general get/set interface to it
- cache hostname lookups and master ip lookups in shared variable area
(This used to be commit 279cbe69efd75450113d2da0da5e67b29f3702b1)

source3/smbwrapper/shared.c [new file with mode: 0644]
source3/smbwrapper/smbsh.c
source3/smbwrapper/smbw.c
source3/smbwrapper/smbw.h

diff --git a/source3/smbwrapper/shared.c b/source3/smbwrapper/shared.c
new file mode 100644 (file)
index 0000000..4637248
--- /dev/null
@@ -0,0 +1,179 @@
+/* 
+   Unix SMB/Netbios implementation.
+   Version 2.0
+   SMB wrapper functions - shared variables
+   Copyright (C) Andrew Tridgell 1998
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+extern int DEBUGLEVEL;
+
+static int shared_fd;
+static char *variables;
+static int shared_size;
+
+/***************************************************** 
+setup the shared area 
+*******************************************************/
+void smbw_setup_shared(void)
+{
+       int fd;
+       pstring s, name;
+
+       slprintf(s,sizeof(s)-1, "%s/msg.XXXXXX",tmpdir());
+
+       fstrcpy(name,(char *)mktemp(s));
+
+       /* note zero permissions! don't change this */
+       fd = open(name,O_RDWR|O_CREAT|O_TRUNC|O_EXCL,0); 
+       if (fd == -1) goto failed;
+
+       shared_fd = set_maxfiles(SMBW_MAX_OPEN);
+       
+       while (shared_fd && dup2(fd, shared_fd) != shared_fd) shared_fd--;
+
+       if (shared_fd == 0) goto failed;
+
+       close(fd);
+
+       DEBUG(4,("created shared_fd=%d\n", shared_fd));
+
+       slprintf(s,sizeof(s)-1,"%d", shared_fd);
+
+       setenv("SMBW_HANDLE", s, 1);
+
+       return;
+
+ failed:
+       perror("Failed to setup shared variable area ");
+       exit(1);
+}
+
+
+/***************************************************** 
+lock the shared variable area
+*******************************************************/
+static void lockit(void)
+{
+       if (shared_fd == 0) {
+               char *p = getenv("SMBW_HANDLE");
+               if (!p) {
+                       DEBUG(0,("ERROR: can't get smbw shared handle\n"));
+                       exit(1);
+               }
+               shared_fd = atoi(p);
+       }
+       if (fcntl_lock(shared_fd,SMB_F_SETLKW,0,1,F_WRLCK)==False) {
+               DEBUG(0,("ERROR: can't get smbw shared lock\n"));
+               exit(1);
+       }
+}
+
+/***************************************************** 
+unlock the shared variable area
+*******************************************************/
+static void unlockit(void)
+{
+       fcntl_lock(shared_fd,SMB_F_SETLK,0,1,F_UNLCK);
+}
+
+
+/***************************************************** 
+get a variable from the shared area
+*******************************************************/
+char *smbw_getshared(const char *name)
+{
+       int i;
+       struct stat st;
+
+       lockit();
+
+       /* maybe the area has changed */
+       if (fstat(shared_fd, &st)) goto failed;
+
+       if (st.st_size != shared_size) {
+               variables = (char *)Realloc(variables, st.st_size);
+               if (!variables) goto failed;
+               shared_size = st.st_size;
+               lseek(shared_fd, 0, SEEK_SET);
+               if (read(shared_fd, variables, shared_size) != shared_size) {
+                       goto failed;
+               }
+       }
+
+       unlockit();
+
+       i=0;
+       while (i < shared_size) {
+               int len;
+               char *n, *v;
+
+               n = &variables[i];
+               i += strlen(n)+1;
+               v = &variables[i];
+               i += strlen(v)+1;
+
+               if (strcmp(name,n)) {
+                       continue;
+               }
+               return v;
+       }
+
+       return NULL;
+
+ failed:
+       DEBUG(0,("smbw: shared variables corrupt (%s)\n", strerror(errno)));
+       exit(1);
+}
+
+
+
+/***************************************************** 
+set a variable in the shared area
+*******************************************************/
+void smbw_setshared(const char *name, const char *val)
+{
+       int len;
+
+       /* we don't allow variable overwrite */
+       if (smbw_getshared(name)) return;
+
+       lockit();
+
+       len = strlen(name) + strlen(val) + 2;
+
+       variables = (char *)Realloc(variables, shared_size + len);
+
+       if (!variables) {
+               DEBUG(0,("out of memory in smbw_setshared\n"));
+               exit(1);
+       }
+
+       pstrcpy(&variables[shared_size], name);
+       shared_size += strlen(name)+1;
+       pstrcpy(&variables[shared_size], val);
+       shared_size += strlen(val)+1;
+
+       lseek(shared_fd, 0, SEEK_SET);
+       if (write(shared_fd, variables, shared_size) != shared_size) {
+               DEBUG(0,("smbw_setshared failed (%s)\n", strerror(errno)));
+               exit(1);
+       }
+
+       unlockit();
+}
index 28bdaad7e39411d50942dde68dec407d83c301cc..0489bb2b637d107821af203988d7b41944ed78d6 100644 (file)
 int main(int argc, char *argv[])
 {
        char *p, *u;
-       char *libd = BINDIR;
-       
+       char *libd = BINDIR;    
        pstring line;
+       extern FILE *dbf;
 
-       printf("Username: ");
-       u = fgets_slash(line, sizeof(line)-1, stdin);
+       smbw_setup_shared();
 
-       p = getpass("Password: ");
+       p = getenv("SMBW_DEBUG");
+       if (p) smbw_setshared("DEBUG", p);
+
+       p = getenv("SMBW_WORKGROUP");
+       if (p) smbw_setshared("WORKGROUP", p);
+
+       p = getenv("SMBW_USER");
+       if (p) smbw_setshared("USER", p);
+
+       p = getenv("SMBW_PASSWORD");
+       if (p) smbw_setshared("PASSWORD", p);
+
+       charset_initialise();
+
+       if (!smbw_getshared("USER")) {
+               printf("Username: ");
+               u = fgets_slash(line, sizeof(line)-1, stdin);
+               smbw_setshared("USER", u);
+       }
+
+       if (!smbw_getshared("PASSWORD")) {
+               p = getpass("Password: ");
+               smbw_setshared("PASSWORD", p);
+       }
 
-       setenv("SMBW_USER", u, 1);
-       setenv("SMBW_PASSWORD", p, 1);
        setenv("PS1", "smbsh$ ", 1);
 
        sys_getwd(line);
index 0d713da7978c2bd685850fdae4062935a0771f1c..7ddc46ca9b0e111fe983c2d5f99ba7cf0001958b 100644 (file)
@@ -58,11 +58,11 @@ void smbw_init(void)
        smbw_busy++;
 
        DEBUGLEVEL = 0;
-       setup_logging("smbw",True);
+       setup_logging("smbsh",True);
 
        dbf = stderr;
 
-       if ((p=getenv("SMBW_LOGFILE"))) {
+       if ((p=smbw_getshared("LOGFILE"))) {
                dbf = fopen(p, "a");
        }
 
@@ -81,11 +81,11 @@ void smbw_init(void)
 
        get_myname(global_myname,NULL);
 
-       if ((p=getenv("SMBW_DEBUG"))) {
+       if ((p=smbw_getshared("DEBUG"))) {
                DEBUGLEVEL = atoi(p);
        }
 
-       if ((p=getenv("SMBW_PREFIX"))) {
+       if ((p=smbw_getshared("PREFIX"))) {
                slprintf(smbw_prefix,sizeof(fstring)-1, "/%s/", p);
                string_sub(smbw_prefix,"//", "/");
                DEBUG(2,("SMBW_PREFIX is %s\n", smbw_prefix));
@@ -100,7 +100,7 @@ void smbw_init(void)
        }
        smbw_busy--;
 
-       set_maxfiles(lp_max_open_files()+10);
+       set_maxfiles(SMBW_MAX_OPEN);
 
        errno = eno;
 }
@@ -259,7 +259,7 @@ char *smbw_parse_path(const char *fname, char *server, char *share, char *path)
        p = p2;
        if (!p) {
                if (len == 0) {
-                       char *workgroup = getenv("SMBW_WORKGROUP");
+                       char *workgroup = smbw_getshared("WORKGROUP");
                        if (!workgroup) workgroup = lp_workgroup();
                        slprintf(server,sizeof(fstring)-1, "%s#1D", workgroup);
                }
@@ -364,17 +364,21 @@ struct smbw_server *smbw_server(char *server, char *share)
        struct nmb_name called, calling;
        char *p, *server_n = server;
        fstring group;
+       pstring ipenv;
+       struct in_addr ip;
+       extern struct in_addr ipzero;
 
+       ip = ipzero;
        ZERO_STRUCT(c);
 
-       username = getenv("SMBW_USER");
+       username = smbw_getshared("USER");
        if (!username) username = getenv("USER");
        if (!username) username = "guest";
 
-       workgroup = getenv("SMBW_WORKGROUP");
+       workgroup = smbw_getshared("WORKGROUP");
        if (!workgroup) workgroup = lp_workgroup();
 
-       password = getenv("SMBW_PASSWORD");
+       password = smbw_getshared("PASSWORD");
        if (!password) password = "";
 
        /* try to use an existing connection */
@@ -395,22 +399,37 @@ struct smbw_server *smbw_server(char *server, char *share)
 
        if ((p=strchr(server_n,'#')) && strcmp(p+1,"1D")==0) {
                struct in_addr ip;
+               pstring s;
+
                fstrcpy(group, server_n);
                p = strchr(group,'#');
                *p = 0;
-               if (!find_master_ip(group, &ip)) {
-                       errno = ENOENT;
-                       return NULL;
+               
+               /* cache the workgroup master lookup */
+               slprintf(s,sizeof(s)-1,"MASTER_%s", group);
+               if (!(server_n = smbw_getshared(s))) {
+                       if (!find_master_ip(group, &ip)) {
+                               errno = ENOENT;
+                               return NULL;
+                       }
+                       fstrcpy(group, inet_ntoa(ip));
+                       server_n = group;
+                       smbw_setshared(s,server_n);
                }
-               fstrcpy(group, inet_ntoa(ip));
-               server_n = group;
        }
 
        DEBUG(4,(" -> server_n=[%s] server=[%s]\n", server_n, server));
 
  again:
+       slprintf(ipenv,sizeof(ipenv)-1,"HOST_%s", server_n);
+
+       ip = ipzero;
+       if ((p=smbw_getshared(ipenv))) {
+               ip = *(interpret_addr2(p));
+       }
+
        /* have to open a new connection */
-       if (!cli_initialise(&c) || !cli_connect(&c, server_n, NULL)) {
+       if (!cli_initialise(&c) || !cli_connect(&c, server_n, &ip)) {
                errno = ENOENT;
                return NULL;
        }
@@ -453,6 +472,8 @@ struct smbw_server *smbw_server(char *server, char *share)
                return NULL;
        }
 
+       smbw_setshared(ipenv,inet_ntoa(ip));
+       
        DEBUG(4,(" tconx ok\n"));
 
        srv = (struct smbw_server *)malloc(sizeof(*srv));
index b0cf2dc2e13c33e960e447b3b7323fffd8613eaa..8de5b5776a07b61c7e49cc353adbf844bf0cfced 100644 (file)
@@ -30,7 +30,6 @@
 
 #define SMBW_PWD_ENV "PWD"
 
-
 struct smbw_server {
        struct smbw_server *next, *prev;
        struct cli_state cli;