Changes from APPLIANCE_HEAD:
[ira/wip.git] / source3 / smbd / service.c
index 272d54e3baadba54965aca1d7abc61fcb715482e..4670d601d7e6239713606d923324f9081230cd6b 100644 (file)
@@ -56,8 +56,8 @@ BOOL become_service(connection_struct *conn,BOOL do_chdir)
        snum = SNUM(conn);
   
        if (do_chdir &&
-           dos_ChDir(conn->connectpath) != 0 &&
-           dos_ChDir(conn->origpath) != 0) {
+           vfs_ChDir(conn,conn->connectpath) != 0 &&
+           vfs_ChDir(conn,conn->origpath) != 0) {
                DEBUG(0,("chdir (%s) failed\n",
                         conn->connectpath));
                return(False);
@@ -401,7 +401,7 @@ connection_struct *make_connection(char *service,char *user,char *password, int
         */
        
        if (*lp_force_group(snum)) {
-               struct group *gptr;
+               gid_t gid;
                pstring gname;
                pstring tmp_gname;
                BOOL user_must_be_member = False;
@@ -416,9 +416,9 @@ connection_struct *make_connection(char *service,char *user,char *password, int
                }
                /* default service may be a group name          */
                pstring_sub(gname,"%S",service);
-               gptr = (struct group *)getgrnam(gname);
+               gid = nametogid(gname);
                
-               if (gptr) {
+               if (gid != (gid_t)-1) {
                        /*
                         * If the user has been forced and the forced group starts
                         * with a '+', then we only set the group to be the forced
@@ -426,16 +426,12 @@ connection_struct *make_connection(char *service,char *user,char *password, int
                         * Otherwise, the meaning of the '+' would be ignored.
                         */
                        if (conn->force_user && user_must_be_member) {
-                               int i;
-                               for (i = 0; gptr->gr_mem[i] != NULL; i++) {
-                                       if (strcmp(user,gptr->gr_mem[i]) == 0) {
-                                               conn->gid = gptr->gr_gid;
+                               if (user_in_group_list( user, gname )) {
+                                               conn->gid = gid;
                                                DEBUG(3,("Forced group %s for member %s\n",gname,user));
-                                               break;
-                                       }
                                }
                        } else {
-                               conn->gid = gptr->gr_gid;
+                               conn->gid = gid;
                                DEBUG(3,("Forced group %s\n",gname));
                        }
                } else {
@@ -456,70 +452,25 @@ connection_struct *make_connection(char *service,char *user,char *password, int
        conn->ngroups = 0;
        conn->groups = NULL;
        
-       if (!IS_IPC(conn)) {
-               /* Find all the groups this uid is in and
-                  store them. Used by become_user() */
-               initialise_groups(conn->user, conn->uid, conn->gid); 
-               initialize_groups(conn->user, conn->uid, conn->gid); 
-               get_current_groups(&conn->ngroups,&conn->groups);
+       /* Find all the groups this uid is in and
+          store them. Used by become_user() */
+       initialise_groups(conn->user, conn->uid, conn->gid); 
+       get_current_groups(&conn->ngroups,&conn->groups);
                
-               /* check number of connections */
-               if (!claim_connection(conn,
-                                     lp_servicename(SNUM(conn)),
-                                     lp_max_connections(SNUM(conn)),
-                                     False)) {
-                       DEBUG(1,("too many connections - rejected\n"));
-                       *ecode = ERRnoresource;
-                       conn_free(conn);
-                       return NULL;
-               }  
-               
-               if (lp_status(SNUM(conn)))
-                       claim_connection(conn,"",
-                                        MAXSTATUS,False);
-       } /* IS_IPC */
-
-       conn->nt_user_token = create_nt_token(conn->uid, conn->gid, conn->ngroups, conn->groups);
-
-       /*
-        * Now initialize the vfs layer.
-        */
-
-       conn->vfs_conn = (struct vfs_connection_struct *)
-               malloc(sizeof(struct vfs_connection_struct));
-
-       if (conn->vfs_conn == NULL) {
-               DEBUG(0, ("No memory to create vfs_connection_struct"));
+       /* check number of connections */
+       if (!claim_connection(conn,
+                             lp_servicename(SNUM(conn)),
+                             lp_max_connections(SNUM(conn)),
+                             False)) {
+               DEBUG(1,("too many connections - rejected\n"));
+               *ecode = ERRnoresource;
+               conn_free(conn);
                return NULL;
-       }
-        
-       ZERO_STRUCTP(conn->vfs_conn);
-
-       /* Copy across relevant data from connection struct */
-        
-       conn->vfs_conn->printer = conn->printer;
-       conn->vfs_conn->ipc = conn->ipc;
-       conn->vfs_conn->read_only = conn->read_only;
-       conn->vfs_conn->admin_user = conn->admin_user;
-
-       pstrcpy(conn->vfs_conn->dirpath, conn->dirpath);
-       pstrcpy(conn->vfs_conn->connectpath, conn->connectpath);
-       pstrcpy(conn->vfs_conn->origpath, conn->origpath);
-        
-       pstrcpy(conn->vfs_conn->service, service);
-       pstrcpy(conn->vfs_conn->user, conn->user);
-        
-       conn->vfs_conn->uid = conn->uid;
-       conn->vfs_conn->gid = conn->gid;
-       conn->vfs_conn->ngroups = conn->ngroups;
-       if (conn->vfs_conn->ngroups != 0) {
-               conn->vfs_conn->groups = (gid_t *)memdup(conn->groups, 
-                                                        conn->ngroups * sizeof(gid_t));
-       } else {
-               conn->vfs_conn->groups = NULL;
-       }
-
-       conn->vfs_conn->nt_user_token = dup_nt_token(conn->nt_user_token);
+       }  
+               
+       conn->nt_user_token = create_nt_token(conn->uid, conn->gid, 
+                                             conn->ngroups, conn->groups,
+                                             guest);
 
        /* Initialise VFS function pointers */
 
@@ -530,6 +481,8 @@ connection_struct *make_connection(char *service,char *user,char *password, int
            /* Loadable object file */
 
            if (!vfs_init_custom(conn)) {
+               DEBUG(0, ("vfs_init failed\n"));
+                   conn_free(conn);
                        return NULL;
            }
 #else
@@ -562,30 +515,21 @@ connection_struct *make_connection(char *service,char *user,char *password, int
        
        if (!become_user(conn, conn->vuid)) {
                DEBUG(0,("Can't become connected user!\n"));
-               if (!IS_IPC(conn)) {
-                       yield_connection(conn,
-                                        lp_servicename(SNUM(conn)),
-                                        lp_max_connections(SNUM(conn)));
-                       if (lp_status(SNUM(conn))) {
-                               yield_connection(conn,"",MAXSTATUS);
-                       }
-               }
+               yield_connection(conn,
+                                lp_servicename(SNUM(conn)),
+                                lp_max_connections(SNUM(conn)));
                conn_free(conn);
                *ecode = ERRbadpw;
                return NULL;
        }
        
-       if (dos_ChDir(conn->connectpath) != 0) {
+       if (vfs_ChDir(conn,conn->connectpath) != 0) {
                DEBUG(0,("Can't change directory to %s (%s)\n",
                         conn->connectpath,strerror(errno)));
                unbecome_user();
-               if (!IS_IPC(conn)) {
-                       yield_connection(conn,
-                                        lp_servicename(SNUM(conn)),
-                                        lp_max_connections(SNUM(conn)));
-                       if (lp_status(SNUM(conn))) 
-                               yield_connection(conn,"",MAXSTATUS);
-               }
+               yield_connection(conn,
+                                lp_servicename(SNUM(conn)),
+                                lp_max_connections(SNUM(conn)));
                conn_free(conn);
                *ecode = ERRnosuchshare;
                return NULL;
@@ -598,9 +542,9 @@ connection_struct *make_connection(char *service,char *user,char *password, int
        {
                pstring s;
                pstrcpy(s,conn->connectpath);
-               dos_GetWd(s);
+               vfs_GetWd(conn,s);
                string_set(&conn->connectpath,s);
-               dos_ChDir(conn->connectpath);
+               vfs_ChDir(conn,conn->connectpath);
        }
 #endif
        
@@ -646,7 +590,7 @@ connection_struct *make_connection(char *service,char *user,char *password, int
        /* Invoke VFS make connection hook */
 
        if (conn->vfs_ops.connect) {
-               if (conn->vfs_ops.connect(conn->vfs_conn, service, user) < 0)
+               if (conn->vfs_ops.connect(conn, service, user) < 0)
                        return NULL;
        }
             
@@ -671,7 +615,7 @@ void close_cnum(connection_struct *conn, uint16 vuid)
 
            /* Call VFS disconnect hook */
            
-           conn->vfs_ops.disconnect();
+           conn->vfs_ops.disconnect(conn);
            
        }
 
@@ -679,9 +623,6 @@ void close_cnum(connection_struct *conn, uint16 vuid)
                         lp_servicename(SNUM(conn)),
                         lp_max_connections(SNUM(conn)));
 
-       if (lp_status(SNUM(conn)))
-               yield_connection(conn,"",MAXSTATUS);
-
        file_close_conn(conn);
        dptr_closecnum(conn);