Removed version number from file header.
[samba.git] / source3 / rpc_server / srv_srvsvc_nt.c
index d071572804e2b0d782fc8e0f283763333785ede2..148bcb4d1e820b6e188a7b632a870a195becb0ff 100644 (file)
@@ -1,6 +1,5 @@
 /* 
- *  Unix SMB/Netbios implementation.
- *  Version 1.9.
+ *  Unix SMB/CIFS implementation.
  *  RPC Pipe client / server routines
  *  Copyright (C) Andrew Tridgell              1992-1997,
  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
 
 #include "includes.h"
 
-extern int DEBUGLEVEL;
 extern pstring global_myname;
 
 /*******************************************************************
  Fill in a share info level 1 structure.
  ********************************************************************/
 
-static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum)
+static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum)
 {
        int len_net_name;
        pstring net_name;
@@ -42,7 +40,7 @@ static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum)
 
        pstrcpy(net_name, lp_servicename(snum));
        pstrcpy(remark, lp_comment(snum));
-       pstring_sub(remark,"%S",lp_servicename(snum));
+       standard_sub_conn(p->conn, remark);
        len_net_name = strlen(net_name);
 
        /* work out the share type */
@@ -63,7 +61,7 @@ static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum)
  Fill in a share info level 2 structure.
  ********************************************************************/
 
-static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum)
+static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum)
 {
        int len_net_name;
        pstring net_name;
@@ -74,7 +72,7 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum)
 
        pstrcpy(net_name, lp_servicename(snum));
        pstrcpy(remark, lp_comment(snum));
-       pstring_sub(remark,"%S",lp_servicename(snum));
+       standard_sub_conn(p->conn, remark);
        pstrcpy(path, "C:");
        pstrcat(path, lp_pathname(snum));
 
@@ -117,34 +115,46 @@ static void smb_conf_updated(int msg_type, pid_t src, void *buf, size_t len)
  ********************************************************************/
 
 static TDB_CONTEXT *share_tdb; /* used for share security descriptors */
