Merge branch 'master' of ssh://git.samba.org/data/git/samba into abartlet-devel
[samba.git] / source3 / smbd / service.c
index 05197021a3242d1186e1a4e7f70f630c28261025..eb16a2601e312e76d90e63f3401fe781cf42c356 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "includes.h"
+#include "smbd/globals.h"
 
 extern userdom_struct current_user_info;
 
@@ -167,8 +168,6 @@ bool set_conn_connectpath(connection_struct *conn, const char *connectpath)
 
 bool set_current_service(connection_struct *conn, uint16 flags, bool do_chdir)
 {
-       static connection_struct *last_conn;
-       static uint16 last_flags;
        int snum;
 
        if (!conn)  {
@@ -235,6 +234,10 @@ static int load_registry_service(const char *servicename)
                return -1;
        }
 
+       if ((servicename == NULL) || (*servicename == '\0')) {
+               return -1;
+       }
+
        if (strequal(servicename, GLOBAL_NAME)) {
                return -2;
        }
@@ -830,6 +833,14 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                        *pstatus = status;
                        return NULL;
                }
+
+               /*
+                * We need to cache this gid, to use within
+                * change_to_user() separately from the conn->server_info
+                * struct. We only use conn->server_info directly if
+                * "force_user" was set.
+                */
+               conn->force_group_gid = conn->server_info->utok.gid;
        }
 
        conn->vuid = (vuser != NULL) ? vuser->vuid : UID_FIELD_INVALID;
@@ -1123,38 +1134,6 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
        return NULL;
 }
 
-/***************************************************************************************
- Simple wrapper function for make_connection() to include a call to 
- vfs_chdir()
- **************************************************************************************/
-connection_struct *make_connection_with_chdir(const char *service_in,
-                                             DATA_BLOB password, 
-                                             const char *dev, uint16 vuid,
-                                             NTSTATUS *status)
-{
-       connection_struct *conn = NULL;
-       
-       conn = make_connection(service_in, password, dev, vuid, status);
-       
-       /*
-        * make_connection() does not change the directory for us any more
-        * so we have to do it as a separate step  --jerry
-        */
-        
-       if ( conn && vfs_ChDir(conn,conn->connectpath) != 0 ) {
-               DEBUG(0,("make_connection_with_chdir: Can't change "
-                        "directory to %s for [print$] (%s)\n",
-                        conn->connectpath,strerror(errno)));
-               yield_connection(conn, lp_servicename(SNUM(conn)));
-               conn_free(conn);
-               *status = NT_STATUS_UNSUCCESSFUL;
-               return NULL;
-       }
-       
-       return conn;
-}
-
 /****************************************************************************
  Make a connection to a service.
  *