-#define SHARE_DATABASE_VERSION 1
+#define SHARE_DATABASE_VERSION_V1 1
+#define SHARE_DATABASE_VERSION_V2 2 /* version id in little endian. */
 
 BOOL share_info_db_init(void)
 {
-    static pid_t local_pid;
-    char *vstring = "INFO/version";
+       static pid_t local_pid;
+       char *vstring = "INFO/version";
+       int32 vers_id;
  
-    if (share_tdb && local_pid == sys_getpid()) return True;
-    share_tdb = tdb_open_log(lock_path("share_info.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
-    if (!share_tdb) {
-        DEBUG(0,("Failed to open share info database %s (%s)\n",
-                               lock_path("share_info.tdb"), strerror(errno) ));
-        return False;
-    }
+       if (share_tdb && local_pid == sys_getpid())
+               return True;
+       share_tdb = tdb_open_log(lock_path("share_info.tdb"), 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
+       if (!share_tdb) {
+               DEBUG(0,("Failed to open share info database %s (%s)\n",
+                       lock_path("share_info.tdb"), strerror(errno) ));
+               return False;
+       }
  
-    local_pid = sys_getpid();
+       local_pid = sys_getpid();
  
-    /* handle a Samba upgrade */
-    tdb_lock_bystring(share_tdb, vstring);
-    if (tdb_fetch_int(share_tdb, vstring) != SHARE_DATABASE_VERSION) {
-        tdb_traverse(share_tdb, (tdb_traverse_func)tdb_delete, NULL);
-        tdb_store_int(share_tdb, vstring, SHARE_DATABASE_VERSION);
-    }
-    tdb_unlock_bystring(share_tdb, vstring);
+       /* handle a Samba upgrade */
+       tdb_lock_bystring(share_tdb, vstring);
+
+       /* Cope with byte-reversed older versions of the db. */
+       vers_id = tdb_fetch_int32(share_tdb, vstring);
+       if ((vers_id == SHARE_DATABASE_VERSION_V1) || (IREV(vers_id) == SHARE_DATABASE_VERSION_V1)) {
+               /* Written on a bigendian machine with old fetch_int code. Save as le. */
+               tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2);
+               vers_id = SHARE_DATABASE_VERSION_V2;
+       }
+
+       if (vers_id != SHARE_DATABASE_VERSION_V2) {
+               tdb_traverse(share_tdb, tdb_traverse_delete_fn, NULL);
+               tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2);
+       }
+       tdb_unlock_bystring(share_tdb, vstring);
 
        message_register(MSG_SMB_CONF_UPDATED, smb_conf_updated);
  
-    return True;
+       return True;
 }
 
 /*******************************************************************
@@ -226,7 +236,7 @@ static BOOL set_share_security(TALLOC_CTX *ctx, const char *share_name, SEC_DESC
 
        prs_init(&ps, (uint32)sec_desc_size(psd), mem_ctx, MARSHALL);
  
-    if (!sec_io_desc("nt_printing_setsec", &psd, &ps, 1)) {
+    if (!sec_io_desc("share_security", &psd, &ps, 1)) {
         goto out;
     }
  
@@ -303,12 +313,12 @@ void map_generic_share_sd_bits(SEC_DESC *psd)
 
 BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 desired_access)
 {
-       uint32 granted, status;
+       uint32 granted;
+       NTSTATUS status;
        TALLOC_CTX *mem_ctx = NULL;
        SEC_DESC *psd = NULL;
        size_t sd_size;
-       struct current_user tmp_user;
-       struct current_user *puser = NULL;
+       NT_USER_TOKEN *token = NULL;
        user_struct *vuser = get_valid_user_struct(vuid);
        BOOL ret = True;
 
@@ -321,26 +331,12 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d
        if (!psd)
                goto out;
 
-       ZERO_STRUCT(tmp_user);
-       if (vuser) {
-               tmp_user.vuid = vuid;
-               tmp_user.uid = vuser->uid;
-               tmp_user.gid = vuser->gid;
-               tmp_user.ngroups = vuser->n_groups;
-               tmp_user.groups = vuser->groups;
-               tmp_user.nt_user_token = vuser->nt_user_token;
-       } else {
-               tmp_user.vuid = vuid;
-               tmp_user.uid = conn->uid;
-               tmp_user.gid = conn->gid;
-               tmp_user.ngroups = conn->ngroups;
-               tmp_user.groups = conn->groups;
-               tmp_user.nt_user_token = conn->nt_user_token;
-       }
-
-       puser = &tmp_user;
+       if (vuser)
+               token = vuser->nt_user_token;
+       else
+               token = conn->nt_user_token;
 
-       ret = se_access_check(psd, puser, desired_access, &granted, &status);
+       ret = se_access_check(psd, token, desired_access, &granted, &status);
 
   out:
 
@@ -353,7 +349,7 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d
  Fill in a share info level 502 structure.
  ********************************************************************/
 
-static void init_srv_share_info_502(TALLOC_CTX *ctx, SRV_SHARE_INFO_502 *sh502, int snum)
+static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum)
 {
        int len_net_name;
        pstring net_name;
@@ -363,12 +359,14 @@ static void init_srv_share_info_502(TALLOC_CTX *ctx, SRV_SHARE_INFO_502 *sh502,
        uint32 type;
        SEC_DESC *sd;
        size_t sd_size;
+       TALLOC_CTX *ctx = p->mem_ctx;
+
 
        ZERO_STRUCTP(sh502);
 
        pstrcpy(net_name, lp_servicename(snum));
        pstrcpy(remark, lp_comment(snum));
-       pstring_sub(remark,"%S",lp_servicename(snum));
+       standard_sub_conn(p->conn, remark);
        pstrcpy(path, "C:");
        pstrcat(path, lp_pathname(snum));
 
@@ -406,11 +404,8 @@ static void init_srv_share_info_1005(SRV_SHARE_INFO_1005* sh1005, int snum)
 {
        sh1005->dfs_root_flag = 0;
 
-#ifdef WITH_MSDFS
        if(lp_host_msdfs() && lp_msdfs_root(snum))
                sh1005->dfs_root_flag = 3;
-#endif
-
 }
 
 /*******************************************************************
@@ -429,12 +424,13 @@ static BOOL is_admin_share(int snum)
  Fill in a share info structure.
  ********************************************************************/
 
-static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr,
+static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
               uint32 info_level, uint32 *resume_hnd, uint32 *total_entries, BOOL all_shares)
 {
        int num_entries = 0;
        int num_services = lp_numservices();
        int snum;
+       TALLOC_CTX *ctx = p->mem_ctx;
 
        DEBUG(5,("init_srv_share_info_ctr\n"));
 
@@ -466,7 +462,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr,
 
                for (snum = *resume_hnd; snum < num_services; snum++) {
                        if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) {
-                               init_srv_share_info_1(&info1[i++], snum);
+                               init_srv_share_info_1(p, &info1[i++], snum);
                        }
                }
 
@@ -483,7 +479,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr,
 
                for (snum = *resume_hnd; snum < num_services; snum++) {
                        if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) {
-                               init_srv_share_info_2(&info2[i++], snum);
+                               init_srv_share_info_2(p, &info2[i++], snum);
                        }
                }
 
@@ -500,7 +496,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr,
 
                for (snum = *resume_hnd; snum < num_services; snum++) {
                        if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) {
-                               init_srv_share_info_502(ctx, &info502[i++], snum);
+                               init_srv_share_info_502(p, &info502[i++], snum);
                        }
                }
 
@@ -520,14 +516,14 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr,
  Inits a SRV_R_NET_SHARE_ENUM structure.
 ********************************************************************/
 
-static void init_srv_r_net_share_enum(TALLOC_CTX *ctx, SRV_R_NET_SHARE_ENUM *r_n,
+static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n,
                                      uint32 info_level, uint32 resume_hnd, BOOL all)  
 {
        DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
 
-       if (init_srv_share_info_ctr(ctx, &r_n->ctr, info_level,
+       if (init_srv_share_info_ctr(p, &r_n->ctr, info_level,
                                    &resume_hnd, &r_n->total_entries, all)) {
-               r_n->status = NT_STATUS_NOPROBLEMO;
+               r_n->status = NT_STATUS_OK;
        } else {
                r_n->status = NT_STATUS_INVALID_INFO_CLASS;
        }
@@ -539,10 +535,10 @@ static void init_srv_r_net_share_enum(TALLOC_CTX *ctx, SRV_R_NET_SHARE_ENUM *r_n
  Inits a SRV_R_NET_SHARE_GET_INFO structure.
 ********************************************************************/
 
-static void init_srv_r_net_share_get_info(TALLOC_CTX *ctx, SRV_R_NET_SHARE_GET_INFO *r_n,
+static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_INFO *r_n,
                                  char *share_name, uint32 info_level)
 {
-       uint32 status = NT_STATUS_NOPROBLEMO;
+       NTSTATUS status = NT_STATUS_OK;
        int snum;
 
        DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
@@ -554,13 +550,13 @@ static void init_srv_r_net_share_get_info(TALLOC_CTX *ctx, SRV_R_NET_SHARE_GET_I
        if (snum >= 0) {
                switch (info_level) {
                case 1:
-                       init_srv_share_info_1(&r_n->info.share.info1, snum);
+                       init_srv_share_info_1(p, &r_n->info.share.info1, snum);
                        break;
                case 2:
-                       init_srv_share_info_2(&r_n->info.share.info2, snum);
+                       init_srv_share_info_2(p, &r_n->info.share.info2, snum);
                        break;
                case 502:
-                       init_srv_share_info_502(ctx, &r_n->info.share.info502, snum);
+                       init_srv_share_info_502(p, &r_n->info.share.info502, snum);
                        break;
                case 1005:
                        init_srv_share_info_1005(&r_n->info.share.info1005, snum);
@@ -574,7 +570,7 @@ static void init_srv_r_net_share_get_info(TALLOC_CTX *ctx, SRV_R_NET_SHARE_GET_I
                status = NT_STATUS_BAD_NETWORK_NAME;
        }
 
-       r_n->info.ptr_share_ctr = (status == NT_STATUS_NOPROBLEMO) ? 1 : 0;
+       r_n->info.ptr_share_ctr = NT_STATUS_IS_OK(status) ? 1 : 0;
        r_n->status = status;
 }
 
@@ -691,10 +687,10 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto
  makes a SRV_R_NET_SESS_ENUM structure.
 ********************************************************************/
 
-static uint32 init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr,
+static NTSTATUS init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr,
                                int switch_value, uint32 *resume_hnd, uint32 *total_entries)
 {
-       uint32 status = NT_STATUS_NOPROBLEMO;
+       NTSTATUS status = NT_STATUS_OK;
        DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
 
        ctr->switch_value = switch_value;
@@ -736,7 +732,7 @@ static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n,
        else
                r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
 
-       if (r_n->status != NT_STATUS_NOPROBLEMO)
+       if (NT_STATUS_IS_ERR(r_n->status))
                resume_hnd = 0;
 
        init_enum_hnd(&r_n->enum_hnd, resume_hnd);
@@ -847,10 +843,10 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto
  makes a SRV_R_NET_CONN_ENUM structure.
 ********************************************************************/
 
-static uint32 init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
+static NTSTATUS init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
                                int switch_value, uint32 *resume_hnd, uint32 *total_entries)
 {
-       uint32 status = NT_STATUS_NOPROBLEMO;
+       NTSTATUS status = NT_STATUS_OK;
        DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
 
        ctr->switch_value = switch_value;
@@ -891,7 +887,7 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
        else
                r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
 
-       if (r_n->status != NT_STATUS_NOPROBLEMO)
+       if (NT_STATUS_IS_ERR(r_n->status))
                resume_hnd = 0;
 
        init_enum_hnd(&r_n->enum_hnd, resume_hnd);
@@ -947,10 +943,10 @@ static void init_srv_file_info_3(SRV_FILE_INFO_3 *fl3, uint32 *fnum, uint32 *fto
  makes a SRV_R_NET_FILE_ENUM structure.
 ********************************************************************/
 
-static uint32 init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr,
+static NTSTATUS init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr,
                                int switch_value, uint32 *resume_hnd, uint32 *total_entries)  
 {
-       uint32 status = NT_STATUS_NOPROBLEMO;
+       NTSTATUS status = NT_STATUS_OK;
        DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__));
 
        ctr->switch_value = switch_value;
@@ -987,7 +983,7 @@ static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n,
        else
                r_n->status = init_srv_file_info_ctr(r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries));
 
-       if (r_n->status != NT_STATUS_NOPROBLEMO)
+       if (NT_STATUS_IS_ERR(r_n->status))
                resume_hnd = 0;
 
        init_enum_hnd(&r_n->enum_hnd, resume_hnd);
@@ -997,9 +993,9 @@ static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n,
 net server get info
 ********************************************************************/
 
-uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u)
+NTSTATUS _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u)
 {
-       uint32 status = NT_STATUS_NOPROBLEMO;
+       NTSTATUS status = NT_STATUS_OK;
        SRV_INFO_CTR *ctr = (SRV_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_INFO_CTR));
 
        if (!ctr)
@@ -1047,11 +1043,33 @@ uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R
        return r_u->status;
 }
 
+/*******************************************************************
+net server set info
+********************************************************************/
+
+NTSTATUS _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u)
+{
+       /* NT gives "Windows NT error 0xc00000022" if we return
+          NT_STATUS_ACCESS_DENIED here so just pretend everything is OK. */
+
+       NTSTATUS status = NT_STATUS_OK;
+
+       DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
+
+       /* Set up the net server set info structure. */
+
+       init_srv_r_net_srv_set_info(r_u, 0x0, status);
+
+       DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
+
+       return r_u->status;
+}
+
 /*******************************************************************
 net file enum
 ********************************************************************/
 
-uint32 _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
+NTSTATUS _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
 {
        r_u->ctr = (SRV_FILE_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_FILE_INFO_CTR));
        if (!r_u->ctr)
@@ -1076,7 +1094,7 @@ uint32 _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_F
 net conn enum
 ********************************************************************/
 
-uint32 _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
+NTSTATUS _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
 {
        DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
 
@@ -1101,7 +1119,7 @@ uint32 _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_C
 net sess enum
 ********************************************************************/
 
-uint32 _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
+NTSTATUS _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
 {
        DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
 
@@ -1126,12 +1144,12 @@ uint32 _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_S
  Net share enum all.
 ********************************************************************/
 
-uint32 _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
+NTSTATUS _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
 {
        DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
 
        /* Create the list of shares for the response. */
-       init_srv_r_net_share_enum(p->mem_ctx, r_u,
+       init_srv_r_net_share_enum(p, r_u,
                                q_u->ctr.info_level,
                                get_enum_hnd(&q_u->enum_hnd), True);
 
@@ -1144,12 +1162,12 @@ uint32 _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R
  Net share enum.
 ********************************************************************/
 
-uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
+NTSTATUS _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
 {
        DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
 
        /* Create the list of shares for the response. */
-       init_srv_r_net_share_enum(p->mem_ctx, r_u,
+       init_srv_r_net_share_enum(p, r_u,
                                q_u->ctr.info_level,
                                get_enum_hnd(&q_u->enum_hnd), False);
 
@@ -1162,7 +1180,7 @@ uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET
  Net share get info.
 ********************************************************************/
 
-uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u)
+NTSTATUS _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u)
 {
        fstring share_name;
 
@@ -1170,7 +1188,7 @@ uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S
 
        /* Create the list of shares for the response. */
        unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
-       init_srv_r_net_share_get_info(p->mem_ctx, r_u, share_name, q_u->info_level);
+       init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level);
 
        DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
 
@@ -1207,9 +1225,7 @@ static char *valid_share_pathname(char *dos_pathname)
        if (getcwd(saved_pathname, sizeof(saved_pathname)) == NULL)
                return False;
 
-       /* Convert to UNIX charset. */
        pstrcpy(unix_pathname, ptr);
-       dos_to_unix(unix_pathname, True);
        
        ret = chdir(unix_pathname);
 
@@ -1224,7 +1240,7 @@ static char *valid_share_pathname(char *dos_pathname)
  Net share set info. Modify share details.
 ********************************************************************/
 
-uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u)
+NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u)
 {
        struct current_user user;
        pstring command;
@@ -1244,27 +1260,27 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
        r_u->switch_value = 0;
 
        if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global"))
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        snum = find_service(share_name);
 
        /* Does this share exist ? */
        if (snum < 0)
-               return ERRnosuchshare;
+               return NT_STATUS_BAD_NETWORK_NAME;
 
        /* No change to printer shares. */
        if (lp_print_ok(snum))
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        get_current_user(&user,p);
 
        if (user.uid != 0)
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        switch (q_u->info_level) {
        case 1:
                /* Not enough info in a level 1 to do anything. */
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        case 2:
                unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
                unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
@@ -1279,7 +1295,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
                map_generic_share_sd_bits(psd);
                break;
        case 1005:
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        case 1501:
                fstrcpy(pathname, lp_pathname(snum));
                fstrcpy(comment, lp_comment(snum));
@@ -1294,11 +1310,11 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
 
        /* We can only modify disk shares. */
        if (type != STYPE_DISKTREE)
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
                
        /* Check if the pathname is valid. */
        if (!(ptr = valid_share_pathname( pathname )))
-               return ERRbadpath;
+               return NT_STATUS_OBJECT_PATH_INVALID;
 
        /* Ensure share name, pathname and comment don't contain '"' characters. */
        string_replace(share_name, '"', ' ');
@@ -1312,20 +1328,20 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
 
        if (strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) {
                if (!lp_change_share_cmd() || !*lp_change_share_cmd())
-                       return ERROR_ACCESS_DENIED;
+                       return NT_STATUS_ACCESS_DENIED;
 
                slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"",
-                               lp_change_share_cmd(), CONFIGFILE, share_name, ptr, comment);
-               dos_to_unix(command, True);  /* Convert to unix-codepage */
+                               lp_change_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment);
 
                DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
                if ((ret = smbrun(command, NULL)) != 0) {
                        DEBUG(0,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));
-                       return ERROR_ACCESS_DENIED;
+                       return NT_STATUS_ACCESS_DENIED;
                }
 
                /* Tell everyone we updated smb.conf. */
-               message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False);
+               message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL,
+                                0, False, NULL);
 
        } else {
                DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
@@ -1347,14 +1363,14 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
 
        DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
 
-       return NT_STATUS_NOPROBLEMO;
+       return NT_STATUS_OK;
 }
 
 /*******************************************************************
  Net share add. Call 'add_share_command "sharename" "pathname" "comment" "read only = xxx"'
 ********************************************************************/
 
-uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
+NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
 {
        struct current_user user;
        pstring command;
@@ -1375,18 +1391,18 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
 
        if (user.uid != 0) {
                DEBUG(10,("_srv_net_share_add: uid != 0. Access denied.\n"));
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        }
 
        if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
                DEBUG(10,("_srv_net_share_add: No add share command\n"));
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        }
 
        switch (q_u->info_level) {
        case 1:
                /* Not enough info in a level 1 to do anything. */
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        case 2:
                unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name));
                unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
@@ -1403,28 +1419,28 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
                break;
        case 1005:
                /* DFS only level. */
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        default:
                DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
                return NT_STATUS_INVALID_INFO_CLASS;
        }
 
        if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global"))
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        snum = find_service(share_name);
 
        /* Share already exists. */
        if (snum >= 0)
-               return ERRfilexists;
+               return NT_STATUS_OBJECT_NAME_COLLISION;
 
        /* We can only add disk shares. */
        if (type != STYPE_DISKTREE)
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
                
        /* Check if the pathname is valid. */
        if (!(ptr = valid_share_pathname( pathname )))
-               return ERRbadpath;
+               return NT_STATUS_OBJECT_PATH_INVALID;
 
        /* Ensure share name, pathname and comment don't contain '"' characters. */
        string_replace(share_name, '"', ' ');
@@ -1432,13 +1448,12 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
        string_replace(comment, '"', ' ');
 
        slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"",
-                       lp_add_share_cmd(), CONFIGFILE, share_name, ptr, comment);
-       dos_to_unix(command, True);  /* Convert to unix-codepage */
+                       lp_add_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment);
 
        DEBUG(10,("_srv_net_share_add: Running [%s]\n", command ));
        if ((ret = smbrun(command, NULL)) != 0) {
                DEBUG(0,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret ));
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        }
 
        if (psd) {
@@ -1448,7 +1463,8 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
        }
 
        /* Tell everyone we updated smb.conf. */
-       message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False);
+       message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False,
+                        NULL);
 
        /*
         * We don't call reload_services() here, the message will
@@ -1458,7 +1474,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
 
        DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
 
-       return NT_STATUS_NOPROBLEMO;
+       return NT_STATUS_OK;
 }
 
 /*******************************************************************
@@ -1466,7 +1482,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
  a parameter.
 ********************************************************************/
 
-uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
+NTSTATUS _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
 {
        struct current_user user;
        pstring command;
@@ -1479,51 +1495,51 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S
        unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
 
        if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global"))
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        snum = find_service(share_name);
 
        if (snum < 0)
-               return ERRnosuchshare;
+               return NT_STATUS_BAD_NETWORK_NAME;
 
        /* No change to printer shares. */
        if (lp_print_ok(snum))
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        get_current_user(&user,p);
 
        if (user.uid != 0)
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        if (!lp_delete_share_cmd() || !*lp_delete_share_cmd())
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
 
        slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"",
-                       lp_delete_share_cmd(), CONFIGFILE, lp_servicename(snum));
-       dos_to_unix(command, True);  /* Convert to unix-codepage */
+                       lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum));
 
        DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
        if ((ret = smbrun(command, NULL)) != 0) {
                DEBUG(0,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
-               return ERROR_ACCESS_DENIED;
+               return NT_STATUS_ACCESS_DENIED;
        }
 
        /* Delete the SD in the database. */
        delete_share_security(snum);
 
        /* Tell everyone we updated smb.conf. */
-       message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False);
+       message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False,
+                        NULL);
 
        lp_killservice(snum);
 
-       return NT_STATUS_NOPROBLEMO;
+       return NT_STATUS_OK;
 }
 
 /*******************************************************************
 time of day
 ********************************************************************/
 
-uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
+NTSTATUS _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
 {
        TIME_OF_DAY_INFO *tod;
        struct tm *t;
@@ -1537,7 +1553,7 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET
  
        r_u->tod = tod;
        r_u->ptr_srv_tod = 0x1;
-       r_u->status = NT_STATUS_NOPROBLEMO;
+       r_u->status = NT_STATUS_OK;
 
        DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
 
@@ -1567,12 +1583,12 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET
  Win9x NT tools get security descriptor.
 ***********************************************************************************/
 
-uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
+NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
                        SRV_R_NET_FILE_QUERY_SECDESC *r_u)
 {
        SEC_DESC *psd = NULL;
        size_t sd_size;
-       fstring null_pw;
+       DATA_BLOB null_pw;
        pstring filename;
        pstring qualname;
        files_struct *fsp = NULL;
@@ -1580,45 +1596,54 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
        BOOL bad_path;
        int access_mode;
        int action;
-       int ecode;
+       NTSTATUS nt_status;
        struct current_user user;
-       fstring user_name;
        connection_struct *conn = NULL;
+       BOOL became_user = False;
 
        ZERO_STRUCT(st);
 
-       r_u->status = NT_STATUS_NOPROBLEMO;
+       r_u->status = NT_STATUS_OK;
 
        unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
 
        /* Null password is ok - we are already an authenticated user... */
-       *null_pw = '\0';
-
-       get_current_user(&user, p);
-       fstrcpy(user_name, uidtoname(user.uid));
+       null_pw = data_blob(NULL, 0);
 
-       conn = make_connection(qualname, user_name, "", 0, "A:", user.vuid, &ecode);
+       get_current_user(&user, p);     
+       
+       become_root();
+       conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
+       unbecome_root();
 
        if (conn == NULL) {
                DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
-               r_u->status = (uint32)ecode;
+               r_u->status = nt_status;
                goto error_exit;
        }
 
+       if (!become_user(conn, conn->vuid)) {
+               DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
+               r_u->status = NT_STATUS_ACCESS_DENIED;
+               goto error_exit;
+       }
+       became_user = True;
+
        unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
        unix_convert(filename, conn, NULL, &bad_path, &st);
+
        fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDONLY),
-                               (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action);
+                              (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action);
 
        if (!fsp) {
                /* Perhaps it is a directory */
                if (errno == EISDIR)
-                       fsp = open_directory(conn, filename, &st,
-                                       (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action);
+                       fsp = open_directory(conn, filename, &st,0,
+                                            (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action);
 
                if (!fsp) {
                        DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename));
-                       r_u->status = ERROR_ACCESS_DENIED;
+                       r_u->status = NT_STATUS_ACCESS_DENIED;
                        goto error_exit;
                }
        }
@@ -1627,7 +1652,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
 
        if (sd_size == 0) {
                DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
-               r_u->status = ERROR_ACCESS_DENIED;
+               r_u->status = NT_STATUS_ACCESS_DENIED;
                goto error_exit;
        }
 
@@ -1640,8 +1665,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
        psd->dacl->revision = (uint16) NT4_ACL_REVISION;
 
        close_file(fsp, True);
-       file_free(fsp);
-
+       unbecome_user();
        close_cnum(conn, user.vuid);
        return r_u->status;
 
@@ -1649,9 +1673,11 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
 
        if(fsp) {
                close_file(fsp, True);
-               file_free(fsp);
        }
 
+       if (became_user)
+               unbecome_user();
+
        if (conn) 
                close_cnum(conn, user.vuid);
 
@@ -1662,58 +1688,66 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
  Win9x NT tools set security descriptor.
 ***********************************************************************************/
 
-uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
+NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
                                                                        SRV_R_NET_FILE_SET_SECDESC *r_u)
 {
        BOOL ret;
+       DATA_BLOB null_pw;
        pstring filename;
        pstring qualname;
-       fstring null_pw;
        files_struct *fsp = NULL;
        SMB_STRUCT_STAT st;
        BOOL bad_path;
        int access_mode;
        int action;
-       int ecode;
+       NTSTATUS nt_status;
        struct current_user user;
-       fstring user_name;
        connection_struct *conn = NULL;
+       BOOL became_user = False;
 
        ZERO_STRUCT(st);
 
-       r_u->status = NT_STATUS_NOPROBLEMO;
+       r_u->status = NT_STATUS_OK;
 
        unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
 
        /* Null password is ok - we are already an authenticated user... */
-       *null_pw = '\0';
-
-       get_current_user(&user, p);
-       fstrcpy(user_name, uidtoname(user.uid));
+       null_pw = data_blob(NULL, 0);
 
-       conn = make_connection(qualname, user_name, null_pw, 0, "A:", user.vuid, &ecode);
+       get_current_user(&user, p);     
+       
+       become_root();
+       conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
+       unbecome_root();
 
        if (conn == NULL) {
                DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
-               r_u->status = (uint32)ecode;
+               r_u->status = nt_status;
                goto error_exit;
        }
 
+       if (!become_user(conn, conn->vuid)) {
+               DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
+               r_u->status = NT_STATUS_ACCESS_DENIED;
+               goto error_exit;
+       }
+       became_user = True;
+
        unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
        unix_convert(filename, conn, NULL, &bad_path, &st);
 
        fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDWR),
-                       (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action);
+                              (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action);
 
        if (!fsp) {
                /* Perhaps it is a directory */
                if (errno == EISDIR)
-                       fsp = open_directory(conn, filename, &st,
-                                               (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action);
+                       fsp = open_directory(conn, filename, &st,0,
+                                            (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action);
 
                if (!fsp) {
                        DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename));
-                       r_u->status = ERROR_ACCESS_DENIED;
+                       r_u->status = NT_STATUS_ACCESS_DENIED;
                        goto error_exit;
                }
        }
@@ -1722,12 +1756,12 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_
 
        if (ret == False) {
                DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));
-               r_u->status = ERROR_ACCESS_DENIED;
+               r_u->status = NT_STATUS_ACCESS_DENIED;
                goto error_exit;
        }
 
        close_file(fsp, True);
-       file_free(fsp);
+       unbecome_user();
        close_cnum(conn, user.vuid);
        return r_u->status;
 
@@ -1735,9 +1769,11 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_
 
        if(fsp) {
                close_file(fsp, True);
-               file_free(fsp);
        }
 
+       if (became_user)
+               unbecome_user();
+
        if (conn) 
                close_cnum(conn, user.vuid);
 
@@ -1790,19 +1826,19 @@ static const char *next_server_disk_enum(uint32 *resume)
        return disk;
 }
 
-uint32 _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
+NTSTATUS _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
 {
        uint32 i;
        const char *disk_name;
        uint32 resume=get_enum_hnd(&q_u->enum_hnd);
 
-       r_u->status=NT_STATUS_NOPROBLEMO;
+       r_u->status=NT_STATUS_OK;
 
        r_u->total_entries = init_server_disk_enum(&resume);
 
        r_u->disk_enum_ctr.unknown = 0; 
 
-       r_u->disk_enum_ctr.disk_info_ptr = (uint32) r_u->disk_enum_ctr.disk_info;
+       r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info? 1 : 0;
 
        /*allow one DISK_INFO for null terminator*/
 
@@ -1826,12 +1862,12 @@ uint32 _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D
        return r_u->status;
 }
 
-uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
+NTSTATUS _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
 {
        int snum;
        fstring share_name;
 
-       r_u->status=NT_STATUS_NOPROBLEMO;
+       r_u->status=NT_STATUS_OK;
 
        switch(q_u->type) {
 
@@ -1850,7 +1886,7 @@ uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV
 
        default:
                /*unsupported type*/
-               r_u->status = ERROR_INVALID_LEVEL;
+               r_u->status = NT_STATUS_INVALID_LEVEL;
                break;
        }