[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
authorGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 20:34:30 +0000 (15:34 -0500)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 20:34:30 +0000 (15:34 -0500)
(This used to be commit 5c6c8e1fe93f340005110a7833946191659d88ab)

248 files changed:
.bzrignore [deleted file]
WHATSNEW.txt
docs/README-NOW [deleted file]
examples/libmsrpc/cacusermgr/Makefile [deleted file]
examples/libmsrpc/cacusermgr/cacusermgr.c [deleted file]
examples/libmsrpc/cacusermgr/cacusermgr.h [deleted file]
examples/libmsrpc/cacusermgr/mgr_group.c [deleted file]
examples/libmsrpc/cacusermgr/mgr_user.c [deleted file]
examples/libmsrpc/cacusermgr/util.c [deleted file]
examples/libmsrpc/test/Makefile [deleted file]
examples/libmsrpc/test/README [deleted file]
examples/libmsrpc/test/lsa/ear.c [deleted file]
examples/libmsrpc/test/lsa/lsaenum.c [deleted file]
examples/libmsrpc/test/lsa/lsaenumprivs.c [deleted file]
examples/libmsrpc/test/lsa/lsapol.c [deleted file]
examples/libmsrpc/test/lsa/lsapriv.c [deleted file]
examples/libmsrpc/test/lsa/lsaq.c [deleted file]
examples/libmsrpc/test/lsa/lsatrust.c [deleted file]
examples/libmsrpc/test/reg/regdelete.c [deleted file]
examples/libmsrpc/test/reg/regkey.c [deleted file]
examples/libmsrpc/test/reg/regkeycreate.c [deleted file]
examples/libmsrpc/test/reg/regkeyenum.c [deleted file]
examples/libmsrpc/test/reg/regopen.c [deleted file]
examples/libmsrpc/test/reg/regopenkey.c [deleted file]
examples/libmsrpc/test/reg/regqueryval.c [deleted file]
examples/libmsrpc/test/reg/regsetval.c [deleted file]
examples/libmsrpc/test/reg/regvalenum.c [deleted file]
examples/libmsrpc/test/reg/security.c [deleted file]
examples/libmsrpc/test/reg/shutdown.c [deleted file]
examples/libmsrpc/test/sam/adduser.c [deleted file]
examples/libmsrpc/test/sam/disable.c [deleted file]
examples/libmsrpc/test/sam/dominfo.c [deleted file]
examples/libmsrpc/test/sam/enable.c [deleted file]
examples/libmsrpc/test/sam/samenum.c [deleted file]
examples/libmsrpc/test/sam/samgroup.c [deleted file]
examples/libmsrpc/test/sam/samlookup.c [deleted file]
examples/libmsrpc/test/sam/samuser.c [deleted file]
examples/libmsrpc/test/smbc_test/smbc.c [deleted file]
examples/libmsrpc/test/svcctl/svc.c [deleted file]
examples/libmsrpc/test/test_util.c [deleted file]
examples/libmsrpc/test/test_util.h [deleted file]
examples/scripts/users_and_groups/adduserstogroups.pl [deleted file]
examples/scripts/users_and_groups/createdomobj.pl [deleted file]
make-tarball.sh [deleted file]
source3/.indent.pro [new file with mode: 0644]
source3/.valgrind_suppressions [deleted file]
source3/Doxyfile
source3/Makefile.in
source3/TODO [deleted file]
source3/VERSION
source3/auth/auth_server.c
source3/client/cifs_resolver.sh [deleted file]
source3/client/client.c
source3/client/mount.cifs.c
source3/configure.in
source3/depcomp [deleted file]
source3/include/ads_protos.h
source3/include/client.h
source3/include/dcerpc.h [new file with mode: 0644]
source3/include/includes.h
source3/include/ntdomain.h
source3/include/ntioctl.h
source3/include/popt_common.h
source3/include/rpc_client.h
source3/include/rpc_misc.h
source3/include/rpc_netlogon.h
source3/include/rpc_samr.h
source3/include/rpc_srvsvc.h [new file with mode: 0644]
source3/include/smb.h
source3/include/smb_launchd.h [deleted file]
source3/include/smb_macros.h
source3/include/trans2.h
source3/lib/dbwrap_tdb.c
source3/lib/dummysmbd.c
source3/lib/launchd.c [deleted file]
source3/lib/replace/system/getaddrinfo.h [new file with mode: 0644]
source3/lib/substitute.c
source3/lib/tdb/common/tdb_private.h
source3/lib/util.c
source3/lib/util_sock.c
source3/lib/util_str.c
source3/libads/ads_status.c
source3/libads/ldap_utils.c
source3/libmsrpc/Doxyfile [deleted file]
source3/libmsrpc/cac_lsarpc.c [deleted file]
source3/libmsrpc/cac_samr.c [deleted file]
source3/libmsrpc/cac_svcctl.c [deleted file]
source3/libmsrpc/cac_winreg.c [deleted file]
source3/libmsrpc/libmsrpc.c [deleted file]
source3/libmsrpc/libmsrpc_internal.c [deleted file]
source3/libsmb/cliconnect.c
source3/libsmb/clidgram.c
source3/libsmb/clientgen.c
source3/libsmb/clierror.c
source3/libsmb/clifile.c
source3/libsmb/clifsinfo.c
source3/libsmb/clilist.c
source3/libsmb/climessage.c
source3/libsmb/clioplock.c
source3/libsmb/cliprint.c
source3/libsmb/clireadwrite.c
source3/libsmb/clitrans.c
source3/libsmb/errormap.c
source3/libsmb/libsmbclient.c
source3/libsmb/smb_seal.c [deleted file]
source3/modules/charset_macosxfs.c
source3/modules/vfs_default.c
source3/nmbd/nmbd.c
source3/nmbd/nmbd_packets.c
source3/param/loadparm.c
source3/passdb/pdb_ldap.c
source3/passdb/secrets.c
source3/python/README [deleted file]
source3/python/examples/spoolss/changeid.py [deleted file]
source3/python/examples/spoolss/enumprinters.py [deleted file]
source3/python/examples/spoolss/psec.py [deleted file]
source3/python/examples/tdbpack/oldtdbutil.py [deleted file]
source3/python/examples/tdbpack/tdbtimetrial.py [deleted file]
source3/python/examples/tdbpack/test_tdbpack.py [deleted file]
source3/python/gprinterdata [deleted file]
source3/python/gtdbtool [deleted file]
source3/python/gtkdictbrowser.py [deleted file]
source3/python/py_common.c [deleted file]
source3/python/py_common.h [deleted file]
source3/python/py_conv.c [deleted file]
source3/python/py_conv.h [deleted file]
source3/python/py_lsa.c [deleted file]
source3/python/py_lsa.h [deleted file]
source3/python/py_ntsec.c [deleted file]
source3/python/py_samr.c [deleted file]
source3/python/py_samr.h [deleted file]
source3/python/py_samr_conv.c [deleted file]
source3/python/py_smb.c [deleted file]
source3/python/py_smb.h [deleted file]
source3/python/py_spoolss.c [deleted file]
source3/python/py_spoolss.h [deleted file]
source3/python/py_spoolss_common.c [deleted file]
source3/python/py_spoolss_drivers.c [deleted file]
source3/python/py_spoolss_drivers_conv.c [deleted file]
source3/python/py_spoolss_forms.c [deleted file]
source3/python/py_spoolss_forms_conv.c [deleted file]
source3/python/py_spoolss_jobs.c [deleted file]
source3/python/py_spoolss_jobs_conv.c [deleted file]
source3/python/py_spoolss_ports.c [deleted file]
source3/python/py_spoolss_ports_conv.c [deleted file]
source3/python/py_spoolss_printerdata.c [deleted file]
source3/python/py_spoolss_printers.c [deleted file]
source3/python/py_spoolss_printers_conv.c [deleted file]
source3/python/py_srvsvc.c [deleted file]
source3/python/py_srvsvc.h [deleted file]
source3/python/py_srvsvc_conv.c [deleted file]
source3/python/py_tdb.c [deleted file]
source3/python/py_tdb.h [deleted file]
source3/python/py_tdbpack.c [deleted file]
source3/python/py_winbind.c [deleted file]
source3/python/py_winbind.h [deleted file]
source3/python/py_winbind_conv.c [deleted file]
source3/python/py_winreg.c [deleted file]
source3/python/py_winreg.h [deleted file]
source3/python/samba/__init__.py [deleted file]
source3/python/samba/printerdata.py [deleted file]
source3/python/setup.py [deleted file]
source3/rpc_client/cli_lsarpc.c
source3/rpc_client/cli_samr.c
source3/rpc_client/cli_srvsvc.c [new file with mode: 0644]
source3/rpc_parse/parse_lsa.c
source3/rpc_parse/parse_misc.c
source3/rpc_parse/parse_prs.c
source3/rpc_parse/parse_rpc.c
source3/rpc_parse/parse_samr.c
source3/rpc_parse/parse_srv.c [new file with mode: 0644]
source3/rpc_server/srv_echo_nt.c
source3/rpc_server/srv_epmapper_nt.c [deleted file]
source3/rpc_server/srv_lsa_nt.c
source3/rpc_server/srv_pipe.c
source3/rpc_server/srv_pipe_hnd.c
source3/rpc_server/srv_samr.c
source3/rpc_server/srv_spoolss_nt.c
source3/rpc_server/srv_srvsvc.c [new file with mode: 0644]
source3/rpc_server/srv_srvsvc_nt.c
source3/rpc_server/srv_svcctl_nt.c
source3/rpc_server/srv_unixinfo_nt.c [deleted file]
source3/rpcclient/cmd_lsarpc.c
source3/rpcclient/cmd_samr.c
source3/rpcclient/cmd_srvsvc.c
source3/rpcclient/cmd_unixinfo.c [deleted file]
source3/rpcclient/rpcclient.c
source3/samba3-knownfail [deleted file]
source3/samba3-skip [deleted file]
source3/samba3-skip-nobuildfarm [deleted file]
source3/script/build_idl.sh [changed mode: 0644->0755]
source3/script/mkbuildoptions.awk
source3/script/tests/gdb_backtrace [changed mode: 0755->0644]
source3/script/tests/selftest.sh
source3/script/tests/test_functions.sh
source3/script/tests/test_local_s3.sh
source3/script/tests/test_posix_s3.sh [new file with mode: 0755]
source3/script/tests/test_smbclient_s3.sh
source3/script/tests/test_smbtorture_s3.sh
source3/script/tests/tests_all.sh
source3/script/tests/tests_smbclient_s3.sh [new file with mode: 0644]
source3/services/svc_netlogon.c
source3/smbd/aio.c
source3/smbd/close.c
source3/smbd/conn.c
source3/smbd/connection.c
source3/smbd/error.c
source3/smbd/files.c
source3/smbd/notify.c
source3/smbd/open.c
source3/smbd/oplock.c
source3/smbd/pipes.c
source3/smbd/process.c
source3/smbd/reply.c
source3/smbd/seal.c [deleted file]
source3/smbd/server.c
source3/smbd/service.c
source3/smbd/session.c
source3/smbd/sockinit.c [deleted file]
source3/smbd/srvstr.c
source3/smbd/trans2.c
source3/smbd/utmp.c
source3/tests/crypttest.c
source3/tests/fcntl_lock.c
source3/tests/fcntl_lock64.c
source3/tests/ftruncate.c
source3/tests/getgroups.c
source3/tests/os2_delete.c [new file with mode: 0644]
source3/tests/shared_mmap.c
source3/tests/summary.c
source3/tests/trivial.c
source3/tests/unixsock.c
source3/utils/net.h
source3/utils/net_rpc.c
source3/utils/pdbedit.c
source3/utils/smbtree.c
source3/winbindd/winbindd.c
source3/winbindd/winbindd.h
source3/winbindd/winbindd_async.c
source3/winbindd/winbindd_cm.c
source3/winbindd/winbindd_dual.c
source3/winbindd/winbindd_idmap.c [deleted file]
source3/winbindd/winbindd_locator.c [deleted file]
source3/winbindd/winbindd_misc.c
source3/winbindd/winbindd_pam.c
source3/winbindd/winbindd_sid.c
source3/winbindd/winbindd_sockinit.c [deleted file]
source3/winbindd/winbindd_util.c

diff --git a/.bzrignore b/.bzrignore
deleted file mode 100644 (file)
index e350ef7..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-*.o
-*.po
-source/client/client_proto.h
-source/groupdb/mapping.po
-source/include/build_env.h
-source/include/config.h
-source/include/config.h.in
-source/include/proto.h
-source/include/stamp-h
-source/include/version.h
-source/Makefile
-source/config.log
-source/config.status
-source/configure
-source/dynconfig.po
-source/smbadduser
-source/bin/*
-source/script/findsmb
-source/script/gen-8bit-gap.sh
-source/script/installbin.sh
-source/script/uninstallbin.sh
-source/smbd/build_options.c
-source/utils/net_proto.h
-source/utils/ntlm_auth_proto.h
-source/web/swat_proto.h
-source/nsswitch/winbindd_proto.h
-source/tags
-source/utils/passwd_proto.h
-source/include/includes.h.gch
index beece3a88f8bb991527bcf1d20bdbe0c9fe16589..a875e2c2c5620e3a3090b6aa6eda771888c40413 100644 (file)
@@ -1,6 +1,5 @@
-                    WHATS NEW IN Samba 3 SVN
-                    ========================
-
-This file is NOT maintained but will be created during releases.
-See the SAMBA_3_2_RELEASE branch for the current WHATSNEW.
+                   ==============================
+                   Release Notes for Samba 3.2.x
+                             XX ##, 200Y
+                   ==============================
 
diff --git a/docs/README-NOW b/docs/README-NOW
deleted file mode 100644 (file)
index 261c8dd..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-                ATTENTION
-            DOCS TREE REMOVED
----------------------------------------------------
-
-This docs tree has been moved to a separate SVN 
-module on svn.samba.org named 'samba-docs'.  
-See http://svn.samba.org/samba/subversion.html
-for details on accessing Samba svn trees.  
-
-For anonymous access to samba-docs, point svn here:
-    svn://svnanon.samba.org/samba-docs/trunk
diff --git a/examples/libmsrpc/cacusermgr/Makefile b/examples/libmsrpc/cacusermgr/Makefile
deleted file mode 100644 (file)
index ab8bea4..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-CC=gcc
-INCLUDES= -I`pwd` -I../../../source/ -I../../../source/include -I../../../source/ubiqx
-
-DEFS= -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
-
-CFLAGS= -g -Wall -ansi $(INCLUDES) 
-
-OBJ= util.o mgr_group.o mgr_user.o
-
-LDFLAGS=-L. -L../../bin/ 
-LIBS=../../../source/bin/libmsrpc.so
-
-all: cacusermgr
-
-cacusermgr: cacusermgr.o $(OBJ)
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(OBJ) $(LIBS)
-
-.c.o:
-       $(CC) $(CFLAGS) -c $< -o $@
-
-clean:
-       rm -f *.o cacusermgr
diff --git a/examples/libmsrpc/cacusermgr/cacusermgr.c b/examples/libmsrpc/cacusermgr/cacusermgr.c
deleted file mode 100644 (file)
index 43c789b..0000000
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Unix SMB/CIFS implementation. 
- * cacusermgr main implementation.
- *
- * Copyright (C) Chris Nicholls     2005
- * 
- * 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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#include "cacusermgr.h"
-
-#define DEFAULT_MENU_LINES 15
-
-
-void create_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
-   struct SamCreateUser  cu;
-   struct SamCreateGroup cg;
-
-   fstring in;
-   fstring tmp;
-
-   if(!hnd || !mem_ctx || !dom_hnd) {
-      printf("No Handle to SAM.\n");
-      return;
-   }
-
-   /*the menu*/
-   in[0] = '\0';
-   while(in[0] != 'c' && in[0] != 'C' && in[0] != 'q' && in[0] != 'Q') {
-      printf("\n");
-      printf("[u] Create User\n");
-      printf("[g] Create Group\n");
-      printf("[m] Create Machine Account\n");
-      printf("[c] Cancel\n\n");
-
-      printf("Command: ");
-      mgr_getline(in);
-
-      printf("\n");
-
-      switch(in[0]) {
-         case 'u': /*create user*/
-         case 'U':
-            ZERO_STRUCT(cu);
-            cu.in.dom_hnd = dom_hnd;
-            cu.in.acb_mask = ACB_NORMAL;
-
-            printf("Enter name: ");
-            mgr_getline(tmp);
-            cu.in.name = talloc_strdup(mem_ctx, tmp);
-
-            if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {
-               printerr("Could not create user.", hnd->status);
-            }
-            else {
-               user_menu(hnd, mem_ctx, dom_hnd, cu.out.user_hnd);
-            }
-
-            /*this will break the loop and send us back to the main menu*/
-            in[0] = 'c';
-            break;
-
-         case 'g': /*create group*/
-         case 'G':
-            ZERO_STRUCT(cg);
-            cg.in.dom_hnd = dom_hnd;
-            cg.in.access  = MAXIMUM_ALLOWED_ACCESS;
-
-            printf("Enter name: ");
-            mgr_getline(tmp);
-            cg.in.name = talloc_strdup(mem_ctx, tmp);
-
-            if(!cac_SamCreateGroup(hnd, mem_ctx, &cg)) {
-               printerr("Could not create group.", hnd->status);
-            }
-            else {
-               group_menu(hnd, mem_ctx, dom_hnd, cg.out.group_hnd);
-            }
-
-            /*this will break the loop and send us back to the main menu*/
-            in[0] = 'c';
-            break;
-
-         case 'm': /*create machine account*/
-         case 'M':
-            ZERO_STRUCT(cu);
-            cu.in.dom_hnd  = dom_hnd;
-            cu.in.acb_mask = ACB_WSTRUST;
-
-            printf("Enter machine name: ");
-            mgr_getline(tmp);
-
-            /*make sure we have a $ on the end*/
-            if(tmp[strlen(tmp) - 1] != '$')
-               cu.in.name = talloc_asprintf(mem_ctx, "%s$", tmp);
-            else
-               cu.in.name = talloc_strdup(mem_ctx, tmp);
-
-            strlower_m(cu.in.name);
-
-            printf("Creating account: %s\n", cu.in.name);
-
-            if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {
-               printerr("Could not create account.", hnd->status);
-            }
-            else {
-               user_menu(hnd, mem_ctx, dom_hnd, cu.out.user_hnd);
-            }
-
-            /*this will break the loop and send us back to the main menu*/
-            in[0] = 'c';
-            break;
-
-         case 'c': /*cancel*/
-         case 'C':
-         case 'q':
-         case 'Q':
-            /*do nothing*/
-            break;
-
-         default:
-            printf("Invalid option\n");
-      }
-   }
-
-   return;
-}
-
-void main_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
-   fstring in;
-   
-   uint32 rid_type = 0;
-
-   struct SamOpenUser   openu;
-   struct SamOpenGroup  openg;
-   struct SamEnumUsers  enumu;
-   struct SamEnumGroups enumg;
-   struct SamFlush      flush;
-
-   char *name = NULL;
-   uint32 rid = 0;
-
-   if(!hnd || !mem_ctx || !dom_hnd) {
-      printf("No handle to SAM.\n");
-      return;
-   }
-
-   /*initialize this here and don't worry about it later*/
-   ZERO_STRUCT(flush);
-   flush.in.dom_hnd = dom_hnd;
-
-   in[0] = '\0';
-
-   /*handle the menu and commands*/
-   while(in[0] != 'q' && in[0] != 'Q') {
-      printf("\n");
-
-      printf("[o] Open User or Group\n");
-      printf("[c] Create Account or Group\n");
-      printf("[u] List Users\n");
-      printf("[g] List Groups\n");
-      printf("[m] List Machine Accounts\n");
-      printf("[q] Quit\n\n");
-
-      printf("Command: ");
-
-      mgr_getline(in);
-
-      printf("\n");
-
-      switch(in[0]) {
-         case 'o': /*open user or group*/
-         case 'O':
-            printf("Enter RID or Name: ");
-            rid_type = rid_or_name(hnd, mem_ctx, dom_hnd, &rid, &name);
-
-            if(rid_type == CAC_USER_RID) {
-               ZERO_STRUCT(openu);
-               openu.in.dom_hnd = dom_hnd;
-               openu.in.rid     = rid;
-               openu.in.access  = MAXIMUM_ALLOWED_ACCESS;
-
-               if(!cac_SamOpenUser(hnd, mem_ctx, &openu))
-                  printerr("Could not open user.", hnd->status);
-               else {
-                  user_menu(hnd, mem_ctx, dom_hnd, openu.out.user_hnd);
-
-                  if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
-                     printerr("Lost handle while flushing SAM.", hnd->status);
-                     /*we want to quit*/
-                     in[0] = 'q';
-                  }
-               }
-            }
-            else if(rid_type == CAC_GROUP_RID) {
-               ZERO_STRUCT(openg);
-               openg.in.dom_hnd = dom_hnd;
-               openg.in.rid     = rid;
-               openg.in.access  = MAXIMUM_ALLOWED_ACCESS;
-
-               if(!cac_SamOpenGroup(hnd, mem_ctx, &openg))
-                  printerr("Could not open group.", hnd->status);
-               else {
-                  group_menu(hnd, mem_ctx, dom_hnd, openg.out.group_hnd);
-
-                  if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
-                     printerr("Lost handle while flushing SAM.", hnd->status);
-                     /*we want to quit*/
-                     in[0] = 'q';
-                  }
-               }
-            }
-            else {
-               printf("Unknown RID/Name.\n");
-            }
-               
-            break;
-
-         case 'c': /*create account/group*/
-         case 'C':
-            create_menu(hnd, mem_ctx, dom_hnd);
-            if(!cac_SamFlush(hnd, mem_ctx, &flush)) {
-               printerr("Lost handle while flushing SAM.", hnd->status);
-               /*we want to quit*/
-               in[0] = 'q';
-            }
-            break;
-
-         case 'u': /*list users*/
-         case 'U':
-            ZERO_STRUCT(enumu);
-            enumu.in.dom_hnd = dom_hnd;
-            enumu.in.acb_mask = ACB_NORMAL;
-
-            printf("Users:\n");
-            while(cac_SamEnumUsers(hnd, mem_ctx, &enumu)) {
-               print_rid_list(enumu.out.rids, enumu.out.names, enumu.out.num_users);
-            }
-            if(CAC_OP_FAILED(hnd->status))
-               printerr("Error occured while enumerating users.", hnd->status);
-            break;
-
-         case 'g': /*list groups*/
-         case 'G':
-            ZERO_STRUCT(enumg);
-            enumg.in.dom_hnd = dom_hnd;
-
-            while(cac_SamEnumGroups(hnd, mem_ctx, &enumg)) {
-               print_rid_list( enumg.out.rids, enumg.out.names, enumg.out.num_groups);
-            }
-
-            if(CAC_OP_FAILED(hnd->status))
-               printerr("Error occured while enumerating groups.", hnd->status);
-            break;
-
-         case 'm': /*list machine accounts*/
-         case 'M':
-            ZERO_STRUCT(enumu);
-            enumu.in.dom_hnd = dom_hnd;
-            enumu.in.acb_mask = ACB_WSTRUST;
-
-            printf("Users:\n");
-            while(cac_SamEnumUsers(hnd, mem_ctx, &enumu)) {
-               print_rid_list( enumu.out.rids, enumu.out.names, enumu.out.num_users);
-            }
-            if(CAC_OP_FAILED(hnd->status))
-               printerr("Error occured while enumerating accounts.", hnd->status);
-            break;
-
-         case 'q': /*quit*/
-         case 'Q':
-            /*just do nothing*/
-            break;
-
-         default:
-            printf("Invalid Command.\n");
-      }
-   }
-}
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   struct SamOpenDomain sod;
-
-   mem_ctx = talloc_init("cacusermgr");
-   if(!mem_ctx) {
-      printf("Could not initialize Talloc Context\n");
-      exit(-1);
-   }
-
-   /**first initialize the server handle with what we have*/
-   hnd = cac_NewServerHandle(True);
-   if(!hnd) {
-      printf("Could not create server handle\n");
-      exit(-1);
-   }
-
-   /*fill in the blanks*/
-   if(!process_cmd_line(hnd, mem_ctx, argc, argv))
-      usage();
-
-   if(!cac_Connect(hnd, NULL)) {
-      printf("Could not connect to server %s. %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   /*open the domain sam*/
-   ZERO_STRUCT(sod);
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS;
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      printf("Could not open handle to domain SAM. %s\n", nt_errstr(hnd->status));
-      goto cleanup;
-   }
-
-   main_menu(hnd, mem_ctx, sod.out.dom_hnd);
-
-cleanup:
-
-   if(sod.out.dom_hnd)
-      cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-
-   if(sod.out.sam)
-      cac_SamClose(hnd, mem_ctx, sod.out.sam);
-
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/cacusermgr/cacusermgr.h b/examples/libmsrpc/cacusermgr/cacusermgr.h
deleted file mode 100644 (file)
index 84c60eb..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Unix SMB/CIFS implementation. 
- * cacusermgr definitions and includes.
- *
- * Copyright (C) Chris Nicholls     2005
- * 
- * 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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef CACUSERMGR_H_
-#define CACUSERMGR_H_
-
-#include "libmsrpc.h"
-#include "includes.h"
-
-/*used for the simple pager - mgr_page()*/
-#define DEFAULT_SCREEN_LINES 20 
-
-/**************
- * prototypes *
- **************/
-
-/*util.c*/
-void usage();
-int process_cmd_line(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, int argc, char **argv);
-void mgr_getline(fstring line);
-void mgr_page(uint32 line_count);
-uint32 rid_or_name(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd, uint32 *rid, char **name);
-char *get_new_password(TALLOC_CTX *mem_ctx);
-void printerr(const char *msg, NTSTATUS status);
-void print_rid_list(uint32 *rids, char **names, uint32 num_rids);
-void print_lookup_records(CacLookupRidsRecord *map, uint32 num_rids);
-int list_groups(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd);
-void list_privs(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, CacUserInfo *info);
-void add_privs(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, CacUserInfo *info);
-void list_users(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd);
-
-void mgr_GetAuthDataFn(const char * pServer,
-                 const char * pShare,
-                 char * pWorkgroup,
-                 int maxLenWorkgroup,
-                 char * pUsername,
-                 int maxLenUsername,
-                 char * pPassword,
-                 int maxLenPassword);
-
-
-/*mgr_group.c*/
-void group_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd, POLICY_HND *group_hnd);
-
-/*mgr_user.c*/
-void user_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd, POLICY_HND *user_hnd);
-
-#endif /*CACUSERMGR_H_*/
diff --git a/examples/libmsrpc/cacusermgr/mgr_group.c b/examples/libmsrpc/cacusermgr/mgr_group.c
deleted file mode 100644 (file)
index 37c89db..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Unix SMB/CIFS implementation. 
- * cacusermgr group implementation.
- *
- * Copyright (C) Chris Nicholls     2005
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#include "cacusermgr.h"
-
-CacGroupInfo *get_group_info(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *group_hnd) {
-   struct SamGetGroupInfo getinfo;
-
-   if(!hnd || !mem_ctx ||!group_hnd)
-      return NULL;
-
-   ZERO_STRUCT(getinfo);
-   getinfo.in.group_hnd = group_hnd;
-
-   if(!cac_SamGetGroupInfo(hnd, mem_ctx, &getinfo)) 
-      printerr("Could not get group info.", hnd->status);
-
-   return getinfo.out.info;
-}
-
-void print_group_info(CacGroupInfo *info) {
-   if(!info)
-      return;
-
-   printf(" Group Name        : %s\n", info->name);
-   printf(" Description       : %s\n", info->description);
-   printf(" Number of Members : %d\n", info->num_members);
-}
-
-CacGroupInfo *modify_group_info(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *group_hnd) {
-   struct SamSetGroupInfo setinfo;
-   CacGroupInfo *info = NULL;
-   fstring tmp;
-
-   info = get_group_info(hnd, mem_ctx, group_hnd);
-
-   if(!info)
-      return NULL;
-
-   printf("Description [%s]: ", info->description);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->description = talloc_strdup(mem_ctx, tmp);
-
-   ZERO_STRUCT(setinfo);
-   setinfo.in.group_hnd = group_hnd;
-   setinfo.in.info = info;
-
-   if(!cac_SamSetGroupInfo(hnd, mem_ctx, &setinfo)) {
-      printerr("Could not set info.", hnd->status);
-      info = NULL;
-   }
-
-   return info;
-}
-
-void group_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd, POLICY_HND *group_hnd) {
-   CacGroupInfo *info = NULL;
-   int rid_type = 0;
-
-   fstring in;
-
-   char *buf;
-
-   struct SamGetGroupMembers getmem;
-   struct SamGetNamesFromRids getnames;
-   struct SamAddGroupMember add;
-   struct SamRemoveGroupMember del;
-   info = get_group_info(hnd, mem_ctx, group_hnd);
-
-   printf("\n");
-   print_group_info(info);
-
-   while(in[0] != 'b' && in[0] != 'B' && in[0] != 'q' && in[0] != 'Q') {
-      printf("\n");
-      printf("[m] List Group Members\n");
-      printf("[a] Add User To Group\n");
-      printf("[r] Remove User From Group\n");
-      printf("[l] List Users\n");
-      printf("[v] View Group Info\n");
-      printf("[d] Set Group Description\n");
-      printf("[x] Delete Group\n");
-      printf("[b] Back\n\n");
-      
-      printf("Command: ");
-      mgr_getline(in);
-      
-      printf("\n");
-
-      switch(in[0]) {
-         case 'a': /*add member to group*/
-         case 'A':
-            ZERO_STRUCT(add);
-            add.in.group_hnd = group_hnd;
-
-            printf("Enter RID or Name: ");
-            rid_type = rid_or_name(hnd, mem_ctx, dom_hnd, &add.in.rid, &buf);
-
-            if(rid_type != CAC_USER_RID) {
-               printf("Invalid User.\n");
-               break;
-            }
-
-            if(!cac_SamAddGroupMember(hnd, mem_ctx, &add)) {
-               printerr("Could not add user to group.", hnd->status);
-            }
-            break;
-
-         case 'r': /*remove user from group*/
-         case 'R':
-            ZERO_STRUCT(del);
-            del.in.group_hnd = group_hnd;
-
-            printf("Enter RID or Name: ");
-            rid_type = rid_or_name(hnd, mem_ctx, dom_hnd, &del.in.rid, &buf);
-
-            if(rid_type != CAC_USER_RID) {
-               printf("Invalid User.\n");
-               break;
-            }
-
-            if(!cac_SamRemoveGroupMember(hnd, mem_ctx, &del)) {
-               printerr("Could not remove use from group.", hnd->status);
-            }
-            break;
-
-         case 'l': /*list users*/
-         case 'L':
-            list_users(hnd, mem_ctx, dom_hnd);
-            break;
-
-         case 'm': /*list members*/
-         case 'M':
-            ZERO_STRUCT(getmem);
-            getmem.in.group_hnd = group_hnd;
-
-            if(!cac_SamGetGroupMembers(hnd, mem_ctx, &getmem)) {
-               printerr("Could not get members.", hnd->status);
-               break;
-            }
-
-            ZERO_STRUCT(getnames);
-            getnames.in.dom_hnd = dom_hnd;
-            getnames.in.rids = getmem.out.rids;
-            getnames.in.num_rids = getmem.out.num_members;
-
-            if(!cac_SamGetNamesFromRids(hnd, mem_ctx, &getnames)) {
-               printerr("Could not lookup names.", hnd->status);
-               break;
-            }
-
-            printf("Group has %d members:\n", getnames.out.num_names);
-            print_lookup_records(getnames.out.map, getnames.out.num_names);
-
-            break;
-
-         case 'd': /*set description*/
-         case 'D':
-            info = modify_group_info(hnd, mem_ctx, group_hnd);
-
-            if(info)
-               printf("Set Group Info.\n");
-            break;
-
-         case 'v': /*view info*/
-         case 'V':
-            info = get_group_info(hnd, mem_ctx, group_hnd);
-            print_group_info(info);
-            break;
-
-         case 'x': /*delete group*/
-         case 'X': 
-            if(!cac_SamDeleteGroup(hnd, mem_ctx, group_hnd))
-               printerr("Could Not Delete Group.", hnd->status);
-
-            /*we want to go back to the main menu*/
-            in[0] = 'b';
-            break;
-
-         case 'b': /*back*/
-         case 'B':
-         case 'q':
-         case 'Q':
-            break;
-
-         default:
-            printf("Invalid Command.\n");
-      }
-   }
-
-   cac_SamClose(hnd, mem_ctx, group_hnd);
-}
diff --git a/examples/libmsrpc/cacusermgr/mgr_user.c b/examples/libmsrpc/cacusermgr/mgr_user.c
deleted file mode 100644 (file)
index bdae55d..0000000
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Unix SMB/CIFS implementation. 
- * cacusermgr user implementation.
- *
- * Copyright (C) Chris Nicholls     2005
- * 
- * 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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#include "cacusermgr.h"
-
-void print_user_info(CacUserInfo *info) {
-   printf("\n");
-   printf(" User Name      : %s\n", info->username);
-   printf(" Full Name      : %s\n", info->full_name);
-   printf(" Home Dir       : %s\n", info->home_dir);
-   printf(" Home Drive     : %s\n", info->home_drive);
-   printf(" Profile Path   : %s\n", info->profile_path);
-   printf(" Logon Script   : %s\n", info->logon_script);
-   printf(" Description    : %s\n", info->description);
-   printf(" Workstations   : %s\n", info->workstations);
-   printf(" Remote Dial    : %s\n", info->dial);
-
-   printf(" Logon Time     : %s\n", http_timestring(info->logon_time));
-   printf(" Logoff Time    : %s\n", http_timestring(info->logoff_time));
-   printf(" Kickoff Time   : %s\n", http_timestring(info->kickoff_time));
-   printf(" Pass last set  : %s\n", http_timestring(info->pass_last_set_time));
-   printf(" Pass can set   : %s\n", http_timestring(info->pass_can_change_time));
-   printf(" Pass must set  : %s\n", http_timestring(info->pass_must_change_time));
-
-   printf(" User RID       : 0x%x\n", info->rid);
-   printf(" Group RID      : 0x%x\n", info->group_rid);
-   printf(" User Type      : ");
-
-   if(info->acb_mask & ACB_NORMAL)
-      printf("Normal User\n");
-   else if(info->acb_mask & ACB_TEMPDUP)
-      printf("Temporary Duplicate Account\n");
-   else if(info->acb_mask & ACB_DOMTRUST)
-      printf("Inter-Domain Trust Account\n");
-   else if(info->acb_mask & ACB_WSTRUST)
-      printf("Workstation Trust Account\n");
-   else if(info->acb_mask & ACB_SVRTRUST)
-      printf("Server Trust Account\n");
-   else
-      printf("\n");
-
-   printf(" Disabled       : %s\n", (info->acb_mask & ACB_DISABLED) ? "Yes" : "No");
-   printf(" Locked         : %s\n", (info->acb_mask & ACB_AUTOLOCK) ? "Yes" : "No");
-   printf(" Pass Expires   : %s\n", (info->acb_mask & ACB_PWNOEXP) ? "No" : "Yes");
-   printf(" Pass Required  : %s\n", (info->acb_mask & ACB_PWNOTREQ) ? "No" : "Yes");
-
-}
-
-CacUserInfo *modify_user_info(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *user_hnd) {
-   CacUserInfo *info = NULL;
-   fstring tmp;
-
-   struct SamGetUserInfo getinfo;
-   struct SamSetUserInfo setinfo;
-
-   ZERO_STRUCT(getinfo);
-   ZERO_STRUCT(setinfo);
-
-   getinfo.in.user_hnd = user_hnd;
-
-   if(!cac_SamGetUserInfo(hnd, mem_ctx, &getinfo)) {
-      printerr("Could not get user info.", hnd->status);
-      return NULL;
-   }
-
-   info = getinfo.out.info;
-
-   printf("\n");
-   printf(" User Name [%s]: ", info->username);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->username = talloc_strdup(mem_ctx, tmp);
-
-   printf(" Full Name [%s]: ", info->full_name);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->full_name = talloc_strdup(mem_ctx, tmp);
-   
-   printf(" Description  [%s]: ", info->description);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->description = talloc_strdup(mem_ctx, tmp);
-   
-   printf(" Home Dir  [%s]: ", info->home_dir);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->home_dir = talloc_strdup(mem_ctx, tmp);
-
-   printf(" Home Drive [%s]: ", info->home_drive);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->home_drive = talloc_strdup(mem_ctx, tmp);
-   
-   printf(" Profile Path [%s]: ", info->profile_path);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->profile_path = talloc_strdup(mem_ctx, tmp);
-
-   printf(" Logon Script [%s]: ", info->logon_script);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->logon_script = talloc_strdup(mem_ctx, tmp);
-   
-   printf(" Workstations [%s]: ", info->workstations);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->workstations = talloc_strdup(mem_ctx, tmp);
-   
-   printf(" Remote Dial [%s]: ", info->dial);
-   mgr_getline(tmp);
-   if(tmp[0] != '\0')
-      info->dial = talloc_strdup(mem_ctx, tmp);
-
-   printf(" Disabled [%s] (y/n): ", (info->acb_mask & ACB_DISABLED) ? "Yes" : "No");
-   mgr_getline(tmp);
-   if(tmp[0] == 'y' || tmp[0] == 'Y')
-      info->acb_mask |= ACB_DISABLED;
-   else if(tmp[0] == 'n' || tmp[0] == 'N')
-      info->acb_mask ^= (info->acb_mask & ACB_DISABLED) ? ACB_DISABLED : 0x0;
-      
-   printf(" Pass Expires [%s] (y/n): ", (info->acb_mask & ACB_PWNOEXP) ? "No" : "Yes");
-   mgr_getline(tmp);
-   if(tmp[0] == 'n' || tmp[0] == 'N')
-      info->acb_mask |= ACB_PWNOEXP;
-   else if(tmp[0] == 'y' || tmp[0] == 'Y')
-      info->acb_mask ^= (info->acb_mask & ACB_PWNOEXP) ? ACB_PWNOEXP : 0x0;
-
-   printf(" Pass Required [%s] (y/n): ", (info->acb_mask & ACB_PWNOTREQ) ? "No" : "Yes");
-   mgr_getline(tmp);
-   if(tmp[0] == 'n' || tmp[0] == 'N')
-      info->acb_mask |= ACB_PWNOTREQ;
-   else if(tmp[0] == 'y' || tmp[0] == 'Y')
-      info->acb_mask ^= (info->acb_mask & ACB_PWNOTREQ) ? ACB_PWNOTREQ : 0x0;
-
-   setinfo.in.user_hnd = user_hnd;
-   setinfo.in.info     = info;
-
-   if(!cac_SamSetUserInfo(hnd, mem_ctx, &setinfo)) {
-      printerr("Could not set user info.", hnd->status);
-   }
-
-   return info;
-}
-
-void add_user_to_group(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, CacUserInfo *info, POLICY_HND *dom_hnd) {
-   int rid_type = 0;
-
-   char *tmp = NULL;
-
-   struct SamOpenGroup og;
-   struct SamAddGroupMember add;
-
-   ZERO_STRUCT(og);
-   ZERO_STRUCT(add);
-   
-   printf("Group RID or Name:");
-
-   og.in.dom_hnd = dom_hnd;
-   og.in.access = MAXIMUM_ALLOWED_ACCESS;
-   rid_type = rid_or_name(hnd, mem_ctx, dom_hnd, &og.in.rid, &tmp);
-
-   if(!cac_SamOpenGroup(hnd, mem_ctx, &og)) {
-      printerr("Could not open group.", hnd->status);
-      return;
-   }
-
-   add.in.group_hnd = og.out.group_hnd;
-   add.in.rid = info->rid;
-
-   if(!cac_SamAddGroupMember(hnd, mem_ctx, &add)) {
-      printerr("Could not add user to group.", hnd->status);
-   }
-
-   cac_SamClose(hnd, mem_ctx, og.out.group_hnd);
-}
-
-void remove_user_from_group(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, CacUserInfo *info, POLICY_HND *dom_hnd) {
-   int rid_type = 0;
-
-   char *tmp = NULL;
-
-   struct SamOpenGroup og;
-   struct SamRemoveGroupMember del;
-
-   ZERO_STRUCT(og);
-   ZERO_STRUCT(del);
-   
-   printf("Group RID or Name:");
-
-   og.in.dom_hnd = dom_hnd;
-   og.in.access = MAXIMUM_ALLOWED_ACCESS;
-   rid_type = rid_or_name(hnd, mem_ctx, dom_hnd, &og.in.rid, &tmp);
-
-   if(!cac_SamOpenGroup(hnd, mem_ctx, &og)) {
-      printerr("Could not open group.", hnd->status);
-      return;
-   }
-
-   del.in.group_hnd = og.out.group_hnd;
-   del.in.rid = info->rid;
-
-   if(!cac_SamRemoveGroupMember(hnd, mem_ctx, &del)) {
-      printerr("Could not add user to group.", hnd->status);
-   }
-
-   cac_SamClose(hnd, mem_ctx, og.out.group_hnd);
-}
-
-void user_menu(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd, POLICY_HND *user_hnd) {
-   fstring in;
-
-   struct SamGetUserInfo      getinfo;
-   struct SamSetPassword      setpass;
-   struct SamGetGroupsForUser groups;
-   struct SamGetNamesFromRids gnfr;
-
-   CacUserInfo *info = NULL;
-
-   if(!hnd || !mem_ctx || !user_hnd) {
-      printf("Must open user.\n");
-      return;
-   }
-
-   /*get the userinfo and print it out*/
-   ZERO_STRUCT(getinfo);
-   getinfo.in.user_hnd = user_hnd;
-
-   if(!cac_SamGetUserInfo(hnd, mem_ctx, &getinfo)) {
-      printerr("Could not get info.", hnd->status);
-      info = NULL;
-   }
-   else {
-      info = getinfo.out.info;
-      print_user_info(info);
-   }
-
-   /*now deal with the menu*/
-   in[0] = '\0';
-   while(in[0] != 'b' && in[0] != 'B' && in[0] != 'q' && in[0] != 'Q') {
-      printf("\n");
-      printf("[s] Set Password\n");
-
-      if(info && (info->acb_mask & ACB_DISABLED))
-         printf("[e] Enable User\n");
-      else if(info)
-         printf("[d] Disable User\n");
-
-      printf("[v] View User Info\n");
-      printf("[m] Modify User Info\n");
-      printf("[x] Delete User\n\n");
-
-      printf("[g] List Group Membership\n");
-      printf("[a] Add User To Group\n");
-      printf("[l] List Domain Groups\n");
-      printf("[r] Remove User From Group\n\n");
-
-      printf("[b] Back\n\n");
-
-      printf("Command: ");
-      mgr_getline(in);
-
-      printf("\n");
-
-      switch(in[0]) {
-         case 'g': /*list group membership*/
-         case 'G': 
-            ZERO_STRUCT(groups);
-            groups.in.user_hnd = user_hnd;
-
-            if(!cac_SamGetGroupsForUser(hnd, mem_ctx, &groups)) {
-               printerr("Could not get groups.", hnd->status);
-               break;
-            }
-
-            ZERO_STRUCT(gnfr);
-            gnfr.in.dom_hnd = dom_hnd;
-            gnfr.in.rids = groups.out.rids;
-            gnfr.in.num_rids = groups.out.num_groups;
-
-            if(!cac_SamGetNamesFromRids(hnd, mem_ctx, &gnfr)) {
-               printerr("Could not map RIDs to names.", hnd->status);
-               break;
-            }
-
-            print_lookup_records(gnfr.out.map, gnfr.out.num_names);
-
-            break;
-         case 's': /*reset password*/
-         case 'S':
-            ZERO_STRUCT(setpass);
-            setpass.in.user_hnd = user_hnd;
-            setpass.in.password = get_new_password(mem_ctx);
-            
-            if(!setpass.in.password) {
-               printf("Out of memory.\n");
-               break;
-            }
-
-            if(!cac_SamSetPassword(hnd, mem_ctx, &setpass)) {
-               printerr("Could not set password.", hnd->status);
-            }
-            else {
-               printf("Reset password.\n");
-            }
-            break;
-
-         case 'e': /*enable user*/
-         case 'E': 
-            if(info && !(info->acb_mask & ACB_DISABLED))
-               break;
-
-            if(!cac_SamEnableUser(hnd, mem_ctx, user_hnd)) {
-               printerr("Could not enable user.", hnd->status);
-            }
-            else {
-               printf("Enabled User.\n");
-               /*toggle the disabled ACB bit in our local copy of the info*/
-               info->acb_mask ^= ACB_DISABLED;
-            }
-            break;
-
-         case 'd': /*disable user*/
-         case 'D':
-            if(info && (info->acb_mask & ACB_DISABLED))
-               break;
-
-            if(!cac_SamDisableUser(hnd, mem_ctx, user_hnd)) {
-               printerr("Could not disable user.", hnd->status);
-            }
-            else {
-               printf("Disabled User.\n");
-               /*toggle the disabled ACB bit in our local copy of the info*/
-               info->acb_mask ^= ACB_DISABLED;
-            }
-            break;
-
-         case 'v': /*view user info*/
-         case 'V':
-            ZERO_STRUCT(getinfo);
-            getinfo.in.user_hnd = user_hnd;
-
-            if(!cac_SamGetUserInfo(hnd, mem_ctx, &getinfo)) {
-               printerr("Could not get info.", hnd->status);
-               info = NULL;
-            }
-            else {
-               info = getinfo.out.info;
-               print_user_info(info);
-            }
-
-            break;
-
-         case 'm': /*modify user info*/
-         case 'M':
-            info = modify_user_info(hnd, mem_ctx, user_hnd);
-
-            if(info)
-               printf("Updated user info.\n");
-            break;
-
-         case 'l': /*list domain groups*/
-         case 'L':
-            list_groups(hnd, mem_ctx, dom_hnd);
-            break;
-
-         case 'a': /*add user to group*/
-         case 'A':
-            add_user_to_group(hnd, mem_ctx, info, dom_hnd);
-            break;
-
-         case 'r': /*remove user from group*/
-         case 'R':
-            remove_user_from_group(hnd, mem_ctx, info, dom_hnd);
-            break;
-            
-         case 'x': /*delete user*/
-         case 'X':
-            if(!cac_SamDeleteUser(hnd, mem_ctx, user_hnd))
-               printerr("Could not delete user.", hnd->status);
-
-            /*we want to go back to the main menu*/
-            in[0] = 'b';
-            break;
-
-         case 'b': /*back*/
-         case 'B':
-         case 'q':
-         case 'Q':
-            /*do nothing*/
-            break;
-            
-         default:
-            printf("Invalid command.\n");
-      }
-   }
-
-   /*close the user before returning*/
-   cac_SamClose(hnd, mem_ctx, user_hnd);
-}
diff --git a/examples/libmsrpc/cacusermgr/util.c b/examples/libmsrpc/cacusermgr/util.c
deleted file mode 100644 (file)
index fa83e9c..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Unix SMB/CIFS implementation. 
- * cacusermgr utility functions.
- *
- * Copyright (C) Chris Nicholls     2005
- * 
- * 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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#include "cacusermgr.h"
-
-/*prints usage and quits*/
-void usage() {
-   printf("Usage:\n");
-   printf("    cacusermgr [options] server\n\n");
-   printf("options:\n");
-   printf("   -u USERNAME        Username to login with\n");
-   printf("   -d/-w DOMAIN       Domain name\n");
-   printf("   -D LEVEL           Debug level\n");
-   printf("   -h                 Print this message\n");
-
-   exit(1);
-}
-
-/*initializes values in the server handle from the command line returns 0 if there is a problem, non-zero if everything is ok*/
-int process_cmd_line(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, int argc, char **argv) {
-   char op;
-
-   if(!hnd || !mem_ctx || !argc)
-      return 0;
-
-   while( (op = getopt(argc, argv, "u:U:d:w:W:D:h")) != -1) {
-      switch(op) {
-         case 'u': /*username*/
-         case 'U': 
-            if(optarg)
-               strncpy(hnd->username, optarg, sizeof(fstring));
-            else
-               usage();
-            break;
-
-         case 'd': /*domain name*/
-         case 'w':
-         case 'W':
-            if(optarg)
-               strncpy(hnd->domain, optarg, sizeof(fstring));
-            else
-               usage();
-            break;
-
-         case 'D': /*debug level*/
-            if(optarg)
-               hnd->debug = atoi(optarg);
-            else
-               usage();
-            break;
-
-         case 'h': /*help*/
-            usage();
-            break;
-
-         case '?':
-         default:
-            printf("Unknown option -%c\n", op);
-            usage();
-      }
-   }
-
-   if(optind >= argc)
-      usage();
-
-   /*whatever is less should be the server*/
-   strncpy(hnd->server, argv[optind], sizeof(fstring));
-
-   return 1;
-}
-
-void mgr_getline(fstring line) {
-
-   fgets(line, sizeof(fstring), stdin);
-
-   if(line[strlen(line) - 1] == '\n')
-      line[strlen(line) - 1] = '\0';
-
-}
-
-/*this is pretty similar to the other get_auth_data_fn's*/
-void mgr_GetAuthDataFn(const char * pServer,
-                 const char * pShare,
-                 char * pWorkgroup,
-                 int maxLenWorkgroup,
-                 char * pUsername,
-                 int maxLenUsername,
-                 char * pPassword,
-                 int maxLenPassword)
-    
-{
-   char temp[sizeof(fstring)];
-
-   static char authUsername[sizeof(fstring)];
-   static char authWorkgroup[sizeof(fstring)];
-   static char authPassword[sizeof(fstring)];
-   static char authSet = 0;
-
-   char *pass = NULL;
-
-   if (authSet)
-   {
-      strncpy(pWorkgroup, authWorkgroup, maxLenWorkgroup - 1);
-      strncpy(pUsername, authUsername, maxLenUsername - 1);
-      strncpy(pPassword, authPassword, maxLenPassword - 1);
-   }
-   else
-   {
-      if(pWorkgroup[0] != '\0') {
-         strncpy(authWorkgroup, pWorkgroup, maxLenWorkgroup - 1);
-      }
-      else {
-         d_printf("Domain: [%s] ", pWorkgroup);
-         mgr_getline(pWorkgroup);
-
-         if (temp[0] != '\0')
-         {
-            strncpy(pWorkgroup, temp, maxLenWorkgroup - 1);
-            strncpy(authWorkgroup, temp, maxLenWorkgroup - 1);
-         }
-      }
-
-
-      if(pUsername[0] != '\0') {
-         strncpy(authUsername, pUsername, maxLenUsername - 1);
-      }
-      else {
-         d_printf("Username: [%s] ", pUsername);
-         mgr_getline(pUsername);
-
-         if (temp[strlen(temp) - 1] == '\n') /* A new line? */
-         {
-            temp[strlen(temp) - 1] = '\0';
-         }
-
-         if (temp[0] != '\0')
-         {
-            strncpy(pUsername, temp, maxLenUsername - 1);
-            strncpy(authUsername, pUsername, maxLenUsername - 1);
-         }
-      }
-      if(pPassword[0] != '\0') {
-         strncpy(authPassword, pPassword, maxLenPassword - 1);
-      }
-      else {
-         pass = getpass("Password: ");
-         if (pass)
-            fstrcpy(temp, pass);
-         if (temp[strlen(temp) - 1] == '\n') /* A new line? */
-         {
-            temp[strlen(temp) - 1] = '\0';
-         }        
-         if (temp[0] != '\0')
-         {
-            strncpy(pPassword, temp, maxLenPassword - 1);
-            strncpy(authPassword, pPassword, maxLenPassword - 1);
-         }    
-      }
-      authSet = 1;
-   }
-}
-
-void mgr_page(uint32 line_count) {
-
-   if( (line_count % DEFAULT_SCREEN_LINES) != 0)
-      return;
-
-   printf("--Press enter to continue--\n");
-   getchar();
-}
-
-/*reads a line from stdin, figures out if it is a RID or name, gets a CacLookupRidsRecord and then returns the type*/
-uint32 rid_or_name(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd, uint32 *rid, char **name) {
-   fstring line;
-
-   BOOL is_rid = False;
-   uint32 rid_type = 0;
-
-   struct SamGetNamesFromRids getnames;
-   struct SamGetRidsFromNames getrids;
-
-   mgr_getline(line);
-
-   if(strncmp(line, "0x", 2) == 0) {
-      /*then this is a RID*/
-      sscanf( (line + 2), "%x", rid);
-      is_rid = True;
-   }
-   else {
-      /*then this is a name*/
-      *name = talloc_strdup(mem_ctx, line);
-   }
-
-   if(is_rid) {
-      ZERO_STRUCT(getnames);
-
-      getnames.in.dom_hnd  = dom_hnd;
-      getnames.in.rids     = rid;
-      getnames.in.num_rids = 1;
-
-      cac_SamGetNamesFromRids(hnd, mem_ctx, &getnames);
-
-      if(getnames.out.num_names > 0)
-         rid_type = getnames.out.map[0].type;
-         
-   }
-   else {
-      ZERO_STRUCT(getrids);
-
-      getrids.in.dom_hnd   = dom_hnd;
-      getrids.in.names     = name;
-      getrids.in.num_names = 1;
-
-      cac_SamGetRidsFromNames(hnd, mem_ctx, &getrids);
-
-      if(getrids.out.num_rids > 0) {
-         rid_type = getrids.out.map[0].type;
-
-         /*send back the RID so cac_SamOpenXX() doesn't have to look it up*/
-         *rid = getrids.out.map[0].rid;
-      }
-   }
-
-   return rid_type;
-}
-
-/*print's out some common error messages*/
-void printerr(const char *msg, NTSTATUS status) {
-   if(NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED))
-      printf("%s You do not have sufficient rights.\n", msg);
-
-   else if(NT_STATUS_EQUAL(status, NT_STATUS_NO_SUCH_USER))
-      printf("%s No such user.\n", msg);
-   
-   else if(NT_STATUS_EQUAL(status, NT_STATUS_NO_SUCH_GROUP))
-      printf("%s No such group.\n", msg);
-
-   else if(NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS))
-      printf("%s User already exists.\n", msg);
-
-   else if(NT_STATUS_EQUAL(status, NT_STATUS_GROUP_EXISTS))
-      printf("%s Group already exists.\n", msg);
-
-   else
-      printf("%s %s.\n", msg, nt_errstr(status));
-}
-
-char *get_new_password(TALLOC_CTX *mem_ctx) {
-   char *pass1 = NULL;
-
-   pass1 = getpass("Enter new password: ");
-
-   return talloc_strdup(mem_ctx, pass1);
-}
-
-void print_rid_list(uint32 *rids, char **names, uint32 num_rids) {
-   uint32 i = 0;
-
-   if(!names || !rids)
-      return;
-
-   printf(" RID     Name\n");
-
-   while(i < num_rids) {
-      printf("[0x%x] [%s]\n", rids[i], names[i]);
-
-      i++;
-
-      mgr_page(i);
-   }
-}
-
-void print_lookup_records(CacLookupRidsRecord *map, uint32 num_rids) {
-   uint32 i = 0;
-
-   if(!map)
-      return;
-
-   printf("RID     Name\n");
-
-   while(i < num_rids) {
-      if(map[i].found) {
-         printf("[0x%x] [%s]\n", map[i].rid, map[i].name);
-      }
-
-      i++;
-
-      mgr_page(i);
-   }
-}
-
-int list_groups(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
-   struct SamEnumGroups eg;
-   
-   if(!hnd || !mem_ctx || !dom_hnd)
-      return 0;
-
-   ZERO_STRUCT(eg);
-   eg.in.dom_hnd = dom_hnd;
-
-   while(cac_SamEnumGroups(hnd, mem_ctx, &eg))
-      print_rid_list(eg.out.rids, eg.out.names, eg.out.num_groups);
-
-   if(CAC_OP_FAILED(hnd->status)) {
-      printerr("Could not enumerate groups.", hnd->status);
-      return 0;
-   }
-
-   return 1;
-}
-
-void list_users(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *dom_hnd) {
-   struct SamEnumUsers eu;
-
-   if(!hnd || !mem_ctx || !dom_hnd)
-      return;
-
-   ZERO_STRUCT(eu);
-   eu.in.dom_hnd = dom_hnd;
-
-   while(cac_SamEnumUsers(hnd, mem_ctx, &eu))
-      print_rid_list(eu.out.rids, eu.out.names, eu.out.num_users);
-
-   if(CAC_OP_FAILED(hnd->status))
-      printerr("Could not enumerate users.", hnd->status);
-}
diff --git a/examples/libmsrpc/test/Makefile b/examples/libmsrpc/test/Makefile
deleted file mode 100644 (file)
index 95fa5ef..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-CC=gcc
-INCLUDES= -I`pwd` -I../../../source/ -I../../../source/include -I../../../source/ubiqx
-
-DEFS= -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
-#CFLAGS= -O -D_SAMBA_BUILD_ -gstabs -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wwrite-strings -DDEBUG_PASSWORD -DDEVELOPER -Wdeclaration-after-statement -g $(INCLUDES) $(DEFS) -fPIC
-
-CFLAGS= -g -Wall -ansi $(INCLUDES) 
-
-LDFLAGS=-L. -L../../bin/ 
-LIBS=../../../source/bin/libmsrpc.so
-
-TESTS= lsapol lsaq lsaenum lsaenumprivs lsapriv ear \
-       regkey regopenkey regkeyenum regvalenum regsetval regqueryval regdelete security \
-                adduser samenum samlookup samgroup enable disable dominfo samuser \
-                svc \
-                smbc
-
-all: $(TESTS)
-
-lsapol: lsa/lsapol.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-lsapriv: lsa/lsapriv.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-lsaq: lsa/lsaq.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-lsaenum: lsa/lsaenum.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-lsaenumprivs: lsa/lsaenumprivs.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-lsaaddrights: lsa/lsaaddrights.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-ear: lsa/ear.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-regkey: reg/regkey.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-regopenkey: reg/regopenkey.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-regkeyenum: reg/regkeyenum.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-regkeycreate: reg/regkeycreate.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
-
-regvalenum: reg/regvalenum.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-regsetval: reg/regsetval.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-regqueryval: reg/regqueryval.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-regdelete: reg/regdelete.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-security: reg/security.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-adduser: sam/adduser.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-samenum: sam/samenum.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-samlookup: sam/samlookup.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-samgroup: sam/samgroup.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-enable: sam/enable.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-disable: sam/disable.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-samuser: sam/samuser.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-dominfo: sam/dominfo.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-svc: svcctl/svc.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS)
-
-smbc: smbc_test/smbc.o test_util.o
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< test_util.o $(LIBS) ../../../source/bin/libsmbclient.so
-
-clean:
-       rm -f $(TESTS) *.o lsa/*.o reg/*.o sam/*.o
diff --git a/examples/libmsrpc/test/README b/examples/libmsrpc/test/README
deleted file mode 100644 (file)
index 9352905..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-This code was written to test the different library functions. However, a simple example of almost every libmsrpc call can be found
-in this code.
-
-notes: most of the programs use a modified smbc_get_auth_data_fn which will not prompt for a user/domain/password so expect flaky results 
-if you run the tests with just a server, ie: svc remote_machine
-   
-
-If you get errors about the libmsrpc.so object, make sure your LD_LIBRARY_PATH points to /path/to/samba3/source/bin
diff --git a/examples/libmsrpc/test/lsa/ear.c b/examples/libmsrpc/test/lsa/ear.c
deleted file mode 100644 (file)
index 8a82025..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-/* connects to an LSA, asks for a list of server names,  prints out their sids, then looks up their names from the sids and prints them out again
- *  if you run as lsaq -p, then it will simulate a partial success for cac_GetNamesFromSids. It will try to lookup the server's local and domain sids
- */
-
-
-#include "libmsrpc.h"
-#include "includes.h"
-
-void fill_conn_info(CacServerHandle *hnd) {
-   pstring domain;
-   pstring username;
-   pstring password;
-   pstring server;
-
-   fprintf(stdout, "Enter domain name: ");
-   fscanf(stdin, "%s", domain);
-
-   fprintf(stdout, "Enter username: ");
-   fscanf(stdin, "%s", username);
-
-   fprintf(stdout, "Enter password (no input masking): ");
-   fscanf(stdin, "%s", password);
-
-   fprintf(stdout, "Enter server (ip or name): ");
-   fscanf(stdin, "%s", server);
-
-   hnd->domain = SMB_STRDUP(domain);
-   hnd->username = SMB_STRDUP(username);
-   hnd->password = SMB_STRDUP(password);
-   hnd->server = SMB_STRDUP(server);
-}
-
-void get_server_names(TALLOC_CTX *mem_ctx, int *num_names, char ***names) {
-   int i = 0;
-   pstring tmp;
-   
-   fprintf(stdout, "How many names do you want to lookup?: ");
-   fscanf(stdin, "%d", num_names);
-
-   *names = TALLOC_ARRAY(mem_ctx, char *, *num_names);
-   if(*names == NULL) {
-      fprintf(stderr, "No memory for allocation\n");
-      exit(-1);
-   }
-
-   for(i = 0; i < *num_names; i++) {
-      fprintf(stdout, "Enter name: ");
-      fscanf(stdin, "%s", tmp);
-      (*names)[i] = talloc_strdup(mem_ctx, tmp);
-   }
-}
-
-int main(int argc, char **argv) {
-   int i;
-   int result;
-   char **names;
-   int num_names;
-   int num_sids;
-   CacServerHandle *hnd = NULL;
-   POLICY_HND *lsa_pol  = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   DOM_SID *sid_buf     = NULL;
-
-   BOOL sim_partial     = False;
-
-   if(argc > 1 && strcmp(argv[1], "-p") == 0)
-      sim_partial = True;
-
-   mem_ctx = talloc_init("lsaq");
-
-   hnd = cac_NewServerHandle(False);
-
-   fill_conn_info(hnd);
-
-   get_server_names(mem_ctx, &num_names, &names);
-
-   /*connect to the PDC and open a LSA handle*/
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server.\n Error %s.\n", nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   fprintf(stdout, "Connected to server: %s\n", hnd->server);
-
-   struct LsaOpenPolicy lop;
-   ZERO_STRUCT(lop);
-
-   lop.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-   lop.in.security_qos = True;
-
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop)) {
-      fprintf(stderr, "Could not get lsa policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   fprintf(stdout, "Opened Policy Handle\n");
-
-   /*just to make things neater*/
-   lsa_pol = lop.out.pol;
-
-   /*fetch the local sid and domain sid for the pdc*/
-
-   struct LsaFetchSid fsop;
-   ZERO_STRUCT(fsop);
-
-   fsop.in.pol = lsa_pol;
-   fsop.in.info_class = (CAC_LOCAL_INFO|CAC_DOMAIN_INFO);
-
-   fprintf(stdout, "fetching SID info for %s\n", hnd->server);
-
-   result = cac_LsaFetchSid(hnd, mem_ctx, &fsop);
-   if(!result) {
-      fprintf(stderr, "Could not get sid for server: %s\n. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      talloc_destroy(mem_ctx);
-      exit(-1);
-   }
-
-   if(result == CAC_PARTIAL_SUCCESS) {
-      fprintf(stdout, "could not retrieve both domain and local information\n");
-   }
-   
-
-   fprintf(stdout, "Fetched SID info for %s\n", hnd->server);
-   if(fsop.out.local_sid != NULL)
-      fprintf(stdout, " domain: %s. Local SID: %s\n", fsop.out.local_sid->domain, sid_string_static(&fsop.out.local_sid->sid));
-
-   if(fsop.out.domain_sid != NULL)
-      fprintf(stdout, " domain: %s, Domain SID: %s\n", fsop.out.domain_sid->domain, sid_string_static(&fsop.out.domain_sid->sid));
-
-   fprintf(stdout, "Looking up sids\n");
-
-   
-   struct LsaGetSidsFromNames gsop;
-   ZERO_STRUCT(gsop);
-   
-   gsop.in.pol       = lsa_pol;
-   gsop.in.num_names = num_names;
-   gsop.in.names     = names;
-
-   result = cac_LsaGetSidsFromNames(hnd, mem_ctx, &gsop);
-
-   if(!result) {
-      fprintf(stderr, "Could not lookup any sids!\n Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   if(result == CAC_PARTIAL_SUCCESS) {
-      fprintf(stdout, "Not all names could be looked up.\nThe following names were not found:\n");
-      
-      for(i = 0; i < (num_names - gsop.out.num_found); i++) {
-         fprintf(stdout, " %s\n", gsop.out.unknown[i]);
-      }
-      
-      fprintf(stdout, "\n");
-   }
-
-   /*buffer the sids so we can look them up back to names*/
-   num_sids = (sim_partial) ? gsop.out.num_found + 2: gsop.out.num_found;
-   sid_buf = TALLOC_ARRAY(mem_ctx, DOM_SID, num_sids);
-
-   fprintf(stdout, "%d names were resolved: \n", gsop.out.num_found);
-
-
-   i = 0;
-   while(i < gsop.out.num_found) {
-      fprintf(stdout, " Name: %s\n SID: %s\n\n", gsop.out.sids[i].name, sid_string_static(&gsop.out.sids[i].sid));
-
-      sid_buf[i] = gsop.out.sids[i].sid;
-
-      printf("Attempting to open account\n");
-
-      struct LsaOpenAccount loa;
-      ZERO_STRUCT(loa);
-
-      loa.in.pol    = lsa_pol;
-      loa.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-      loa.in.sid    = &gsop.out.sids[i].sid;
-
-      if(!cac_LsaOpenAccount(hnd, mem_ctx, &loa)) {
-         fprintf(stderr, "Could not open account.\n Error: %s\n", nt_errstr(hnd->status));
-      }
-
-      printf("\nEnumerating privs:");
-      struct LsaEnumAccountRights earop;
-      ZERO_STRUCT(earop);
-
-      earop.in.pol = lsa_pol;
-
-      earop.in.sid = &gsop.out.sids[i].sid;
-
-      if(!cac_LsaEnumAccountRights(hnd, mem_ctx, &earop)) {
-         fprintf(stderr, "Could not enumerate account rights.\n Error: %s\n", nt_errstr(hnd->status));
-      }
-
-      int j;
-      printf( "Rights: ");
-      for(j = 0; j < earop.out.num_privs; j++) {
-         printf("  %s\n", earop.out.priv_names[j]);
-      }
-
-      printf("\n");
-
-
-      i++;
-   }
-
-   /*if we want a partial success to occur below, then add the server's SIDs to the end of the array*/
-   if(sim_partial) {
-      sid_buf[i] = fsop.out.local_sid->sid;
-      sid_buf[i+1] = fsop.out.domain_sid->sid;
-   }
-
-   fprintf(stdout, "Looking up Names from SIDs\n");
-
-   struct LsaGetNamesFromSids gnop;
-   ZERO_STRUCT(gnop);
-
-   gnop.in.pol       = lsa_pol;
-   gnop.in.num_sids  = num_sids;
-   gnop.in.sids      = sid_buf;
-
-   result = cac_LsaGetNamesFromSids(hnd, mem_ctx, &gnop);
-
-   if(!result) {
-      fprintf(stderr, "Could not lookup any names!.\n Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   if(result == CAC_PARTIAL_SUCCESS) {
-      fprintf(stdout, "\nNot all SIDs could be looked up.\n. The following SIDs were not found:\n");
-
-      for(i = 0; i < (num_sids - gnop.out.num_found); i++) {
-         fprintf(stdout, "SID: %s\n", sid_string_static(&gnop.out.unknown[i]));
-      }
-
-      fprintf(stdout, "\n");
-   }
-
-   fprintf(stdout, "%d SIDs were resolved: \n", gnop.out.num_found);
-   for(i = 0; i < gnop.out.num_found; i++) {
-      fprintf(stdout, " SID: %s\n Name: %s\n", sid_string_static(&gnop.out.sids[i].sid), gsop.out.sids[i].name);
-   }
-   
-done:
-
-   if(!cac_LsaClosePolicy(hnd, mem_ctx, lsa_pol)) {
-      fprintf(stderr, "Could not close LSA policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-   }
-   else {
-      fprintf(stdout, "Closed Policy handle.\n");
-   }
-
-   cac_FreeHandle(hnd);
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/test/lsa/lsaenum.c b/examples/libmsrpc/test/lsa/lsaenum.c
deleted file mode 100644 (file)
index d4ad4f7..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/*enumerates SIDs*/
-
-#include "libmsrpc.h"
-#include "includes.h"
-
-int main(int argc, char **argv) {
-
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   POLICY_HND *pol      = NULL;
-
-   int i;
-   int max_sids;
-
-   mem_ctx = talloc_init("lsaenum");
-
-   hnd = cac_NewServerHandle(True);
-   
-   printf("Enter server to connect to: ");
-   fscanf(stdin, "%s", hnd->server);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   printf("How many sids do you want to grab at a time? ");
-   fscanf(stdin, "%d", &max_sids);
-
-   struct LsaOpenPolicy lop;
-   ZERO_STRUCT(lop);
-
-   lop.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-   lop.in.security_qos = True;
-
-
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop)) {
-      fprintf(stderr, "Could not open policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   pol = lop.out.pol;
-
-
-   struct LsaEnumSids esop;
-   ZERO_STRUCT(esop);
-   esop.in.pol = pol;
-   /*grab a couple at a time to demonstrate multiple calls*/
-   esop.in.pref_max_sids = max_sids;
-
-   printf("Attempting to fetch SIDs %d at a time\n", esop.in.pref_max_sids);
-
-   while(cac_LsaEnumSids(hnd, mem_ctx, &esop)) {
-      
-      printf("\nEnumerated %d sids: \n", esop.out.num_sids);
-      for(i = 0; i < esop.out.num_sids; i++) {
-         printf(" SID: %s\n", sid_string_static(&esop.out.sids[i]));
-      }
-
-      printf("Resolving names\n");
-
-      struct LsaGetNamesFromSids gnop;
-      ZERO_STRUCT(gnop);
-
-      gnop.in.pol = pol;
-      gnop.in.sids = esop.out.sids;
-      gnop.in.num_sids = esop.out.num_sids;
-
-      if(!cac_LsaGetNamesFromSids(hnd, mem_ctx, &gnop)) {
-         fprintf(stderr, "Could not resolve names.\n Error: %s\n", nt_errstr(hnd->status));
-         goto done;
-      }
-
-      printf("\nResolved %d names: \n", gnop.out.num_found);
-      for(i = 0; i < gnop.out.num_found; i++) {
-         printf(" SID: %s\n", sid_string_static(&gnop.out.sids[i].sid));
-         printf(" Name: %s\n", gnop.out.sids[i].name);
-      }
-
-      /*clean up a little*/
-      talloc_free(gnop.out.sids);
-   }
-
-done:
-   if(!cac_LsaClosePolicy(hnd, mem_ctx, pol)) {
-      fprintf(stderr, "Could not close policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-   }
-
-   cac_FreeHandle(hnd);
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/test/lsa/lsaenumprivs.c b/examples/libmsrpc/test/lsa/lsaenumprivs.c
deleted file mode 100644 (file)
index 8b5c9de..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*enumerates privileges*/
-
-#include "libmsrpc.h"
-#include "includes.h"
-
-#define MAX_STRING_LEN 50;
-
-int main() {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-   POLICY_HND *lsa_pol  = NULL;
-
-   int i;
-
-   mem_ctx = talloc_init("lsatrust");
-
-   hnd = cac_NewServerHandle(True);
-
-   printf("Server: ");
-   fscanf(stdin, "%s", hnd->server);
-
-   printf("Connecting to server....\n");
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server.\n Error: %s\n errno %s\n", nt_errstr(hnd->status), strerror(errno));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   printf("Connected to server\n");
-
-   struct LsaOpenPolicy lop;
-   ZERO_STRUCT(lop);
-
-   lop.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-   lop.in.security_qos = True;
-
-
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop)) {
-      fprintf(stderr, "Could not open policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   lsa_pol = lop.out.pol;
-
-   printf("Enumerating Privileges\n");
-
-   struct LsaEnumPrivileges ep;
-   ZERO_STRUCT(ep);
-
-   ep.in.pol = lsa_pol;
-   ep.in.pref_max_privs = 50;
-
-   while(cac_LsaEnumPrivileges(hnd, mem_ctx, &ep)) {
-      printf(" Enumerated %d privileges\n", ep.out.num_privs);
-
-      for(i = 0; i < ep.out.num_privs; i++) {
-         printf("\"%s\"\n", ep.out.priv_names[i]);
-      }
-
-      printf("\n");
-   }
-
-   if(CAC_OP_FAILED(hnd->status)) {
-      fprintf(stderr, "Error while enumerating privileges.\n Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-done:
-   if(!cac_LsaClosePolicy(hnd, mem_ctx, lsa_pol)) {
-      fprintf(stderr, "Could not close policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-   }
-
-   cac_FreeHandle(hnd);
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/test/lsa/lsapol.c b/examples/libmsrpc/test/lsa/lsapol.c
deleted file mode 100644 (file)
index 58407e4..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/* simple test code, opens and closes an LSA policy handle using libmsrpc, careful.. there's no password input masking*/
-
-#include "includes.h"
-#include "libmsrpc.h"
-
-void fill_conn_info(CacServerHandle *hnd) {
-   pstring domain;
-   pstring username;
-   pstring password;
-   pstring server;
-
-   fprintf(stdout, "Enter domain name: ");
-   fscanf(stdin, "%s", domain);
-
-   fprintf(stdout, "Enter username: ");
-   fscanf(stdin, "%s", username);
-
-   fprintf(stdout, "Enter password (no input masking): ");
-   fscanf(stdin, "%s", password);
-
-   fprintf(stdout, "Enter server (ip or name): ");
-   fscanf(stdin, "%s", server);
-
-   hnd->domain = SMB_STRDUP(domain);
-   hnd->username = SMB_STRDUP(username);
-   hnd->password = SMB_STRDUP(password);
-   hnd->server = SMB_STRDUP(server);
-}
-
-int main() {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx;
-   struct LsaOpenPolicy op;
-
-   mem_ctx = talloc_init("lsapol");
-
-   
-   hnd = cac_NewServerHandle(False);
-
-   /*this line is unnecesary*/
-   cac_SetAuthDataFn(hnd, cac_GetAuthDataFn);
-
-   hnd->debug = 0;
-
-   fill_conn_info(hnd);
-
-   /*connect to the server, its name/ip is already in the handle so just pass NULL*/
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server. \n Error %s\n errno(%d): %s\n", nt_errstr(hnd->status), errno, strerror(errno));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-   else {
-      fprintf(stdout, "Connected to server\n");
-   }
-
-   op.in.access = GENERIC_EXECUTE_ACCESS;
-   op.in.security_qos = True;
-
-   /*open the handle*/
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &op)) {
-      fprintf(stderr, "Could not open policy.\n Error: %s.errno: %d.\n", nt_errstr(hnd->status), errno);
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-   else {
-      fprintf(stdout, "Opened Policy handle\n");
-   }
-
-   /*close the handle*/
-   if(!cac_LsaClosePolicy(hnd, mem_ctx, op.out.pol)) {
-      fprintf(stderr, "Could not close policy. Error: %s\n", nt_errstr(hnd->status));
-   }
-   else {
-      fprintf(stdout, "Closed Policy handle\n");
-   }
-
-   /*cleanup*/
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   fprintf(stdout, "Free'd server handle\n");
-
-   return 0;
-}
-
diff --git a/examples/libmsrpc/test/lsa/lsapriv.c b/examples/libmsrpc/test/lsa/lsapriv.c
deleted file mode 100644 (file)
index 80b3ea1..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*tries to set privileges for an account*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-#define BIGGEST_UINT32 0xffffffff
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-            
-   struct LsaOpenPolicy lop;
-   struct LsaEnumPrivileges ep;
-   struct LsaEnumAccountRights ar;
-   struct LsaAddPrivileges ap;
-   
-   fstring tmp;
-
-   uint32 i = 0;
-   
-   mem_ctx = talloc_init("lsapriv");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   ZERO_STRUCT(lop);
-
-   lop.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop)) {
-      fprintf(stderr, "Could not open LSA policy. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   /*first enumerate possible privileges*/
-   ZERO_STRUCT(ep);
-
-   ep.in.pol = lop.out.pol;
-   ep.in.pref_max_privs = BIGGEST_UINT32;
-
-   printf("Enumerating supported privileges:\n");
-   while(cac_LsaEnumPrivileges(hnd, mem_ctx, &ep)) {
-      for(i = 0; i < ep.out.num_privs; i++) {
-         printf("\t%s\n", ep.out.priv_names[i]);
-      }
-   }
-
-   if(CAC_OP_FAILED(hnd->status)) {
-      fprintf(stderr, "Could not enumerate privileges. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   printf("Enter account name: ");
-   cactest_readline(stdin, tmp);
-
-   ZERO_STRUCT(ar);
-
-   ar.in.pol = lop.out.pol;
-   ar.in.name = talloc_strdup(mem_ctx, tmp);
-   
-   printf("Enumerating privileges for %s:\n", ar.in.name);
-   if(!cac_LsaEnumAccountRights(hnd, mem_ctx, &ar)) {
-      fprintf(stderr, "Could not enumerate privileges. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   printf("Enumerated %d privileges:\n", ar.out.num_privs);
-
-   for(i = 0; i < ar.out.num_privs; i++) 
-      printf("\t%s\n", ar.out.priv_names[i]);
-
-   ZERO_STRUCT(ap);
-
-   ap.in.pol = lop.out.pol;
-   ap.in.name = ar.in.name;
-
-   printf("How many privileges will you set: ");
-   scanf("%d", &ap.in.num_privs);
-
-   ap.in.priv_names = talloc_array(mem_ctx, char *, ap.in.num_privs);
-   if(!ap.in.priv_names) {
-      fprintf(stderr, "No memory\n");
-      goto done;
-   }
-
-   for(i = 0; i < ap.in.num_privs; i++) {
-      printf("Enter priv %d: ", i);
-      cactest_readline(stdin, tmp);
-
-      ap.in.priv_names[i] = talloc_strdup(mem_ctx, tmp);
-   }
-
-   if(!cac_LsaSetPrivileges(hnd, mem_ctx, &ap)) {
-      fprintf(stderr, "Could not set privileges. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-done:
-   talloc_destroy(mem_ctx);
-   cac_FreeHandle(hnd);
-
-   return 0;
-
-}
-
diff --git a/examples/libmsrpc/test/lsa/lsaq.c b/examples/libmsrpc/test/lsa/lsaq.c
deleted file mode 100644 (file)
index 54c1849..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-/* connects to an LSA, asks for a list of server names,  prints out their sids, then looks up their names from the sids and prints them out again
- *  if you run as lsaq -p, then it will simulate a partial success for cac_GetNamesFromSids. It will try to lookup the server's local and domain sids
- */
-
-
-#include "libmsrpc.h"
-#include "includes.h"
-
-void fill_conn_info(CacServerHandle *hnd) {
-   pstring domain;
-   pstring username;
-   pstring password;
-   pstring server;
-
-   fprintf(stdout, "Enter domain name: ");
-   fscanf(stdin, "%s", domain);
-
-   fprintf(stdout, "Enter username: ");
-   fscanf(stdin, "%s", username);
-
-   fprintf(stdout, "Enter password (no input masking): ");
-   fscanf(stdin, "%s", password);
-
-   fprintf(stdout, "Enter server (ip or name): ");
-   fscanf(stdin, "%s", server);
-
-   hnd->domain = SMB_STRDUP(domain);
-   hnd->username = SMB_STRDUP(username);
-   hnd->password = SMB_STRDUP(password);
-   hnd->server = SMB_STRDUP(server);
-}
-
-void get_server_names(TALLOC_CTX *mem_ctx, int *num_names, char ***names) {
-   int i = 0;
-   pstring tmp;
-   
-   fprintf(stdout, "How many names do you want to lookup?: ");
-   fscanf(stdin, "%d", num_names);
-
-   *names = TALLOC_ARRAY(mem_ctx, char *, *num_names);
-   if(*names == NULL) {
-      fprintf(stderr, "No memory for allocation\n");
-      exit(-1);
-   }
-
-   for(i = 0; i < *num_names; i++) {
-      fprintf(stdout, "Enter name: ");
-      fscanf(stdin, "%s", tmp);
-      (*names)[i] = talloc_strdup(mem_ctx, tmp);
-   }
-}
-
-int main(int argc, char **argv) {
-   int i;
-   int result;
-   char **names;
-   int num_names;
-   int num_sids;
-   CacServerHandle *hnd = NULL;
-   POLICY_HND *lsa_pol  = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   DOM_SID *sid_buf     = NULL;
-
-   BOOL sim_partial     = False;
-
-   if(argc > 1 && strcmp(argv[1], "-p") == 0)
-      sim_partial = True;
-
-   mem_ctx = talloc_init("lsaq");
-
-   hnd = cac_NewServerHandle(False);
-
-   fill_conn_info(hnd);
-
-   get_server_names(mem_ctx, &num_names, &names);
-
-   /*connect to the PDC and open a LSA handle*/
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server.\n Error %s.\n", nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   fprintf(stdout, "Connected to server: %s\n", hnd->server);
-
-   struct LsaOpenPolicy lop;
-   ZERO_STRUCT(lop);
-
-   lop.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-   lop.in.security_qos = True;
-
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop)) {
-      fprintf(stderr, "Could not get lsa policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   fprintf(stdout, "Opened Policy Handle\n");
-
-   /*just to make things neater*/
-   lsa_pol = lop.out.pol;
-
-   /*fetch the local sid and domain sid for the pdc*/
-
-   struct LsaFetchSid fsop;
-   ZERO_STRUCT(fsop);
-
-   fsop.in.pol = lsa_pol;
-   fsop.in.info_class = (CAC_LOCAL_INFO|CAC_DOMAIN_INFO);
-
-   fprintf(stdout, "fetching SID info for %s\n", hnd->server);
-
-   result = cac_LsaFetchSid(hnd, mem_ctx, &fsop);
-   if(!result) {
-      fprintf(stderr, "Could not get sid for server: %s\n. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      talloc_destroy(mem_ctx);
-      exit(-1);
-   }
-
-   if(result == CAC_PARTIAL_SUCCESS) {
-      fprintf(stdout, "could not retrieve both domain and local information\n");
-   }
-   
-
-   fprintf(stdout, "Fetched SID info for %s\n", hnd->server);
-   if(fsop.out.local_sid != NULL)
-      fprintf(stdout, " domain: %s. Local SID: %s\n", fsop.out.local_sid->domain, sid_string_static(&fsop.out.local_sid->sid));
-
-   if(fsop.out.domain_sid != NULL)
-      fprintf(stdout, " domain: %s, Domain SID: %s\n", fsop.out.domain_sid->domain, sid_string_static(&fsop.out.domain_sid->sid));
-
-   fprintf(stdout, "\nAttempting to query info policy\n");
-
-   struct LsaQueryInfoPolicy qop;
-   ZERO_STRUCT(qop);
-
-   qop.in.pol = lsa_pol;
-
-   if(!cac_LsaQueryInfoPolicy(hnd, mem_ctx, &qop)) {
-      fprintf(stderr, "Could not query information policy!.\n Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   fprintf(stdout, "Query result: \n");
-   fprintf(stdout, " domain name: %s\n", qop.out.domain_name);
-   fprintf(stdout, " dns name:    %s\n", qop.out.dns_name);
-   fprintf(stdout, " forest name: %s\n", qop.out.forest_name);
-   fprintf(stdout, " domain guid: %s\n", smb_uuid_string_static(*qop.out.domain_guid));
-   fprintf(stdout, " domain sid:  %s\n", sid_string_static(qop.out.domain_sid));
-
-   fprintf(stdout, "\nLooking up sids\n");
-   
-   struct LsaGetSidsFromNames gsop;
-   ZERO_STRUCT(gsop);
-   
-   gsop.in.pol       = lsa_pol;
-   gsop.in.num_names = num_names;
-   gsop.in.names     = names;
-
-   result = cac_LsaGetSidsFromNames(hnd, mem_ctx, &gsop);
-
-   if(!result) {
-      fprintf(stderr, "Could not lookup any sids!\n Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   if(result == CAC_PARTIAL_SUCCESS) {
-      fprintf(stdout, "Not all names could be looked up.\nThe following names were not found:\n");
-      
-      for(i = 0; i < (num_names - gsop.out.num_found); i++) {
-         fprintf(stdout, " %s\n", gsop.out.unknown[i]);
-      }
-      
-      fprintf(stdout, "\n");
-   }
-
-   /*buffer the sids so we can look them up back to names*/
-   num_sids = (sim_partial) ? gsop.out.num_found + 2: gsop.out.num_found;
-   sid_buf = TALLOC_ARRAY(mem_ctx, DOM_SID, num_sids);
-
-   fprintf(stdout, "%d names were resolved: \n", gsop.out.num_found);
-
-
-   i = 0;
-   while(i < gsop.out.num_found) {
-      fprintf(stdout, " Name: %s\n SID: %s\n\n", gsop.out.sids[i].name, sid_string_static(&gsop.out.sids[i].sid));
-
-      sid_buf[i] = gsop.out.sids[i].sid;
-
-      i++;
-   }
-   
-   /*if we want a partial success to occur below, then add the server's SIDs to the end of the array*/
-   if(sim_partial) {
-      sid_buf[i] = fsop.out.local_sid->sid;
-      sid_buf[i+1] = fsop.out.domain_sid->sid;
-   }
-
-   fprintf(stdout, "Looking up Names from SIDs\n");
-
-   struct LsaGetNamesFromSids gnop;
-   ZERO_STRUCT(gnop);
-
-   gnop.in.pol       = lsa_pol;
-   gnop.in.num_sids  = num_sids;
-   gnop.in.sids      = sid_buf;
-
-   result = cac_LsaGetNamesFromSids(hnd, mem_ctx, &gnop);
-
-   if(!result) {
-      fprintf(stderr, "Could not lookup any names!.\n Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   if(result == CAC_PARTIAL_SUCCESS) {
-      fprintf(stdout, "\nNot all SIDs could be looked up.\n. The following SIDs were not found:\n");
-
-      for(i = 0; i < (num_sids - gnop.out.num_found); i++) {
-         fprintf(stdout, "SID: %s\n", sid_string_static(&gnop.out.unknown[i]));
-      }
-
-      fprintf(stdout, "\n");
-   }
-
-   fprintf(stdout, "%d SIDs were resolved: \n", gnop.out.num_found);
-   for(i = 0; i < gnop.out.num_found; i++) {
-      fprintf(stdout, " SID: %s\n Name: %s\n", sid_string_static(&gnop.out.sids[i].sid), gsop.out.sids[i].name);
-   }
-   
-done:
-
-   if(!cac_LsaClosePolicy(hnd, mem_ctx, lsa_pol)) {
-      fprintf(stderr, "Could not close LSA policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-   }
-   else {
-      fprintf(stdout, "Closed Policy handle.\n");
-   }
-
-   cac_FreeHandle(hnd);
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/test/lsa/lsatrust.c b/examples/libmsrpc/test/lsa/lsatrust.c
deleted file mode 100644 (file)
index 6ad293f..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*queries trusted domain information*/
-
-#include "libmsrpc.h"
-#include "includes.h"
-
-#define MAX_STRING_LEN 50;
-
-void print_info(LSA_TRUSTED_DOMAIN_INFO *info) {
-   switch(info->info_class) {
-      case CAC_INFO_TRUSTED_DOMAIN_FULL_INFO:
-      case CAC_INFO_TRUSTED_DOMAIN_INFO_ALL:
-         printf("     Domain Name:     %s\n", unistr2_static(&info->info_ex.domain_name.unistring));
-         printf("     Netbios Name:    %s\n", unistr2_static(&info->info_ex.netbios_name.unistring));
-         printf("     Domain Sid:      %s\n", sid_string_static(&info->info_ex.sid.sid));
-         printf("     Trust direction: %d\n", info->info_ex.trust_direction);
-         printf("     Trust Type:      %d\n", info->info_ex.trust_type);
-         printf("     Trust attr:      %d\n", info->info_ex.trust_attributes); 
-         printf("     Posix Offset:    %d\n", info->posix_offset.posix_offset);
-         break;
-   }
-}
-
-int main() {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-   POLICY_HND *lsa_pol  = NULL;
-
-   int i;
-
-   mem_ctx = talloc_init("lsatrust");
-
-   hnd = cac_NewServerHandle(False);
-
-   /*malloc some memory so get_auth_data_fn can work*/
-   hnd->username     = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-   hnd->domain       = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-   hnd->netbios_name = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-   hnd->password     = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-
-   hnd->server       = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-
-
-   printf("Server: ");
-   fscanf(stdin, "%s", hnd->server);
-
-   printf("Connecting to server....\n");
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server.\n Error: %s\n errno %s\n", nt_errstr(hnd->status), strerror(errno));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   printf("Connected to server\n");
-
-   struct LsaOpenPolicy lop;
-   ZERO_STRUCT(lop);
-
-   lop.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-   lop.in.security_qos = True;
-
-
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop)) {
-      fprintf(stderr, "Could not open policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-   lsa_pol = lop.out.pol;
-
-   printf("Enumerating Trusted Domains\n");
-
-   struct LsaEnumTrustedDomains etd;
-   ZERO_STRUCT(etd);
-
-   etd.in.pol = lsa_pol;
-
-   while(cac_LsaEnumTrustedDomains(hnd, mem_ctx, &etd)) {
-      printf(" Enumerated %d domains\n", etd.out.num_domains);
-
-      for(i = 0; i < etd.out.num_domains; i++) {
-         printf("   Name: %s\n", etd.out.domain_names[i]);
-         printf("   SID:  %s\n", sid_string_static(&etd.out.domain_sids[i]));
-
-         printf("\n   Attempting to open domain...\n");
-
-         struct LsaOpenTrustedDomain otd;
-         ZERO_STRUCT(otd);
-
-         otd.in.pol = lsa_pol;
-         otd.in.domain_sid = &etd.out.domain_sids[i];
-         otd.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-
-         /*try to query trusted domain info by name*/
-         struct LsaQueryTrustedDomainInfo qtd;
-         ZERO_STRUCT(qtd);
-
-         qtd.in.pol = lsa_pol;
-         qtd.in.domain_name = etd.out.domain_names[i];
-
-         
-         int j;
-         for(j = 0; j < 100; j++ ) {
-            qtd.in.info_class = j;
-
-            printf("    Querying trustdom by name\n");
-            if(!cac_LsaQueryTrustedDomainInfo(hnd, mem_ctx, &qtd)) {
-               fprintf(stderr, "    could not query trusted domain info.\n    Error %s\n", nt_errstr(hnd->status));
-               continue;
-            }
-            
-            printf("    info_class %d succeeded\n", j); 
-            printf("    Query result:\n");    
-            printf("     size %d\n", sizeof(*qtd.out.info));
-         }
-
-         /*try to query trusted domain info by SID*/
-         printf("    Querying trustdom by sid\n");
-         qtd.in.domain_sid = &etd.out.domain_sids[i];
-         if(!cac_LsaQueryTrustedDomainInfo(hnd, mem_ctx, &qtd)) {
-            fprintf(stderr, "    could not query trusted domain info.\n    Error %s\n", nt_errstr(hnd->status));
-            continue;
-         }
-
-         printf("    Query result:\n");    
-/*         print_info(qtd.out.info);*/
-
-         if(CAC_OP_FAILED(hnd->status)) {
-            fprintf(stderr, "    Could not enum sids.\n    Error: %s\n", nt_errstr(hnd->status));
-            continue;
-         }
-      }
-
-      printf("\n");
-   }
-
-   if(CAC_OP_FAILED(hnd->status)) {
-      fprintf(stderr, "Error while enumerating trusted domains.\n Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-done:
-   if(!cac_LsaClosePolicy(hnd, mem_ctx, lsa_pol)) {
-      fprintf(stderr, "Could not close policy handle.\n Error: %s\n", nt_errstr(hnd->status));
-   }
-
-   cac_FreeHandle(hnd);
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/test/reg/regdelete.c b/examples/libmsrpc/test/reg/regdelete.c
deleted file mode 100644 (file)
index 50b08ba..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*tests deleting a key or value*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   fstring tmp;
-   char input = 'v';
-   
-   mem_ctx = talloc_init("regdelete");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   printf("enter key to open: \n");
-   cactest_readline(stdin, tmp);
-
-   struct RegOpenKey rok;
-   ZERO_STRUCT(rok);
-
-   rok.in.name = talloc_strdup(mem_ctx, tmp);
-   rok.in.access = REG_KEY_ALL;
-
-   if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-      fprintf(stderr, "Could not open key %s. Error %s\n", rok.in.name, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   printf("getting version (just for testing\n");
-
-   struct RegGetVersion rgv;
-   ZERO_STRUCT(rgv);
-
-   rgv.in.key = rok.out.key;
-
-   if(!cac_RegGetVersion(hnd, mem_ctx, &rgv))
-      fprintf(stderr, "Could not get version. Error: %s\n", nt_errstr(hnd->status));
-   else
-      printf("Version: %d\n", rgv.out.version);
-
-
-   while(input == 'v' || input == 'k') {
-      printf("Delete [v]alue [k]ey or [q]uit: ");
-      scanf("%c", &input);
-
-      switch(input) {
-         case 'v':
-            printf("Value to delete: ");
-            cactest_readline(stdin, tmp);
-            
-            struct RegDeleteValue rdv;
-            ZERO_STRUCT(rdv);
-            
-            rdv.in.parent_key = rok.out.key;
-            rdv.in.name   = talloc_strdup(mem_ctx, tmp);
-
-            if(!cac_RegDeleteValue(hnd, mem_ctx, &rdv))
-               fprintf(stderr, "Could not delete value %s. Error: %s\n", rdv.in.name, nt_errstr(hnd->status));
-
-            break;
-         case 'k':
-            printf("Key to delete: ");
-            cactest_readline(stdin, tmp);
-            
-            struct RegDeleteKey rdk;
-            ZERO_STRUCT(rdk);
-
-            rdk.in.parent_key = rok.out.key;
-            rdk.in.name   = talloc_strdup(mem_ctx, tmp);
-
-            printf("delete recursively? [y/n]: ");
-            cactest_readline(stdin, tmp);
-
-            rdk.in.recursive = (tmp[0] == 'y') ? True : False;
-
-            if(!cac_RegDeleteKey(hnd, mem_ctx, &rdk))
-               fprintf(stderr, "Could not delete key %s. Error %s\n", rdk.in.name, nt_errstr(hnd->status));
-
-            break;
-      }
-   }
-   cac_RegClose(hnd, mem_ctx, rok.out.key);
-
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
-
-
diff --git a/examples/libmsrpc/test/reg/regkey.c b/examples/libmsrpc/test/reg/regkey.c
deleted file mode 100644 (file)
index a90d06c..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*opens and closes a key*/
-
-#include "libmsrpc.h"
-
-int main() {
-   CacServerHandle *hnd = NULL;
-    TALLOC_CTX *mem_ctx  = NULL;
-    fstring key;
-
-    mem_ctx = talloc_init("regkey");
-    hnd = cac_NewServerHandle(False);
-
-    /*allocate some memory so get_auth_data_fn can do it's magic*/
-    hnd->username = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-    hnd->domain   = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-    hnd->netbios_name = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-    hnd->password = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-    hnd->server   = SMB_MALLOC_ARRAY(char, sizeof(fstring));
-    printf("Enter server to connect to: ");
-    fscanf(stdin, "%s", hnd->server);
-
-    printf("Enter key to open: ");
-    fscanf(stdin, "%s", key);
-
-    if(!cac_Connect(hnd, NULL)) {
-       fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-       cac_FreeHandle(hnd);
-       exit(-1);
-    }
-
-    struct RegConnect rc;
-    ZERO_STRUCT(rc);
-
-    rc.in.access = REG_KEY_ALL;
-    rc.in.root   = HKEY_LOCAL_MACHINE;
-
-    if(!cac_RegConnect(hnd, mem_ctx, &rc)) {
-       fprintf(stderr, " Could not connect to registry. %s\n", nt_errstr(hnd->status));
-       goto done;
-    }
-
-    printf("trying to open key %s...\n", key);
-
-    
-    struct RegOpenKey rok;
-    ZERO_STRUCT(rok);
-
-    rok.in.parent_key = rc.out.key;
-    rok.in.name   = key;
-    rok.in.access = REG_KEY_ALL;
-
-    if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-       fprintf(stderr, "Could not open key %s\n Error: %s\n", rok.in.name, nt_errstr(hnd->status));
-       goto done;
-    }
-
-    if(!cac_RegClose(hnd, mem_ctx, rok.out.key)) {
-       fprintf(stderr, "Could not close handle %s\n", nt_errstr(hnd->status));
-    }
-
-    if(!cac_RegClose(hnd, mem_ctx, rc.out.key)) {
-       fprintf(stderr, " Could not close handle. %s\n", nt_errstr(hnd->status));
-    }
-
-done:
-    cac_FreeHandle(hnd);
-
-    talloc_destroy(mem_ctx);
-
-    return 0;
-
-}
diff --git a/examples/libmsrpc/test/reg/regkeycreate.c b/examples/libmsrpc/test/reg/regkeycreate.c
deleted file mode 100644 (file)
index 50764f1..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*tests creating a registry key*/
-
-#include "libmsrpc.h"
-
-#define MAX_KEYS_PER_ENUM 3
-
-int main() {
-   CacServerHandle *hnd = NULL;
-    TALLOC_CTX *mem_ctx  = NULL;
-    fstring key_name;
-
-    fstring key_to_create;
-
-    mem_ctx = talloc_init("regcreatekey");
-    hnd = cac_NewServerHandle(True);
-
-    printf("Enter server to connect to: ");
-    fscanf(stdin, "%s", hnd->server);
-
-    printf("Enter key to open: ");
-    fscanf(stdin, "%s", key_name);
-
-    printf("Enter key to create: ");
-    fscanf(stdin, "%s", key_to_create);
-
-    if(!cac_Connect(hnd, NULL)) {
-       fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-       cac_FreeHandle(hnd);
-       exit(-1);
-    }
-
-    printf("trying to open key %s...\n", key_name);
-
-    struct RegOpenKey rok;
-    ZERO_STRUCT(rok);
-
-    rok.in.parent_key = NULL;
-    rok.in.name   = key_name;
-    rok.in.access = REG_KEY_ALL;
-
-    if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-       fprintf(stderr, "Could not open key %s\n Error: %s\n", rok.in.name, nt_errstr(hnd->status));
-       goto done;
-    }
-
-    printf("Creating key %s...\n", key_to_create);
-
-    struct RegCreateKey rck;
-    ZERO_STRUCT(rck);
-
-    rck.in.parent_key = rok.out.key;
-    rck.in.key_name = talloc_strdup(mem_ctx, key_to_create);
-    rck.in.class_name = talloc_strdup(mem_ctx, "");
-    rck.in.access = REG_KEY_ALL;
-
-    if(!cac_RegCreateKey(hnd, mem_ctx, &rck)) {
-       fprintf(stderr, "Could not create key. Error %s\n", nt_errstr(hnd->status));
-       goto done;
-    }
-
-    if(!cac_RegClose(hnd, mem_ctx, rck.out.key)) {
-       fprintf(stderr, "Could not close key.  Error %s\n", nt_errstr(hnd->status));
-       goto done;
-    }
-
-    /**enumerate all the subkeys*/
-    printf("Enumerating all subkeys:\n");
-
-    struct RegEnumKeys ek;
-    ZERO_STRUCT(ek);
-
-    ek.in.key = rok.out.key;
-    ek.in.max_keys = 50;
-
-    while(cac_RegEnumKeys(hnd, mem_ctx, &ek)) {
-       int j;
-
-       for(j = 0; j < ek.out.num_keys; j++) {
-          printf(" Key name: %s\n", ek.out.key_names[j]);
-       }
-    }
-
-    if(CAC_OP_FAILED(hnd->status)) {
-       fprintf(stderr, "Could not enumerate keys: %s\n", nt_errstr(hnd->status));
-       goto done;
-    }
-
-    printf("deleting key %s\n", key_to_create);
-
-    struct RegDeleteKey rdk;
-    ZERO_STRUCT(rdk);
-
-    rdk.in.parent_key = rok.out.key;
-    rdk.in.name   = key_to_create;
-
-    if(!cac_RegDeleteKey(hnd, mem_ctx, &rdk)) {
-       fprintf(stderr, "Could not delete key.  Error %s\n", nt_errstr(hnd->status));
-    }
-
-    printf("closing key %s...\n", key_name);
-
-    if(!cac_RegClose(hnd, mem_ctx, rok.out.key)) {
-       fprintf(stderr, "Could not close handle %s\n", nt_errstr(hnd->status));
-    }
-
-done:
-    cac_FreeHandle(hnd);
-
-    talloc_destroy(mem_ctx);
-
-    return 0;
-
-}
diff --git a/examples/libmsrpc/test/reg/regkeyenum.c b/examples/libmsrpc/test/reg/regkeyenum.c
deleted file mode 100644 (file)
index f140d95..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*tests enumerating keys or values*/
-
-#include "libmsrpc.h"
-
-#define MAX_KEYS_PER_ENUM 3
-
-int main() {
-   CacServerHandle *hnd = NULL;
-    TALLOC_CTX *mem_ctx  = NULL;
-    int num_keys;
-
-    int max_enum;
-
-    int i;
-
-    fstring *key_names;
-
-    mem_ctx = talloc_init("regkeyenum");
-    hnd = cac_NewServerHandle(True);
-
-    printf("Enter server to connect to: ");
-    fscanf(stdin, "%s", hnd->server);
-
-    printf("How many keys do you want to open?: ");
-    fscanf(stdin, "%d", &num_keys);
-
-    printf("How many keys per enum?: ");
-    fscanf(stdin, "%d", &max_enum);
-
-    key_names = TALLOC_ARRAY(mem_ctx, fstring , num_keys);
-    if(!key_names) {
-       fprintf(stderr, "No memory\n");
-       exit(-1);
-    }
-
-    for(i = 0; i < num_keys; i++) {
-       printf("Enter key to open: ");
-       fscanf(stdin, "%s", key_names[i]);
-    }
-
-    if(!cac_Connect(hnd, NULL)) {
-       fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-       cac_FreeHandle(hnd);
-       exit(-1);
-    }
-
-    for(i = 0; i < num_keys; i++) {
-       printf("trying to open key %s...\n", key_names[i]);
-
-       struct RegOpenKey rok;
-       ZERO_STRUCT(rok);
-
-       rok.in.parent_key = NULL;
-       rok.in.name   = key_names[i];
-       rok.in.access = REG_KEY_ALL;
-
-       if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-          fprintf(stderr, "Could not open key %s\n Error: %s\n", rok.in.name, nt_errstr(hnd->status));
-          continue;
-       }
-
-       /**enumerate all the subkeys*/
-       printf("Enumerating all subkeys:\n");
-
-       struct RegEnumKeys ek;
-       ZERO_STRUCT(ek);
-
-       ek.in.key = rok.out.key;
-       ek.in.max_keys = max_enum;
-
-       while(cac_RegEnumKeys(hnd, mem_ctx, &ek)) {
-          int j;
-
-          for(j = 0; j < ek.out.num_keys; j++) {
-             printf(" Key name: %s\n", ek.out.key_names[j]);
-          }
-       }
-
-       if(CAC_OP_FAILED(hnd->status)) {
-          fprintf(stderr, "Could not enumerate keys: %s\n", nt_errstr(hnd->status));
-          continue;
-       }
-
-       printf("closing key %s...\n", key_names[i]);
-
-       if(!cac_RegClose(hnd, mem_ctx, rok.out.key)) {
-          fprintf(stderr, "Could not close handle %s\n", nt_errstr(hnd->status));
-       }
-    }
-
-    cac_FreeHandle(hnd);
-
-    talloc_destroy(mem_ctx);
-
-    return 0;
-
-}
diff --git a/examples/libmsrpc/test/reg/regopen.c b/examples/libmsrpc/test/reg/regopen.c
deleted file mode 100644 (file)
index fedc52e..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*opens and closes a registry handle*/
-
-#include "libmsrpc.h"
-
-int main() {
-   CacServerHandle *hnd = NULL;
-    TALLOC_CTX *mem_ctx  = NULL;
-    POLICY_HND **keys      = NULL;
-
-    char roots[4][50] = { {CAC_HKCR}, {CAC_HKLM}, {CAC_HKU}, {CAC_HKPD} };
-
-    int i;
-
-    mem_ctx = talloc_init("regopen");
-    hnd = cac_NewServerHandle(True);
-
-    keys = TALLOC_ARRAY(mem_ctx, POLICY_HND *, 4);
-    
-    printf("Enter server to connect to: ");
-    fscanf(stdin, "%s", hnd->server);
-
-    if(!cac_Connect(hnd, NULL)) {
-       fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-       cac_FreeHandle(hnd);
-       exit(-1);
-    }
-
-    struct RegConnect rc;
-    ZERO_STRUCT(rc);
-
-    rc.in.access = SEC_RIGHT_MAXIMUM_ALLOWED;
-
-    for(i = 0; i < 4; i++) {
-       printf("opening: %s\n", roots[i]);
-
-       rc.in.root = roots[i];
-
-       if(!cac_RegConnect(hnd, mem_ctx, &rc)) {
-          fprintf(stderr, " Could not connect to registry. %s\n", nt_errstr(hnd->status));
-          continue;
-       }
-
-       keys[i] = rc.out.key;
-    }
-
-    for(i = 3; i >= 0; i--) {
-       if(keys[i] == NULL)
-          continue;
-
-       printf("closing: %s\n", roots[i]);
-
-       if(!cac_RegClose(hnd, mem_ctx, keys[i])) {
-          fprintf(stderr, " Could not close handle. %s\n", nt_errstr(hnd->status));
-       }
-    }
-
-    cac_FreeHandle(hnd);
-
-    talloc_destroy(mem_ctx);
-
-    return 0;
-
-}
diff --git a/examples/libmsrpc/test/reg/regopenkey.c b/examples/libmsrpc/test/reg/regopenkey.c
deleted file mode 100644 (file)
index 732da17..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*tests cac_RegOpenKey()*/
-
-#include "libmsrpc.h"
-
-int main() {
-   CacServerHandle *hnd = NULL;
-    TALLOC_CTX *mem_ctx  = NULL;
-    int num_keys;
-    int i;
-
-    fstring *key_names;
-
-    mem_ctx = talloc_init("regopenkey");
-    hnd = cac_NewServerHandle(True);
-
-    printf("Enter server to connect to: ");
-    fscanf(stdin, "%s", hnd->server);
-
-    printf("How many keys do you want to open?: ");
-    fscanf(stdin, "%d", &num_keys);
-
-    key_names = TALLOC_ARRAY(mem_ctx, fstring , num_keys);
-    if(!key_names) {
-       fprintf(stderr, "No memory\n");
-       exit(-1);
-    }
-
-    for(i = 0; i < num_keys; i++) {
-       printf("Enter key to open: ");
-       fscanf(stdin, "%s", key_names[i]);
-    }
-
-    if(!cac_Connect(hnd, NULL)) {
-       fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-       cac_FreeHandle(hnd);
-       exit(-1);
-    }
-
-    for(i = 0; i < num_keys; i++) {
-       printf("trying to open key %s...\n", key_names[i]);
-
-       struct RegOpenKey rok;
-       ZERO_STRUCT(rok);
-
-       rok.in.parent_key = NULL;
-       rok.in.name   = key_names[i];
-       rok.in.access = REG_KEY_ALL;
-
-       if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-          fprintf(stderr, "Could not open key %s\n Error: %s\n", rok.in.name, nt_errstr(hnd->status));
-          continue;
-       }
-
-       printf("closing key %s...\n", key_names[i]);
-
-       if(!cac_RegClose(hnd, mem_ctx, rok.out.key)) {
-          fprintf(stderr, "Could not close handle %s\n", nt_errstr(hnd->status));
-       }
-    }
-
-    cac_FreeHandle(hnd);
-
-    talloc_destroy(mem_ctx);
-
-    return 0;
-
-}
diff --git a/examples/libmsrpc/test/reg/regqueryval.c b/examples/libmsrpc/test/reg/regqueryval.c
deleted file mode 100644 (file)
index 9989651..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*tests cac_RegQueryValue()*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-#define MAX_KEYS_PER_ENUM 3
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-    TALLOC_CTX *mem_ctx  = NULL;
-    fstring key_name;
-
-    fstring val_name;
-
-    mem_ctx = talloc_init("regqueryval");
-    hnd = cac_NewServerHandle(True);
-
-    cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-    cac_parse_cmd_line(argc, argv, hnd);
-
-    printf("Enter key to open: ");
-    fscanf(stdin, "%s", key_name);
-
-    printf("Enter value to query: ");
-    fscanf(stdin, "%s", val_name);
-
-    if(!cac_Connect(hnd, NULL)) {
-       fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-       cac_FreeHandle(hnd);
-       exit(-1);
-    }
-
-    printf("trying to open key %s...\n", key_name);
-
-    struct RegOpenKey rok;
-    ZERO_STRUCT(rok);
-
-    rok.in.parent_key = NULL;
-    rok.in.name       = key_name;
-    rok.in.access     = REG_KEY_ALL;
-
-    if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-       fprintf(stderr, "Could not open key %s\n Error: %s\n", rok.in.name, nt_errstr(hnd->status));
-       goto done;
-    }
-
-    struct RegQueryValue rqv;
-    ZERO_STRUCT(rqv);
-
-    rqv.in.key = rok.out.key;
-    rqv.in.val_name = talloc_strdup(mem_ctx, val_name);
-
-    printf("querying value %s...\n", rqv.in.val_name);
-    if(!cac_RegQueryValue(hnd, mem_ctx, &rqv)) {
-       fprintf(stderr, "Could not query value. Error: %s\n", nt_errstr(hnd->status));
-    }
-    else {
-       printf("Queried value %s\n", rqv.in.val_name);
-       print_value(rqv.out.type, rqv.out.data);
-    }
-
-
-    printf("closing key %s...\n", key_name);
-
-    if(!cac_RegClose(hnd, mem_ctx, rok.out.key)) {
-       fprintf(stderr, "Could not close handle %s\n", nt_errstr(hnd->status));
-    }
-
-done:
-    cac_FreeHandle(hnd);
-
-    talloc_destroy(mem_ctx);
-
-    return 0;
-
-}
diff --git a/examples/libmsrpc/test/reg/regsetval.c b/examples/libmsrpc/test/reg/regsetval.c
deleted file mode 100644 (file)
index e732791..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*tests cac_RegSetVal()*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   fstring tmp;
-   
-   mem_ctx = talloc_init("regsetval");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   printf("enter key to open: \n");
-   scanf("%s", tmp);
-
-   struct RegOpenKey rok;
-   ZERO_STRUCT(rok);
-
-   rok.in.name = talloc_strdup(mem_ctx, tmp);
-   rok.in.access = REG_KEY_ALL;
-
-   if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-      fprintf(stderr, "Could not open key %s. Error %s\n", rok.in.name, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct RegSetValue rsv;
-   ZERO_STRUCT(rsv);
-
-   rsv.in.key = rok.out.key;
-
-   cactest_reg_input_val(mem_ctx, &rsv.in.type, &rsv.in.val_name, &rsv.in.value);
-
-   if(!cac_RegSetValue(hnd, mem_ctx, &rsv)) {
-      fprintf(stderr, "Could not set value. Error: %s\n", nt_errstr(hnd->status));
-   }
-
-   cac_RegClose(hnd, mem_ctx, rok.out.key);
-
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
-
-
diff --git a/examples/libmsrpc/test/reg/regvalenum.c b/examples/libmsrpc/test/reg/regvalenum.c
deleted file mode 100644 (file)
index 9778f4e..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*tests enumerating registry values*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-#define MAX_KEYS_PER_ENUM 3
-
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-    TALLOC_CTX *mem_ctx  = NULL;
-    int num_keys;
-
-    int max_enum;
-
-    fstring *key_names;
-
-    int i;
-    mem_ctx = talloc_init("regvalenum");
-    hnd = cac_NewServerHandle(True);
-
-    cac_parse_cmd_line(argc, argv, hnd);
-
-    cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-    
-    if(!cac_Connect(hnd, NULL)) {
-       fprintf(stderr, "Could not connect to server.\n Error: %s.\n errno: %s\n", nt_errstr(hnd->status), strerror(errno));
-       cac_FreeHandle(hnd);
-       exit(-1);
-    }
-
-    printf("How many keys do you want to open?: ");
-    fscanf(stdin, "%d", &num_keys);
-
-    printf("How many values per enum?: ");
-    fscanf(stdin, "%d", &max_enum);
-
-    key_names = TALLOC_ARRAY(mem_ctx, fstring , num_keys);
-    if(!key_names) {
-       fprintf(stderr, "No memory\n");
-       exit(-1);
-    }
-
-    for(i = 0; i < num_keys; i++) {
-       printf("Enter key to open: ");
-       fscanf(stdin, "%s", key_names[i]);
-    }
-
-    for(i = 0; i < num_keys; i++) {
-       printf("trying to open key %s...\n", key_names[i]);
-
-       struct RegOpenKey rok;
-       ZERO_STRUCT(rok);
-
-       rok.in.parent_key = NULL;
-       rok.in.name   = key_names[i];
-       rok.in.access = REG_KEY_ALL;
-
-       if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-          fprintf(stderr, "Could not open key %s\n Error: %s\n", rok.in.name, nt_errstr(hnd->status));
-          continue;
-       }
-
-       /**enumerate all the subkeys*/
-       printf("Enumerating all values:\n");
-
-       struct RegEnumValues rev;
-       ZERO_STRUCT(rev);
-
-       rev.in.key = rok.out.key;
-       rev.in.max_values = max_enum;
-
-       while(cac_RegEnumValues(hnd, mem_ctx, &rev)) {
-          int j;
-
-          for(j = 0; j < rev.out.num_values; j++) {
-             printf(" Value name: %s\n", rev.out.value_names[j]);
-             print_value(rev.out.types[j], rev.out.values[j]);
-          }
-       }
-
-       if(CAC_OP_FAILED(hnd->status)) {
-          fprintf(stderr, "Could not enumerate values: %s\n", nt_errstr(hnd->status));
-          continue;
-       }
-
-       printf("closing key %s...\n", key_names[i]);
-
-       if(!cac_RegClose(hnd, mem_ctx, rok.out.key)) {
-          fprintf(stderr, "Could not close handle %s\n", nt_errstr(hnd->status));
-       }
-    }
-
-    cac_FreeHandle(hnd);
-
-    talloc_destroy(mem_ctx);
-
-    return 0;
-
-}
diff --git a/examples/libmsrpc/test/reg/security.c b/examples/libmsrpc/test/reg/security.c
deleted file mode 100644 (file)
index 6808f8c..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*tests cac_RegSetKeySecurity()*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   fstring tmp;
-   
-   mem_ctx = talloc_init("regsetval");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct RegOpenKey rok;
-   ZERO_STRUCT(rok);
-
-   printf("enter key to query: ");
-   cactest_readline(stdin, tmp);
-
-   rok.in.name = talloc_strdup(mem_ctx, tmp);
-   rok.in.access = REG_KEY_ALL;
-
-   if(!cac_RegOpenKey(hnd, mem_ctx, &rok)) {
-      fprintf(stderr, "Could not open key %s. Error %s\n", rok.in.name, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct RegGetKeySecurity rks;
-   ZERO_STRUCT(rks);
-
-   rks.in.key = rok.out.key;
-   rks.in.info_type = ALL_SECURITY_INFORMATION;
-
-   if(!cac_RegGetKeySecurity(hnd, mem_ctx, &rks)) {
-      fprintf(stderr, "Could not query security for %s.  Error: %s\n", rok.in.name, nt_errstr(hnd->status));
-      goto done;
-   }
-
-   printf("resetting key security...\n");
-
-   struct RegSetKeySecurity rss;
-   ZERO_STRUCT(rss);
-
-   rss.in.key = rok.out.key;
-   rss.in.info_type = ALL_SECURITY_INFORMATION;
-   rss.in.size = rks.out.size;
-   rss.in.descriptor = rks.out.descriptor;
-
-   if(!cac_RegSetKeySecurity(hnd, mem_ctx, &rss)) {
-      fprintf(stderr, "Could not set security. Error %s\n", nt_errstr(hnd->status));
-   }
-
-done:
-   cac_RegClose(hnd, mem_ctx, rok.out.key);
-   
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
-
-
diff --git a/examples/libmsrpc/test/reg/shutdown.c b/examples/libmsrpc/test/reg/shutdown.c
deleted file mode 100644 (file)
index 6184fbd..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*tries to shut down a remote pc*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx  = NULL;
-
-   fstring tmp;
-   
-   mem_ctx = talloc_init("cac_shutdown");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   hnd->_internal.srv_level = SRV_WIN_NT4;
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct Shutdown s;
-   ZERO_STRUCT(s);
-
-   printf("Message: ");
-   cactest_readline(stdin, tmp);
-
-   s.in.message = talloc_strdup(mem_ctx, tmp);
-
-   printf("timeout: ");
-   scanf("%d", &s.in.timeout);
-
-   printf("Reboot? [y/n]: ");
-   cactest_readline(stdin, tmp);
-
-   s.in.reboot = ( tmp[0] == 'y') ? True : False;
-
-   printf("Force? [y/n]: ");
-   cactest_readline(stdin, tmp);
-
-   s.in.force = (tmp[0] == 'y') ? True : False;
-
-   if(!cac_Shutdown(hnd, mem_ctx, &s)) {
-      fprintf(stderr, "could not shut down server: error %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   printf("Server %s is shutting down. Would you like to try to abort? [y/n]: ", hnd->server);
-   fscanf(stdin, "%s", tmp);
-
-   if(tmp[0] == 'y') {
-      if(!cac_AbortShutdown(hnd, mem_ctx)) {
-         fprintf(stderr, "Could not abort shutdown. Error %s\n", nt_errstr(hnd->status));
-      }
-   }
-
-done:
-   cac_FreeHandle(hnd);
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/test/sam/adduser.c b/examples/libmsrpc/test/sam/adduser.c
deleted file mode 100644 (file)
index 94482d0..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*add's a user to a domain*/
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-
-   fstring tmp;
-
-   struct SamOpenUser ou;
-
-   POLICY_HND *user_hnd = NULL;
-
-   mem_ctx = talloc_init("cac_adduser");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   struct SamCreateUser cdu;
-   ZERO_STRUCT(cdu);
-
-   printf("Enter account name: ");
-   cactest_readline(stdin, tmp);
-
-   cdu.in.dom_hnd = sod.out.dom_hnd;
-   cdu.in.name = talloc_strdup(mem_ctx, tmp);
-   cdu.in.acb_mask  = ACB_NORMAL;
-
-   if(!cac_SamCreateUser(hnd, mem_ctx, &cdu)) {
-      fprintf(stderr, "Could not create user %s. Error: %s\n", cdu.in.name, nt_errstr(hnd->status));
-   }
-
-   printf("would you like to delete this user? [y/n]: ");
-   cactest_readline(stdin, tmp);
-
-   if(tmp[0] == 'y') {
-
-      if(!cdu.out.user_hnd) {
-         ZERO_STRUCT(ou);
-         ou.in.dom_hnd = sod.out.dom_hnd;
-         ou.in.access  = MAXIMUM_ALLOWED_ACCESS;
-         ou.in.name    = talloc_strdup(mem_ctx, cdu.in.name);
-
-         if(!cac_SamOpenUser(hnd, mem_ctx, &ou)) {
-            fprintf(stderr, "Could not open user for deletion. Error: %s\n", nt_errstr(hnd->status));
-         }
-
-         user_hnd = ou.out.user_hnd;
-      }
-
-      else {
-         user_hnd = cdu.out.user_hnd;
-      }
-
-      if(!cac_SamDeleteUser(hnd, mem_ctx, user_hnd))
-         fprintf(stderr, "Could not delete user. Error: %s\n", nt_errstr(hnd->status));
-   }
-   else {
-      printf("Nope..ok\n");
-   }
-
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-   cac_SamClose(hnd, mem_ctx, sod.out.sam);
-
-done:
-   talloc_destroy(mem_ctx);
-
-   cac_FreeHandle(hnd);
-   
-   return 0;
-}
-
-/*TODO: add a function that will create a user and set userinfo and set the password*/
diff --git a/examples/libmsrpc/test/sam/disable.c b/examples/libmsrpc/test/sam/disable.c
deleted file mode 100644 (file)
index f140bad..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*disable a user*/
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-
-   struct SamOpenUser ou;
-
-   fstring tmp;
-
-   mem_ctx = talloc_init("cac_disable");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   ZERO_STRUCT(ou);
-   printf("Enter username: ");
-   cactest_readline(stdin, tmp);
-
-   ou.in.name = talloc_strdup(mem_ctx, tmp);
-   ou.in.access = MAXIMUM_ALLOWED_ACCESS;
-   ou.in.dom_hnd = sod.out.dom_hnd;
-
-   if(!cac_SamOpenUser(hnd, mem_ctx, &ou)) {
-      fprintf(stderr, "Could not open user. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   /*enable the user*/
-   if(!cac_SamDisableUser(hnd, mem_ctx, ou.out.user_hnd)) {
-      fprintf(stderr, "Could not disable user: %s\n", nt_errstr(hnd->status));
-   }
-
-done:
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-   
-   return 0;
-}
-
diff --git a/examples/libmsrpc/test/sam/dominfo.c b/examples/libmsrpc/test/sam/dominfo.c
deleted file mode 100644 (file)
index cd2ecce..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*gets domain info and prints it out*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-
-   mem_ctx = talloc_init("cac_dominfo");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   struct SamGetDomainInfo gdi;
-   ZERO_STRUCT(gdi);
-
-   gdi.in.dom_hnd = sod.out.dom_hnd;
-
-   if(!cac_SamGetDomainInfo(hnd, mem_ctx, &gdi)) {
-      fprintf(stderr, "Could not get domain info. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   printf("Got domain info:\n");
-   print_cac_domain_info(gdi.out.info);
-
-done:
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-   
-   return 0;
-}
-
diff --git a/examples/libmsrpc/test/sam/enable.c b/examples/libmsrpc/test/sam/enable.c
deleted file mode 100644 (file)
index bb91fb2..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*enable a user*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-
-   struct SamOpenUser ou;
-
-   fstring tmp;
-
-   mem_ctx = talloc_init("cac_samgroup");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   ZERO_STRUCT(ou);
-   printf("Enter username: ");
-   cactest_readline(stdin, tmp);
-
-   ou.in.name = talloc_strdup(mem_ctx, tmp);
-   ou.in.access = MAXIMUM_ALLOWED_ACCESS;
-   ou.in.dom_hnd = sod.out.dom_hnd;
-
-   if(!cac_SamOpenUser(hnd, mem_ctx, &ou)) {
-      fprintf(stderr, "Could not open user. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   /*enable the user*/
-   if(!cac_SamEnableUser(hnd, mem_ctx, ou.out.user_hnd)) {
-      fprintf(stderr, "Could not enable user: %s\n", nt_errstr(hnd->status));
-   }
-
-done:
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-   
-   return 0;
-}
-
diff --git a/examples/libmsrpc/test/sam/samenum.c b/examples/libmsrpc/test/sam/samenum.c
deleted file mode 100644 (file)
index f1b9ebd..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*enumerate users/groups/aliases*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-            
-   
-   struct SamEnumUsers eu;
-   struct SamEnumGroups eg;
-   struct SamEnumAliases ea;
-
-   fstring tmp;
-   
-   int i;
-
-   mem_ctx = talloc_init("cac_samenum");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   tmp[0] = 0x00;
-   while(tmp[0] != 'q') {
-      printf("Enumerate [u]sers, [g]roups or [a]liases or [q]uit: ");
-      cactest_readline(stdin, tmp);
-
-      switch(tmp[0]) {
-         case 'u':
-            ZERO_STRUCT(eu);
-
-            eu.in.dom_hnd = sod.out.dom_hnd;
-            
-            printf("ACB mask (can be 0): ");
-            scanf("%x", &eu.in.acb_mask);
-
-            while(cac_SamEnumUsers(hnd, mem_ctx, &eu)) {
-               printf("Enumerated %d users:\n", eu.out.num_users);
-               for(i = 0; i < eu.out.num_users; i++) {
-                  printf(" Name: %s\n", eu.out.names[i]);
-                  printf(" RID:  %d\n", eu.out.rids[i]);
-               }
-            }
-
-            if(CAC_OP_FAILED(hnd->status)) {
-               printf("Could not enumerate users. Error: %s\n", nt_errstr(hnd->status));
-            }
-            break;
-         case 'g':
-            ZERO_STRUCT(eg);
-            eg.in.dom_hnd = sod.out.dom_hnd;
-
-            printf("Enumerating groups...\n");
-            while(cac_SamEnumGroups(hnd, mem_ctx, &eg)) {
-               printf("Enumerated %d groups:\n", eg.out.num_groups);
-               for(i = 0; i < eg.out.num_groups; i++) {
-                  printf("RID:  %d\n", eg.out.rids[i]);
-                  printf("Name: %s\n", eg.out.names[i]);
-                  printf("Desc: %s\n", eg.out.descriptions[i]);
-               }
-            }
-
-            if(CAC_OP_FAILED(hnd->status)) {
-               printf("Could not enumerate Groups. Error: %s\n", nt_errstr(hnd->status));
-            }
-            break;
-         case 'a':
-            ZERO_STRUCT(ea);
-            ea.in.dom_hnd = sod.out.dom_hnd;
-
-            printf("Enumerating Aliases...\n");
-            while(cac_SamEnumAliases(hnd, mem_ctx, &ea)) {
-               printf("Enumerated %d aliases:\n", ea.out.num_aliases);
-
-               for(i = 0; i < ea.out.num_aliases; i++) {
-                  printf("RID:  %d\n", ea.out.rids[i]);
-                  printf("Name: %s\n", ea.out.names[i]);
-                  printf("Desc: %s\n", ea.out.descriptions[i]);
-               }
-            }
-            if(CAC_OP_FAILED(hnd->status)) {
-               printf("Could not enumerate Aliases. Error: %s\n", nt_errstr(hnd->status));
-            }
-            break;
-      }
-   }
-
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-   cac_SamClose(hnd, mem_ctx, sod.out.sam);
-
-done:
-   talloc_destroy(mem_ctx);
-   cac_FreeHandle(hnd);
-
-   return 0;
-
-}
-
diff --git a/examples/libmsrpc/test/sam/samgroup.c b/examples/libmsrpc/test/sam/samgroup.c
deleted file mode 100644 (file)
index 39d9fa1..0000000
+++ /dev/null
@@ -1,480 +0,0 @@
-/*Some group management stuff*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-            
-   
-   struct SamEnumGroups eg;
-   struct SamEnumUsers eu;
-   struct SamCreateGroup cg;
-   struct SamOpenGroup og;
-   struct SamGetGroupMembers ggm;
-   struct SamGetNamesFromRids gn;
-   struct SamAddGroupMember add;
-   struct SamRemoveGroupMember del;
-   struct SamSetGroupMembers set;
-   struct SamGetGroupsForUser gg;
-   struct SamOpenUser         ou;
-   struct SamGetGroupInfo     gi;
-   struct SamSetGroupInfo     si;
-   struct SamRenameGroup      rg;
-   struct SamGetSecurityObject gso;
-
-   POLICY_HND *group_hnd = NULL;
-
-   fstring tmp;
-   fstring input;
-   
-   int i;
-
-   mem_ctx = talloc_init("cac_samgroup");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   tmp[0] = 0x00;
-   while(tmp[0] != 'q') {
-      printf("\n");
-      printf("[l]ist groups\n");
-      printf("[c]reate group\n");
-      printf("[o]pen group\n");
-      printf("[d]elete group\n");
-      printf("list [m]embers\n");
-      printf("list [u]sers\n");
-      printf("list [g]roup for users\n");
-      printf("[a]dd member\n");
-      printf("[r]emove member\n");
-      printf("[x] clear members\n");
-      printf("get group [i]nfo\n");
-      printf("[e]dit group info\n");
-      printf("[s]et members\n");
-      printf("re[n]ame group\n");
-      printf("[z] close group\n");
-      printf("[t] get security info\n");
-
-      printf("[q]uit\n\n");
-      printf("Enter option: ");
-      cactest_readline(stdin, tmp);
-
-      printf("\n");
-
-      switch(tmp[0]) {
-         case 'c': /*create group*/
-            if(group_hnd != NULL) {
-               /*then we have an open handle.. close it*/
-               cac_SamClose(hnd, mem_ctx, group_hnd);
-               group_hnd = NULL;
-            }
-
-            printf("Enter group name: ");
-            cactest_readline(stdin, input);
-
-            ZERO_STRUCT(cg);
-
-            cg.in.name      = talloc_strdup(mem_ctx, input);
-            cg.in.access    = MAXIMUM_ALLOWED_ACCESS;
-            cg.in.dom_hnd   = sod.out.dom_hnd;
-
-            if(!cac_SamCreateGroup(hnd, mem_ctx, &cg)) {
-               fprintf(stderr, "Could not create group. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Created group %s\n", cg.in.name);
-
-               group_hnd = cg.out.group_hnd;
-            }
-            break;
-
-         case 'o': /*open group*/
-            if(group_hnd != NULL) {
-               /*then we have an open handle.. close it*/
-               cac_SamClose(hnd, mem_ctx, group_hnd);
-               group_hnd = NULL;
-            }
-
-            ZERO_STRUCT(og);
-
-            og.in.dom_hnd = sod.out.dom_hnd;
-            og.in.access = MAXIMUM_ALLOWED_ACCESS;
-
-            printf("Enter RID: 0x");
-            scanf("%x", &og.in.rid);
-
-            if(!cac_SamOpenGroup(hnd, mem_ctx, &og)) {
-               fprintf(stderr, "Could not open group. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Opened group\n");
-               group_hnd = og.out.group_hnd;
-            }
-
-            break;
-
-         case 'l': /*list groups*/
-            ZERO_STRUCT(eg);
-            eg.in.dom_hnd = sod.out.dom_hnd;
-
-            while(cac_SamEnumGroups(hnd, mem_ctx, &eg)) {
-               for(i = 0; i < eg.out.num_groups; i++) {
-                  printf("RID: 0x%x Name: %s\n", eg.out.rids[i], eg.out.names[i]);
-               }
-            }
-
-            if(CAC_OP_FAILED(hnd->status)) {
-               printf("Could not enumerate Groups. Error: %s\n", nt_errstr(hnd->status));
-            }
-
-            break;
-            
-         case 'm': /*list group members*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(ggm);
-            ggm.in.group_hnd = group_hnd;
-
-            if(!cac_SamGetGroupMembers(hnd, mem_ctx, &ggm)) {
-               fprintf(stderr, "Could not get group members. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-
-            printf("Group has %d members:\n", ggm.out.num_members);
-
-            if(ggm.out.num_members == 0) /*just skip the rest of this case*/
-               break;
-
-            /**get the user names*/
-            gn.in.dom_hnd = sod.out.dom_hnd;
-            gn.in.num_rids = ggm.out.num_members;
-            gn.in.rids = ggm.out.rids;
-
-            if(!cac_SamGetNamesFromRids(hnd, mem_ctx, &gn)) {
-               fprintf(stderr, "Could not lookup names. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-
-            for(i = 0; i < gn.out.num_names; i++) {
-               printf("RID: 0x%x Name: %s\n", gn.out.map[i].rid, gn.out.map[i].name);
-            }
-
-            break;
-
-         case 'd': /*delete group*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            if(!cac_SamDeleteGroup(hnd, mem_ctx, group_hnd)) {
-               fprintf(stderr, "Could not delete group. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Deleted group.\n");
-               group_hnd = NULL;
-            }
-            break;
-
-         case 'u': /*list users*/
-            ZERO_STRUCT(eu);
-
-            eu.in.dom_hnd = sod.out.dom_hnd;
-            
-            while(cac_SamEnumUsers(hnd, mem_ctx, &eu)) {
-               for(i = 0; i < eu.out.num_users; i++) {
-                  printf(" RID: 0x%x Name: %s\n", eu.out.rids[i], eu.out.names[i]);
-               }
-            }
-
-            if(CAC_OP_FAILED(hnd->status)) {
-               printf("Could not enumerate users. Error: %s\n", nt_errstr(hnd->status));
-            }
-
-            break;
-
-         case 'a': /*add member to group*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(add);
-
-            add.in.group_hnd = group_hnd;
-
-            printf("Enter user RID: 0x");
-            scanf("%x", &add.in.rid);
-
-            if(!cac_SamAddGroupMember(hnd, mem_ctx, &add)) {
-               fprintf(stderr, "Could not add user to group. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Successfully added user to group\n");
-            }
-            break;
-
-         case 'r': /*remove user from group*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(del);
-            del.in.group_hnd = group_hnd;
-
-            printf("Enter RID: 0x");
-            scanf("%x", &del.in.rid);
-
-            if(!cac_SamRemoveGroupMember(hnd, mem_ctx, &del)) {
-               fprintf(stderr, "Could not remove user from group. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Removed user from group.\n");
-            }
-
-            break;
-
-         case 'x': /*clear group members*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            if(!cac_SamClearGroupMembers(hnd, mem_ctx, group_hnd)) {
-               fprintf(stderr, "Could not clear group members. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Cleared group members\n");
-            }
-
-            break;
-            
-         case 's': /*set members*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(set);
-
-            set.in.group_hnd = group_hnd;
-
-            printf("Enter the number of members: ");
-            scanf("%d", &set.in.num_members);
-
-            set.in.rids = TALLOC_ARRAY(mem_ctx, uint32, set.in.num_members);
-
-            for(i = 0; i < set.in.num_members; i++) {
-               printf("Enter RID #%d: 0x", (i+1));
-               scanf("%x", (set.in.rids + i));
-            }
-
-            if(!cac_SamSetGroupMembers(hnd, mem_ctx, &set)) {
-               printf("could not set members. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Set users\n");
-            }
-
-            break;
-            
-         case 'g': /*list groups for user*/
-            ZERO_STRUCT(ou);
-            ZERO_STRUCT(gg);
-
-            printf("Enter username: ");
-            cactest_readline(stdin, input);
-
-            if(input[0] != '\0') {
-               ou.in.name = talloc_strdup(mem_ctx, input);
-            }
-            else {
-               printf("Enter RID: 0x");
-               scanf("%x", &ou.in.rid);
-            }
-            
-            ou.in.access   = MAXIMUM_ALLOWED_ACCESS;
-            ou.in.dom_hnd  = sod.out.dom_hnd;
-
-            if(!cac_SamOpenUser(hnd, mem_ctx, &ou)) {
-               fprintf(stderr, "Could not open user %s. Error: %s\n", ou.in.name, nt_errstr(hnd->status));
-               break;
-            }
-
-            /*now find the groups*/
-            gg.in.user_hnd = ou.out.user_hnd;
-
-            if(!cac_SamGetGroupsForUser(hnd, mem_ctx, &gg)) {
-               fprintf(stderr, "Could not get groups for user. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-
-            cac_SamClose(hnd, mem_ctx, ou.out.user_hnd);
-
-            ZERO_STRUCT(gn);
-
-            gn.in.dom_hnd = sod.out.dom_hnd;
-            gn.in.num_rids = gg.out.num_groups;
-            gn.in.rids  = gg.out.rids;
-
-            if(!cac_SamGetNamesFromRids(hnd, mem_ctx, &gn)) {
-               fprintf(stderr, "Could not get names from RIDs. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-
-            printf("%d groups: \n", gn.out.num_names);
-
-            for(i = 0; i < gn.out.num_names; i++) {
-               printf("RID: 0x%x ", gn.out.map[i].rid);
-
-               if(gn.out.map[i].found)
-                  printf("Name: %s\n", gn.out.map[i].name);
-               else
-                  printf("Unknown RID\n");
-            }
-
-            break;
-
-         case 'z': /*close group*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            if(!cac_SamClose(hnd, mem_ctx, group_hnd)) {
-               printf("Could not close group\n");
-               break;
-            }
-
-            group_hnd = NULL;
-            break;
-
-         case 'i': /*get group info*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(gi);
-            gi.in.group_hnd = group_hnd;
-
-            if(!cac_SamGetGroupInfo(hnd, mem_ctx, &gi)) {
-               printf("Could not get group info. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Retrieved Group info\n");
-               print_cac_group_info(gi.out.info);
-            }
-            
-            break;
-
-         case 'e': /*edit group info*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(gi);
-            ZERO_STRUCT(si);
-
-            gi.in.group_hnd = group_hnd;
-            
-            if(!cac_SamGetGroupInfo(hnd, mem_ctx, &gi)) {
-               printf("Could not get group info. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-
-            edit_cac_group_info(mem_ctx, gi.out.info);
-
-            si.in.group_hnd = group_hnd;
-            si.in.info      = gi.out.info;
-
-            if(!cac_SamSetGroupInfo(hnd, mem_ctx, &si)) {
-               printf("Could not set group info. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf(" Done.\n");
-            }
-
-            break;
-
-         case 'n': /*rename group*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(rg);
-
-            printf("Enter new group name: ");
-            cactest_readline(stdin, tmp);
-
-            rg.in.group_hnd = group_hnd;
-            rg.in.new_name = talloc_strdup(mem_ctx, tmp);
-
-            if(!cac_SamRenameGroup(hnd, mem_ctx, &rg)) 
-               printf("Could not rename group. Error: %s\n", nt_errstr(hnd->status));
-            else
-               printf("Done.\n");
-
-            break;
-         case 't': /*get security info*/
-            if(!group_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(gso);
-
-            gso.in.pol = group_hnd;
-
-            if(!cac_SamGetSecurityObject(hnd, mem_ctx, &gso)) {
-               printf("Could not get security descriptor info. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Got it.\n");
-            }
-            break;
-            
-         case 'q':
-            break;
-
-         default:
-            printf("Invalid command\n");
-      }
-   }
-
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-
-   if(group_hnd)
-      cac_SamClose(hnd, mem_ctx, group_hnd);
-
-done:
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
-
diff --git a/examples/libmsrpc/test/sam/samlookup.c b/examples/libmsrpc/test/sam/samlookup.c
deleted file mode 100644 (file)
index 32be50d..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*lookup names or rids*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-            
-   
-   struct SamGetNamesFromRids sgn;
-   struct SamGetRidsFromNames sgr;
-
-   fstring tmp;
-   fstring input;
-   
-   int i;
-
-   mem_ctx = talloc_init("cac_samenum");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   tmp[0] = 0x00;
-   while(tmp[0] != 'q') {
-      printf("get [n]ames or get [r]ids or [q]uit: ");
-      cactest_readline(stdin, tmp);
-
-      switch(tmp[0]) {
-         case 'n':
-            ZERO_STRUCT(sgn);
-
-            sgn.in.dom_hnd = sod.out.dom_hnd;
-
-            printf("How many rids will you enter: ");
-            scanf("%d", &sgn.in.num_rids);
-
-            sgn.in.rids = talloc_array(mem_ctx, int, sgn.in.num_rids);
-            
-            for(i = 0; i < sgn.in.num_rids; i++) {
-               printf("  Enter RID %d: 0x", i);
-               scanf("%x", &sgn.in.rids[i]);
-            }
-
-            printf("Getting names...\n");
-
-            if(!cac_SamGetNamesFromRids(hnd, mem_ctx, &sgn)) {
-               fprintf(stderr, "could not lookup names. Error: %s\n", nt_errstr(hnd->status));
-               talloc_free(sgn.in.rids);
-               continue;
-            }
-
-            printf("Found %d names:\n", sgn.out.num_names);
-
-            for(i = 0; i < sgn.out.num_names; i++) {
-               printf(" RID:  0x%x ", sgn.out.map[i].rid);
-
-               if(sgn.out.map[i].found) {
-                  printf("Name: %s\n", sgn.out.map[i].name);
-               }
-               else {
-                  printf("Unknown RID\n");
-               }
-
-            }
-
-            break;
-
-         case 'r':
-            ZERO_STRUCT(sgr);
-
-            sgr.in.dom_hnd = sod.out.dom_hnd;
-
-            printf("How many names will you enter: ");
-            scanf("%d", &sgr.in.num_names);
-
-            sgr.in.names = talloc_array(mem_ctx, char *, sgr.in.num_names);
-
-            for(i = 0; i < sgr.in.num_names; i++) {
-               printf(" Enter name %d: ", (i+1));
-               cactest_readline(stdin, input);
-
-               sgr.in.names[i] = talloc_strdup(mem_ctx, input);
-            }
-
-            if(!cac_SamGetRidsFromNames(hnd, mem_ctx, &sgr)) {
-               fprintf(stderr, "Could not lookup names. Error: %s\n", nt_errstr(hnd->status));
-               continue;
-            }
-
-            printf("Found %d RIDs:\n", sgr.out.num_rids);
-
-            for(i = 0; i < sgr.out.num_rids; i++) {
-               printf(" Name: %s ", sgr.out.map[i].name);
-
-               if(sgr.out.map[i].found) {
-                  printf("RID: 0x%x\n", sgr.out.map[i].rid);
-               }
-               else {
-                  printf("Unknown name\n");
-               }
-            }
-
-            break;
-         case 'q':
-            printf("\n");
-            break;
-         default:
-            printf("Invalid command!\n");
-      }
-   }
-
-
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-   cac_SamClose(hnd, mem_ctx, sod.out.sam);
-
-done:
-   talloc_destroy(mem_ctx);
-   cac_FreeHandle(hnd);
-
-   return 0;
-
-}
-
diff --git a/examples/libmsrpc/test/sam/samuser.c b/examples/libmsrpc/test/sam/samuser.c
deleted file mode 100644 (file)
index df56a2d..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-/*Some user management stuff*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-            
-   
-   struct SamOpenUser    ou;
-   struct SamEnumUsers   eu;
-   struct SamCreateUser  cu;
-   struct SamGetUserInfo gi;
-   struct SamSetUserInfo si;
-   struct SamRenameUser  ru;
-   struct SamSetPassword sp;
-
-   POLICY_HND *user_hnd = NULL;
-
-   fstring tmp;
-   fstring input;
-
-   char *pass1 = NULL;
-   char *pass2 = NULL;
-   
-   int i;
-
-   mem_ctx = talloc_init("cac_samgroup");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   struct SamOpenDomain sod;
-   ZERO_STRUCT(sod);
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS; 
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod)) {
-      fprintf(stderr, "Could not open domain. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   tmp[0] = 0x00;
-   while(tmp[0] != 'q') {
-      printf("\n");
-      printf("[l]ist users\n");
-      printf("[c]reate user\n");
-      printf("[o]pen user\n");
-      printf("[d]elete user\n");
-      printf("[g]et user info\n");
-      printf("[e]dit user info\n");
-      printf("[r]ename user\n");
-      printf("reset [p]assword\n");
-      printf("[n] close user\n");
-
-      printf("[q]uit\n\n");
-      printf("Enter option: ");
-      cactest_readline(stdin, tmp);
-
-      printf("\n");
-
-      switch(tmp[0]) {
-         case 'c': /*create user*/
-            if(user_hnd != NULL) {
-               /*then we have an open handle.. close it*/
-               cac_SamClose(hnd, mem_ctx, user_hnd);
-               user_hnd = NULL;
-            }
-
-            printf("Enter user name: ");
-            cactest_readline(stdin, input);
-
-            ZERO_STRUCT(cu);
-
-            cu.in.name      = talloc_strdup(mem_ctx, input);
-            cu.in.dom_hnd   = sod.out.dom_hnd;
-            cu.in.acb_mask  = ACB_NORMAL;
-
-            if(!cac_SamCreateUser(hnd, mem_ctx, &cu)) {
-               printf("Could not create user. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Created user %s with RID 0x%x\n", cu.in.name, cu.out.rid);
-               user_hnd = cu.out.user_hnd;
-            }
-
-            break;
-
-         case 'o': /*open group*/
-            if(user_hnd != NULL) {
-               /*then we have an open handle.. close it*/
-               cac_SamClose(hnd, mem_ctx, user_hnd);
-               user_hnd = NULL;
-            }
-
-            ZERO_STRUCT(ou);
-
-            ou.in.dom_hnd = sod.out.dom_hnd;
-            ou.in.access = MAXIMUM_ALLOWED_ACCESS;
-
-            printf("Enter RID: 0x");
-            scanf("%x", &ou.in.rid);
-
-            if(!cac_SamOpenUser(hnd, mem_ctx, &ou)) {
-               fprintf(stderr, "Could not open user. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Opened user\n");
-               user_hnd = ou.out.user_hnd;
-            }
-
-            break;
-
-         case 'l': /*list users*/
-            ZERO_STRUCT(eu);
-            eu.in.dom_hnd = sod.out.dom_hnd;
-
-            while(cac_SamEnumUsers(hnd, mem_ctx, &eu)) {
-               for(i = 0; i < eu.out.num_users; i++) {
-                  printf("RID: 0x%x Name: %s\n", eu.out.rids[i], eu.out.names[i]);
-               }
-            }
-
-            if(CAC_OP_FAILED(hnd->status)) {
-               printf("Could not enumerate Users. Error: %s\n", nt_errstr(hnd->status));
-            }
-
-            break;
-            
-            break;
-
-         case 'd': /*delete group*/
-            if(!user_hnd) {
-               printf("Must open group first!\n");
-               break;
-            }
-
-            if(!cac_SamDeleteGroup(hnd, mem_ctx, user_hnd)) {
-               fprintf(stderr, "Could not delete group. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Deleted group.\n");
-               user_hnd = NULL;
-            }
-            break;
-
-         
-         case 'n':
-            if(!user_hnd) {
-               printf("Must open user first!\n");
-               break;
-            }
-
-            if(!cac_SamClose(hnd, mem_ctx, user_hnd)) {
-               printf("Could not user group\n");
-               break;
-            }
-
-            user_hnd = NULL;
-            break;
-
-         case 'g': /*get user info*/
-            if(!user_hnd) {
-               printf("Must open user first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(gi);
-            gi.in.user_hnd = ou.out.user_hnd;
-
-            if(!cac_SamGetUserInfo(hnd, mem_ctx, &gi)) {
-               printf("Could not get user info. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Retrieved User information:\n");
-               print_cac_user_info(gi.out.info);
-            } 
-
-            break;
-
-         case 'e': /*edit user info*/
-            if(!user_hnd) {
-               printf("Must Open user first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(gi);
-            gi.in.user_hnd = ou.out.user_hnd;
-            if(!cac_SamGetUserInfo(hnd, mem_ctx, &gi)) {
-               printf("Could not get user info. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-            
-            edit_cac_user_info(mem_ctx, gi.out.info);
-
-            printf("setting following info:\n");
-            print_cac_user_info(gi.out.info);
-
-            ZERO_STRUCT(si);
-
-            si.in.user_hnd = user_hnd;
-            si.in.info     = gi.out.info;
-
-            if(!cac_SamSetUserInfo(hnd, mem_ctx, &si)) {
-               printf("Could not set user info. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Done.\n");
-            }
-
-            break;
-
-         case 'r': /*rename user*/
-            if(!user_hnd) {
-               printf("Must open user first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(ru);
-
-            printf("Enter new username: ");
-            cactest_readline(stdin, tmp);
-
-            ru.in.user_hnd = user_hnd;
-            ru.in.new_name = talloc_strdup(mem_ctx, tmp);
-
-            if(!cac_SamRenameUser(hnd, mem_ctx, &ru)) {
-               printf("Could not rename user. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Renamed user\n");
-            }
-
-            break;
-
-         case 'p': /*reset password*/
-
-            if(!user_hnd) {
-               printf("Must open user first!\n");
-               break;
-            }
-
-            do {
-               if(pass1 && pass2) {
-                  printf("Passwords do not match. Please try again\n");
-               }
-
-               pass1 = getpass("Enter new password: ");
-               pass2 = getpass("Re-enter new password: ");
-            } while(strncmp(pass1, pass2, MAX_PASS_LEN));
-
-            ZERO_STRUCT(sp);
-            sp.in.user_hnd = user_hnd;
-            sp.in.password = talloc_strdup(mem_ctx, pass1);
-
-            if(!cac_SamSetPassword(hnd, mem_ctx, &sp)) {
-               printf("Could not set password. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Done.\n");
-            }
-
-            break;
-
-         case 'q':
-            break;
-
-         default:
-            printf("Invalid command\n");
-      }
-   }
-
-   cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-
-   if(user_hnd)
-      cac_SamClose(hnd, mem_ctx, user_hnd);
-
-done:
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
-
diff --git a/examples/libmsrpc/test/smbc_test/smbc.c b/examples/libmsrpc/test/smbc_test/smbc.c
deleted file mode 100644 (file)
index 3db3cea..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*simple test for libsmbclient compatibility. initialize a smbc context, open sessions on a couple pipes and quit*/
-
-#include "libmsrpc.h"
-#include "libsmbclient.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   SMBCCTX *ctx = NULL;
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-
-   struct LsaOpenPolicy lop;
-   struct RegConnect    rc;
-   struct SamOpenDomain sod;
-
-   ZERO_STRUCT(lop);
-   ZERO_STRUCT(rc);
-   ZERO_STRUCT(sod);
-
-   mem_ctx = talloc_init("cac_smbc");
-   if(!mem_ctx) {
-      printf("Could not initialize talloc context\n");
-      exit(-1);
-   }
-   
-   hnd = cac_NewServerHandle(True);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   /*initialize smbc context*/
-   if( (ctx = smbc_new_context()) == NULL) {
-      exit(1);
-   }
-
-   /*this probably isn't what someone would want to do, but it initializes the values we need*/
-   ctx->debug = hnd->debug;
-   ctx->callbacks.auth_fn = cac_GetAuthDataFn;
-   
-
-   if(smbc_init_context(ctx) == NULL)
-      exit(1);
-
-   cac_SetSmbcContext(hnd, ctx);
-
-   /*still have to call cac_Connect()*/
-   if(!cac_Connect(hnd, NULL)) {
-      printf("Could not connect to server\n");
-      exit(1);
-   }
-
-   lop.in.access = MAXIMUM_ALLOWED_ACCESS;
-   if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop))
-      printf("Could not open LSA policy. Error: %s\n", nt_errstr(hnd->status));
-
-   printf("Opened LSA policy.\n");
-
-   rc.in.access = MAXIMUM_ALLOWED_ACCESS;
-   rc.in.root   = HKEY_LOCAL_MACHINE;
-   if(!cac_RegConnect(hnd, mem_ctx, &rc))
-      printf("Could not connect to registry. Error: %s\n", nt_errstr(hnd->status));
-
-   printf("Connceted to Registry.\n");
-
-   sod.in.access = MAXIMUM_ALLOWED_ACCESS;
-
-   if(!cac_SamOpenDomain(hnd, mem_ctx, &sod))
-      printf("Could not open domain SAM. Error: %s\n", nt_errstr(hnd->status));
-
-   printf("Opened domain.\n");
-
-   if(lop.out.pol)
-      cac_LsaClosePolicy(hnd, mem_ctx, lop.out.pol);
-
-   if(rc.out.key)
-      cac_RegClose(hnd, mem_ctx, rc.out.key);
-
-   if(sod.out.sam)
-      cac_SamClose(hnd, mem_ctx, sod.out.sam);
-
-   if(sod.out.dom_hnd)
-      cac_SamClose(hnd, mem_ctx, sod.out.dom_hnd);
-
-   cac_FreeHandle(hnd);
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
diff --git a/examples/libmsrpc/test/svcctl/svc.c b/examples/libmsrpc/test/svcctl/svc.c
deleted file mode 100644 (file)
index db5fa27..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-/*Tests all of the svcctl calls (at least at time of writing)*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-int main(int argc, char **argv) {
-   CacServerHandle *hnd = NULL;
-   TALLOC_CTX *mem_ctx = NULL;
-            
-
-   struct SvcOpenScm      sos;
-   struct SvcEnumServices es;
-   struct SvcOpenService  os;
-   struct SvcGetStatus    gs;
-   struct SvcStartService start;
-   struct SvcStopService  stop;
-   struct SvcPauseService pause;
-   struct SvcContinueService res;
-   struct SvcGetDisplayName gdn;
-   struct SvcGetServiceConfig sgc;
-  
-   POLICY_HND *svc_hnd = NULL;
-
-   fstring tmp;
-   fstring input;
-   
-   int i;
-
-   mem_ctx = talloc_init("cac_samgroup");
-
-   hnd = cac_NewServerHandle(True);
-
-   cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
-
-   cac_parse_cmd_line(argc, argv, hnd);
-
-   if(!cac_Connect(hnd, NULL)) {
-      fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
-      exit(-1);
-   }
-
-   /*open a handle to the scm*/
-   ZERO_STRUCT(sos);
-
-   sos.in.access = SC_MANAGER_ALL_ACCESS;
-
-   if(!cac_SvcOpenScm(hnd, mem_ctx, &sos)) {
-      fprintf(stderr, "Could not open SCM. Error: %s\n", nt_errstr(hnd->status));
-      goto done;
-   }
-
-   printf("Opened SCM\n");
-
-   tmp[0] = 0x00;
-   while(tmp[0] != 'q') {
-      printf("\n");
-      printf("[e] Enum Services\n");
-      printf("[o] Open Service\n");
-      printf("[x] Close Service\n");
-      printf("[g] Get service status\n");
-      printf("[s] Start service\n");
-      printf("[t] Stop service\n");
-      printf("[p] Pause service\n");
-      printf("[r] Resume service\n");
-      printf("[c] Get service config\n");
-
-      printf("[d] Get display name\n");
-
-      printf("[q]uit\n\n");
-      printf("Enter option: ");
-      cactest_readline(stdin, tmp);
-
-      printf("\n");
-
-      switch(tmp[0]) {
-         case 'e': /*enum services*/
-            ZERO_STRUCT(es);
-            es.in.scm_hnd = sos.out.scm_hnd;
-
-            if(!cac_SvcEnumServices(hnd, mem_ctx, &es)) {
-               printf("Could not enumerate services. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-
-            for(i = 0; i < es.out.num_services; i++) {
-               print_cac_service(es.out.services[i]);
-            }
-            printf("Enumerated %d services:\n", es.out.num_services);
-
-            break;
-
-         case 'o': /*Open service*/
-            ZERO_STRUCT(os);
-
-            printf("Enter service name: ");
-            cactest_readline(stdin, tmp);
-
-            os.in.name = talloc_strdup(mem_ctx, tmp);
-            os.in.scm_hnd = sos.out.scm_hnd;
-            os.in.access = SERVICE_ALL_ACCESS;
-
-            if(!cac_SvcOpenService(hnd, mem_ctx, &os)) {
-               printf("Could not open service. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-            
-            printf("Opened service.\n");
-            svc_hnd = os.out.svc_hnd;
-
-            break;
-         case 'x': /*close service*/
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            cac_SvcClose(hnd, mem_ctx, svc_hnd);
-            svc_hnd = NULL;
-            break;
-         case 'g': /*get svc status*/
-            
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(gs);
-
-            gs.in.svc_hnd = svc_hnd;
-
-            if(!cac_SvcGetStatus(hnd, mem_ctx, &gs)) {
-               printf("Could not get status. Error: %s\n", nt_errstr(hnd->status));
-               break;
-            }
-
-            print_service_status(gs.out.status);
-            break;
-         case 's': /*start service*/
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(start);
-
-            start.in.svc_hnd = svc_hnd;
-
-            printf("Enter number of parameters: ");
-            scanf("%d", &start.in.num_parms);
-
-            start.in.parms = talloc_array(mem_ctx, char *, start.in.num_parms);
-
-            for(i = 0; i < start.in.num_parms; i++) {
-               printf("Parm %d: ", i);
-               cactest_readline(stdin, tmp);
-               start.in.parms[i] = talloc_strdup(mem_ctx, tmp);
-            }
-
-            printf("Timeout (seconds): ");
-            scanf("%d", &start.in.timeout);
-
-            if(!cac_SvcStartService(hnd, mem_ctx, &start)) {
-               printf("Could not start service. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("Started service.\n");
-            }
-
-            break;
-         case 't': /*stop service*/
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(stop);
-            stop.in.svc_hnd = svc_hnd;
-
-            printf("Timeout (seconds): ");
-            scanf("%d", &stop.in.timeout);
-
-            if(!cac_SvcStopService(hnd, mem_ctx, &stop)) {
-               if(CAC_OP_FAILED(hnd->status)) {
-                  printf("Error occured: %s\n", nt_errstr(hnd->status));
-               }
-               else {
-                  printf("Service was not stopped within %d seconds.\n", stop.in.timeout);
-                  print_service_status(stop.out.status);
-               }
-            }
-            else {
-               printf("Done.\n");
-               print_service_status(stop.out.status);
-            }
-            break;
-         case 'd': /*get display name*/
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(gdn);
-            gdn.in.svc_hnd = svc_hnd;
-
-            if(!cac_SvcGetDisplayName(hnd, mem_ctx, &gdn)) {
-               printf("Could not get display name. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               printf("\tDisplay Name: %s\n", gdn.out.display_name);
-            }
-            break;
-
-         case 'p': /*pause service*/
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(pause);
-            pause.in.svc_hnd = svc_hnd;
-
-            printf("Timeout (seconds): ");
-            scanf("%d", &pause.in.timeout);
-
-            if(!cac_SvcPauseService(hnd, mem_ctx, &pause)) {
-               if(CAC_OP_FAILED(hnd->status)) {
-                  printf("Error occured: %s\n", nt_errstr(hnd->status));
-               }
-               else {
-                  printf("Service was not paused within %d seconds.\n", pause.in.timeout);
-                  print_service_status(pause.out.status);
-               }
-            }
-            else {
-               printf("Done.\n");
-               print_service_status(pause.out.status);
-            }
-
-            break;
-            
-         case 'r': /*resume service*/
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(res);
-            res.in.svc_hnd = svc_hnd;
-
-            printf("Timeout (seconds): ");
-            scanf("%d", &res.in.timeout);
-
-            if(!cac_SvcContinueService(hnd, mem_ctx, &res)) {
-               if(CAC_OP_FAILED(hnd->status)) {
-                  printf("Error occured: %s\n", nt_errstr(hnd->status));
-               }
-               else {
-                  printf("Service was not resumed within %d seconds.\n", res.in.timeout);
-                  print_service_status(res.out.status);
-               }
-            }
-            else {
-               printf("Done.\n");
-               print_service_status(res.out.status);
-            }
-
-            break;
-
-         case 'c': /*get service config*/
-            if(!svc_hnd) {
-               printf("Must open service first!\n");
-               break;
-            }
-
-            ZERO_STRUCT(sgc);
-
-            sgc.in.svc_hnd = svc_hnd;
-
-            if(!cac_SvcGetServiceConfig(hnd, mem_ctx, &sgc)) {
-               printf("Could not get service config. Error: %s\n", nt_errstr(hnd->status));
-            }
-            else {
-               print_service_config(&sgc.out.config);
-            }
-            break;
-
-         case 'q': /*quit*/
-            break;
-         default:
-            printf("Invalid command\n");
-      }
-   }
-
-   cac_SvcClose(hnd, mem_ctx, sos.out.scm_hnd);
-
-   done:
-   cac_FreeHandle(hnd);
-
-   talloc_destroy(mem_ctx);
-
-   return 0;
-}
-
diff --git a/examples/libmsrpc/test/test_util.c b/examples/libmsrpc/test/test_util.c
deleted file mode 100644 (file)
index 81a9c92..0000000
+++ /dev/null
@@ -1,408 +0,0 @@
-/*some utility functions for the registry tests*/
-
-#include "libmsrpc.h"
-#include "test_util.h"
-
-
-void cactest_print_usage(char **argv) {
-   printf("Usage:\n");
-   printf("  %s server [-U username] [-W domain] [-P passwprd] [-N netbios_name]\n", argv[0]);
-}
-
-/*allocates memory for auth info and parses domain/user/server out of command line*/
-void cac_parse_cmd_line(int argc, char **argv, CacServerHandle *hnd) {
-   int i = 0;
-
-   ZERO_STRUCTP(hnd->username);
-   ZERO_STRUCTP(hnd->domain);
-   ZERO_STRUCTP(hnd->netbios_name);
-   ZERO_STRUCTP(hnd->password);
-
-   for(i = 1; i < argc; i++) {
-      if( strncmp(argv[i], "-U", sizeof(fstring)) == 0) {
-         strncpy(hnd->username, argv[i+1], sizeof(fstring));
-         i++;
-      }
-
-      else if(strncmp(argv[i], "-W", sizeof(fstring)) == 0) {
-         strncpy(hnd->domain, argv[i+1], sizeof(fstring));
-         i++;
-
-      }
-
-      else if(strncmp(argv[i], "-P", sizeof(fstring)) == 0) {
-         strncpy(hnd->password, argv[i+1], sizeof(fstring));
-         i++;
-
-      }
-
-      else if(strncmp(argv[i], "-N", sizeof(fstring)) == 0) {
-         strncpy(hnd->netbios_name, argv[i+1], sizeof(fstring));
-         i++;
-      }
-
-      else if(strncmp(argv[i], "-d", sizeof(fstring)) == 0) {
-         sscanf(argv[i+1], "%d", &hnd->debug);
-         i++;
-      }
-
-      else { /*assume this is the server name*/
-         strncpy(hnd->server, argv[i], sizeof(fstring));
-      }
-   }
-
-   if(!hnd->server) {
-      cactest_print_usage(argv);
-      cac_FreeHandle(hnd);
-      exit(-1);
-   }
-
-}
-
-void print_value(uint32 type, REG_VALUE_DATA *data) {
-   int i = 0;
-
-   switch(type) {
-      case REG_SZ:
-         printf(" Type: REG_SZ\n");
-         printf(" Value: %s\n", data->reg_sz);
-         break;
-      case REG_EXPAND_SZ:
-         printf(" Type: REG_EXPAND_SZ\n");
-         printf(" Value: %s\n", data->reg_expand_sz);
-         break;
-      case REG_MULTI_SZ:
-         printf(" Type: REG_MULTI_SZ\n");
-         printf(" Values: ");
-
-         for(i = 0; i < data->reg_multi_sz.num_strings; i++) {
-            printf("     %d: %s\n", i, data->reg_multi_sz.strings[i]);
-         }
-         break;
-      case REG_DWORD:
-         printf(" Type: REG_DWORD\n");
-         printf(" Value: %d\n", data->reg_dword);
-         break;
-      case REG_DWORD_BE:
-         printf(" Type: REG_DWORD_BE\n");
-         printf(" Value: 0x%x\n", data->reg_dword_be);
-         break;
-      case REG_BINARY:
-         printf(" Type: REG_BINARY\n");
-         break;
-      default:
-         printf(" Invalid type: %d\n", type);
-         
-   }
-
-   printf("\n");
-   
-}
-
-void cactest_readline(FILE *in, fstring line) {
-
-   int c;
-   
-   c = fgetc(in);
-   if(c != '\n')
-      ungetc(c, in);
-
-   fgets(line, sizeof(fstring), in);
-
-   if(line[strlen(line) - 1] == '\n')
-      line[strlen(line) - 1] = '\0';
-
-}
-
-void cactest_GetAuthDataFn(const char * pServer,
-                 const char * pShare,
-                 char * pWorkgroup,
-                 int maxLenWorkgroup,
-                 char * pUsername,
-                 int maxLenUsername,
-                 char * pPassword,
-                 int maxLenPassword)
-    
-{
-   char temp[sizeof(fstring)];
-
-   static char authUsername[sizeof(fstring)];
-   static char authWorkgroup[sizeof(fstring)];
-   static char authPassword[sizeof(fstring)];
-   static char authSet = 0;
-
-   char *pass = NULL;
-
-   if (authSet)
-   {
-      strncpy(pWorkgroup, authWorkgroup, maxLenWorkgroup - 1);
-      strncpy(pUsername, authUsername, maxLenUsername - 1);
-      strncpy(pPassword, authPassword, maxLenPassword - 1);
-   }
-   else
-   {
-      if(pWorkgroup[0] != '\0') {
-         strncpy(authWorkgroup, pWorkgroup, maxLenWorkgroup - 1);
-      }
-      else {
-         d_printf("Domain: [%s] ", pWorkgroup);
-         fscanf(stdin, "%s", temp);
-
-         if (temp[0] != '\0')
-         {
-            strncpy(pWorkgroup, temp, maxLenWorkgroup - 1);
-            strncpy(authWorkgroup, temp, maxLenWorkgroup - 1);
-         }
-      }
-
-
-      if(pUsername[0] != '\0') {
-         strncpy(authUsername, pUsername, maxLenUsername - 1);
-      }
-      else {
-         d_printf("Username: [%s] ", pUsername);
-         fscanf(stdin, "%s", temp);
-
-         if (temp[strlen(temp) - 1] == '\n') /* A new line? */
-         {
-            temp[strlen(temp) - 1] = '\0';
-         }
-
-         if (temp[0] != '\0')
-         {
-            strncpy(pUsername, temp, maxLenUsername - 1);
-            strncpy(authUsername, pUsername, maxLenUsername - 1);
-         }
-      }
-      if(pPassword[0] != '\0') {
-         strncpy(authPassword, pPassword, maxLenPassword - 1);
-      }
-      else {
-         pass = getpass("Password: ");
-         if (pass)
-            fstrcpy(temp, pass);
-         if (temp[strlen(temp) - 1] == '\n') /* A new line? */
-         {
-            temp[strlen(temp) - 1] = '\0';
-         }        
-         if (temp[0] != '\0')
-         {
-            strncpy(pPassword, temp, maxLenPassword - 1);
-            strncpy(authPassword, pPassword, maxLenPassword - 1);
-         }    
-      }
-      authSet = 1;
-   }
-}
-
-void cactest_reg_input_val(TALLOC_CTX *mem_ctx, int *type, char **name, REG_VALUE_DATA *data) {
-   fstring tmp;
-   int i;
-
-   printf("Enter value name: \n");
-   cactest_readline(stdin, tmp);
-   *name = talloc_strdup(mem_ctx, tmp);
-
-   do {
-      printf("Enter type. %d = REG_SZ, %d = REG_DWORD, %d = REG_MULTI_SZ: ", REG_SZ, REG_DWORD, REG_MULTI_SZ);
-      scanf("%d", type);
-   } while(*type != REG_SZ && *type != REG_DWORD && *type != REG_MULTI_SZ);
-
-   switch(*type) {
-      case REG_SZ:
-         printf("Enter string:\n");
-         cactest_readline(stdin, tmp);
-
-         data->reg_sz = talloc_strdup(mem_ctx, tmp);
-         break;
-
-      case REG_DWORD:
-         printf("Enter dword: ");
-         scanf("%d", &data->reg_dword);
-         break;
-
-      case REG_MULTI_SZ:
-         printf("Enter number of strings: ");
-         scanf("%d", &data->reg_multi_sz.num_strings);
-         
-         data->reg_multi_sz.strings = talloc_array(mem_ctx, char *, data->reg_multi_sz.num_strings);
-
-         for(i = 0; i < data->reg_multi_sz.num_strings; i++) {
-            printf("String %d: ", i+1);
-            cactest_readline(stdin, tmp);
-
-            data->reg_multi_sz.strings[i] = talloc_strdup(mem_ctx, tmp);
-         }
-         break;
-   }
-}
-
-void print_cac_user_info(CacUserInfo *info) {
-   printf("    User Name    : %s\n", info->username);
-   printf("    Full Name    : %s\n", info->full_name);
-   printf("    Home Dir     : %s\n", info->home_dir);
-   printf("    Home Drive   : %s\n", info->home_drive);
-   printf("    Profile Path : %s\n", info->profile_path);
-   printf("    Logon Script : %s\n", info->logon_script);
-   printf("    Description  : %s\n", info->description);
-   printf("    Workstations : %s\n", info->workstations);
-   printf("    Remote Dial  : %s\n", info->dial);
-
-   printf("    Logon Time   : %s\n", http_timestring(info->logon_time));
-   printf("    Logoff Time  : %s\n", http_timestring(info->logoff_time));
-   printf("    Kickoff Time : %s\n", http_timestring(info->kickoff_time));
-   printf("    Pass last set: %s\n", http_timestring(info->pass_last_set_time));
-   printf("    Pass can set : %s\n", http_timestring(info->pass_can_change_time));
-   printf("    Pass must set: %s\n", http_timestring(info->pass_must_change_time));
-
-   printf("    User RID     : 0x%x\n", info->rid);
-   printf("    Group RID    : 0x%x\n", info->group_rid);
-   printf("    ACB Mask     : 0x%x\n", info->acb_mask);
-
-   printf("    Bad pwd count: %d\n", info->bad_passwd_count);
-   printf("    Logon Cuont  : %d\n", info->logon_count);
-
-   printf(" NT Password  : %s\n", info->nt_password);
-   printf(" LM Password  : %s\n", info->lm_password);
-
-}
-
-void edit_readline(fstring line) {
-   fgets(line, sizeof(fstring), stdin);
-
-   if(line[strlen(line)-1] == '\n')
-      line[strlen(line)-1] = '\0';
-}
-void edit_cac_user_info(TALLOC_CTX *mem_ctx, CacUserInfo *info) {
-   fstring tmp;
-
-   printf(" User Name [%s]: ", info->username);
-   edit_readline(tmp);
-
-   if(tmp[0] != '\0')
-      info->username = talloc_strdup(mem_ctx, tmp);
-
-   printf(" Full Name [%s]: ", info->full_name);
-
-   edit_readline(tmp);
-   if(tmp[0] != '\0')
-      info->full_name = talloc_strdup(mem_ctx, tmp);
-
-   printf(" Description [%s]: ", info->description);
-   edit_readline(tmp);
-   if(tmp[0] != '\0')
-      info->description = talloc_strdup(mem_ctx, tmp);
-
-   printf(" Remote Dial [%s]: ", info->dial);
-   edit_readline(tmp);
-   if(tmp[0] != '\0')
-      info->dial = talloc_strdup(mem_ctx, tmp);
-
-   printf(" ACB Mask [0x%x]: ", info->acb_mask);
-   edit_readline(tmp);
-   if(tmp[0] != '\0') 
-      sscanf(tmp, "%x", &info->acb_mask);
-
-   printf(" Must change pass at next logon? [y/N]: ");
-   edit_readline(tmp);
-
-   if(tmp[0] == 'y' || tmp[0] == 'Y')
-      info->pass_must_change= True;
-
-}
-   
-void print_cac_group_info(CacGroupInfo *info) {
-   printf(" Group Name  : %s\n", info->name);
-   printf(" Description : %s\n", info->description);
-   printf(" Num Members : %d\n", info->num_members);
-}
-
-void edit_cac_group_info(TALLOC_CTX *mem_ctx, CacGroupInfo *info) {
-   fstring tmp;
-
-   printf("Group Name [%s]: ", info->name);
-   edit_readline(tmp);
-   if(tmp[0] != '\0')
-      info->name = talloc_strdup(mem_ctx, tmp);
-
-   printf("Description [%s]: ", info->description);
-   edit_readline(tmp);
-   if(tmp[0] != '\0')
-      info->description = talloc_strdup(mem_ctx, tmp);
-}
-
-char *srv_role_str(uint32 role) {
-   switch(role) {
-      case ROLE_STANDALONE:
-         return "STANDALONE";
-         break;
-      case ROLE_DOMAIN_MEMBER:
-         return "DOMAIN_MEMBER";
-         break;
-      case ROLE_DOMAIN_BDC:
-         return "DOMAIN_BDC";
-         break;
-      case ROLE_DOMAIN_PDC:
-         return "DOMAIN_PDC";
-         break;
-   }
-
-   return "Invalid role!\n";
-}
-
-char *cactime_str(CacTime ctime, fstring tmp) {
-
-   snprintf(tmp, sizeof(fstring), "%u Days, %u Hours, %u Minutes, %u Seconds", ctime.days, ctime.hours, ctime.minutes, ctime.seconds);
-
-   return tmp;
-}
-
-void print_cac_domain_info(CacDomainInfo *info) {
-   fstring tmp;
-   
-   printf("  Server Role      : %s\n", srv_role_str(info->server_role));
-   printf("  Num Users        : %d\n", info->num_users);
-   printf("  Num Domain Groups: %d\n", info->num_domain_groups);
-   printf("  Num Local Groups : %d\n", info->num_local_groups);
-   printf("  Comment          : %s\n", info->comment);
-   printf("  Domain Name      : %s\n", info->domain_name);
-   printf("  Server Name      : %s\n", info->server_name);
-   printf("  Min. Pass. Length: %d\n", info->min_pass_length);
-   printf("  Password History : %d\n", info->pass_history);
-   printf("\n");
-   printf("  Passwords Expire In    : %s\n", cactime_str(info->expire, tmp));
-   printf("  Passwords Can Change in: %s\n", cactime_str(info->min_pass_age, tmp));
-   printf("  Lockouts last          : %s\n", cactime_str(info->lockout_duration, tmp));
-   printf("  Allowed Bad Attempts   : %d\n", info->num_bad_attempts);
-}
-
-void print_cac_service(CacService svc) {
-   printf("\tService Name: %s\n", svc.service_name);
-   printf("\tDisplay Name: %s\n", svc.display_name);
-   print_service_status(svc.status);
-}
-
-void print_service_status(SERVICE_STATUS status) {
-   printf("\tStatus:\n");
-   printf("\t Type:          0x%x\n", status.type); 
-   printf("\t State:         0x%x\n", status.state);
-   printf("\t Controls:      0x%x\n", status.controls_accepted);
-   printf("\t W32 Exit Code: 0x%x\n", status.win32_exit_code);
-   printf("\t SVC Exit Code: 0x%x\n", status.service_exit_code);
-   printf("\t Checkpoint:    0x%x\n", status.check_point);
-   printf("\t Wait Hint:     0x%x\n", status.wait_hint);
-   printf("\n");
-}
-
-void print_service_config(CacServiceConfig *config) {
-   printf("\tConfig:\n");
-   printf("\tType:             0x%x\n", config->type);
-   printf("\tStart Type:       0x%x\n", config->start_type);
-   printf("\tError config:     0x%x\n", config->error_control);
-   printf("\tExecutable Path:  %s\n", config->exe_path);
-   printf("\tLoad Order Group: %s\n", config->load_order_group);
-   printf("\tTag ID:           0x%x\n", config->tag_id);
-   printf("\tDependencies:     %s\n", config->dependencies);
-   printf("\tStart Name:       %s\n", config->start_name);
-   printf("\tDisplay Name:     %s\n", config->display_name);
-}
diff --git a/examples/libmsrpc/test/test_util.h b/examples/libmsrpc/test/test_util.h
deleted file mode 100644 (file)
index 9b27599..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef TEST_UTIL_H
-#define TEST_UTIL_H
-
-#include "libmsrpc.h"
-
-/*prototypes*/
-void cactest_GetAuthDataFn(const char * pServer,
-                 const char * pShare,
-                 char * pWorkgroup,
-                 int maxLenWorkgroup,
-                 char * pUsername,
-                 int maxLenUsername,
-                 char * pPassword,
-                 int maxLenPassword);
-
-
-void cactest_print_usage(char **argv);
-void cac_parse_cmd_line(int argc, char **argv, CacServerHandle *hnd);
-void print_value(uint32 type, REG_VALUE_DATA *data);
-void cactest_readline(FILE *in, fstring line);
-void cactest_reg_input_val(TALLOC_CTX *mem_ctx, int *type, char **name, REG_VALUE_DATA *data);
-void print_cac_user_info(CacUserInfo *info);
-void edit_cac_user_info(TALLOC_CTX *mem_ctx, CacUserInfo *info);
-void print_cac_group_info(CacGroupInfo *info);
-void edit_cac_group_info(TALLOC_CTX *mem_ctx, CacGroupInfo *info);
-void print_cac_domain_info(CacDomainInfo *info);
-void print_cac_service(CacService svc);
-void print_service_status(SERVICE_STATUS status);
-void print_service_config(CacServiceConfig *config);
-
-#endif /*TEST_UTIL_H*/
diff --git a/examples/scripts/users_and_groups/adduserstogroups.pl b/examples/scripts/users_and_groups/adduserstogroups.pl
deleted file mode 100755 (executable)
index 17ca5bd..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/perl
-
-#
-# adduserstogroups.pl
-#
-#    add single or continuously numbered domain users
-#    to a given single group or list of groups
-#
-# Copyright (C) Michael Adam <obnox@samba.org> 2007
-#
-# 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 3 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, see <http://www.gnu.org/licenses/>.
-#
-
-#
-# WARNING: This script is still rather crude.
-#
-
-use strict;
-use Getopt::Std;
-
-my $net_cmd    = "net";
-
-# defaults:
-
-my $server;
-my $num_members        = 1;
-my $startmem;                  # if empty, don't add numbers to member prefix
-my $member_prefix;             # name prefix for member
-my $num_groups = 1;
-my $startgroup;                        # if empty, don't add numbers to group prefix
-my $group_prefix;              # name prefix for group
-my $path;                      # path to rpcclient command
-my $net_path   = $net_cmd;
-my $creds;
-
-sub usage {
-       print "USAGE: $0 [-h] -S server -U user\%pass \\\n"
-               . "\t-m member [-s startmem] [-n nummem] \\\n"
-               . "\t-g group [-G stargroup] [-N numgroups] \\\n"
-               . "\t[-P path]\n";
-}
-
-# parse commandline:
-
-my %options = ();
-getopts("U:S:m:s:n:g:G:N:P:h", \%options);
-
-if (exists($options{h})) {
-       usage();
-       exit 0;
-}
-
-if (exists($options{g})) {
-       $group_prefix = $options{g};
-}
-else {
-       print "ERROR: mandatory argument '-g' missing\n";
-       usage();
-       exit 1;
-}
-
-if (exists($options{U})) {
-       $creds = "-U $options{U}";
-       if ($creds !~ '%') {
-               print "ERROR: you need to specify credentials in the form -U user\%pass\n";
-               usage();
-               exit 1;
-       }
-}
-else {
-       print "ERROR: mandatory argument '-U' missing\n";
-       usage();
-       exit 1;
-}
-
-if (exists($options{S})) {
-       $server = $options{S};
-}
-else {
-       print "ERROR: madatory argument '-S' missing\n";
-       usage();
-       exit 1;
-}
-
-if (exists($options{s})) {
-       $startmem = $options{s};
-}
-
-if (exists($options{n})) {
-       $num_members = $options{n};
-}
-
-if (exists($options{m})) {
-       $member_prefix = $options{m};
-}
-else {
-       print "ERROR: mandatory argument '-m' missing\n";
-       usage();
-       exit 1;
-}
-
-if (exists($options{G})) {
-       $startgroup = $options{G};
-}
-
-if (exists($options{N})) {
-       $num_groups = $options{N};
-}
-
-if (exists($options{P})) {
-       $path = $options{p};
-       $net_path = "$path/$net_cmd";
-}
-
-if (@ARGV) {
-       print "ERROR: junk on the command line ('" . join(" ", @ARGV) . "')...\n";
-       usage();
-       exit 1;
-}
-
-# utility functions:
-
-sub do_add {
-       my $member_name = shift;
-       my $group_name = shift;
-       print "adding member $member_name to group $group_name\n";
-       system("$net_path rpc -I $server ".$creds." group addmem $group_name $member_name");
-}
-
-sub add_group_loop {
-       my $member_name = shift;
-
-       if ("x$startgroup" eq "x") {
-               do_add($member_name, $group_prefix);
-       }
-       else {
-               for (my $groupnum = 1; $groupnum <= $num_groups; ++$groupnum) {
-                       do_add($member_name, 
-                              sprintf("%s%.05d", $group_prefix, $startgroup + $groupnum - 1));
-               }
-       }
-}
-
-
-# main:
-
-if ("x$startmem" eq "x") {
-       add_group_loop($member_prefix);
-}
-else {
-       for (my $memnum = 1; $memnum <= $num_members; ++$memnum) {
-               add_group_loop(sprintf("%s%.05d", $member_prefix, $startmem + $memnum - 1));
-       }
-}
-
diff --git a/examples/scripts/users_and_groups/createdomobj.pl b/examples/scripts/users_and_groups/createdomobj.pl
deleted file mode 100755 (executable)
index 60f34b8..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-#!/usr/bin/perl
-
-#
-# createdomobj.pl
-#
-#    create single or continuously numbered domain 
-#    users/groups/aliases via rpc
-#
-# Copyright (C) Michael Adam <obnox@samba.org> 2007
-#
-# 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 3 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, see <http://www.gnu.org/licenses/>.
-#
-
-#
-# WARNING: This script is still rather crude.
-#
-
-use strict;
-use Getopt::Std;
-
-
-my $target_type        = "group";              # what type of object to create
-my $rpc_cmd    = "createdom".$target_type;
-my $rpccli_cmd = "rpcclient";
-
-# defaults:
-
-my $server;
-my $num_targets        = 1;
-my $startnum;                          # if empty, don't add numbers to prefix
-my $prefix     = $target_type;         # name-prefix
-my $path;                              # path to rpcclient command
-my $rpccli_path        = $rpccli_cmd;
-my $creds;
-
-sub usage {
-       print "USAGE: $0 [-h] -S server -U user\%pass [-p prefix] \\\n"
-               . "\t[-t {alias|group|user}] [-s startnum] [-n numobjs] [-P path] \n";
-}
-
-# parse commandline:
-
-my %options = ();
-getopts("U:t:S:s:n:p:P:h", \%options);
-
-if (exists($options{h})) {
-       usage();
-       exit 0;
-}
-
-if (exists($options{t})) {
-       $target_type = $options{t};
-       if ($target_type !~ /^(alias|user|group)$/) {
-               print "ERROR: invalid target type given\n";
-               usage();
-               exit 1;
-       }
-       $rpc_cmd = "createdom".$target_type;
-}
-
-if (exists($options{U})) {
-       $creds = "-U $options{U}";
-       if ($creds !~ '%') {
-               print "ERROR: you need to specify credentials in the form -U user\%pass\n";
-               usage();
-               exit 1;
-       }
-}
-else {
-       print "ERROR: mandatory argument '-U' missing\n";
-       usage();
-       exit 1;
-}
-
-if (exists($options{S})) {
-       $server = $options{S};
-}
-else {
-       print "ERROR: madatory argument '-S' missing\n";
-       usage();
-       exit 1;
-}
-
-if (exists($options{s})) {
-       $startnum = $options{s};
-}
-
-if (exists($options{n})) {
-       $num_targets = $options{n};
-}
-
-if (exists($options{p})) {
-       $prefix = $options{p};
-}
-
-if (exists($options{P})) {
-       $path = $options{p};
-       $rpccli_path = "$path/$rpccli_cmd";
-}
-
-if (@ARGV) {
-       print "ERROR: junk on the command line ('" . join(" ", @ARGV) . "')...\n";
-       usage();
-       exit 1;
-}
-
-# utility functions:
-
-sub open_rpc_pipe {
-       print "opening rpc pipe\n";
-       open(IPC, "| $rpccli_cmd $server $creds -d0") or
-               die "error opening rpc pipe.";
-}
-
-sub close_rpc_pipe {
-       print "closing rpc pipe\n";
-       close(IPC);
-}
-
-sub do_create {
-       my $target_name = shift;
-       print "creating $target_type $target_name\n";
-       print IPC "$rpc_cmd $target_name\n";
-}
-
-# main:
-
-open_rpc_pipe();
-
-if ("x$startnum" eq "x") {
-       do_create($prefix);
-}
-else {
-       for (my $num = 1; $num <= $num_targets; ++$num) {
-               do_create(sprintf "%s%.05d", $prefix, $startnum + $num - 1);
-               if (($num) % 500 == 0) {
-                       printf("500 ".$target_type."s created\n");
-                       close_rpc_pipe();
-                       sleep 2;
-                       open_rpc_pipe();
-               }
-       }
-}
-
-close_rpc_pipe();
-
diff --git a/make-tarball.sh b/make-tarball.sh
deleted file mode 100644 (file)
index c57f01d..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-
-## A simple script to build a tarball of the current CVS tree.
-## You either need to include the using_samba cvs module in the
-## parent directory or tell the script where to find it 
-##
-## Usgae:  ./make-tarball.sh [nodocs]
-
-NODOCS=0
-if [ x"$1" = x"nodocs" ] ; then
-       NODOCS=1
-       echo Not including docs.
-fi
-
-DOCSDIR=../samba-docs/
-USING_SAMBA=../using_samba/
-SRCDIR=`pwd`
-
-if [ $NODOCS -eq 0 ]; then
-       if [ ! -d $USING_SAMBA ]; then
-       
-               echo Cannot find "Using Samba" directory \(assuming $USING_SAMBA\).  
-               echo Please set the USING_SAMBA variable in this script to the correct
-               echo location.  The html files are available in the using_samba CVS 
-               echo module on cvs.samba.org.  See http://cvs.samba.org/ for details 
-               echo about anonymous CVS access.  Exiting now....
-       
-               exit 1
-       
-       fi
-       
-       if [ ! -d $DOCSDIR ]; then
-       
-               echo Cannot find samba-docs \(assuming $DOCSDIR\).
-               echo Please set the DOCSDIR variable in this script 
-               echo to the correct path.
-       
-               exit 1
-       
-       fi
-fi
-
-( cd source ; sh script/mkversion.sh )
-VERSION=`grep SAMBA_VERSION_OFFICIAL_STRING source/include/version.h | cut -d\" -f2 | sed 's/ /_/g'`
-TARBALLDIR=/tmp/samba-$VERSION
-
-echo Creating the tarball source directory in $TARBALLDIR
-
-/bin/rm -rf $TARBALLDIR
-/bin/rm -f samba-$VERSION.tar
-
-mkdir $TARBALLDIR
-rsync -aC ./ $TARBALLDIR
-/bin/rm -rf $TARBALLDIR/docs/*
-if [ $NODOCS -eq 0 ]; then
-       rsync -aC $DOCSDIR/ $TARBALLDIR/docs/ 
-       rsync -aC $USING_SAMBA $TARBALLDIR/docs/htmldocs/
-fi
-
-echo Creating packaging scripts...
-( cd $TARBALLDIR/packaging; sh bin/update-pkginfo $VERSION 1 )
-
-echo Creating source/configure...
-( cd $TARBALLDIR/source; ./autogen.sh )
-
-echo Making tarball samba-$VERSION.tar in current directory...
-( cd `dirname $TARBALLDIR`; tar cf $SRCDIR/samba-$VERSION.tar samba-$VERSION )
diff --git a/source3/.indent.pro b/source3/.indent.pro
new file mode 100644 (file)
index 0000000..05445f4
--- /dev/null
@@ -0,0 +1,30 @@
+-bad
+-bap
+-bbb
+-br
+-ce
+-ut
+-ts8
+-i8
+-di1
+-brs
+-npsl
+-npcs
+-prs
+-bbo
+-hnl
+-bad
+-bap
+-bbb
+-br
+-ce
+-ut
+-ts8
+-i8
+-di1
+-brs
+-npsl
+-npcs
+-prs
+-bbo
+-hnl
diff --git a/source3/.valgrind_suppressions b/source3/.valgrind_suppressions
deleted file mode 100644 (file)
index a09a4dc..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-# add valgrind suppressions for the build farm here. Get the format
-# from the build farm log
-
-{
-   samba_dlopen1
-   Memcheck:Cond
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/tls/libc-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   fun:_dl_open
-}
-
-{
-   samba_dlopen2
-   Memcheck:Cond
-   obj:/lib/ld-2.3.6.so
-   fun:_dl_open
-}
-
-{
-   samba_dlopen3
-   Memcheck:Addr4
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/tls/libc-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   fun:_dl_open
-}
-
-{
-   samba_dlopen4
-   Memcheck:Cond
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/tls/libc-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   fun:_dl_open
- }
-
-{
-   samba_dlopen5
-   Memcheck:Addr4
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/tls/libc-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   fun:_dl_open
-}
-
-{
-   samba_dlopen6
-   Memcheck:Cond
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/tls/libc-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   fun:_dl_open
-}
-
-{
-   samba_dlopen7
-   Memcheck:Addr4
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/tls/libc-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   fun:_dl_open
-}                                              
-
-{
-   samba_libc_dlsym1
-   Memcheck:Addr4
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   obj:/lib/tls/libc-2.3.6.so
-   obj:/lib/ld-2.3.6.so
-   fun:__libc_dlsym
-}
index cdcb658908aad1153b9bf0f5e647bd9def45f0fe..c1040781d84577fe7bb704b0168e1d1cbbd191ef 100644 (file)
@@ -168,3 +168,9 @@ DOT_CLEANUP            = YES
 # configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
 SEARCHENGINE           = NO
+CGI_NAME               = search.cgi
+CGI_URL                = 
+DOC_URL                = 
+DOC_ABSPATH            = 
+BIN_ABSPATH            = /usr/local/bin/
+EXT_DOC_PATHS          = 
index 2a1b7ee8c317dc4b9c412a2e7f23187d4277e6ea..320c9bceef7b5607ee7ec32be1d02fbd191e3d8d 100644 (file)
@@ -16,7 +16,7 @@ localstatedir=@localstatedir@
 datarootdir=@datarootdir@
 
 selftest_prefix=@selftest_prefix@
-samba4srcdir=@samba4srcdir@
+smbtorture4_path=@smbtorture4_path@
 
 LIBS=@LIBS@
 CC=@CC@
@@ -48,13 +48,10 @@ WINBIND_NSS_LDSHFLAGS=@WINBIND_NSS_LDSHFLAGS@ @LDFLAGS@
 AWK=@AWK@
 PICFLAG=@PICFLAG@
 DYNEXP=@DYNEXP@
-PYTHON=@PYTHON@
 PERL=@PERL@
 
 PIDL_ARGS=@PIDL_ARGS@
 
-SELFTEST_ARGS = @SELFTEST_ARGS@
-
 TERMLDFLAGS=@TERMLDFLAGS@
 TERMLIBS=@TERMLIBS@
 PRINT_LIBS=@PRINT_LIBS@
@@ -134,7 +131,6 @@ LOCKDIR = @lockdir@
 PIDDIR = @piddir@
 
 LIBSMBCLIENT=bin/libsmbclient.a @LIBSMBCLIENT_SHARED@
-LIBMSRPC=bin/libmsrpc.a @LIBMSRPC_SHARED@
 LIBSMBSHAREMODES=bin/libsmbsharemodes.a @LIBSMBSHAREMODES_SHARED@
 LIBADDNS=bin/libaddns.a @LIBADDNS_SHARED@
 
@@ -254,9 +250,7 @@ LIBNDR_GEN_OBJ = librpc/gen_ndr/ndr_wkssvc.o \
                 librpc/gen_ndr/ndr_srvsvc.o \
                 librpc/gen_ndr/ndr_svcctl.o \
                 librpc/gen_ndr/ndr_eventlog.o \
-                librpc/gen_ndr/ndr_unixinfo.o \
-                librpc/gen_ndr/ndr_notify.o \
-                librpc/gen_ndr/ndr_epmapper.o
+                librpc/gen_ndr/ndr_notify.o
 
 RPC_PARSE_OBJ0 = rpc_parse/parse_prs.o rpc_parse/parse_misc.o
 
@@ -264,7 +258,7 @@ RPC_PARSE_OBJ0 = rpc_parse/parse_prs.o rpc_parse/parse_misc.o
 # that requires knowledge of security contexts
 RPC_PARSE_OBJ1 = $(RPC_PARSE_OBJ0) rpc_parse/parse_sec.o
 
-RPC_PARSE_OBJ2 = rpc_parse/parse_rpc.o rpc_parse/parse_net.o
+RPC_PARSE_OBJ2 = rpc_parse/parse_rpc.o rpc_parse/parse_net.o rpc_parse/parse_srv.o
 
 LIBREPLACE_OBJ = @LIBREPLACE_OBJS@
 
@@ -351,10 +345,10 @@ LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \
             libsmb/clistr.o libsmb/cliquota.o libsmb/clifsinfo.o libsmb/clidfs.o \
              libsmb/smberr.o libsmb/credentials.o libsmb/pwd_cache.o \
             libsmb/clioplock.o $(ERRORMAP_OBJ) libsmb/clirap2.o \
-            libsmb/smb_seal.o $(DOSERR_OBJ) \
+            $(DOSERR_OBJ) \
             $(RPC_PARSE_OBJ1) $(LIBSAMBA_OBJ) $(LIBNMB_OBJ)
 
-RPC_CLIENT_OBJ1 = rpc_client/cli_netlogon.o
+RPC_CLIENT_OBJ1 = rpc_client/cli_netlogon.o rpc_client/cli_srvsvc.o
 
 LIBMSRPC_OBJ = rpc_client/cli_lsarpc.o rpc_client/cli_samr.o \
               $(RPC_CLIENT_OBJ1) rpc_client/cli_reg.o $(RPC_CLIENT_OBJ) \
@@ -369,8 +363,7 @@ LIBMSRPC_GEN_OBJ = librpc/gen_ndr/cli_lsa.o \
                   librpc/gen_ndr/cli_winreg.o \
                   librpc/gen_ndr/cli_initshutdown.o \
                   librpc/gen_ndr/cli_eventlog.o \
-                  librpc/gen_ndr/cli_unixinfo.o \
-                  librpc/gen_ndr/cli_epmapper.o \
+                  librpc/gen_ndr/cli_wkssvc.o \
                   $(LIBNDR_GEN_OBJ) \
                   $(RPCCLIENT_NDR_OBJ)
 
@@ -390,19 +383,18 @@ RPC_NETLOG_OBJ = rpc_server/srv_netlog.o rpc_server/srv_netlog_nt.o
 RPC_SAMR_OBJ = rpc_server/srv_samr.o rpc_server/srv_samr_nt.o \
                rpc_server/srv_samr_util.o
 
-RPC_UNIXINFO_OBJ = librpc/gen_ndr/srv_unixinfo.o rpc_server/srv_unixinfo_nt.o
 REGFIO_OBJ = registry/regfio.o
 
-RPC_EPMAPPER_OBJ = librpc/gen_ndr/srv_epmapper.o rpc_server/srv_epmapper_nt.o
-
 RPC_INITSHUTDOWN_OBJ =  librpc/gen_ndr/srv_initshutdown.o rpc_server/srv_initshutdown_nt.o
 
 RPC_REG_OBJ =  rpc_server/srv_winreg_nt.o \
               librpc/gen_ndr/srv_winreg.o \
               $(REGFIO_OBJ)
+
 RPC_LSA_DS_OBJ =  rpc_server/srv_lsa_ds.o rpc_server/srv_lsa_ds_nt.o
 
-RPC_SVC_OBJ = librpc/gen_ndr/srv_srvsvc.o rpc_server/srv_srvsvc_nt.o
+RPC_SVC_OBJ = rpc_server/srv_srvsvc.o rpc_server/srv_srvsvc_nt.o \
+             librpc/gen_ndr/srv_srvsvc.o
 
 RPC_WKS_OBJ =  librpc/gen_ndr/srv_wkssvc.o rpc_server/srv_wkssvc_nt.o
 
@@ -529,7 +521,7 @@ SMBD_OBJ_SRV = smbd/files.o smbd/chgpasswd.o smbd/connection.o \
                smbd/reply.o smbd/sesssetup.o smbd/trans2.o smbd/uid.o \
               smbd/dosmode.o smbd/filename.o smbd/open.o smbd/close.o \
               smbd/blocking.o smbd/sec_ctx.o smbd/srvstr.o \
-              smbd/vfs.o smbd/statcache.o smbd/seal.o \
+              smbd/vfs.o smbd/statcache.o \
                smbd/posix_acls.o lib/sysacls.o $(SERVER_MUTEX_OBJ) \
               smbd/process.o smbd/service.o smbd/error.o \
               printing/printfsp.o lib/sysquotas.o lib/sysquotas_linux.o \
@@ -537,7 +529,7 @@ SMBD_OBJ_SRV = smbd/files.o smbd/chgpasswd.o smbd/connection.o \
               smbd/change_trust_pw.o smbd/fake_file.o \
               smbd/quotas.o smbd/ntquotas.o $(AFS_OBJ) smbd/msdfs.o \
               $(AFS_SETTOKEN_OBJ) smbd/aio.o smbd/statvfs.o \
-              smbd/dmapi.o lib/launchd.o smbd/sockinit.o \
+              smbd/dmapi.o \
               $(MANGLE_OBJ) @VFS_STATIC@
 
 SMBD_OBJ_BASE = $(PARAM_WITHOUT_REG_OBJ) $(SMBD_OBJ_SRV) $(LIBSMB_OBJ) \
@@ -630,7 +622,6 @@ RPCCLIENT_OBJ1 = rpcclient/rpcclient.o rpcclient/cmd_lsarpc.o \
                 rpcclient/cmd_dfs.o \
                 rpcclient/cmd_ds.o rpcclient/cmd_echo.o \
                 rpcclient/cmd_shutdown.o rpcclient/cmd_test.o \
-                rpcclient/cmd_unixinfo.o \
                 $(DISPLAY_SEC_OBJ) $(DISPLAY_DSDCINFO_OBJ)
 
 RPCCLIENT_OBJ = $(RPCCLIENT_OBJ1) \
@@ -650,11 +641,6 @@ LIBSMBCLIENT_OBJ = libsmb/libsmbclient.o libsmb/libsmb_compat.o \
                   $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(RPC_PARSE_OBJ) \
                   $(SECRETS_OBJ) $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ)
 
-CAC_OBJ = $(LIBSMBCLIENT_OBJ) \
-                        libmsrpc/libmsrpc.o libmsrpc/libmsrpc_internal.o \
-                        libmsrpc/cac_lsarpc.o libmsrpc/cac_winreg.o libmsrpc/cac_samr.o \
-                        libmsrpc/cac_svcctl.o
-
 LIBSMBSHAREMODES_OBJ = libsmb/smb_share_modes.o $(TDB_BASE_OBJ)
 
 # This shared library is intended for linking with unit test programs
@@ -680,6 +666,7 @@ CLIENT_OBJ = $(CLIENT_OBJ1) $(PARAM_OBJ) $(LIBSMB_OBJ) \
 TOOL_OBJ = client/smbctool.o client/clitar.o $(PARAM_OBJ) $(LIBSMB_OBJ) \
             $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \
              $(READLINE_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) \
+             $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \
             $(DISPLAY_SEC_OBJ)
 
 UTIL_REG_OBJ = lib/util_reg.o
@@ -827,7 +814,6 @@ SMBFILTER_OBJ = utils/smbfilter.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(SECRETS_OBJ) \
                  $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ)
 
 PROTO_OBJ = $(SMBD_OBJ_MAIN) $(LIBNDR_OBJ) $(LIBNDR_GEN_OBJ) \
-           $(RPCCLIENT_NDR_OBJ) \
            $(SMBD_OBJ_SRV) $(NMBD_OBJ1) $(LIBSMB_OBJ) \
            $(SMBTORTURE_OBJ1) $(RPCCLIENT_OBJ1) \
            $(LIBMSRPC_OBJ) \
@@ -844,7 +830,7 @@ PROTO_OBJ = $(SMBD_OBJ_MAIN) $(LIBNDR_OBJ) $(LIBNDR_GEN_OBJ) \
             $(IDMAP_OBJ) libsmb/spnego.o $(PASSCHANGE_OBJ) $(RPC_UNIXINFO_OBJ) \
            $(RPC_NTSVCS_OBJ) $(RPC_INITSHUTDOWN_OBJ) \
            utils/passwd_util.o $(LIBGPO_OBJ) $(NSS_INFO_OBJ) \
-           $(RPC_EPMAPPER_OBJ) $(DISPLAY_DSDCINFO_OBJ)
+           $(RPCCLIENT_NDR_OBJ) $(DISPLAY_DSDCINFO_OBJ)
 
 WINBIND_WINS_NSS_OBJ = nsswitch/wins.o $(PARAM_OBJ) \
        $(LIBSMB_OBJ) $(LIB_NONSMBD_OBJ) $(NSSWINS_OBJ) $(KRBCLIENT_OBJ) $(SECRETS_OBJ)
@@ -861,7 +847,6 @@ NSS_INFO_OBJ = winbindd/nss_info.o @NSS_INFO_STATIC@
 
 WINBINDD_OBJ1 = \
                winbindd/winbindd.o       \
-               winbindd/winbindd_sockinit.o \
                winbindd/winbindd_user.o  \
                winbindd/winbindd_group.o \
                winbindd/winbindd_util.o  \
@@ -869,19 +854,17 @@ WINBINDD_OBJ1 = \
                winbindd/winbindd_pam.o   \
                winbindd/winbindd_sid.o   \
                winbindd/winbindd_misc.o  \
-               winbindd/winbindd_cm.o \
-               winbindd/winbindd_wins.o \
-               winbindd/winbindd_rpc.o \
+               winbindd/winbindd_cm.o    \
+               winbindd/winbindd_wins.o  \
+               winbindd/winbindd_rpc.o   \
                winbindd/winbindd_reconnect.o \
-               winbindd/winbindd_ads.o \
+               winbindd/winbindd_ads.o   \
                winbindd/winbindd_passdb.o \
-               winbindd/winbindd_dual.o \
+               winbindd/winbindd_dual.o  \
                winbindd/winbindd_async.o \
                winbindd/winbindd_creds.o \
                winbindd/winbindd_cred_cache.o \
                winbindd/winbindd_ccache_access.o \
-               winbindd/winbindd_idmap.o \
-               winbindd/winbindd_locator.o \
                auth/token_util.o
 
 WINBINDD_OBJ = \
@@ -891,7 +874,7 @@ WINBINDD_OBJ = \
                $(PROFILE_OBJ) $(SLCACHE_OBJ) $(SMBLDAP_OBJ) \
                $(SECRETS_OBJ) $(LIBADS_OBJ) $(KRBCLIENT_OBJ) $(POPT_LIB_OBJ) \
                $(DCUTIL_OBJ) $(IDMAP_OBJ) $(NSS_INFO_OBJ) \
-               $(AFS_OBJ) $(AFS_SETTOKEN_OBJ) lib/launchd.o \
+               $(AFS_OBJ) $(AFS_SETTOKEN_OBJ) \
                $(LIBADS_SERVER_OBJ) $(SERVER_MUTEX_OBJ) $(LDB_OBJ)
 
 WBINFO_OBJ = nsswitch/wbinfo.o $(LIBSAMBA_OBJ) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
@@ -1067,18 +1050,6 @@ COMPILE_CC_PATH = $(CC) -I. -I$(srcdir) $(PATH_FLAGS) $(FLAGS) $(PICFLAG) -c $<
 
 COMPILE = $(COMPILE_CC)
 
-# BEGIN GNU make specific
-# Rewrite the COMPILE rule to generate dependencies as a side-effect.
-# This is is actually toolchain-independent, but making use of the dependency
-# files requires GNU make, so it's pointless to have them otherwise.
-@ifGNUmake@DEPDIR=.
-@ifGNUmake@COMPILE_DEPENDS = source=$< object=$@ libtool=no \
-@ifGNUmake@    tmpdepfile=$(DEPDIR)/$*.TPo depfile=$(DEPDIR)/$*.d \
-@ifGNUmake@    DEPDIR=$(DEPDIR) @CCDEPMODE@ \
-@ifGNUmake@    $(srcdir)/depcomp $(COMPILE_CC)
-@ifGNUmake@COMPILE = $(COMPILE_DEPENDS)
-# END GNU make specific
-
 .c.o:
        @if (: >> $@ || : > $@) >/dev/null 2>&1; then rm -f $@; else \
         dir=`echo $@ | sed 's,/[^/]*$$,,;s,^$$,.,'` $(MAKEDIR); fi
@@ -1093,13 +1064,6 @@ COMPILE = $(COMPILE_CC)
                $(COMPILE_CC) >/dev/null 2>&1
 @BROKEN_CC@    -mv `echo $@ | sed 's%^.*/%%g'` $@
 
-# BEGIN GNU make specific
-# Include all the generated dependency files. The sort is done to
-# remove duplicates.
-@ifGNUmake@DEPENDS_OBJ = $(SMBD_SRV_OBJ) $(NET_OBJ) $(WINBINDD_OBJ)
-@ifGNUmake@-include $(patsubst %.o, %.d, $(sort $(DEPENDS_OBJ)))
-# END GNU make specific
-
 PRECOMPILED_HEADER = $(builddir)/include/includes.h.gch
 
 # this adds support for precompiled headers. To use it, install a snapshot
@@ -1392,15 +1356,6 @@ bin/libsmbsharemodes.a: $(BINARY_PREREQS) $(LIBSMBSHAREMODES_OBJ)
        @echo Linking non-shared library $@
        @-$(AR) -rc $@ $(LIBSMBSHAREMODES_OBJ)
 
-bin/libmsrpc.@SHLIBEXT@: $(BINARY_PREREQS) $(CAC_OBJ)
-       @echo Linking shared library $@
-       @$(SHLD_DSO) $(CAC_OBJ) $(LDFLAGS) $(LIBS) \
-               @SONAMEFLAG@`basename $@`.$(SONAME_VER)
-
-bin/libmsrpc.a: $(BINARY_PREREQS) $(CAC_OBJ)
-       @echo Linking non-shared library $@
-       @-$(AR) -rc $@ $(CAC_OBJ)
-
 # This is probably wrong for anything other than the GNU linker.
 bin/libbigballofmud.@SHLIBEXT@: $(BINARY_PREREQS) $(LIBBIGBALLOFMUD_OBJ)
        @echo Linking shared library $@
@@ -1434,10 +1389,6 @@ bin/librpc_unixinfo.@SHLIBEXT@: $(BINARY_PREREQS) $(RPC_UNIXINFO_OBJ)
        @echo "Linking $@"
        @$(SHLD_MODULE) $(RPC_UNIXINFO_OBJ)
 
-bin/librpc_epmapper.@SHLIBEXT@: $(BINARY_PREREQS) $(RPC_EPMAPPER_OBJ)
-       @echo "Linking $@"
-       @$(SHLD_MODULE) $(RPC_EPMAPPER_OBJ)
-
 bin/librpc_srvsvc.@SHLIBEXT@: $(BINARY_PREREQS) $(RPC_SVC_OBJ)
        @echo "Linking $@"
        @$(SHLD_MODULE) $(RPC_SVC_OBJ)
@@ -1836,36 +1787,6 @@ installpammodules: $(PAM_MODULES)
                        "$(DESTDIR)/$(PAMMODULESDIR)"; \
        done
 
-# Python extensions
-
-PYTHON_OBJ = $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_OBJ) $(RPC_PARSE_OBJ) \
-       $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
-       $(SECRETS_OBJ) $(KRBCLIENT_OBJ) $(SMBLDAP_OBJ) $(LDB_OBJ)
-
-python_ext: $(PYTHON_OBJ)
-       @if test -z "$(PYTHON)"; then \
-               echo Use the option --with-python to configure python; \
-               exit 1; \
-       fi
-       PYTHON_OBJS="$(PYTHON_OBJ)" \
-       PYTHON_CFLAGS="$(CFLAGS) $(CPPFLAGS) $(FLAGS)" \
-       LIBS="$(LDFLAGS) $(LIBS) $(PASSDB_LIBS) $(IDMAP_LIBS) $(KRB5LIBS) $(LDAP_LIBS)" \
-               $(PYTHON) python/setup.py build
-
-python_install: $(PYTHON_OBJ)
-       @if test -z "$(PYTHON)"; then \
-               echo Use the option --with-python to configure python; \
-               exit 1; \
-       fi
-       PYTHON_OBJS="$(PYTHON_OBJ)" \
-       PYTHON_CFLAGS="$(CFLAGS) $(CPPFLAGS)" \
-       LIBS="$(LDFLAGS) $(LIBS)" \
-               $(PYTHON) python/setup.py install --root=$(DESTDIR)
-
-python_clean:
-       @-if test -n "$(PYTHON)"; then $(PYTHON) python/setup.py clean; fi
-       @-rm -rf build/
-
 # revert to the previously installed version
 revert:
        @$(SHELL) $(srcdir)/script/revert.sh $(SBINDIR) $(SBIN_PROGS)
@@ -1948,11 +1869,10 @@ uninstallpammodules:
 # Toplevel clean files
 TOPFILES=dynconfig.o
 
-clean: delheaders python_clean
+clean: delheaders 
        -rm -f $(PRECOMPILED_HEADER)
        -rm -f core */*~ *~ \
                */*.o */*/*.o */*/*/*.o \
-               */*.d */*/*.d */*/*/*.d \
                */*.@SHLIBEXT@ */*/*.@SHLIBEXT@ */*/*/*.@SHLIBEXT@ \
                $(TOPFILES) $(BIN_PROGS) $(SBIN_PROGS) $(ROOT_SBIN_PROGS) \
                $(MODULES) $(TORTURE_PROGS) $(LIBSMBCLIENT) $(LIBADDNS) \
@@ -2099,32 +2019,16 @@ test_pam_modules: pam_modules
                        || exit 1; \
        done
 
-
-SELFTEST = $(PERL) $(samba4srcdir)/selftest/selftest.pl --prefix=${selftest_prefix} \
-                  --srcdir="${samba4srcdir}" --bindir=${builddir}/bin --testlist="${srcdir}/script/tests/tests_all.sh|" \
-                  --expected-failures=samba3-knownfail --target=samba3 --skip=samba3-skip $(SELFTEST_ARGS)
 ##
 ## Targets for 'make test'
 ##
 test: all torture timelimit
        @echo Running Test suite
-       @$(SELFTEST) --socket-wrapper --immediate $(TESTS)
-
-htmltest: all torture timelimit
-       @echo Running Test suite
-       @$(SELFTEST) --socket-wrapper --format=html --immediate $(TESTS)
+       @sh $(srcdir)/script/tests/selftest.sh ${selftest_prefix}/st all "${smbtorture4_path}"
 
 valgrindtest: all torture timelimit
        @echo Running Test suite with valgrind
        @NMBD_VALGRIND="xterm -n smbd -e valgrind -q --db-attach=yes --num-callers=30" \
         SMBD_VALGRIND="xterm -n smbd -e valgrind -q --db-attach=yes --num-callers=30" \
         VALGRIND="valgrind -q --num-callers=30 --log-file=${selftest_prefix}/st/valgrind.log" \
-        $(SELFTEST) --immediate --socket-wrapper $(TESTS)
-
-gdbtest: all torture timelimit
-       SMBD_VALGRIND="xterm -n smbd -e $(srcdir)/script/gdb_run " \
-               $(SELFTEST) --immediate --socket-wrapper $(TESTS)
-
-testenv: everything
-       $(SELFTEST) --socket-wrapper --testenv
-
+        $(srcdir)/script/tests/selftest.sh ${selftest_prefix}/st all "${smbtorture4_path}"
diff --git a/source3/TODO b/source3/TODO
deleted file mode 100644 (file)
index b5f98ab..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-- Properly map Samba4's dom_sid to Samba3's DOM_SID
-- Allow building IDL files from within the Samba3 tree
-- Autogenerate correct headers so generated files don't have to 
-  be edited for Samba3
index 4635bcd16905ba3bfe858959a4d503a4f9da9808..72764299f503af75b779e090683f0b9b6c29ea3c 100644 (file)
 ########################################################
 SAMBA_VERSION_MAJOR=3
 SAMBA_VERSION_MINOR=2
-SAMBA_VERSION_RELEASE=1
+SAMBA_VERSION_RELEASE=0
 
 ########################################################
-# If a official release has a serious bug              #
-# a security release will have 'a' sufffix             #
+# Bug fix releases use a letter for the patch revision #
 #                                                      #
 # so SAMBA's version will be                           #
 # <MAJOR>.<MINOR>.<RELEASE><REVISION>                  #
index ba7507ef4f1f4584fa9558abdb61415ebaf8c939..b7669e945cfb1f5f6ae6133b3144042ae6e5a8eb 100644 (file)
@@ -149,7 +149,7 @@ struct server_security_state {
 ****************************************************************************/
 
 static BOOL send_server_keepalive(const struct timeval *now,
-                                 void *private_data) 
+                                 void *private_data)
 {
        struct server_security_state *state = talloc_get_type_abort(
                private_data, struct server_security_state);
@@ -231,7 +231,6 @@ static DATA_BLOB auth_get_challenge_server(const struct auth_context *auth_conte
                        *my_private_data =
                                (void *)make_server_security_state(cli);
                        return data_blob_null;
-                       
                } else if (cli->secblob.length < 8) {
                        /* We can't do much if we don't get a full challenge */
                        DEBUG(2,("make_auth_info_server: Didn't receive a full challenge from server\n"));
@@ -240,7 +239,7 @@ static DATA_BLOB auth_get_challenge_server(const struct auth_context *auth_conte
                }
 
                if (!(*my_private_data = (void *)make_server_security_state(cli))) {
-                       return data_blob_null;
+                       return data_blob(NULL,0);
                }
 
                /* The return must be allocated on the caller's mem_ctx, as our own will be
@@ -258,7 +257,7 @@ static DATA_BLOB auth_get_challenge_server(const struct auth_context *auth_conte
 ****************************************************************************/
 
 static NTSTATUS check_smbserver_security(const struct auth_context *auth_context,
-                                        void *private_data, 
+                                        void *my_private_data, 
                                         TALLOC_CTX *mem_ctx,
                                         const auth_usersupplied_info *user_info, 
                                         auth_serversupplied_info **server_info)
@@ -270,12 +269,8 @@ static NTSTATUS check_smbserver_security(const struct auth_context *auth_context
        static BOOL bad_password_server = False;
        NTSTATUS nt_status = NT_STATUS_NOT_IMPLEMENTED;
        BOOL locally_made_cli = False;
-       struct server_security_state *state;
-
-       state = talloc_get_type_abort(
-               private_data, struct server_security_state);
 
-       cli = state->cli;
+       cli = (struct cli_state *)my_private_data;
        
        if (cli) {
        } else {
diff --git a/source3/client/cifs_resolver.sh b/source3/client/cifs_resolver.sh
deleted file mode 100644 (file)
index 2229d5a..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/sh
-###############################################################################
-#
-# Written by Igor Mammedov (niallain@gmail.com)
-# Modified by Steve French <sfrench@samba.org>
-#
-# 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.
-#
-###############################################################################
-#
-# linux-cifs-client dns name resolver helper
-#     called by cifs kernel module upcall to key API to resolve server name 
-#     to IP when module connects to DFS link.  We may eventually make this
-#     C code, but this is a good starting point.
-#     You should have appropriate kernel and keyutils installed.
-#     CIFS DFS Support will require Linux kernel module 
-#      cifs.ko version 1.48 or later.      
-#
-#     Consult the CIFS client users guide for more details
-#       http://www.samba.org/samba/ftp/cifs-cvs/linux-cifs-client-guide.pdf
-#
-# Put the following string in /etc/request-key.conf without comment sign :)
-#    create  cifs_resolver   *       *           /sbin/cifs_resolver.sh %k %d %S
-#
-# Put this script into /sbin directory
-# Call:  /sbin/cifs_resolver.sh <keyid> <desc> <session-keyring>
-#
-#     <desc> - is server name to resolve
-#
-
-status=0
-{
-    echo "cifs_resolver: resolving: $2"
-
-    DATAA=`/usr/bin/host $2`
-    status=$?
-
-    if [ "x$status" != "x0" ]; then
-           echo "cifs_resolver: failed to resolve: $2"
-           exit $status
-    else 
-           DATAA=`echo "$DATAA" | sed 's/.*has address //'`
-           echo "cifs_resolver: resolved: $2 to $DATAA"
-           keyctl instantiate $1 "$DATAA" $3 || exit 1
-    fi
-# if you want to debug the upcall, replace /dev/null (below) with ttyS0 or file
-} >&/dev/null
-exit 0 
index 52ca5e309ab4a7112759838bff498c20f17f0f44..171d413b0ae546031058dc6485ff9fecf7126df6 100644 (file)
@@ -1823,54 +1823,6 @@ static int cmd_open(void)
 /****************************************************************************
 ****************************************************************************/
 
-static int cmd_posix_encrypt(void)
-{
-       NTSTATUS status;
-
-       if (cli->use_kerberos) {
-               status = cli_gss_smb_encryption_start(cli);
-       } else {        
-               fstring buf;
-               fstring domain;
-               fstring user;
-               fstring password;
-
-               if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {
-                       d_printf("posix_encrypt domain user password\n");
-                       return 1;
-               }
-               fstrcpy(domain,buf);
-
-               if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {
-                       d_printf("posix_encrypt domain user password\n");
-                       return 1;
-               }
-               fstrcpy(user,buf);
-
-               if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {
-                       d_printf("posix_encrypt domain user password\n");
-                       return 1;
-               }
-               fstrcpy(password,buf);
-
-               status = cli_raw_ntlm_smb_encryption_start(cli,
-                                                       user,
-                                                       password,
-                                                       domain);
-       }
-       
-       if (!NT_STATUS_IS_OK(status)) {
-               d_printf("posix_encrypt failed with error %s\n", nt_errstr(status));
-       } else {
-               d_printf("encryption on\n");
-       }
-
-       return 0;
-}
-
-/****************************************************************************
-****************************************************************************/
-
 static int cmd_posix_open(void)
 {
        pstring mask;
@@ -3072,12 +3024,10 @@ static BOOL browse_host_rpc(BOOL sort)
        NTSTATUS status;
        struct rpc_pipe_client *pipe_hnd;
        TALLOC_CTX *mem_ctx;
-       uint32 enum_hnd = 0;
-       struct srvsvc_NetShareCtr1 ctr1;
-       union srvsvc_NetShareCtr ctr;
+       ENUM_HND enum_hnd;
+       WERROR werr;
+       SRV_SHARE_INFO_CTR ctr;
        int i;
-       uint32 level;
-       uint32 numentries;
 
        mem_ctx = talloc_new(NULL);
        if (mem_ctx == NULL) {
@@ -3085,6 +3035,8 @@ static BOOL browse_host_rpc(BOOL sort)
                return False;
        }
 
+       init_enum_hnd(&enum_hnd, 0);
+
        pipe_hnd = cli_rpc_pipe_open_noauth(cli, PI_SRVSVC, &status);
 
        if (pipe_hnd == NULL) {
@@ -3094,23 +3046,23 @@ static BOOL browse_host_rpc(BOOL sort)
                return False;
        }
 
-       ZERO_STRUCT(ctr1);
-       level = 1;
-       ctr.ctr1 = &ctr1;
-
-       status = rpccli_srvsvc_NetShareEnum(pipe_hnd, mem_ctx, "", &level,
-                                           &ctr, 0xffffffff, &numentries,
-                                           &enum_hnd);
+       werr = rpccli_srvsvc_net_share_enum(pipe_hnd, mem_ctx, 1, &ctr,
+                                           0xffffffff, &enum_hnd);
 
-       if (!NT_STATUS_IS_OK(status)) {
+       if (!W_ERROR_IS_OK(werr)) {
                TALLOC_FREE(mem_ctx);
                cli_rpc_pipe_close(pipe_hnd);
                return False;
        }
 
-       for (i=0; i<numentries; i++) {
-               struct srvsvc_NetShareInfo1 *info = &ctr.ctr1->array[i];
-               browse_fn(info->name, info->type, info->comment, NULL);
+       for (i=0; i<ctr.num_entries; i++) {
+               SRV_SHARE_INFO_1 *info = &ctr.share.info1[i];
+               char *name, *comment;
+               name = rpcstr_pull_unistr2_talloc(
+                       mem_ctx, &info->info_1_str.uni_netname);
+               comment = rpcstr_pull_unistr2_talloc(
+                       mem_ctx, &info->info_1_str.uni_remark);
+               browse_fn(name, info->info_1.type, comment, NULL);
        }
 
        TALLOC_FREE(mem_ctx);
@@ -3322,7 +3274,6 @@ static struct
   {"newer",cmd_newer,"<file> only mget files newer than the specified local file",{COMPL_LOCAL,COMPL_NONE}},
   {"open",cmd_open,"<mask> open a file",{COMPL_REMOTE,COMPL_NONE}},
   {"posix", cmd_posix, "turn on all POSIX capabilities", {COMPL_REMOTE,COMPL_NONE}},
-  {"posix_encrypt",cmd_posix_encrypt,"<domain> <user> <password> start up transport encryption",{COMPL_REMOTE,COMPL_NONE}},
   {"posix_open",cmd_posix_open,"<name> 0<mode> open_flags mode open a file using POSIX interface",{COMPL_REMOTE,COMPL_NONE}},
   {"posix_mkdir",cmd_posix_mkdir,"<name> 0<mode> creates a directory using POSIX interface",{COMPL_REMOTE,COMPL_NONE}},
   {"posix_rmdir",cmd_posix_rmdir,"<name> removes a directory using POSIX interface",{COMPL_REMOTE,COMPL_NONE}},
@@ -3719,12 +3670,12 @@ static void readline_callback(void)
        timeout.tv_usec = 0;
        sys_select_intr(cli->fd+1,&fds,NULL,NULL,&timeout);
                
-       /* We deliberately use cli_receive_smb_return_keepalive instead of
+       /* We deliberately use receive_smb instead of
           client_receive_smb as we want to receive
           session keepalives and then drop them here.
        */
        if (FD_ISSET(cli->fd,&fds)) {
-               if (!cli_receive_smb_return_keepalive(cli)) {
+               if (!receive_smb(cli->fd,cli->inbuf,0)) {
                        DEBUG(0, ("Read from server failed, maybe it closed the "
                                "connection\n"));
                        return;
index 5ed0f27ab1e66e991812aa67cf83f594042100df..eb45ae5b4a038ed2ff76a4bce6fd09971e50c1b6 100755 (executable)
@@ -426,7 +426,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                } else if (strncmp(data, "ip", 2) == 0) {
                        if (!value || !*value) {
                                printf("target ip address argument missing");
-                       } else if (strnlen(value, INET6_ADDRSTRLEN) < INET6_ADDRSTRLEN) {
+                       } else if (strnlen(value, 35) < 35) {
                                if(verboseflag)
                                        printf("ip address %s override specified\n",value);
                                got_ip = 1;
index e73edb418fac7bb91c0879a786752af9672b2d76..db4e0685244c701d41ac5af7a6ce04929889b1cf 100644 (file)
@@ -293,10 +293,6 @@ AC_SUBST(INSTALLLIBCMD_SH)
 AC_SUBST(INSTALLLIBCMD_A)
 AC_SUBST(UNINSTALLLIBCMD_SH)
 AC_SUBST(UNINSTALLLIBCMD_A)
-AC_SUBST(INSTALL_LIBMSRPC)
-AC_SUBST(UNINSTALL_LIBMSRPC)
-AC_SUBST(LIBMSRPC_SHARED)
-AC_SUBST(LIBMSRPC)
 AC_SUBST(INSTALL_LIBADDNS)
 AC_SUBST(UNINSTALL_LIBADDNS)
 AC_SUBST(LIBADDNS_SHARED)
@@ -373,7 +369,7 @@ AC_SUBST(SWAT_INSTALL_TARGETS)
 
 #################################################
 # set prefix for 'make test'
-selftest_prefix="./st"
+selftest_prefix="./"
 AC_SUBST(selftest_prefix)
 AC_ARG_WITH(selftest-prefix,
 [  --with-selftest-prefix=DIR    The prefix where make test will be runned ($selftest_prefix)],
@@ -387,59 +383,21 @@ AC_ARG_WITH(selftest-prefix,
   esac
 ])
 
-AC_ARG_ENABLE(launchd,
-[  --enable-launchd        Support running under launchd (default=auto)])
-
-if test x"$enable_launchd" != x"no" ; then
-    AC_CACHE_CHECK([whether to include launchd support],
-       samba_cv_launchd_support,
-       [
-           AC_TRY_COMPILE(
-           [
-#include <launch.h>
-           ],
-           [
-               launchd_msg(NULL);
-               launchd_data_get_fd(NULL);
-           ],
-           samba_cv_launchd_support=yes,
-           samba_cv_launchd_support=no)
-       ])
-
-    if test x"$samba_cv_launchd_support" = x"yes" ; then
-       AC_DEFINE(WITH_LAUNCHD_SUPPORT, 1,
-                   [Whether launchd support should be enabled])
-    else
-       if test x"$enable_launchd" = x"yes" ; then
-           AC_ERROR(launchd support is not available)
-       fi
-    fi
-fi
-
 #################################################
 # set path of samba4's smbtorture
-samba4srcdir=""
-AC_SUBST(samba4srcdir)
-AC_ARG_WITH(samba4srcdir,
-[  --with-samba4srcdir=PATH    The path to a samba4 source directorhy for make test (none)],
+smbtorture4_path=""
+AC_SUBST(smbtorture4_path)
+AC_ARG_WITH(smbtorture4_path,
+[  --with-smbtorture4-path=PATH    The path to a samba4 smbtorture for make test (none)],
 [ case "$withval" in
   yes|no)
-    AC_MSG_ERROR([--with-samba4srcdir should take a path])
+    AC_MSG_ERROR([--with-smbtorture4-path should take a path])
   ;;
   * )
-    if test -z "$withval" -a ! -f $withval; then
-       AC_MSG_ERROR(['$withval' does not  exist!])
+    smbtorture4_path="$withval"
+    if test -z "$smbtorture4_path" -a ! -f $smbtorture4_path; then
+       AC_MSG_ERROR(['$smbtorture_path' does not  exist!])
     fi
-       
-       if test -f "$withval/selftest/selftest.pl"; then
-               samba4srcdir="$withval"
-       else
-               if test -f "$withval/source/selftest/selftest.pl"; then
-                       samba4srcdir="$withval/source"
-               else
-                       AC_MSG_ERROR([unable to find selftest.pl in '$withval'!])
-               fi
-       fi
   ;;
  esac
 ])
@@ -657,41 +615,7 @@ if test x"$SMB_BUILD_CC_NEGATIVE_ENUM_VALUES" != x"yes"; then
        PIDL_ARGS="$PIDL_ARGS --uint-enums"
 fi
 
-############################################
-# Check whether we can do automatic dependency tracking
-
-m4_include(m4/substnot.m4)
-m4_include(m4/cond.m4)
-m4_include(m4/make.m4)
-m4_include(m4/depout.m4)
-m4_include(m4/lead-dot.m4)
-m4_include(m4/check_gnu_make.m4)
-m4_include(m4/depend.m4)
-
-# Using the dependency files requires GNU make until someone adds support
-# for Makefile includes for other make implementations. Note that
-# CHECK_GNU_MAKE() can find a non-default make.
-CHECK_GNU_MAKE()
-if test "x$_cv_gnu_make_command" != "x" -a \
-    x`which make` = x`which "$_cv_gnu_make_command"` ; then
-    AC_SUBST(MAKE, $_cv_gnu_make_command)
-else
-    # If GNU make is not the default, don't enable GNU-isms because we can't
-    # guarantee that GNU make will actually be the make that is invoked.
-    ifGNUmake='#'
-fi
-
-AM_DEP_TRACK()
-_AM_DEPENDENCIES(CC)
-
-# As per vl, disable dependency tracking by default until we don't need
-# to use "make proto' -- jpeach
-if test "x$enable_dependency_tracking" != xyes; then
-    ifGNUmake='#'
-fi
-
-############################################
-# Figure out the flags to support named structure initializers
+dnl Figure out the flags to support named structure initializers
 
 LIBREPLACE_C99_STRUCT_INIT([],[AC_MSG_ERROR([c99 structure initializer are not supported])])
 
@@ -741,7 +665,7 @@ AC_SUBST(DYNEXP)
 
 dnl Add modules that have to be built by default here
 dnl These have to be built static:
-default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_winreg rpc_initshutdown rpc_lsa_ds rpc_wkssvc rpc_svcctl2 rpc_ntsvcs rpc_net rpc_netdfs rpc_srvsvc rpc_spoolss rpc_eventlog2 rpc_unixinfo rpc_epmapper auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin vfs_default nss_info_template"
+default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_winreg rpc_initshutdown rpc_lsa_ds rpc_wkssvc rpc_svcctl2 rpc_ntsvcs rpc_net rpc_netdfs rpc_srvsvc2 rpc_spoolss rpc_eventlog2 auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin vfs_default nss_info_template"
 
 dnl These are preferably build shared, and static if dlopen() is not available
 default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_full_audit vfs_netatalk vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap vfs_expand_msdfs vfs_shadow_copy charset_CP850 charset_CP437 auth_script vfs_readahead"
@@ -869,11 +793,11 @@ case "$host_os" in
         CPPFLAGS="-D_LARGEFILE64_SOURCE $CPPFLAGS"
         AC_TRY_RUN([
 #include <unistd.h>
-int main () {
+main () {
 #if _LFS64_LARGEFILE == 1
-return 0;
+exit(0);
 #else
-return 1;
+exit(1);
 #endif
 }], [SINIX_LFS_SUPPORT=yes], [SINIX_LFS_SUPPORT=no], [SINIX_LFS_SUPPORT=cross])
         CPPFLAGS="$old_CPPFLAGS"
@@ -888,15 +812,6 @@ return 1;
       fi
     ;;
 
-# Systems with LFS support.
-#
-    gnu* | k*bsd*-gnu)
-       CPPFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $CPPFLAGS"
-       AC_DEFINE(_LARGEFILE64_SOURCE, 1, [Whether to enable large file support])
-       AC_DEFINE(_FILE_OFFSET_BITS, 64, [File offset bits])
-       AC_DEFINE(_GNU_SOURCE, 1, [Whether to use GNU libc extensions])
-       ;;
-
 # Tests for linux LFS support. Need kernel 2.4 and glibc2.2 or greater support.
 #
     *linux*)
@@ -908,7 +823,7 @@ return 1;
 #include <sys/utsname.h>
 #include <string.h>
 #include <stdlib.h>
-int main() {
+main() {
 #if _LFS64_LARGEFILE == 1
        struct utsname uts;
        char *release;
@@ -920,9 +835,9 @@ int main() {
        int libc_minor = __GLIBC_MINOR__;
 
        if (libc_major < 2)
-              return 1;
+              exit(1);
        if (libc_minor < 2)
-              return 1;
+              exit(1);
 #endif
 
        /* Ensure this is kernel 2.4 or higher */
@@ -933,10 +848,10 @@ int main() {
        minor = atoi(strsep(&release, "."));
 
        if (major > 2 || (major == 2 && minor > 3))
-               return 0;
-       return 1;
+               exit(0);
+       exit(1);
 #else
-       return 1;
+       exit(1);
 #endif
 }
 ], [LINUX_LFS_SUPPORT=yes], [LINUX_LFS_SUPPORT=no], [LINUX_LFS_SUPPORT=cross])
@@ -957,7 +872,7 @@ int main() {
     *darwin*)
        AC_DEFINE(BROKEN_UNICODE_COMPOSE_CHARACTERS, 1, [Does this system use unicode compose characters])
 
-       # Add a system specific charset module.
+# Add a system specific charset module.
        default_shared_modules="$default_shared_modules charset_macosxfs"
 
        ;;
@@ -969,9 +884,9 @@ int main() {
 #include <unistd.h>
 main () {
 #if _LFS64_LARGEFILE == 1
-return 0;
+exit(0);
 #else
-return 1;
+exit(1);
 #endif
 }], [GLIBC_LFS_SUPPORT=yes], [GLIBC_LFS_SUPPORT=no], [GLIBC_LFS_SUPPORT=cross])
         CPPFLAGS="$old_CPPFLAGS"
@@ -1210,7 +1125,7 @@ AC_HAVE_DECL(snprintf, [#include <stdio.h>])
 # nothing until kernel 2.1.44! very dumb.
 AC_CACHE_CHECK([for real setresuid],samba_cv_have_setresuid,[
     AC_TRY_RUN([#include <errno.h>
-int main() { setresuid(1,1,1); setresuid(2,2,2); return errno==EPERM?0:1;}],
+main() { setresuid(1,1,1); setresuid(2,2,2); exit(errno==EPERM?0:1);}],
        samba_cv_have_setresuid=yes,samba_cv_have_setresuid=no,samba_cv_have_setresuid=cross)])
 if test x"$samba_cv_have_setresuid" = x"yes"; then
     AC_DEFINE(HAVE_SETRESUID,1,[Whether the system has setresuid])
@@ -1221,7 +1136,7 @@ fi
 AC_CACHE_CHECK([for real setresgid],samba_cv_have_setresgid,[
     AC_TRY_RUN([#include <unistd.h>
 #include <errno.h>
-int main() { errno = 0; setresgid(1,1,1); return errno != 0 ? (errno==EPERM ? 0 : 1) : 0;}],
+main() { errno = 0; setresgid(1,1,1); exit(errno != 0 ? (errno==EPERM ? 0 : 1) : 0);}],
        samba_cv_have_setresgid=yes,samba_cv_have_setresgid=no,samba_cv_have_setresgid=cross)])
 if test x"$samba_cv_have_setresgid" = x"yes"; then
     AC_DEFINE(HAVE_SETRESGID,1,[Whether the system has setresgid])
@@ -1374,7 +1289,6 @@ AC_CHECK_FUNCS(memalign posix_memalign hstrerror)
 AC_CHECK_HEADERS(sys/mman.h)
 # setbuffer, shmget, shm_open are needed for smbtorture
 AC_CHECK_FUNCS(setbuffer shmget shm_open)
-AC_CHECK_FUNCS(makecontext getcontext setcontext swapcontext)
 
 # Find a method of generating a stack trace
 AC_CHECK_HEADERS(execinfo.h libexc.h libunwind.h)
@@ -1525,35 +1439,25 @@ AC_DEFINE(HAVE_PRCTL, 1, [Whether prctl is available]),[])
 #
 #
 case "$host_os" in
-    linux*-gnu* | gnu* | k*bsd*-gnu)
+    *linux*)
        # glibc <= 2.3.2 has a broken getgrouplist
-    AC_CACHE_CHECK([for a broken Linux getgrouplist API],
-           linux_getgrouplist_ok,
-           [
-               AC_TRY_RUN([
+       AC_TRY_RUN([
 #include <unistd.h>
 #include <sys/utsname.h>
-
-                   int main() {
-                          /* glibc up to 2.3 has a broken getgrouplist */
+main() {
+       /* glibc up to 2.3 has a broken getgrouplist */
 #if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
-                          int libc_major = __GLIBC__;
-                          int libc_minor = __GLIBC_MINOR__;
+       int libc_major = __GLIBC__;
+       int libc_minor = __GLIBC_MINOR__;
 
-                          if (libc_major < 2)
-                                 return 1;
-                          if ((libc_major == 2) && (libc_minor <= 3))
-                                 return 1;
+       if (libc_major < 2)
+              exit(1);
+       if ((libc_major == 2) && (libc_minor <= 3))
+              exit(1);
 #endif
-                          return 0;
-                   }
-
-               ],
-               [linux_getgrouplist_ok=yes],
-               [linux_getgrouplist_ok=no],
-               [linux_getgrouplist_ok=cross])
-       ])
-
+       exit(0);
+}
+], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no])
        if test x"$linux_getgrouplist_ok" = x"yes"; then
           AC_DEFINE(HAVE_GETGROUPLIST, 1, [Have good getgrouplist])
        fi
@@ -1574,7 +1478,7 @@ if test x$ac_cv_func_stat64 = xno ; then
 #include <unistd.h>
 #endif
 #include <sys/stat.h>
-], [struct stat64 st64; return stat64(".",&st64);], [ac_cv_func_stat64=yes])
+], [struct stat64 st64; exit(stat64(".",&st64));], [ac_cv_func_stat64=yes])
   AC_MSG_RESULT([$ac_cv_func_stat64])
   if test x$ac_cv_func_stat64 = xyes ; then
     AC_DEFINE(HAVE_STAT64,1,[Whether stat64() is available])
@@ -1588,7 +1492,7 @@ if test x$ac_cv_func_lstat64 = xno ; then
 #include <unistd.h>
 #endif
 #include <sys/stat.h>
-], [struct stat64 st64; return lstat64(".",&st64);], [ac_cv_func_lstat64=yes])
+], [struct stat64 st64; exit(lstat64(".",&st64));], [ac_cv_func_lstat64=yes])
   AC_MSG_RESULT([$ac_cv_func_lstat64])
   if test x$ac_cv_func_lstat64 = xyes ; then
     AC_DEFINE(HAVE_LSTAT64,[Whether lstat64() is available])
@@ -1602,7 +1506,7 @@ if test x$ac_cv_func_fstat64 = xno ; then
 #include <unistd.h>
 #endif
 #include <sys/stat.h>
-], [struct stat64 st64; return fstat64(0,&st64);], [ac_cv_func_fstat64=yes])
+], [struct stat64 st64; exit(fstat64(0,&st64));], [ac_cv_func_fstat64=yes])
   AC_MSG_RESULT([$ac_cv_func_fstat64])
   if test x$ac_cv_func_fstat64 = xyes ; then
     AC_DEFINE(HAVE_FSTAT64,1,[Whether fstat64() is available])
@@ -1825,29 +1729,6 @@ EOF
        fi
 fi
 
-#Check if we can enable relro as well
-if test x"${samba_cv_fpie}" = x"yes"
-then
-       AC_CACHE_CHECK(for relro, samba_cv_fpie_relro,
-       [
-               cat > conftest.c <<EOF
-int foo;
-main () { return 0;}
-EOF
-                if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -pie -fPIE -Wl,-z,relro -o conftest conftest.c 1>&AS_MESSAGE_LOG_FD])
-               then
-                       samba_cv_fpie_relro=yes
-               else
-                       samba_cv_fpie_relro=no
-               fi
-               rm -f conftest*
-       ])
-       if test x"${samba_cv_fpie_relro}" = x"yes"
-       then
-               PIE_LDFLAGS="-pie -Wl,-z,relro"
-       fi
-fi
-
 # Assume non-shared by default and override below
 BLDSHARED="false"
 
@@ -1863,16 +1744,13 @@ DSO_EXPORTS=""
 
 # this bit needs to be modified for each OS that supports share libs
 # You need to specify how to create a shared library and
-# how to compile C code to produce PIC object files
+  # how to compile C code to produce PIC object files
 
-AC_MSG_CHECKING([ability to build shared libraries])
+  AC_MSG_CHECKING([ability to build shared libraries])
 
-# and these are for particular systems
-case "$host_os" in
-               linux*-gnu* | gnu* | k*bsd*-gnu)
-                       case "$host_os" in 
-                               linux*)   AC_DEFINE(LINUX,1,[Whether the host os is linux]) ;;
-                       esac
+  # and these are for particular systems
+  case "$host_os" in
+               *linux*)   AC_DEFINE(LINUX,1,[Whether the host os is linux])
                        BLDSHARED="true"
                        if test "${ac_cv_gnu_ld_no_default_allow_shlib_undefined}" = "yes"; then
                                LDSHFLAGS="-shared -Wl,-Bsymbolic -Wl,--allow-shlib-undefined"
@@ -2038,20 +1916,21 @@ case "$host_os" in
                *darwin*)   AC_DEFINE(DARWINOS,1,[Whether the host os is Darwin/MacOSX])
                        BLDSHARED="true"
                        LDSHFLAGS="-bundle -flat_namespace -undefined suppress"
-                       MODULE_EXPORTS="-exported_symbols_list \$(srcdir)/exports/modules-darwin.syms"
                        SHLIBEXT="dylib"
-                       # Since gcc doesn't fail on unrecognised options, the
-                       # PIE test incorrectly succeeds. Darwin gcc does not
-                       # actually support the PIE stuff.
-                       PIE_LDFLAGS=
-                       PIE_CFLAGS=
+                        MODULE_EXPORTS="-exported_symbols_list \$(srcdir)/exports/modules-darwin.syms"
+                        SHLIBEXT="dylib"
+                        # Since gcc doesn't fail on unrecognised options, the
+                        # PIE test incorrectly succeeds. Darwin gcc does not
+                        # actually support the PIE stuff.
+                        PIE_LDFLAGS=
+                        PIE_CFLAGS=
                        AC_DEFINE(STAT_ST_BLOCKSIZE,512)
                        ;;
 
                *)
                        AC_DEFINE(STAT_ST_BLOCKSIZE,512)
                        ;;
-esac
+  esac
 
 if test "$enable_shared" != "yes"; then
        BLDSHARED=false
@@ -2124,7 +2003,7 @@ AC_DEFINE_UNQUOTED(SHLIBEXT, "$SHLIBEXT", [Shared library extension])
 
 AC_CACHE_CHECK([for long long],samba_cv_have_longlong,[
 AC_TRY_RUN([#include <stdio.h>
-int main() { long long x = 1000000; x *= x; return ((x/1000000) == 1000000)? 0: 1; }],
+main() { long long x = 1000000; x *= x; exit(((x/1000000) == 1000000)? 0: 1); }],
 samba_cv_have_longlong=yes,samba_cv_have_longlong=no,samba_cv_have_longlong=cross)])
 if test x"$samba_cv_have_longlong" = x"yes"; then
     AC_DEFINE(HAVE_LONGLONG,1,[Whether the host supports long long's])
@@ -2156,7 +2035,7 @@ fi
 AC_CACHE_CHECK([for 64 bit off_t],samba_cv_SIZEOF_OFF_T,[
 AC_TRY_RUN([#include <stdio.h>
 #include <sys/stat.h>
-int main() { return (sizeof(off_t) == 8) ? 0 : 1; }],
+main() { exit((sizeof(off_t) == 8) ? 0 : 1); }],
 samba_cv_SIZEOF_OFF_T=yes,samba_cv_SIZEOF_OFF_T=no,samba_cv_SIZEOF_OFF_T=cross)])
 if test x"$samba_cv_SIZEOF_OFF_T" = x"yes"; then
     AC_DEFINE(SIZEOF_OFF_T,8,[The size of the 'off_t' type])
@@ -2169,7 +2048,7 @@ AC_TRY_RUN([
 #endif
 #include <stdio.h>
 #include <sys/stat.h>
-int main() { struct stat64 st; off64_t s; if (sizeof(off_t) == sizeof(off64_t)) return 1; return (lstat64("/dev/null", &st)==0)?0:1; }],
+main() { struct stat64 st; off64_t s; if (sizeof(off_t) == sizeof(off64_t)) exit(1); exit((lstat64("/dev/null", &st)==0)?0:1); }],
 samba_cv_HAVE_OFF64_T=yes,samba_cv_HAVE_OFF64_T=no,samba_cv_HAVE_OFF64_T=cross)])
 if test x"$samba_cv_HAVE_OFF64_T" = x"yes"; then
     AC_DEFINE(HAVE_OFF64_T,1,[Whether off64_t is available])
@@ -2182,7 +2061,7 @@ AC_TRY_RUN([
 #endif
 #include <stdio.h>
 #include <sys/stat.h>
-int main() { return (sizeof(ino_t) == 8) ? 0 : 1; }],
+main() { exit((sizeof(ino_t) == 8) ? 0 : 1); }],
 samba_cv_SIZEOF_INO_T=yes,samba_cv_SIZEOF_INO_T=no,samba_cv_SIZEOF_INO_T=cross)])
 if test x"$samba_cv_SIZEOF_INO_T" = x"yes"; then
     AC_DEFINE(SIZEOF_INO_T,8,[The size of the 'ino_t' type])
@@ -2195,7 +2074,7 @@ AC_TRY_RUN([
 #endif
 #include <stdio.h>
 #include <sys/stat.h>
-int main() { struct stat64 st; ino64_t s; if (sizeof(ino_t) == sizeof(ino64_t)) return 1; return (lstat64("/dev/null", &st)==0)?0:1; }],
+main() { struct stat64 st; ino64_t s; if (sizeof(ino_t) == sizeof(ino64_t)) exit(1); exit((lstat64("/dev/null", &st)==0)?0:1); }],
 samba_cv_HAVE_INO64_T=yes,samba_cv_HAVE_INO64_T=no,samba_cv_HAVE_INO64_T=cross)])
 if test x"$samba_cv_HAVE_INO64_T" = x"yes"; then
     AC_DEFINE(HAVE_INO64_T,1,[Whether the 'ino64_t' type is available])
@@ -2208,7 +2087,7 @@ AC_TRY_RUN([
 #endif
 #include <stdio.h>
 #include <sys/stat.h>
-int main() { return (sizeof(dev_t) == 8) ? 0 : 1; }],
+main() { exit((sizeof(dev_t) == 8) ? 0 : 1); }],
 samba_cv_SIZEOF_DEV_T=yes,samba_cv_SIZEOF_DEV_T=no,samba_cv_SIZEOF_DEV_T=cross)])
 if test x"$samba_cv_SIZEOF_DEV_T" = x"yes"; then
     AC_DEFINE(SIZEOF_DEV_T,8,[The size of the 'dev_t' type])
@@ -2221,7 +2100,7 @@ AC_TRY_RUN([
 #endif
 #include <stdio.h>
 #include <sys/stat.h>
-int main() { struct stat64 st; dev64_t s; if (sizeof(dev_t) == sizeof(dev64_t)) return 1; return (lstat64("/dev/null", &st)==0)?0:1; }],
+main() { struct stat64 st; dev64_t s; if (sizeof(dev_t) == sizeof(dev64_t)) exit(1); exit((lstat64("/dev/null", &st)==0)?0:1); }],
 samba_cv_HAVE_DEV64_T=yes,samba_cv_HAVE_DEV64_T=no,samba_cv_HAVE_DEV64_T=cross)])
 if test x"$samba_cv_HAVE_DEV64_T" = x"yes"; then
     AC_DEFINE(HAVE_DEV64_T,1,[Whether the 'dev64_t' type is available])
@@ -2259,7 +2138,7 @@ AC_TRY_RUN([
 #include <unistd.h>
 #endif
 #include <sys/types.h>
-int main() { dev_t dev; int i = major(dev); return 0; }],
+main() { dev_t dev; int i = major(dev); return 0; }],
 samba_cv_HAVE_DEVICE_MAJOR_FN=yes,samba_cv_HAVE_DEVICE_MAJOR_FN=no,samba_cv_HAVE_DEVICE_MAJOR_FN=cross)])
 if test x"$samba_cv_HAVE_DEVICE_MAJOR_FN" = x"yes"; then
     AC_DEFINE(HAVE_DEVICE_MAJOR_FN,1,[Whether the major macro for dev_t is available])
@@ -2271,7 +2150,7 @@ AC_TRY_RUN([
 #include <unistd.h>
 #endif
 #include <sys/types.h>
-int main() { dev_t dev; int i = minor(dev); return 0; }],
+main() { dev_t dev; int i = minor(dev); return 0; }],
 samba_cv_HAVE_DEVICE_MINOR_FN=yes,samba_cv_HAVE_DEVICE_MINOR_FN=no,samba_cv_HAVE_DEVICE_MINOR_FN=cross)])
 if test x"$samba_cv_HAVE_DEVICE_MINOR_FN" = x"yes"; then
     AC_DEFINE(HAVE_DEVICE_MINOR_FN,1,[Whether the minor macro for dev_t is available])
@@ -2283,7 +2162,7 @@ AC_TRY_RUN([
 #include <unistd.h>
 #endif
 #include <sys/types.h>
-int main() { dev_t dev = makedev(1,2); return 0; }],
+main() { dev_t dev = makedev(1,2); return 0; }],
 samba_cv_HAVE_MAKEDEV=yes,samba_cv_HAVE_MAKEDEV=no,samba_cv_HAVE_MAKEDEV=cross)])
 if test x"$samba_cv_HAVE_MAKEDEV" = x"yes"; then
     AC_DEFINE(HAVE_MAKEDEV,1,[Whether the macro for makedev is available])
@@ -2291,7 +2170,7 @@ fi
 
 AC_CACHE_CHECK([for unsigned char],samba_cv_HAVE_UNSIGNED_CHAR,[
 AC_TRY_RUN([#include <stdio.h>
-int main() { char c; c=250; return (c > 0)?0:1; }],
+main() { char c; c=250; exit((c > 0)?0:1); }],
 samba_cv_HAVE_UNSIGNED_CHAR=yes,samba_cv_HAVE_UNSIGNED_CHAR=no,samba_cv_HAVE_UNSIGNED_CHAR=cross)])
 if test x"$samba_cv_HAVE_UNSIGNED_CHAR" = x"yes"; then
     AC_DEFINE(HAVE_UNSIGNED_CHAR,1,[Whether the 'unsigned char' type is available])
@@ -2342,12 +2221,12 @@ if test x"$samba_cv_WITH_PROFILE" = x"yes"; then
 
     AC_LIBTESTFUNC(rt, clock_gettime,
            [
-               AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
-                   [Whether clock_gettime is available])
-               SMB_CHECK_CLOCK_ID(CLOCK_MONOTONIC)
-               SMB_CHECK_CLOCK_ID(CLOCK_PROCESS_CPUTIME_ID)
-               SMB_CHECK_CLOCK_ID(CLOCK_REALTIME)
-           ])
+                           AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
+                               [Whether clock_gettime is available])
+                           SMB_CHECK_CLOCK_ID(CLOCK_MONOTONIC)
+                           SMB_CHECK_CLOCK_ID(CLOCK_PROCESS_CPUTIME_ID)
+                           SMB_CHECK_CLOCK_ID(CLOCK_REALTIME)
+                       ])
 
 fi
 
@@ -2381,18 +2260,18 @@ void foo(const char *format, ...) {
        va_start(ap, format);
        len = vsnprintf(buf, 0, format, ap);
        va_end(ap);
-       if (len != 5) return 1;
+       if (len != 5) exit(1);
 
        va_start(ap, format);
        len = vsnprintf(0, 0, format, ap);
        va_end(ap);
-       if (len != 5) return 1;
+       if (len != 5) exit(1);
 
-       if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) return 1;
+       if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1);
 
-       return 0;
+       exit(0);
 }
-int main() { foo("hello"); }
+main() { foo("hello"); }
 ],
 samba_cv_HAVE_C99_VSNPRINTF=yes,samba_cv_HAVE_C99_VSNPRINTF=no,samba_cv_HAVE_C99_VSNPRINTF=cross)])
 if test x"$samba_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
@@ -2402,9 +2281,9 @@ fi
 AC_CACHE_CHECK([for broken readdir name],samba_cv_HAVE_BROKEN_READDIR_NAME,[
 AC_TRY_RUN([#include <sys/types.h>
 #include <dirent.h>
-int main() { struct dirent *di; DIR *d = opendir("."); di = readdir(d);
+main() { struct dirent *di; DIR *d = opendir("."); di = readdir(d);
 if (di && di->d_name[-2] == '.' && di->d_name[-1] == 0 &&
-di->d_name[0] == 0) return 0; return 1;} ],
+di->d_name[0] == 0) exit(0); exit(1);} ],
 samba_cv_HAVE_BROKEN_READDIR_NAME=yes,samba_cv_HAVE_BROKEN_READDIR_NAME=no,samba_cv_HAVE_BROKEN_READDIR_NAME=cross)])
 if test x"$samba_cv_HAVE_BROKEN_READDIR_NAME" = x"yes"; then
     AC_DEFINE(HAVE_BROKEN_READDIR_NAME,1,[Whether readdir() returns the wrong name offset])
@@ -2413,7 +2292,7 @@ fi
 AC_CACHE_CHECK([for utimbuf],samba_cv_HAVE_UTIMBUF,[
 AC_TRY_COMPILE([#include <sys/types.h>
 #include <utime.h>],
-[struct utimbuf tbuf;  tbuf.actime = 0; tbuf.modtime = 1; return utime("foo.c",&tbuf);],
+[struct utimbuf tbuf;  tbuf.actime = 0; tbuf.modtime = 1; exit(utime("foo.c",&tbuf));],
 samba_cv_HAVE_UTIMBUF=yes,samba_cv_HAVE_UTIMBUF=no,samba_cv_HAVE_UTIMBUF=cross)])
 if test x"$samba_cv_HAVE_UTIMBUF" = x"yes"; then
     AC_DEFINE(HAVE_UTIMBUF,1,[Whether struct utimbuf is available])
@@ -2745,7 +2624,7 @@ AC_TRY_RUN([
 #ifndef F_GETLEASE
 #define F_GETLEASE     1025
 #endif
-int main() {
+main() {
        int fd = open("/dev/null", O_RDONLY);
        return fcntl(fd, F_GETLEASE, 0) == -1;
 }
@@ -2763,8 +2642,8 @@ AC_TRY_RUN([
 #ifndef F_NOTIFY
 #define F_NOTIFY 1026
 #endif
-int main() {
-               return fcntl(open("/tmp", O_RDONLY), F_NOTIFY, 0) == -1 ?  1 : 0;
+main() {
+               exit(fcntl(open("/tmp", O_RDONLY), F_NOTIFY, 0) == -1 ?  1 : 0);
 }
 ],
 samba_cv_HAVE_KERNEL_CHANGE_NOTIFY=yes,samba_cv_HAVE_KERNEL_CHANGE_NOTIFY=no,samba_cv_HAVE_KERNEL_CHANGE_NOTIFY=cross)])
@@ -2841,8 +2720,8 @@ AC_TRY_RUN([
 #define LOCK_MAND      32
 #define LOCK_READ      64
 #endif
-int main() {
-               return flock(open("/dev/null", O_RDWR), LOCK_MAND|LOCK_READ) != 0;
+main() {
+               exit(flock(open("/dev/null", O_RDWR), LOCK_MAND|LOCK_READ) != 0);
 }
 ],
 samba_cv_HAVE_KERNEL_SHARE_MODES=yes,samba_cv_HAVE_KERNEL_SHARE_MODES=no,samba_cv_HAVE_KERNEL_SHARE_MODES=cross)])
@@ -2878,15 +2757,15 @@ if test x"$samba_cv_HAVE_SYS_CAPABILITY_H" = x"yes"; then
                AC_TRY_RUN([
 #include <sys/types.h>
 #include <sys/capability.h>
-int main() {
+main() {
  cap_t cap;
  cap_value_t vals[1];
  if (!(cap = cap_get_proc()))
-   return 1;
+   exit(1);
  vals[0] = CAP_CHOWN;
  cap_set_flag(cap, CAP_INHERITABLE, 1, vals, CAP_CLEAR);
  cap_set_proc(cap);
return 0;
exit(0);
 }],
                samba_cv_HAVE_POSIX_CAPABILITIES=yes,
                samba_cv_HAVE_POSIX_CAPABILITIES=no,
@@ -3008,15 +2887,15 @@ AC_TRY_RUN([#include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
-int main() {
+main() {
   struct stat st;
   char tpl[20]="/tmp/test.XXXXXX";
   int fd = mkstemp(tpl);
-  if (fd == -1) return 1;
+  if (fd == -1) exit(1);
   unlink(tpl);
-  if (fstat(fd, &st) != 0) return 1;
-  if ((st.st_mode & 0777) != 0600) return 1;
-  return 0;
+  if (fstat(fd, &st) != 0) exit(1);
+  if ((st.st_mode & 0777) != 0600) exit(1);
+  exit(0);
 }],
 samba_cv_HAVE_SECURE_MKSTEMP=yes,
 samba_cv_HAVE_SECURE_MKSTEMP=no,
@@ -3026,12 +2905,7 @@ if test x"$samba_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
 fi
 
 AC_CACHE_CHECK([for broken readdir],samba_cv_HAVE_BROKEN_READDIR,[
-       AC_TRY_RUN([
-#include "${srcdir-.}/lib/replace/test/os2_delete.c"
-int main(void) {
-    return test_readdir_os2_delete();
-}
-],
+       AC_TRY_RUN([#include "${srcdir-.}/tests/os2_delete.c"],
                [samba_cv_HAVE_BROKEN_READDIR=no],
                        [samba_cv_HAVE_BROKEN_READDIR=yes],
                        [samba_cv_HAVE_BROKEN_READDIR="assuming not"])])
@@ -3040,10 +2914,7 @@ if test x"$samba_cv_HAVE_BROKEN_READDIR" = x"yes"; then
 AC_CACHE_CHECK([for replacing readdir],samba_cv_REPLACE_READDIR,[
        AC_TRY_RUN([
 #include "${srcdir-.}/lib/repdir.c"
-#include "${srcdir-.}/lib/replace/test/os2_delete.c"
-int main(void) {
-    return test_readdir_os2_delete();
-],
+#include "${srcdir-.}/tests/os2_delete.c"],
        samba_cv_REPLACE_READDIR=yes,samba_cv_REPLACE_READDIR=no)])
 fi
 
@@ -3336,11 +3207,11 @@ dnl
 #ifdef HAVE_SYS_FCNTL_H
 #include <sys/fcntl.h>
 #endif
-int main() { struct flock64 fl64;
+main() { struct flock64 fl64;
 #if defined(F_SETLKW64) && defined(F_SETLK64) && defined(F_GETLK64)
-return 0;
+exit(0);
 #else
-return 1;
+exit(1);
 #endif
 }],
        samba_cv_HAVE_STRUCT_FLOCK64=yes,samba_cv_HAVE_STRUCT_FLOCK64=no,samba_cv_HAVE_STRUCT_FLOCK64=cross)])
@@ -3421,11 +3292,10 @@ fi
 AC_CACHE_CHECK([if the realpath function allows a NULL argument],samba_cv_REALPATH_TAKES_NULL,[
 AC_TRY_RUN([
 #include <stdio.h>
-#include <stdlib.h>
 #include <limits.h>
-int main() {
+main() {
        char *newpath = realpath("/tmp", NULL);
-       return (newpath != NULL) ? 0 : 1;
+       exit ((newpath != NULL) ? 0 : 1);
 }
 ],
 samba_cv_REALPATH_TAKES_NULL=yes,samba_cv_REALPATH_TAKES_NULL=no,samba_cv_REALPATH_TAKES_NULL=cross)])
@@ -3664,12 +3534,6 @@ if test x"$with_ldap_support" != x"no"; then
     default_shared_modules="$default_shared_modules";
     SMBLDAP="lib/smbldap.o"
     SMBLDAPUTIL="lib/smbldap_util.o"
-    if test x"$ac_cv_func_ext_ldap_initialize" != x"yes"; then
-      AC_MSG_WARN(Disabling ldb_ldap support (requires ldap_initialize))
-    else
-      AC_DEFINE(HAVE_LDB_LDAP,1,[Whether ldb_ldap is available])
-      LDBLDAP="lib/ldb/ldb_ldap/ldb_ldap.o"
-    fi
     with_ldap_support=yes
     AC_MSG_CHECKING(whether LDAP support is used)
     AC_MSG_RESULT(yes)
@@ -4289,7 +4153,7 @@ if test x"$with_ads_support" != x"no"; then
                 samba_cv_HAVE_WRFILE_KEYTAB,[
     AC_TRY_RUN([
 #include<krb5.h>
-  int main()
+  main()
   {
     krb5_context context;
     krb5_keytab keytab;
@@ -4684,15 +4548,15 @@ if test x"${try_pam}" != x"no";then
                x"$ac_cv_header_pam_pam_modules_h" = x"no" ; then
                if test x"${try_pam}" = x"yes";then
                        AC_MSG_ERROR([--with-pam=yes but pam_modules.h not found])
-               fi
+       fi
                create_pam_modules=no
-       fi
+    fi
 
        if test x"$use_pam" = x"yes"; then
-               AC_DEFINE(WITH_PAM,1,[Whether to include PAM support])
+    AC_DEFINE(WITH_PAM,1,[Whether to include PAM support])
                AC_DEFINE(HAVE_LIBPAM,1,[Whether libpam is available])
                AUTH_LIBS="$AUTH_LIBS $PAM_LIBS"
-               with_pam_for_crypt=yes
+    with_pam_for_crypt=yes
 
                if test x"$create_pam_modules" = x"yes"; then
                        AC_DEFINE(WITH_PAM_MODULES,1,[Whether to include PAM MODULES support])
@@ -5167,38 +5031,6 @@ if test $enable_static = yes; then
        UNINSTALLLIBCMD_A="rm -f"
 fi
 
-#################################################
-# should we build libmsrpc?
-INSTALL_LIBMSRPC=
-UNINSTALL_LIBMSRPC=
-LIBMSRPC_SHARED=
-LIBMSRPC=
-AC_MSG_CHECKING(whether to build the libmsrpc shared library)
-AC_ARG_WITH(libmsrpc,
-[  --with-libmsrpc         Build the libmsrpc shared library (default=no unmaintained)],
-[ case "$withval" in
-  *)
-     AC_MSG_RESULT(no)
-     ;;
-  yes)
-     if test $BLDSHARED = true; then
-        LIBMSRPC_SHARED=bin/libmsrpc.$SHLIBEXT
-        LIBMSRPC=libmsrpc
-        AC_MSG_RESULT(yes)
-     else
-       enable_static=yes
-        AC_MSG_RESULT(no shared library support -- will supply static library)
-     fi
-     if test $enable_static = yes; then
-        LIBMSRPC=libmsrpc
-     fi
-     INSTALL_LIBMSRPC=installlibmsrpc
-     UNINSTALL_LIBMSRPC=uninstalllibmsrpc
-     ;;
-  esac ]
-)
-
-
 #################################################
 # should we build libaddns?
 INSTALL_LIBADDNS=
@@ -5336,7 +5168,7 @@ if test $space = no; then
   main ()
   {
     struct statvfs64 fsd;
-    return statvfs64 (".", &fsd);
+    exit (statvfs64 (".", &fsd));
   }],
   fu_cv_sys_stat_statvfs64=yes,
   fu_cv_sys_stat_statvfs64=no,
@@ -5389,7 +5221,7 @@ if test $space = no; then
   {
     struct statfs fsd;
     fsd.f_fsize = 0;
-    return statfs (".", &fsd, sizeof (struct statfs));
+    exit (statfs (".", &fsd, sizeof (struct statfs)));
   }],
   fu_cv_sys_stat_statfs3_osf1=yes,
   fu_cv_sys_stat_statfs3_osf1=no,
@@ -5420,7 +5252,7 @@ member (AIX, 4.3BSD)])
   {
   struct statfs fsd;
   fsd.f_bsize = 0;
-  return statfs (".", &fsd);
+  exit (statfs (".", &fsd));
   }],
   fu_cv_sys_stat_statfs2_bsize=yes,
   fu_cv_sys_stat_statfs2_bsize=no,
@@ -5441,7 +5273,7 @@ if test $space = no; then
   main ()
   {
   struct statfs fsd;
-  return statfs (".", &fsd, sizeof fsd, 0);
+  exit (statfs (".", &fsd, sizeof fsd, 0));
   }],
     fu_cv_sys_stat_statfs4=yes,
     fu_cv_sys_stat_statfs4=no,
@@ -5469,7 +5301,7 @@ member (4.4BSD and NetBSD)])
   {
   struct statfs fsd;
   fsd.f_fsize = 0;
-  return statfs (".", &fsd);
+  exit (statfs (".", &fsd));
   }],
   fu_cv_sys_stat_statfs2_fsize=yes,
   fu_cv_sys_stat_statfs2_fsize=no,
@@ -5500,7 +5332,7 @@ if test $space = no; then
   struct fs_data fsd;
   /* Ultrix's statfs returns 1 for success,
      0 for not mounted, -1 for failure.  */
-  return statfs (".", &fsd) != 1;
+  exit (statfs (".", &fsd) != 1);
   }],
   fu_cv_sys_stat_fs_data=yes,
   fu_cv_sys_stat_fs_data=no,
@@ -5816,7 +5648,7 @@ AC_ARG_WITH(sendfile-support,
        AC_MSG_RESULT(yes);
 
        case "$host_os" in
-       linux*-gnu* | gnu* | k*bsd*-gnu)
+       *linux*)
                AC_CACHE_CHECK([for linux sendfile64 support],samba_cv_HAVE_SENDFILE64,[
                AC_TRY_LINK([#include <sys/sendfile.h>],
 [\
@@ -6065,7 +5897,6 @@ samba_cv_HAVE_SENDFILE=yes,samba_cv_HAVE_SENDFILE=no)])
 
 AC_CACHE_CHECK([for Linux readahead],
                 samba_cv_HAVE_LINUX_READAHEAD,[
-
     AC_TRY_LINK([
 #if defined(HAVE_UNISTD_H)
 #include <unistd.h>
@@ -6123,11 +5954,11 @@ NSSSONAMEVERSIONSUFFIX=""
 WINBIND_NSS_PTHREAD=""
 
 case "$host_os" in
-       linux*-gnu* | gnu* | k*bsd*-gnu)
+       *linux*)
                NSSSONAMEVERSIONSUFFIX=".2"
                WINBIND_NSS_EXTRA_OBJS="nsswitch/winbind_nss_linux.o"
                ;;
-       freebsd5*|*freebsd[[6-9]]*)
+       *freebsd[[5-9]]*)
                # FreeBSD winbind client is implemented as a wrapper around
                # the Linux version.
                NSSSONAMEVERSIONSUFFIX=".1"
@@ -6282,6 +6113,7 @@ if test x"$samba_cv_HAVE_PEERCRED" = x"yes"; then
     AC_DEFINE(HAVE_PEERCRED,1,[Whether we can use SO_PEERCRED to get socket credentials])
 fi
 
+
 #################################################
 # Check to see if we should use the included popt
 
@@ -6310,7 +6142,7 @@ if test x"$INCLUDED_POPT" = x"yes"; then
     FLAGS1="-I\$(srcdir)/popt"
 else
     AC_MSG_RESULT(no)
-    BUILD_POPT=""
+       BUILD_POPT=""
     POPTLIBS="-lpopt"
 fi
 AC_SUBST(BUILD_POPT)
@@ -6354,35 +6186,6 @@ AC_SUBST(FLAGS1)
 
 
 
-#################################################
-# Check if the user wants Python
-
-# At the moment, you can use this to set which Python binary to link
-# against.  (Libraries built for Python2.2 can't be used by 2.1,
-# though they can coexist in different directories.)  In the future
-# this might make the Python stuff be built by default.
-
-# Defaulting python breaks the clean target if python isn't installed
-
-PYTHON=
-
-AC_ARG_WITH(python,
-[  --with-python=PYTHONNAME  build Python libraries],
-[ case "${withval-python}" in
-  yes)
-       PYTHON=python
-       EXTRA_ALL_TARGETS="$EXTRA_ALL_TARGETS python_ext"
-       ;;
-  no)
-       PYTHON=
-       ;;
-  *)
-       PYTHON=${withval-python}
-       ;;
-  esac ])
-AC_SUBST(PYTHON)
-
-
 # Checks for the vfs_fileid module
 # Start
 AC_CHECK_FUNC(getmntent)
@@ -6431,7 +6234,7 @@ done
 
 dnl Always built these modules static
 MODULE_rpc_spoolss=STATIC
-MODULE_rpc_srvsvc=STATIC
+MODULE_rpc_srvsvc2=STATIC
 MODULE_idmap_tdb=STATIC
 MODULE_idmap_passdb=STATIC
 MODULE_idmap_nss=STATIC
@@ -6472,13 +6275,11 @@ SMB_MODULE(rpc_svcctl2, \$(RPC_SVCCTL_OBJ), "bin/librpc_svcctl2.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_ntsvcs, \$(RPC_NTSVCS_OBJ), "bin/librpc_ntsvcs.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_net, \$(RPC_NETLOG_OBJ), "bin/librpc_NETLOGON.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_netdfs, \$(RPC_DFS_OBJ), "bin/librpc_netdfs.$SHLIBEXT", RPC)
-SMB_MODULE(rpc_srvsvc, \$(RPC_SVC_OBJ), "bin/librpc_srvsvc.$SHLIBEXT", RPC)
+SMB_MODULE(rpc_srvsvc2, \$(RPC_SVC_OBJ), "bin/librpc_svcsvc2.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_spoolss, \$(RPC_SPOOLSS_OBJ), "bin/librpc_spoolss.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_eventlog2, \$(RPC_EVENTLOG_OBJ), "bin/librpc_eventlog2.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_samr, \$(RPC_SAMR_OBJ), "bin/librpc_samr.$SHLIBEXT", RPC)
-SMB_MODULE(rpc_rpcecho, \$(RPC_ECHO_OBJ), "bin/librpc_echo.$SHLIBEXT", RPC)
-SMB_MODULE(rpc_unixinfo, \$(RPC_UNIXINFO_OBJ), "bin/librpc_unixinfo.$SHLIBEXT", RPC)
-SMB_MODULE(rpc_epmapper, \$(RPC_EPMAPPER_OBJ), "bin/librpc_epmapper.$SHLIBEXT", RPC)
+SMB_MODULE(rpc_rpcecho, \$(RPC_ECHO_OBJ), "bin/librpc_rpcecho.$SHLIBEXT", RPC)
 SMB_SUBSYSTEM(RPC,smbd/server.o)
 
 SMB_MODULE(idmap_ldap, winbindd/idmap_ldap.o, "bin/ldap.$SHLIBEXT", IDMAP)
@@ -6532,7 +6333,6 @@ SMB_MODULE(vfs_cacheprime, \$(VFS_CACHEPRIME_OBJ), "bin/cacheprime.$SHLIBEXT", V
 SMB_MODULE(vfs_prealloc, \$(VFS_PREALLOC_OBJ), "bin/prealloc.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_commit, \$(VFS_COMMIT_OBJ), "bin/commit.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_gpfs, \$(VFS_GPFS_OBJ), "bin/gpfs.$SHLIBEXT", VFS)
-SMB_MODULE(vfs_notify_fam, \$(VFS_NOTIFY_FAM_OBJ), "bin/notify_fam.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_readahead, \$(VFS_READAHEAD_OBJ), "bin/readahead.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_fileid, \$(VFS_FILEID_OBJ), "bin/fileid.$SHLIBEXT", VFS)
 
@@ -6556,9 +6356,7 @@ if test x"$RUN_FROM_BUILD_FARM" = x"yes"; then
        AC_DEFINE(ENABLE_BUILD_FARM_HACKS, 1, [Defined if running in the build farm])
 else
        AC_MSG_RESULT(no)
-       SELFTEST_ARGS="$SELFTEST_ARGS --skip=samba3-skip-nobuildfarm"
 fi
-AC_SUBST(SELFTEST_ARGS)
 
 #################################################
 # check for bad librt/libpthread interactions
diff --git a/source3/depcomp b/source3/depcomp
deleted file mode 100755 (executable)
index b8ece16..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2006-10-15.18
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software
-# Foundation, Inc.
-
-# 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, 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, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> $depfile
-    echo >> $depfile
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
-  if test "$libtool" = yes; then
-    "$@" -Wc,-M
-  else
-    "$@" -M
-  fi
-  stat=$?
-
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
-  fi
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-
-  if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
-    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no
-  for arg in "$@"; do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
-  "$@" || exit $?
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-       set fnord "$@"
-       shift
-       shift
-       ;;
-    *)
-       set fnord "$@" "$arg"
-       shift
-       shift
-       ;;
-    esac
-  done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::   \1 \\:p' >> "$depfile"
-  echo "       " >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
index 589bbb5ddb706a30a4cf6ed459f8d418df649d98..093b45d7c722f1398746d2b90c1b0d04dbc3de72 100644 (file)
@@ -82,9 +82,6 @@ ADS_STATUS ads_search_retry_extended_dn_ranged(ADS_STRUCT *ads, TALLOC_CTX *mem_
                                                enum ads_extended_dn_flags flags,
                                                char ***strings,
                                                size_t *num_strings);
-BOOL ads_get_dn_from_extended_dn(TALLOC_CTX *mem_ctx, 
-                                const char *extended_dn,
-                                char **dn);
 ADS_STATUS ads_search_retry_sid(ADS_STRUCT *ads, LDAPMessage **res, 
                                const DOM_SID *sid,
                                const char **attrs);
index f8f65044427a00984febd50edf972f4cdc7b11ec..5165b85df11e2af0f7223d8d80d6242165b71ff0 100644 (file)
@@ -78,28 +78,6 @@ struct rpc_pipe_client {
        struct dcinfo *dc;
 };
 
-/* Transport encryption state. */
-enum smb_trans_enc_type { SMB_TRANS_ENC_NTLM, SMB_TRANS_ENC_GSS };
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-struct smb_tran_enc_state_gss {
-       gss_ctx_id_t gss_ctx;
-       gss_cred_id_t creds;
-};
-#endif
-
-struct smb_trans_enc_state {
-       enum smb_trans_enc_type smb_enc_type;
-       uint16 enc_ctx_num;
-       BOOL enc_on;
-       union {
-               NTLMSSP_STATE *ntlmssp_state;
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-               struct smb_tran_enc_state_gss *gss_state;
-#endif
-       } s;
-};
-
 struct cli_state {
        int port;
        int fd;
@@ -159,8 +137,6 @@ struct cli_state {
 
        smb_sign_info sign_info;
 
-       struct smb_trans_enc_state *trans_enc_state; /* Setup if we're encrypting SMB's. */
-
        /* the session key for this CLI, outside 
           any per-pipe authenticaion */
        DATA_BLOB user_session_key;
diff --git a/source3/include/dcerpc.h b/source3/include/dcerpc.h
new file mode 100644 (file)
index 0000000..e69de29
index 4f11e7a0932a4b6a50a0797db6b53e2db290281c..a57891b76311b897b4fbf52a8e088162fe1649ab 100644 (file)
@@ -680,6 +680,7 @@ typedef int BOOL;
 #include "reg_objects.h"
 #include "reg_db.h"
 #include "rpc_samr.h"
+#include "rpc_srvsvc.h"
 #include "rpc_spoolss.h"
 #include "rpc_eventlog.h"
 #include "rpc_ds.h"
@@ -782,6 +783,8 @@ enum flush_reason_enum {
 #include "librpc/gen_ndr/srv_svcctl.h"
 #include "librpc/gen_ndr/srv_lsa.h"
 #include "librpc/gen_ndr/srv_eventlog.h"
+#include "librpc/gen_ndr/srv_winreg.h"
+#include "librpc/gen_ndr/srv_initshutdown.h"
 
 /***** automatically generated prototypes *****/
 #ifndef NO_PROTO_H
index 147150d9780dd4c0d58a9f669b7f45c82b560ea5..6ce0ef646467756ef73e0aef71c10d5d8b7130f2 100644 (file)
@@ -233,9 +233,17 @@ typedef struct pipes_struct {
        struct dcinfo *dc; /* Keeps the creds data from netlogon. */
 
        /*
-        * Credentials used for the pipe operations
+        * Windows user info.
+        */
+       fstring user_name;
+       fstring domain;
+       fstring wks;
+
+       /*
+        * Unix user name and credentials used when a pipe is authenticated.
         */
 
+       fstring pipe_user_name;
        struct current_user pipe_user;
        DATA_BLOB session_key;
  
index 2bf9211a1e76682b12539212367f1f2255930406..c565b8f9a42c0d53f34e84a404afa01fc6fa5c53 100644 (file)
@@ -64,7 +64,7 @@
 #define FSCTL_DISMOUNT_VOLUME
 #define FSCTL_GET_NTFS_FILE_RECORD
 #define FSCTL_ALLOW_EXTENDED_DASD_IO
-#define FSCTL_RECALL_FILE           0x00090117
+#define FSCTL_RECALL_FILE
 
 #endif
 
index 9944610c62e13f641ff6afab7de2a444d594f628..24c0bbf49c561acc62a263e1578e6e515af9d3d7 100644 (file)
@@ -49,17 +49,6 @@ struct user_auth_info {
        int signing_state;
 };
 
-enum smb_server_mode {
-       /* Daemonize and manage our own sockets */
-       SERVER_MODE_DAEMON,
-       /* Don't daemonize or manage sockets */
-       SERVER_MODE_INETD,
-       /* Don't daemonize, but do manage sockets */
-       SERVER_MODE_FOREGROUND,
-       /* Run in the foreground, log to stdout, don't fork children */
-       SERVER_MODE_INTERACTIVE
-};
-
 extern struct user_auth_info cmdline_auth_info;
 
 #endif /* _POPT_COMMON_H */
index 95aeffdcb9da94e56f953feb8352f61fa37bd1f8..66c4f589879252a2a6419cf52443ba8197d9ec37 100644 (file)
 /* autogenerated client stubs */
 
 #include "librpc/gen_ndr/cli_echo.h"
-#include "librpc/gen_ndr/cli_unixinfo.h"
-#include "librpc/gen_ndr/cli_epmapper.h"
-#include "librpc/gen_ndr/cli_dfs.h"
 #include "librpc/gen_ndr/cli_lsa.h"
-#include "librpc/gen_ndr/cli_srvsvc.h"
 #include "librpc/gen_ndr/cli_svcctl.h"
-#include "librpc/gen_ndr/cli_winreg.h"
-#include "librpc/gen_ndr/cli_initshutdown.h"
 #include "librpc/gen_ndr/cli_wkssvc.h"
+#include "librpc/gen_ndr/cli_eventlog.h"
+#include "librpc/gen_ndr/cli_dfs.h"
+#include "librpc/gen_ndr/cli_initshutdown.h"
+#include "librpc/gen_ndr/cli_winreg.h"
+#include "librpc/gen_ndr/cli_srvsvc.h"
 
 /* macro to expand cookie-cutter code in cli_xxx() using rpc_api_pipe_req() */
 
index e50a52fea2f9a68e142a2596d114b881d9f4e855..53073c85be5c9cb64bc4c1f9b19e3f6379b1e8e8 100644 (file)
@@ -92,6 +92,10 @@ enum unistr2_term_codes { UNI_FLAGS_NONE = 0, UNI_STR_TERMINATE = 1, UNI_MAXLEN_
  **********************************************************************/
  
 typedef struct policy_handle POLICY_HND;
+typedef struct {
+       uint32 ptr_hnd;          /* pointer to enumeration handle */
+       uint32 handle;           /* enumeration handle */
+} ENUM_HND;
 
 #define OUR_HANDLE(hnd) (((hnd)==NULL) ? "NULL" :\
        ( IVAL((hnd)->uuid.node,2) == (uint32)sys_getpid() ? "OURS" : \
index b2c542a9066bc877076d67b26d281fd8c412452c..a82b977a5bbadfd8014a52eebf15307b7f303e4e 100644 (file)
 #define NET_DSR_GETDCNAMEEX2   0x22
 #define NET_SAMLOGON_EX                0x27
 
+/* Secure Channel types.  used in NetrServerAuthenticate negotiation */
+#define SEC_CHAN_WKSTA   2
+#define SEC_CHAN_DOMAIN  4
+#define SEC_CHAN_BDC     6
+
 /* Returned delta types */
 #define SAM_DELTA_DOMAIN_INFO    0x01
 #define SAM_DELTA_GROUP_INFO     0x02
 #define SAM_DELTA_DELETE_USER    0x15
 #define SAM_DELTA_MODIFIED_COUNT 0x16
 
+/* SAM database types */
+#define SAM_DATABASE_DOMAIN    0x00 /* Domain users and groups */
+#define SAM_DATABASE_BUILTIN   0x01 /* BUILTIN users and groups */
+#define SAM_DATABASE_PRIVS     0x02 /* Privileges */
+
 /* flags use when sending a NETLOGON_CONTROL request */
 
 #define NETLOGON_CONTROL_SYNC                  0x2
index 368ebbbc5b741ad09dfaa92f5f3e253788e71d17..2273fba2e6c523fd96dd83a8b55ecf7bd4d28340 100644 (file)
@@ -4,7 +4,7 @@
    Copyright (C) Andrew Tridgell              1992-2000
    Copyright (C) Luke Kenneth Casson Leighton 1996-2000
    Copyright (C) Paul Ashton                  1997-2000
-   Copyright (C) Jean François Micouleau      1998-2001
+   Copyright (C) Jean François Micouleau      1998-2001
    Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
    
    
@@ -127,11 +127,11 @@ SamrTestPrivateFunctionsUser
 #define SAMR_REMOVE_SID_FOREIGN_DOMAIN        0x2d
 #define SAMR_QUERY_DOMAIN_INFO2  0x2e /* looks like an alias for SAMR_QUERY_DOMAIN_INFO */
 #define SAMR_UNKNOWN_2f        0x2f
-#define SAMR_QUERY_DISPINFO2   0x30 /* Alias for SAMR_QUERY_DISPINFO
+#define SAMR_QUERY_DISPINFO3   0x30 /* Alias for SAMR_QUERY_DISPINFO
                                       with info level 3 */
-#define SAMR_GET_DISPENUM_INDEX2 0x31
+#define SAMR_UNKNOWN_31        0x31
 #define SAMR_CREATE_USER       0x32
-#define SAMR_QUERY_DISPINFO3   0x33 /* Alias for SAMR_QUERY_DISPINFO
+#define SAMR_QUERY_DISPINFO4   0x33 /* Alias for SAMR_QUERY_DISPINFO
                                       with info level 4 */
 #define SAMR_ADDMULTI_ALIASMEM 0x34
 
diff --git a/source3/include/rpc_srvsvc.h b/source3/include/rpc_srvsvc.h
new file mode 100644 (file)
index 0000000..097c0d4
--- /dev/null
@@ -0,0 +1,871 @@
+/*
+   Unix SMB/CIFS implementation.
+   SMB parameters and setup
+   Copyright (C) Andrew Tridgell 1992-1997
+   Copyright (C) Luke Kenneth Casson Leighton 1996-1997
+   Copyright (C) Paul Ashton 1997
+   Copyright (C) Nigel Williams 2001
+   Copyright (C) Gerald (Jerry) Carter 2006.
+
+   
+   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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _RPC_SRVSVC_H /* _RPC_SRVSVC_H */
+#define _RPC_SRVSVC_H 
+
+/* srvsvc pipe */
+#define SRV_NET_CONN_ENUM          0x08
+#define SRV_NET_FILE_ENUM          0x09
+#define SRV_NET_FILE_CLOSE         0x0b
+#define SRV_NET_SESS_ENUM          0x0c
+#define SRV_NET_SESS_DEL           0x0d
+#define SRV_NET_SHARE_ADD          0x0e
+#define SRV_NET_SHARE_ENUM_ALL     0x0f
+#define SRV_NET_SHARE_GET_INFO     0x10
+#define SRV_NET_SHARE_SET_INFO     0x11
+#define SRV_NET_SHARE_DEL          0x12
+#define SRV_NET_SHARE_DEL_STICKY   0x13
+#define SRV_NET_SRV_GET_INFO       0x15
+#define SRV_NET_SRV_SET_INFO       0x16
+#define SRV_NET_DISK_ENUM          0x17
+#define SRV_NET_REMOTE_TOD         0x1c
+#define SRV_NET_NAME_VALIDATE      0x21
+#define SRV_NET_SHARE_ENUM         0x24
+#define SRV_NET_FILE_QUERY_SECDESC 0x27
+#define SRV_NET_FILE_SET_SECDESC   0x28
+
+#define MAX_SERVER_DISK_ENTRIES 15
+
+typedef struct disk_info {
+       uint32  unknown;
+       UNISTR3 disk_name;
+} DISK_INFO;
+
+typedef struct disk_enum_container {
+       uint32 level;
+       uint32 entries_read;
+       uint32 unknown;
+       uint32 disk_info_ptr;
+       DISK_INFO *disk_info;
+} DISK_ENUM_CONTAINER;
+
+typedef struct net_srv_disk_enum {
+       uint32 ptr_srv_name;         /* pointer (to server name?) */
+       UNISTR2 uni_srv_name;        /* server name */
+
+       DISK_ENUM_CONTAINER disk_enum_ctr;
+
+       uint32 preferred_len;        /* preferred maximum length (0xffff ffff) */
+       uint32 total_entries;        /* total number of entries */
+       ENUM_HND enum_hnd;
+       WERROR status;               /* return status */
+} SRV_Q_NET_DISK_ENUM, SRV_R_NET_DISK_ENUM;
+
+/***************************/
+
+typedef struct  {
+       UNISTR2 *servername;
+       UNISTR2 sharename;
+       uint32 type;
+       uint32 flags;
+       WERROR status;
+} SRV_Q_NET_NAME_VALIDATE;
+
+typedef struct  {
+       WERROR status;
+} SRV_R_NET_NAME_VALIDATE;
+
+/***************************/
+
+/* oops - this is going to take up a *massive* amount of stack. */
+/* the UNISTR2s already have 1024 uint16 chars in them... */
+
+#define MAX_SESS_ENTRIES 32
+
+typedef struct {
+       UNISTR2 *sharename;
+} SESS_INFO_0;
+
+typedef struct {
+       uint32 num_entries_read;
+       uint32 ptr_sess_info;
+       uint32 num_entries_read2;
+       SESS_INFO_0 info_0[MAX_SESS_ENTRIES];
+} SRV_SESS_INFO_0;
+
+typedef struct {
+       UNISTR2 *sharename;
+       UNISTR2 *username;
+       uint32 num_opens;
+       uint32 open_time;
+       uint32 idle_time;
+       uint32 user_flags;
+} SESS_INFO_1;
+
+typedef struct {
+       uint32 num_entries_read;
+       uint32 ptr_sess_info;
+       uint32 num_entries_read2;
+       SESS_INFO_1 info_1[MAX_SESS_ENTRIES];
+} SRV_SESS_INFO_1;
+
+typedef struct {
+       uint32 switch_value;
+       uint32 ptr_sess_ctr;
+       union {
+               SRV_SESS_INFO_0 info0; 
+               SRV_SESS_INFO_1 info1; 
+       } sess;
+
+} SRV_SESS_INFO_CTR;
+
+typedef struct {
+       UNISTR2 *servername;
+       UNISTR2 *qualifier;
+       UNISTR2 *username;
+       uint32 sess_level;
+       SRV_SESS_INFO_CTR *ctr;
+       uint32 preferred_len;
+       ENUM_HND enum_hnd;
+} SRV_Q_NET_SESS_ENUM;
+
+typedef struct {
+       uint32 sess_level; 
+       SRV_SESS_INFO_CTR *ctr;
+       uint32 total_entries;
+       ENUM_HND enum_hnd;
+       WERROR status;
+} SRV_R_NET_SESS_ENUM;
+
+/***************************/
+
+/* SRV_Q_NET_SESS_DEL */
+typedef struct q_net_sess_del
+{
+       uint32 ptr_srv_name;         /* pointer (to server name?) */
+       UNISTR2 uni_srv_name;        /* server name */
+
+       uint32 ptr_cli_name;         /* pointer (to qualifier name) */
+       UNISTR2 uni_cli_name;        /* qualifier name "\\qualifier" */
+
+       uint32 ptr_user_name;         /* pointer (to user name */
+       UNISTR2 uni_user_name;        /* user name */
+
+} SRV_Q_NET_SESS_DEL;
+
+/* SRV_R_NET_SESS_DEL */
+typedef struct r_net_sess_del
+{
+       WERROR status;               /* return status */
+
+} SRV_R_NET_SESS_DEL;
+
+/* CONN_INFO_0 (pointers to level 0 connection info strings) */
+typedef struct ptr_conn_info0
+{
+       uint32 id; /* connection id. */
+
+} CONN_INFO_0;
+
+/* oops - this is going to take up a *massive* amount of stack. */
+/* the UNISTR2s already have 1024 uint16 chars in them... */
+#define MAX_CONN_ENTRIES 32
+
+/* SRV_CONN_INFO_0 */
+typedef struct srv_conn_info_0_info
+{
+       uint32 num_entries_read;                     /* EntriesRead */
+       uint32 ptr_conn_info;                       /* Buffer */
+       uint32 num_entries_read2;                    /* EntriesRead */
+
+       CONN_INFO_0     info_0    [MAX_CONN_ENTRIES]; /* connection entry pointers */
+
+} SRV_CONN_INFO_0;
+
+/* CONN_INFO_1 (pointers to level 1 connection info strings) */
+typedef struct ptr_conn_info1
+{
+       uint32 id;   /* connection id */
+       uint32 type; /* 0x3 */
+       uint32 num_opens;
+       uint32 num_users;
+       uint32 open_time;
+
+       uint32 ptr_usr_name; /* pointer to user name. */
+       uint32 ptr_net_name; /* pointer to network name (e.g IPC$). */
+
+} CONN_INFO_1;
+
+/* CONN_INFO_1_STR (level 1 connection info strings) */
+typedef struct str_conn_info1
+{
+       UNISTR2 uni_usr_name; /* unicode string of user */
+       UNISTR2 uni_net_name; /* unicode string of name */
+
+} CONN_INFO_1_STR;
+
+/* SRV_CONN_INFO_1 */
+typedef struct srv_conn_info_1_info
+{
+       uint32 num_entries_read;                     /* EntriesRead */
+       uint32 ptr_conn_info;                       /* Buffer */
+       uint32 num_entries_read2;                    /* EntriesRead */
+
+       CONN_INFO_1     info_1    [MAX_CONN_ENTRIES]; /* connection entry pointers */
+       CONN_INFO_1_STR info_1_str[MAX_CONN_ENTRIES]; /* connection entry strings */
+
+} SRV_CONN_INFO_1;
+
+/* SRV_CONN_INFO_CTR */
+typedef struct srv_conn_info_ctr_info
+{
+       uint32 switch_value;         /* switch value */
+       uint32 ptr_conn_ctr;       /* pointer to conn info union */
+       union
+    {
+               SRV_CONN_INFO_0 info0; /* connection info level 0 */
+               SRV_CONN_INFO_1 info1; /* connection info level 1 */
+
+    } conn;
+
+} SRV_CONN_INFO_CTR;
+
+
+/* SRV_Q_NET_CONN_ENUM */
+typedef struct q_net_conn_enum_info
+{
+       uint32 ptr_srv_name;         /* pointer (to server name) */
+       UNISTR2 uni_srv_name;        /* server name "\\server" */
+
+       uint32 ptr_qual_name;         /* pointer (to qualifier name) */
+       UNISTR2 uni_qual_name;        /* qualifier name "\\qualifier" */
+
+       uint32 conn_level;          /* connection level */
+
+       SRV_CONN_INFO_CTR *ctr;
+
+       uint32 preferred_len;        /* preferred maximum length (0xffff ffff) */
+       ENUM_HND enum_hnd;
+
+} SRV_Q_NET_CONN_ENUM;
+
+/* SRV_R_NET_CONN_ENUM */
+typedef struct r_net_conn_enum_info
+{
+       uint32 conn_level;          /* share level */
+
+       SRV_CONN_INFO_CTR *ctr;
+
+       uint32 total_entries;                    /* total number of entries */
+       ENUM_HND enum_hnd;
+
+       WERROR status;               /* return status */
+
+} SRV_R_NET_CONN_ENUM;
+
+/* SH_INFO_0 */
+typedef struct ptr_share_info0
+{
+       uint32 ptr_netname; /* pointer to net name. */
+} SH_INFO_0;
+
+/* SH_INFO_0_STR (level 0 share info strings) */
+typedef struct str_share_info0
+{
+        SH_INFO_0 *ptrs;
+
+       UNISTR2 uni_netname; /* unicode string of net name */
+
+} SH_INFO_0_STR;
+
+/* SRV_SHARE_INFO_0 */
+typedef struct share_info_0_info
+{
+       SH_INFO_0 info_0;
+       SH_INFO_0_STR info_0_str;
+
+} SRV_SHARE_INFO_0;
+
+/* SH_INFO_1 (pointers to level 1 share info strings) */
+typedef struct ptr_share_info1
+{
+       uint32 ptr_netname; /* pointer to net name. */
+       uint32 type; /* ipc, print, disk ... */
+       uint32 ptr_remark; /* pointer to comment. */
+
+} SH_INFO_1;
+
+/* SH_INFO_1_STR (level 1 share info strings) */
+typedef struct str_share_info1
+{
+        SH_INFO_1 *ptrs;
+
+       UNISTR2 uni_netname; /* unicode string of net name */
+       UNISTR2 uni_remark; /* unicode string of comment */
+
+} SH_INFO_1_STR;
+
+/* SRV_SHARE_INFO_1 */
+typedef struct share_info_1_info
+{
+       SH_INFO_1 info_1;
+       SH_INFO_1_STR info_1_str;
+
+} SRV_SHARE_INFO_1;
+
+/* SH_INFO_2 (pointers to level 2 share info strings) */
+typedef struct ptr_share_info2
+{
+       uint32 ptr_netname; /* pointer to net name. */
+       uint32 type; /* ipc, print, disk ... */
+       uint32 ptr_remark; /* pointer to comment. */
+       uint32 perms;      /* permissions */
+       uint32 max_uses;   /* maximum uses */
+       uint32 num_uses;   /* current uses */
+       uint32 ptr_path;   /* pointer to path name */
+       uint32 ptr_passwd; /* pointer to password */
+
+} SH_INFO_2;
+
+/* SH_INFO_2_STR (level 2 share info strings) */
+typedef struct str_share_info2
+{
+       SH_INFO_2 *ptrs;
+
+       UNISTR2 uni_netname; /* unicode string of net name (e.g NETLOGON) */
+       UNISTR2 uni_remark;  /* unicode string of comment (e.g "Logon server share") */
+       UNISTR2 uni_path;    /* unicode string of local path (e.g c:\winnt\system32\repl\import\scripts) */
+       UNISTR2 uni_passwd;  /* unicode string of password - presumably for share level security (e.g NULL) */
+
+} SH_INFO_2_STR;
+
+/* SRV_SHARE_INFO_2 */
+typedef struct share_info_2_info
+{
+       SH_INFO_2 info_2;
+       SH_INFO_2_STR info_2_str;
+
+} SRV_SHARE_INFO_2;
+
+typedef struct ptr_share_info501
+{
+       uint32 ptr_netname; /* pointer to net name */
+       uint32 type;     /* ipc, print, disk */
+       uint32 ptr_remark;  /* pointer to comment */
+       uint32 csc_policy;  /* client-side offline caching policy << 4 */
+} SH_INFO_501;
+
+typedef struct str_share_info501
+{
+       UNISTR2 uni_netname; /* unicode string of net name */
+       UNISTR2 uni_remark;  /* unicode string of comment */
+} SH_INFO_501_STR;
+
+/* SRV_SHARE_INFO_501 */
+typedef struct share_info_501_info
+{
+       SH_INFO_501 info_501;
+       SH_INFO_501_STR info_501_str;
+} SRV_SHARE_INFO_501;
+
+/* SH_INFO_502 (pointers to level 502 share info strings) */
+typedef struct ptr_share_info502
+{
+       uint32 ptr_netname; /* pointer to net name. */
+       uint32 type; /* ipc, print, disk ... */
+       uint32 ptr_remark; /* pointer to comment. */
+       uint32 perms;      /* permissions */
+       uint32 max_uses;   /* maximum uses */
+       uint32 num_uses;   /* current uses */
+       uint32 ptr_path;   /* pointer to path name */
+       uint32 ptr_passwd; /* pointer to password */
+        uint32 reserved;    /* this holds the space taken by the sd in the rpc packet */
+        uint32 reserved_offset;   /* required for _post operation when marshalling */
+       uint32 sd_size;    /* size of security descriptor */
+       uint32 ptr_sd;     /* pointer to security descriptor */
+
+} SH_INFO_502;
+
+/* SH_INFO_502_STR (level 502 share info strings) */
+typedef struct str_share_info502
+{
+       SH_INFO_502 *ptrs;
+
+       UNISTR2 uni_netname; /* unicode string of net name (e.g NETLOGON) */
+       UNISTR2 uni_remark;  /* unicode string of comment (e.g "Logon server share") */
+       UNISTR2 uni_path;    /* unicode string of local path (e.g c:\winnt\system32\repl\import\scripts) */
+       UNISTR2 uni_passwd;  /* unicode string of password - presumably for share level security (e.g NULL) */
+
+        uint32 reserved;
+       uint32 sd_size;
+       SEC_DESC *sd;
+
+} SH_INFO_502_STR;
+
+/* SRV_SHARE_INFO_502 */
+typedef struct share_info_502_info
+{
+       SH_INFO_502 info_502;
+       SH_INFO_502_STR info_502_str;
+
+} SRV_SHARE_INFO_502;
+
+typedef struct ptr_share_info1004
+{
+       uint32 ptr_remark;
+
+} SH_INFO_1004;
+
+typedef struct str_share_info1004
+{
+       SH_INFO_1004 *ptrs;
+
+       UNISTR2 uni_remark;
+
+} SH_INFO_1004_STR;
+
+typedef struct ptr_info_1004_info
+{
+       SH_INFO_1004     info_1004; 
+       SH_INFO_1004_STR info_1004_str; 
+} SRV_SHARE_INFO_1004;
+
+typedef struct share_info_1005_info
+{
+  uint32 share_info_flags; 
+} SRV_SHARE_INFO_1005;
+
+typedef struct share_info_1006_info
+{
+       uint32 max_uses; 
+} SRV_SHARE_INFO_1006;
+
+typedef struct ptr_share_info1007
+{
+       uint32 flags;
+       uint32 ptr_AlternateDirectoryName;
+
+} SH_INFO_1007;
+
+typedef struct str_share_info1007
+{
+       SH_INFO_1007 *ptrs;
+
+       UNISTR2 uni_AlternateDirectoryName;
+
+} SH_INFO_1007_STR;
+
+typedef struct ptr_info_1007_info
+{
+       SH_INFO_1007     info_1007; 
+       SH_INFO_1007_STR info_1007_str; 
+} SRV_SHARE_INFO_1007;
+
+/* SRV_SHARE_INFO_1501 */
+typedef struct share_info_1501_info
+{
+       SEC_DESC_BUF *sdb;
+} SRV_SHARE_INFO_1501;
+
+/* SRV_SHARE_INFO_CTR */
+typedef struct srv_share_info_ctr_info
+{
+       uint32 info_level;
+       uint32 switch_value;
+       uint32 ptr_share_info;
+
+       uint32 num_entries;
+       uint32 ptr_entries;
+       uint32 num_entries2;
+
+       union {
+               SRV_SHARE_INFO_0    *info0;
+               SRV_SHARE_INFO_1    *info1;    /* share info level 1 */
+               SRV_SHARE_INFO_2    *info2;    /* share info level 2 */
+               SRV_SHARE_INFO_501  *info501;  /* share info level 501 */
+               SRV_SHARE_INFO_502  *info502;  /* share info level 502 */
+               SRV_SHARE_INFO_1004 *info1004;
+               SRV_SHARE_INFO_1005 *info1005;
+               SRV_SHARE_INFO_1006 *info1006;
+               SRV_SHARE_INFO_1007 *info1007;
+               SRV_SHARE_INFO_1501 *info1501;
+               void *info;
+
+       } share;
+
+} SRV_SHARE_INFO_CTR;
+
+/* SRV_Q_NET_SHARE_ENUM */
+typedef struct q_net_share_enum_info
+{
+       uint32 ptr_srv_name;         /* pointer (to server name?) */
+       UNISTR2 uni_srv_name;        /* server name */
+
+       SRV_SHARE_INFO_CTR ctr;     /* share info container */
+
+       uint32 preferred_len;        /* preferred maximum length (0xffff ffff) */
+
+       ENUM_HND enum_hnd;
+
+} SRV_Q_NET_SHARE_ENUM;
+
+
+/* SRV_R_NET_SHARE_ENUM */
+typedef struct r_net_share_enum_info
+{
+       SRV_SHARE_INFO_CTR ctr;     /* share info container */
+
+       uint32 total_entries;                    /* total number of entries */
+       ENUM_HND enum_hnd;
+
+       WERROR status;               /* return status */
+
+} SRV_R_NET_SHARE_ENUM;
+
+
+/* SRV_Q_NET_SHARE_GET_INFO */
+typedef struct q_net_share_get_info_info
+{
+       uint32 ptr_srv_name;
+       UNISTR2 uni_srv_name;
+
+       UNISTR2 uni_share_name;
+       uint32 info_level;
+
+} SRV_Q_NET_SHARE_GET_INFO;
+
+/* SRV_SHARE_INFO */
+typedef struct srv_share_info {
+       uint32 switch_value;
+       uint32 ptr_share_ctr;
+
+       union {
+               SRV_SHARE_INFO_0    info0;
+               SRV_SHARE_INFO_1 info1;
+               SRV_SHARE_INFO_2 info2;
+               SRV_SHARE_INFO_501 info501;
+               SRV_SHARE_INFO_502 info502;
+               SRV_SHARE_INFO_1004 info1004;
+               SRV_SHARE_INFO_1005 info1005;
+               SRV_SHARE_INFO_1006 info1006;
+               SRV_SHARE_INFO_1007 info1007;
+               SRV_SHARE_INFO_1501 info1501;
+       } share;
+} SRV_SHARE_INFO;
+
+/* SRV_R_NET_SHARE_GET_INFO */
+typedef struct r_net_share_get_info_info
+{
+       SRV_SHARE_INFO info;
+       WERROR status;
+
+} SRV_R_NET_SHARE_GET_INFO;
+
+/* SRV_Q_NET_SHARE_SET_INFO */
+typedef struct q_net_share_set_info_info
+{
+       uint32 ptr_srv_name;
+       UNISTR2 uni_srv_name;
+
+       UNISTR2 uni_share_name;
+       uint32 info_level;
+
+       SRV_SHARE_INFO info;
+
+        uint32 ptr_parm_error;
+        uint32 parm_error;
+
+} SRV_Q_NET_SHARE_SET_INFO;
+
+/* SRV_R_NET_SHARE_SET_INFO */
+typedef struct r_net_share_set_info
+{
+        uint32 ptr_parm_error;
+        uint32 parm_error;
+
+       WERROR status;               /* return status */
+
+} SRV_R_NET_SHARE_SET_INFO;
+
+/* SRV_Q_NET_SHARE_ADD */
+typedef struct q_net_share_add
+{
+       uint32 ptr_srv_name;
+       UNISTR2 uni_srv_name;
+
+       uint32 info_level;
+
+       SRV_SHARE_INFO info;
+
+       uint32 ptr_err_index; /* pointer to error index */
+       uint32 err_index;     /* index in info to field in error */
+
+} SRV_Q_NET_SHARE_ADD;
+
+/* SRV_R_NET_SHARE_ADD */
+typedef struct r_net_share_add
+{
+
+        uint32 ptr_parm_error;
+        uint32 parm_error;
+
+       WERROR status;               /* return status */
+
+} SRV_R_NET_SHARE_ADD;
+
+/* SRV_Q_NET_SHARE_DEL */
+typedef struct q_net_share_del
+{
+       uint32 ptr_srv_name;
+       UNISTR2 uni_srv_name;
+       UNISTR2 uni_share_name;
+       uint32 reserved;
+
+} SRV_Q_NET_SHARE_DEL;
+
+/* SRV_R_NET_SHARE_DEL */
+typedef struct r_net_share_del
+{
+       WERROR status;               /* return status */
+
+} SRV_R_NET_SHARE_DEL;
+
+/***************************/
+
+typedef struct {
+       uint32 id;            /* file index */
+       uint32 perms;         /* file permissions. don't know what format */
+       uint32 num_locks;     /* file locks */
+       UNISTR2 *path;        /* file name */
+       UNISTR2 *user;        /* file owner */
+} FILE_INFO_3;
+
+typedef struct {
+       uint32 level;                /* switch value */
+       uint32 ptr_file_info;        /* pointer to file info union */
+
+       uint32 num_entries;
+       uint32 ptr_entries;
+       uint32 num_entries2;
+       union {
+               FILE_INFO_3 *info3;
+       } file;
+
+} SRV_FILE_INFO_CTR;
+
+typedef struct {
+       UNISTR2 *servername;
+       UNISTR2 *qualifier;
+       UNISTR2 *username;
+       uint32 level;
+       SRV_FILE_INFO_CTR ctr;
+       uint32 preferred_len;     /* preferred maximum length (0xffff ffff) */
+       ENUM_HND enum_hnd;
+} SRV_Q_NET_FILE_ENUM;
+
+typedef struct {
+       uint32 level;   
+       SRV_FILE_INFO_CTR ctr;
+       uint32 total_entries;
+       ENUM_HND enum_hnd;
+       WERROR status;      
+} SRV_R_NET_FILE_ENUM;
+
+/* SRV_INFO_100 */
+typedef struct srv_info_100_info
+{
+       uint32 platform_id;     /* 0x500 */
+       uint32 ptr_name;        /* pointer to server name */
+
+       UNISTR2 uni_name;       /* server name "server" */
+
+} SRV_INFO_100;
+
+/* SRV_INFO_101 */
+typedef struct srv_info_101_info
+{
+       uint32 platform_id;     /* 0x500 */
+       uint32 ptr_name;        /* pointer to server name */
+       uint32 ver_major;       /* 0x4 */
+       uint32 ver_minor;       /* 0x2 */
+       uint32 srv_type;        /* browse etc type */
+       uint32 ptr_comment;     /* pointer to server comment */
+
+       UNISTR2 uni_name;       /* server name "server" */
+       UNISTR2 uni_comment;    /* server comment "samba x.x.x blah" */
+
+} SRV_INFO_101;
+
+/* SRV_INFO_102  */
+typedef struct srv_info_102_info
+{
+       uint32 platform_id;     /* 0x500 */
+       uint32 ptr_name;        /* pointer to server name */
+       uint32 ver_major;       /* 0x4 */
+       uint32 ver_minor;       /* 0x2 */
+       uint32 srv_type;        /* browse etc type */
+       uint32 ptr_comment;     /* pointer to server comment */
+       uint32 users;           /* 0xffff ffff*/
+       uint32 disc;            /* 0xf */
+       uint32 hidden;          /* 0x0 */
+       uint32 announce;        /* 240 */
+       uint32 ann_delta;       /* 3000 */
+       uint32 licenses;        /* 0 */
+       uint32 ptr_usr_path;    /* pointer to user path */
+
+       UNISTR2 uni_name;       /* server name "server" */
+       UNISTR2 uni_comment;    /* server comment "samba x.x.x blah" */
+       UNISTR2 uni_usr_path;   /* "c:\" (eh?) */
+
+} SRV_INFO_102;
+
+
+/* SRV_INFO_CTR */
+typedef struct srv_info_ctr_info
+{
+       uint32 switch_value;         /* switch value */
+       uint32 ptr_srv_ctr;         /* pointer to server info */
+       union
+    {
+               SRV_INFO_102 sv102; /* server info level 102 */
+               SRV_INFO_101 sv101; /* server info level 101 */
+               SRV_INFO_100 sv100; /* server info level 100 */
+
+    } srv;
+
+} SRV_INFO_CTR;
+
+/* SRV_Q_NET_SRV_GET_INFO */
+typedef struct q_net_srv_get_info
+{
+       uint32  ptr_srv_name;
+       UNISTR2 uni_srv_name; /* "\\server" */
+       uint32  switch_value;
+
+} SRV_Q_NET_SRV_GET_INFO;
+
+/* SRV_R_NET_SRV_GET_INFO */
+typedef struct r_net_srv_get_info
+{
+       SRV_INFO_CTR *ctr;
+
+       WERROR status;               /* return status */
+
+} SRV_R_NET_SRV_GET_INFO;
+
+/* SRV_Q_NET_SRV_SET_INFO */
+typedef struct q_net_srv_set_info
+{
+       uint32  ptr_srv_name;
+       UNISTR2 uni_srv_name; /* "\\server" */
+       uint32  switch_value;
+
+       SRV_INFO_CTR *ctr;
+
+} SRV_Q_NET_SRV_SET_INFO;
+
+
+/* SRV_R_NET_SRV_SET_INFO */
+typedef struct r_net_srv_set_info
+{
+       uint32 switch_value;         /* switch value */
+
+       WERROR status;               /* return status */
+
+} SRV_R_NET_SRV_SET_INFO;
+
+/* SRV_Q_NET_REMOTE_TOD */
+typedef struct q_net_remote_tod
+{
+       uint32  ptr_srv_name;
+       UNISTR2 uni_srv_name; /* "\\server" */
+
+} SRV_Q_NET_REMOTE_TOD;
+
+/* TIME_OF_DAY_INFO */
+typedef struct time_of_day_info
+{
+       uint32  elapsedt;
+       uint32  msecs;
+       uint32  hours;
+       uint32  mins;
+       uint32  secs;
+       uint32  hunds;
+       uint32  zone;
+       uint32  tintervals;
+       uint32  day;
+       uint32  month;
+       uint32  year;
+       uint32  weekday;
+       
+} TIME_OF_DAY_INFO;
+
+/* SRV_R_NET_REMOTE_TOD */
+typedef struct r_net_remote_tod
+{
+       uint32 ptr_srv_tod;         /* pointer to TOD */
+       TIME_OF_DAY_INFO *tod;
+       
+       WERROR status;               /* return status */
+
+} SRV_R_NET_REMOTE_TOD;
+
+/* SRV_Q_NET_FILE_QUERY_SECDESC */
+typedef struct q_net_file_query_secdesc
+{
+       uint32  ptr_srv_name;
+       UNISTR2 uni_srv_name;
+       uint32  ptr_qual_name;
+       UNISTR2 uni_qual_name;
+       UNISTR2 uni_file_name;
+       uint32  unknown1;
+       uint32  unknown2;
+       uint32  unknown3;
+} SRV_Q_NET_FILE_QUERY_SECDESC;
+
+/* SRV_R_NET_FILE_QUERY_SECDESC */
+typedef struct r_net_file_query_secdesc
+{
+       uint32 ptr_response;
+       uint32 size_response;
+       uint32 ptr_secdesc;
+       uint32 size_secdesc;
+       SEC_DESC *sec_desc;
+       WERROR status;
+} SRV_R_NET_FILE_QUERY_SECDESC;
+
+/* SRV_Q_NET_FILE_SET_SECDESC */
+typedef struct q_net_file_set_secdesc
+{
+       uint32  ptr_srv_name;
+       UNISTR2 uni_srv_name;
+       uint32  ptr_qual_name;
+       UNISTR2 uni_qual_name;
+       UNISTR2 uni_file_name;
+       uint32  sec_info;
+       uint32  size_set;
+       uint32  ptr_secdesc;
+       uint32  size_secdesc;
+       SEC_DESC *sec_desc;
+} SRV_Q_NET_FILE_SET_SECDESC;
+
+/* SRV_R_NET_FILE_SET_SECDESC */
+typedef struct r_net_file_set_secdesc
+{
+       WERROR status;
+} SRV_R_NET_FILE_SET_SECDESC;
+
+
+#endif /* _RPC_SRVSVC_H */
index 21bdd9b5c5ae37d19bdce7ba8961a2b692e74527..75ec4363d0cbf6813aec4e48ca4a637110518526 100644 (file)
@@ -78,7 +78,6 @@
 #define WRITE_ERROR 4 /* This error code can go into the client smb_rw_error. */
 #define READ_BAD_SIG 5
 #define DO_NOT_DO_TDIS 6 /* cli_close_connection() check for this when smbfs wants to keep tree connected */
-#define READ_BAD_DECRYPT 7
 
 #define DIR_STRUCT_SIZE 43
 
@@ -186,10 +185,9 @@ typedef uint32 codepoint_t;
 #define PIPE_NETDFS   "\\PIPE\\netdfs"
 #define PIPE_ECHO     "\\PIPE\\rpcecho"
 #define PIPE_SHUTDOWN "\\PIPE\\initshutdown"
-#define PIPE_EPMAPPER "\\PIPE\\epmapper"
+#define PIPE_EPM      "\\PIPE\\epmapper"
 #define PIPE_SVCCTL   "\\PIPE\\svcctl"
 #define PIPE_EVENTLOG "\\PIPE\\eventlog"
-#define PIPE_UNIXINFO    "\\PIPE\\unixinfo"
 
 #define PIPE_NETLOGON_PLAIN "\\NETLOGON"
 
@@ -206,10 +204,8 @@ typedef uint32 codepoint_t;
 #define PI_INITSHUTDOWN                10
 #define PI_SVCCTL              11
 #define PI_EVENTLOG            12
-#define PI_UNIXINFO            13
-#define PI_NTSVCS              14
-#define PI_EPMAPPER            15
-#define PI_MAX_PIPES           16
+#define PI_NTSVCS              13
+#define PI_MAX_PIPES           14
 
 /* 64 bit time (100usec) since ????? - cifs6.txt, section 3.5, page 30 */
 typedef uint64_t NTTIME;
@@ -304,11 +300,10 @@ struct id_map {
 #include "librpc/ndr/misc.h"
 #include "librpc/ndr/security.h"
 #include "librpc/ndr/libndr.h"
-#include "librpc/gen_ndr/unixinfo.h"
 #include "librpc/gen_ndr/lsa.h"
 #include "librpc/gen_ndr/dfs.h"
-#include "librpc/gen_ndr/initshutdown.h"
 #include "librpc/gen_ndr/winreg.h"
+#include "librpc/gen_ndr/initshutdown.h"
 #include "librpc/gen_ndr/eventlog.h"
 #include "librpc/gen_ndr/srvsvc.h"
 #include "librpc/gen_ndr/wkssvc.h"
@@ -507,6 +502,7 @@ typedef struct files_struct {
        BOOL modified;
        BOOL is_directory;
        BOOL is_stat;
+       BOOL aio_write_behind;
        BOOL lockdb_clean;
        BOOL initial_delete_on_close; /* Only set at NTCreateX if file was created. */
        BOOL posix_open;
@@ -657,6 +653,7 @@ typedef struct connection_struct {
        name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
        name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
        name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */       
+       name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */       
        struct dfree_cached_info *dfree_info;
        struct trans_state *pending_trans;
        struct notify_context *notify_ctx;
@@ -1918,6 +1915,4 @@ enum usershare_err {
 /* Different reasons for closing a file. */
 enum file_close_type {NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE};
 
-#include "librpc/gen_ndr/epmapper.h"
-
 #endif /* _SMB_H */
diff --git a/source3/include/smb_launchd.h b/source3/include/smb_launchd.h
deleted file mode 100644 (file)
index dcbe43c..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-   Unix SMB/CIFS implementation.
-   Launchd integration wrapper API
-
-   Copyright (C) James Peach 2007
-
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-struct smb_launch_info
-{
-       int idle_timeout_secs;
-       int num_sockets;
-       int *socket_list;
-};
-
-/* Retrieve launchd configuration. Returns True if we are running under
- * launchd, False otherwise. NOTE this does not guarantee to provide a list of
- * sockets since this is a user configuration option.
- */
-BOOL smb_launchd_checkin(struct smb_launch_info *linfo);
-
-/* Retrieve launchd configuration. The variadic arguments are a list of
- * constant null-terminated strings. The strings are the names of the socket
- * dictionaries to retrieve sockets from. The list of names is terminated by a
- * NULL.
- */
-BOOL smb_launchd_checkin_names(struct smb_launch_info *linfo, ...);
-
-/* Free any data or state associated with a successful launchd checkin. */
-void smb_launchd_checkout(struct smb_launch_info *linfo);
index d53d6c3418af4fd1a5c213c087320b3bfd583948..aea429d2ea1f3950fa479ca9f357a6aa932a0143 100644 (file)
 #define SMB_LARGE_LKLEN_OFFSET_HIGH(indx) (12 + (20 * (indx)))
 #define SMB_LARGE_LKLEN_OFFSET_LOW(indx) (16 + (20 * (indx)))
 
-#define ERROR_DOS(class,code) error_packet(inbuf,outbuf,class,code,NT_STATUS_OK,__LINE__,__FILE__)
-#define ERROR_NT(status) error_packet(inbuf,outbuf,0,0,status,__LINE__,__FILE__)
-#define ERROR_FORCE_NT(status) error_packet(inbuf,outbuf,-1,-1,status,__LINE__,__FILE__)
-#define ERROR_BOTH(status,class,code) error_packet(inbuf,outbuf,class,code,status,__LINE__,__FILE__)
+#define ERROR_DOS(class,code) error_packet(outbuf,class,code,NT_STATUS_OK,__LINE__,__FILE__)
+#define ERROR_NT(status) error_packet(outbuf,0,0,status,__LINE__,__FILE__)
+#define ERROR_OPEN(status) error_open(outbuf,status,__LINE__,__FILE__)
+#define ERROR_FORCE_NT(status) error_packet(outbuf,-1,-1,status,__LINE__,__FILE__)
+#define ERROR_BOTH(status,class,code) error_packet(outbuf,class,code,status,__LINE__,__FILE__)
 
 #define reply_nterror(req,status) reply_nt_error(req,status,__LINE__,__FILE__)
 #define reply_force_nterror(req,status) reply_force_nt_error(req,status,__LINE__,__FILE__)
 #define reply_unixerror(req,defclass,deferror) reply_unix_error(req,defclass,deferror,NT_STATUS_OK,__LINE__,__FILE__)
 
 /* this is how errors are generated */
-#define UNIXERROR(defclass,deferror) unix_error_packet(inbuf,outbuf,defclass,deferror,NT_STATUS_OK,__LINE__,__FILE__)
+#define UNIXERROR(defclass,deferror) unix_error_packet(outbuf,defclass,deferror,NT_STATUS_OK,__LINE__,__FILE__)
 
 /* these are the datagram types */
 #define DGRAM_DIRECT_UNIQUE 0x10
@@ -378,4 +379,12 @@ do { \
 #define ADD_TO_LARGE_ARRAY(mem_ctx, type, elem, array, num, size) \
        add_to_large_array((mem_ctx), sizeof(type), &(elem), (void *)(array), (num), (size));
 
+#ifndef ISDOT
+#define ISDOT(p) (*(p) == '.' && *((p) + 1) == '\0')
+#endif /* ISDOT */
+
+#ifndef ISDOTDOT
+#define ISDOTDOT(p) (*(p) == '.' && *((p) + 1) == '.' && *((p) + 2) == '\0')
+#endif /* ISDOTDOT */
+
 #endif /* _SMB_MACROS_H */
index 5cc50b193cc8af02883db641a99a82f53c01f97c..f7f3ef21497579cbfc9063c978a7e1bb17c5d09f 100644 (file)
@@ -530,8 +530,7 @@ findfirst/findnext is SMB_FIND_FILE_UNIX_INFO2.
 #define CIFS_UNIX_POSIX_PATH_OPERATIONS_CAP       0x20 /* We can cope with POSIX open/mkdir/unlink etc. */
 #define CIFS_UNIX_LARGE_READ_CAP           0x40 /* We can cope with 24 bit reads in readX. */
 #define CIFS_UNIX_LARGE_WRITE_CAP          0x80 /* We can cope with 24 bit writes in writeX. */
-#define CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP     0x100 /* We can do SPNEGO negotiations for encryption. */
-#define CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP   0x200 /* We *must* SPNEGO negotiations for encryption. */
+
 
 #define SMB_QUERY_POSIX_FS_INFO     0x201
 
@@ -654,27 +653,6 @@ enum smb_whoami_flags {
        DOM_SID[] -             list of SIDs (may be empty)
 */
 
-/*
- * The following trans2 is done between client and server 
- * as a FSINFO call to set up the encryption state for transport
- * encryption.
- *
- * The request looks like :
- *
- * [data block] -> SPNEGO framed GSSAPI request.
- *
- * The reply looks like :
- *
- * [data block] -> SPNEGO framed GSSAPI reply - if error
- *                 is NT_STATUS_OK then we're done, if it's
- *                 NT_STATUS_MORE_PROCESSING_REQUIRED then the
- *                 client needs to keep going. If it's an
- *                 error it can be any NT_STATUS error.
- *
- */
-
-#define SMB_REQUEST_TRANSPORT_ENCRYPTION     0x203
-
 /* The query/set info levels for POSIX ACLs. */
 #define SMB_QUERY_POSIX_ACL  0x204
 #define SMB_SET_POSIX_ACL  0x204
index be691dc7ec9c5113b3f055faf11a589b9d1bd5c4..24462d6789270519f9fcf270f96f71b0168a9767 100644 (file)
@@ -72,8 +72,7 @@ static struct db_record *db_tdb_fetch_locked(struct db_context *db,
        result->delete_rec = db_tdb_delete;
 
        if (DEBUGLEVEL > 10) {
-               char *keystr = hex_encode(NULL, (unsigned char *)key.dptr,
-                                         key.dsize);
+               char *keystr = hex_encode(NULL, key.dptr, key.dsize);
                DEBUG(10, (DEBUGLEVEL > 10
                           ? "Locking key %s\n" : "Locking key %20s\n",
                           keystr));
index cdda964f66d452de48d8c17addeb7d2f92fd7365..38bec5270d292adcd83403093afbb6fb92b17bbd 100644 (file)
@@ -47,23 +47,3 @@ NTSTATUS can_delete_directory(struct connection_struct *conn,
        return NT_STATUS_OK;
 }
 
-NTSTATUS srv_decrypt_buffer(char *buf)
-{
-       return NT_STATUS_OK;
-}
-
-NTSTATUS srv_encrypt_buffer(char *buffer, char **buf_out)
-{
-       *buf_out = buffer;
-       return NT_STATUS_OK;
-}
-
-void srv_free_enc_buffer(char *buf)
-{
-       ;
-}
-
-BOOL srv_encryption_on(void)
-{
-       return False;
-}
diff --git a/source3/lib/launchd.c b/source3/lib/launchd.c
deleted file mode 100644 (file)
index 97480f9..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
-   Unix SMB/CIFS implementation.
-   Launchd integration wrapper API
-
-   Copyright (C) 2007 James Peach
-
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "smb_launchd.h"
-
-/* launchd source code and documentation is available here:
- *     http://launchd.macosforge.org/
- */
-
-#if defined(WITH_LAUNCHD_SUPPORT)
-
-#include <launch.h>
-#include <stdarg.h>
-
-typedef void (*launchd_iterator)(launch_data_t, const char*, void*);
-
-#define LAUNCHD_TRACE_LEVEL 10
-
- void smb_launchd_checkout(struct smb_launch_info *linfo)
-{
-       talloc_free(linfo->socket_list);
-}
-
-static void pull_launch_sockets(launch_data_t key,
-                               const char *name,
-                               struct smb_launch_info *linfo)
-{
-       launch_data_type_t type;
-
-       type = launch_data_get_type(key);
-       DEBUG(LAUNCHD_TRACE_LEVEL,
-               ("Searching item name='%s' type=%d for sockets\n",
-                name ? name : "", (int)type));
-
-       switch (type) {
-       case LAUNCH_DATA_FD:
-               if (!linfo->socket_list) {
-                       /* We are counting the number of sockets. */
-                       linfo->num_sockets++;
-               } else {
-                       /* We are collecting the socket fds. */
-                       int fd = launch_data_get_fd(key);
-
-                       linfo->socket_list[linfo->num_sockets] = fd;
-                       linfo->num_sockets++;
-                       DEBUG(LAUNCHD_TRACE_LEVEL,
-                               ("Added fd=%d to launchd set\n", fd));
-               }
-               return;
-       case LAUNCH_DATA_ARRAY:
-       {
-               int i;
-               launch_data_t item;
-
-               for (i = 0; i < launch_data_array_get_count(key); ++i) {
-                       item = launch_data_array_get_index(key, i);
-                       pull_launch_sockets(item, name, linfo);
-               }
-               return;
-       }
-       case LAUNCH_DATA_DICTIONARY:
-               launch_data_dict_iterate(key,
-                       (launchd_iterator)pull_launch_sockets, linfo);
-               return;
-       default:
-               return;
-       }
-}
-
- BOOL smb_launchd_checkin_names(struct smb_launch_info *linfo, ...)
-{
-       launch_data_t msg;
-       launch_data_t resp;
-       launch_data_t item;
-       BOOL is_launchd = False;
-
-       ZERO_STRUCTP(linfo);
-
-       msg = launch_data_new_string(LAUNCH_KEY_CHECKIN);
-       resp = launch_msg(msg);
-       if (resp == NULL) {
-               /* IPC to launchd failed. */
-               launch_data_free(msg);
-               return is_launchd;
-       }
-
-       if (launch_data_get_type(resp) == LAUNCH_DATA_ERRNO) {
-               errno = launch_data_get_errno(resp);
-               goto done;
-       }
-
-       /* At this point, we know we are running under launchd. */
-       linfo->idle_timeout_secs = 600;
-       is_launchd = True;
-
-       if ((item = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_TIMEOUT))) {
-               linfo->idle_timeout_secs = launch_data_get_integer(item);
-       }
-
-       if ((item = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_SOCKETS))) {
-               int count = 0;
-               const char * sockname = NULL;
-               launch_data_t sockdata;
-               va_list args;
-
-               /* Figure out the maximum number of sockets. */
-               va_start(args, linfo);
-               while ((sockname = va_arg(args, const char *))) {
-                   ++count;
-               }
-               va_end(args);
-
-               DEBUG(LAUNCHD_TRACE_LEVEL, ("Found %d launchd sockets\n",
-                                       linfo->num_sockets));
-
-               if (launch_data_dict_get_count(item) < count) {
-                       DEBUG(0, ("%d launchd sockets requested, "
-                           "but only %d are available\n",
-                           count, launch_data_dict_get_count(item)));
-               }
-
-               linfo->socket_list = TALLOC_ARRAY(NULL, int, count);
-               if (linfo->socket_list == NULL) {
-                       goto done;
-               }
-
-               linfo->num_sockets = 0;
-               va_start(args, linfo);
-               while ((sockname = va_arg(args, const char *))) {
-                   sockdata = launch_data_dict_lookup(item, sockname);
-
-                   pull_launch_sockets(sockdata, sockname, linfo);
-                   DEBUG(LAUNCHD_TRACE_LEVEL,
-                           ("Added launchd socket \"%s\"\n", sockname));
-               }
-
-               SMB_ASSERT(count >= linfo->num_sockets);
-       }
-
-done:
-       launch_data_free(msg);
-       launch_data_free(resp);
-       return is_launchd;
-}
-
- BOOL smb_launchd_checkin(struct smb_launch_info *linfo)
-{
-       launch_data_t msg;
-       launch_data_t resp;
-       launch_data_t item;
-       BOOL is_launchd = False;
-
-       ZERO_STRUCTP(linfo);
-
-       msg = launch_data_new_string(LAUNCH_KEY_CHECKIN);
-       resp = launch_msg(msg);
-       if (resp == NULL) {
-               /* IPC to launchd failed. */
-               launch_data_free(msg);
-               return is_launchd;
-       }
-
-       if (launch_data_get_type(resp) == LAUNCH_DATA_ERRNO) {
-               errno = launch_data_get_errno(resp);
-               goto done;
-       }
-
-       /* At this point, we know we are running under launchd. */
-       linfo->idle_timeout_secs = 600;
-       is_launchd = True;
-
-       if ((item = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_TIMEOUT))) {
-               linfo->idle_timeout_secs = launch_data_get_integer(item);
-       }
-
-       if ((item = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_SOCKETS))) {
-               int count;
-
-               pull_launch_sockets(item, NULL, linfo);
-               DEBUG(LAUNCHD_TRACE_LEVEL, ("Found %d launchd sockets\n",
-                                       linfo->num_sockets));
-
-               count = linfo->num_sockets;
-               linfo->socket_list = TALLOC_ARRAY(NULL, int, count);
-               if (linfo->socket_list == NULL) {
-                       goto done;
-               }
-
-               linfo->num_sockets = 0;
-               pull_launch_sockets(item, NULL, linfo);
-
-               DEBUG(LAUNCHD_TRACE_LEVEL, ("Added %d launchd sockets\n",
-                                       linfo->num_sockets));
-
-               SMB_ASSERT(count == linfo->num_sockets);
-       }
-
-done:
-       launch_data_free(msg);
-       launch_data_free(resp);
-       return is_launchd;
-}
-
-#else /* defined(WITH_LAUNCHD_SUPPORT) */
-
- BOOL smb_launchd_checkin(struct smb_launch_info * UNUSED(linfo))
-{
-       ZERO_STRUCTP(linfo);
-       return False;
-}
-
- BOOL smb_launchd_checkin_names(struct smb_launch_info * UNUSED(linfo), ...)
-{
-       ZERO_STRUCTP(linfo);
-       return False;
-}
-
- void smb_launchd_checkout(struct smb_launch_info * UNUSED(linfo))
-{
-}
-
-#endif /* defined(WITH_LAUNCHD_SUPPORT) */
-
diff --git a/source3/lib/replace/system/getaddrinfo.h b/source3/lib/replace/system/getaddrinfo.h
new file mode 100644 (file)
index 0000000..e69de29
index 80233c5080f74ba885e3ea97e647c1d5b4d1aa93..57df02f7216f7b7a7141104ecaaf6f30368e5b77 100644 (file)
@@ -767,3 +767,21 @@ void standard_sub_advanced(const char *servicename, const char *user,
                SAFE_FREE( s );
        }
 }
+
+/****************************************************************************
+ *  Do some standard substitutions in a string.
+ *  ****************************************************************************/
+
+void standard_sub_conn(connection_struct *conn, char *str, size_t len)
+{
+       char *s;
+
+       s = alloc_sub_advanced(lp_servicename(SNUM(conn)), conn->user, conn->connectpath,
+                              conn->gid, smb_user_name, "", str);
+
+       if ( s ) {
+               strncpy( str, s, len );
+               SAFE_FREE( s );
+       }
+}
+
index d2f2c23d7296901cf3d83f178fead2f34094df56..032b0ca6382a6d26a2b581df93a16cb69b15a0a7 100644 (file)
 typedef uint32_t tdb_len_t;
 typedef uint32_t tdb_off_t;
 
+#ifndef offsetof
+#define offsetof(t,f) ((unsigned int)&((t *)0)->f)
+#endif
+
 #define TDB_MAGIC_FOOD "TDB file\n"
 #define TDB_VERSION (0x26011967 + 6)
 #define TDB_MAGIC (0x26011999U)
index b98441ea53d0eb531deaeaa3548105bdb044c719..adbebb04d458544fd19ea489d705ebfdf03e1217 100644 (file)
@@ -514,51 +514,32 @@ void show_msg(char *buf)
        dump_data(10, (uint8 *)smb_buf(buf), bcc);      
 }
 
-/*******************************************************************
- Set the length and marker of an encrypted smb packet.
-********************************************************************/
-
-void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)
-{
-       _smb_setlen(buf,len);
-
-       SCVAL(buf,4,0xFF);
-       SCVAL(buf,5,'E');
-       SSVAL(buf,6,enc_ctx_num);
-}
-
 /*******************************************************************
  Set the length and marker of an smb packet.
 ********************************************************************/
 
-void smb_setlen(const char *frombuf, char *buf, int len)
+void smb_setlen(char *buf,int len)
 {
        _smb_setlen(buf,len);
 
-       if (frombuf) {
-               if (buf != frombuf) {
-                       memcpy(buf+4, frombuf+4, 4);
-               }
-       } else {
-               SCVAL(buf,4,0xFF);
-               SCVAL(buf,5,'S');
-               SCVAL(buf,6,'M');
-               SCVAL(buf,7,'B');
-       }
+       SCVAL(buf,4,0xFF);
+       SCVAL(buf,5,'S');
+       SCVAL(buf,6,'M');
+       SCVAL(buf,7,'B');
 }
 
 /*******************************************************************
  Setup the word count and byte count for a smb message.
 ********************************************************************/
 
-int set_message(const char *frombuf, char *buf,int num_words,int num_bytes,BOOL zero)
+int set_message(char *buf,int num_words,int num_bytes,BOOL zero)
 {
        if (zero && (num_words || num_bytes)) {
                memset(buf + smb_size,'\0',num_words*2 + num_bytes);
        }
        SCVAL(buf,smb_wct,num_words);
        SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);  
-       smb_setlen(frombuf, buf,smb_size + num_words*2 + num_bytes - 4);
+       smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
        return (smb_size + num_words*2 + num_bytes);
 }
 
@@ -566,11 +547,11 @@ int set_message(const char *frombuf, char *buf,int num_words,int num_bytes,BOOL
  Setup only the byte count for a smb message.
 ********************************************************************/
 
-int set_message_bcc(const char *frombuf, char *buf,int num_bytes)
+int set_message_bcc(char *buf,int num_bytes)
 {
        int num_words = CVAL(buf,smb_wct);
        SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);  
-       smb_setlen(frombuf, buf,smb_size + num_words*2 + num_bytes - 4);
+       smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
        return (smb_size + num_words*2 + num_bytes);
 }
 
@@ -579,11 +560,9 @@ int set_message_bcc(const char *frombuf, char *buf,int num_bytes)
  message as a marker.
 ********************************************************************/
 
-int set_message_end(const char *frombuf, void *outbuf,void *end_ptr)
+int set_message_end(void *outbuf,void *end_ptr)
 {
-       return set_message_bcc(frombuf,
-                       (char *)outbuf,
-                       PTR_DIFF(end_ptr,smb_buf((char *)outbuf)));
+       return set_message_bcc((char *)outbuf,PTR_DIFF(end_ptr,smb_buf((char *)outbuf)));
 }
 
 /*******************************************************************
@@ -603,7 +582,7 @@ ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
        *outbuf = tmp;
 
        memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
-       set_message_bcc(NULL, (char *)tmp, smb_buflen(tmp) + blob.length);
+       set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
        return blob.length;
 }
 
@@ -2296,8 +2275,9 @@ void print_asc(int level, const unsigned char *buf,int len)
                DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
 }
 
-void dump_data(int level, const unsigned char *buf,int len)
+void dump_data(int level, const unsigned char *buf1,int len)
 {
+       const unsigned char *buf = (const unsigned char *)buf1;
        int i=0;
        if (len<=0) return;
 
index d061d73a81871318ab16b9c1461eb37a14291bb1..1508ddfce34ec0a733ec06a105e928f1afbd6408 100644 (file)
@@ -815,19 +815,6 @@ BOOL receive_smb(int fd, char *buffer, unsigned int timeout)
                return False;
        }
 
-       if (srv_encryption_on()) {
-               NTSTATUS status = srv_decrypt_buffer(buffer);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("receive_smb: SMB decryption failed "
-                               "on incoming packet! Error %s\n",
-                               nt_errstr(status) ));
-                       if (smb_read_error == 0) {
-                               smb_read_error = READ_BAD_DECRYPT;
-                       }
-                       return False;
-               }
-       }
-
        /* Check the incoming SMB signature. */
        if (!srv_check_sign_mac(buffer, True)) {
                DEBUG(0, ("receive_smb: SMB Signature verification "
@@ -852,19 +839,6 @@ ssize_t receive_smb_talloc(TALLOC_CTX *mem_ctx, int fd, char **buffer,
                return -1;
        }
 
-       if (srv_encryption_on()) {
-               NTSTATUS status = srv_decrypt_buffer(*buffer);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("receive_smb: SMB decryption failed on "
-                                 "incoming packet! Error %s\n",
-                                 nt_errstr(status) ));
-                       if (smb_read_error == 0) {
-                               smb_read_error = READ_BAD_DECRYPT;
-                       }
-                       return -1;
-               }
-       }
-
        /* Check the incoming SMB signature. */
        if (!srv_check_sign_mac(*buffer, True)) {
                DEBUG(0, ("receive_smb: SMB Signature verification failed on "
@@ -887,35 +861,22 @@ BOOL send_smb(int fd, char *buffer)
        size_t len;
        size_t nwritten=0;
        ssize_t ret;
-       char *buf_out = buffer;
 
        /* Sign the outgoing packet if required. */
-       srv_calculate_sign_mac(buf_out);
-
-       if (srv_encryption_on()) {
-               NTSTATUS status = srv_encrypt_buffer(buffer, &buf_out);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("send_smb: SMB encryption failed "
-                               "on outgoing packet! Error %s\n",
-                               nt_errstr(status) ));
-                       return False;
-               }
-       }
+       srv_calculate_sign_mac(buffer);
 
-       len = smb_len(buf_out) + 4;
+       len = smb_len(buffer) + 4;
 
        while (nwritten < len) {
-               ret = write_data(fd,buf_out+nwritten,len - nwritten);
+               ret = write_data(fd,buffer+nwritten,len - nwritten);
                if (ret <= 0) {
                        DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n",
                                (int)len,(int)ret, strerror(errno) ));
-                       srv_free_enc_buffer(buf_out);
                        return False;
                }
                nwritten += ret;
        }
 
-       srv_free_enc_buffer(buf_out);
        return True;
 }
 
index db5775b79fd16790f39794f60134715e432ca8bb..fbd9c1ca6daf1da762c80b4810c9f50436dd7390 100644 (file)
@@ -447,7 +447,6 @@ BOOL strisnormal(const char *s, int case_default)
  String replace.
  NOTE: oldc and newc must be 7 bit characters
 **/
-
 void string_replace( char *s, char oldc, char newc )
 {
        char *p;
index 742304b6fc4976a55c392b12b7c197b1e3c489fe..3f0ab576386e98b4617ca7fb064672a71e5b34bb 100644 (file)
@@ -83,10 +83,6 @@ NTSTATUS ads_ntstatus(ADS_STATUS status)
 #ifdef HAVE_KRB5
        case ENUM_ADS_ERROR_KRB5:
                return krb5_to_nt_status(status.err.rc);
-#endif
-#ifdef HAVE_GSSAPI
-       case ENUM_ADS_ERROR_GSS:
-               return map_nt_error_from_gss(status.err.rc, status.minor_status);
 #endif
        default:
                break;
@@ -146,12 +142,3 @@ const char *ads_errstr(ADS_STATUS status)
        }
 }
 
-#ifdef HAVE_GSSAPI
-NTSTATUS gss_err_to_ntstatus(uint32 maj, uint32 min)
-{
-       ADS_STATUS adss = ADS_ERROR_GSS(maj, min);
-       DEBUG(10,("gss_err_to_ntstatus: Error %s\n",
-               ads_errstr(adss) ));
-       return ads_ntstatus(adss);
-}
-#endif
index 2f5c11b90c3c68bf591031ba5fddc01cee5b7e6a..18f7da81d71bcb5dcaf54b5cdafbd930a2ca8b7f 100644 (file)
@@ -60,8 +60,8 @@ static ADS_STATUS ads_do_search_retry_internal(ADS_STRUCT *ads, const char *bind
                status = ads_do_search_all_args(ads, bp, scope, expr, attrs, args, res);
        }
        if (ADS_ERR_OK(status)) {
-               DEBUG(5,("Search for %s in <%s> gave %d replies\n",
-                       expr, bp, ads_count_replies(ads, *res)));
+               DEBUG(5,("Search for %s in <%s> gave %d replies\n",
+                        expr, bp, ads_count_replies(ads, *res)));
                SAFE_FREE(bp);
                return status;
        }
@@ -159,6 +159,21 @@ static ADS_STATUS ads_do_search_retry_internal(ADS_STRUCT *ads, const char *bind
                                        "(objectclass=*)", attrs, &args, res);
 }
 
+ ADS_STATUS ads_search_retry_dn_sd_flags(ADS_STRUCT *ads, LDAPMessage **res, 
+                                        uint32 sd_flags,
+                                        const char *dn, 
+                                        const char **attrs)
+{
+       ads_control args;
+
+       args.control = ADS_SD_FLAGS_OID;
+       args.val = sd_flags;
+       args.critical = True;
+
+       return ads_do_search_retry_args(ads, dn, LDAP_SCOPE_BASE,
+                                       "(objectclass=*)", attrs, &args, res);
+}
+
  ADS_STATUS ads_search_retry_extended_dn_ranged(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx, 
                                                const char *dn, 
                                                const char **attrs,
@@ -181,21 +196,6 @@ static ADS_STATUS ads_do_search_retry_internal(ADS_STRUCT *ads, const char *bind
                                 "(objectclass=*)", &args, attrs[0],
                                 strings, num_strings);
 
-}
-
- ADS_STATUS ads_search_retry_dn_sd_flags(ADS_STRUCT *ads, LDAPMessage **res, 
-                                        uint32 sd_flags,
-                                        const char *dn, 
-                                        const char **attrs)
-{
-       ads_control args;
-
-       args.control = ADS_SD_FLAGS_OID;
-       args.val = sd_flags;
-       args.critical = True;
-
-       return ads_do_search_retry_args(ads, dn, LDAP_SCOPE_BASE,
-                                       "(objectclass=*)", attrs, &args, res);
 }
 
  ADS_STATUS ads_search_retry_sid(ADS_STRUCT *ads, LDAPMessage **res, 
diff --git a/source3/libmsrpc/Doxyfile b/source3/libmsrpc/Doxyfile
deleted file mode 100644 (file)
index f4e6f5e..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-# Doxyfile 0.1
-
-#---------------------------------------------------------------------------
-# General configuration options
-#---------------------------------------------------------------------------
-PROJECT_NAME           = libmsrpc
-PROJECT_NUMBER         = 
-
-# NOTE: By default, Doxygen writes into the dox/ subdirectory of the
-# invocation directory.  If you want to put it somewhere else, for
-# example, to write straight into a webserver directory, then override
-# this variable in a configuration concatenated to this one: Doxygen
-# doesn't mind variables being redefined.
-
-OUTPUT_DIRECTORY       = dox
-
-OUTPUT_LANGUAGE        = English
-EXTRACT_ALL            = YES
-EXTRACT_PRIVATE        = YES
-EXTRACT_STATIC         = YES
-HIDE_UNDOC_MEMBERS     = NO
-HIDE_UNDOC_CLASSES     = NO
-BRIEF_MEMBER_DESC      = YES
-REPEAT_BRIEF           = YES
-ALWAYS_DETAILED_SEC    = NO
-FULL_PATH_NAMES        = YES
-STRIP_FROM_PATH        = $(PWD)/
-INTERNAL_DOCS          = YES
-CLASS_DIAGRAMS         = YES
-SOURCE_BROWSER         = YES
-INLINE_SOURCES         = YES
-STRIP_CODE_COMMENTS    = NO
-CASE_SENSE_NAMES       = YES
-SHORT_NAMES            = NO
-HIDE_SCOPE_NAMES       = YES
-VERBATIM_HEADERS       = YES
-SHOW_INCLUDE_FILES     = YES
-JAVADOC_AUTOBRIEF      = YES
-INHERIT_DOCS           = YES
-INLINE_INFO            = YES
-SORT_MEMBER_DOCS       = NO
-DISTRIBUTE_GROUP_DOC   = NO
-TAB_SIZE               = 8
-GENERATE_TODOLIST      = YES
-GENERATE_TESTLIST      = YES
-GENERATE_BUGLIST       = YES
-ALIASES                = 
-ENABLED_SECTIONS       = 
-MAX_INITIALIZER_LINES  = 30
-OPTIMIZE_OUTPUT_FOR_C  = YES
-SHOW_USED_FILES        = YES
-REFERENCED_BY_RELATION = YES
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-QUIET                  = YES
-WARNINGS               = NO
-WARN_IF_UNDOCUMENTED   = NO
-WARN_FORMAT            = "$file:$line: $text"
-WARN_LOGFILE           = 
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-INPUT                  = ../include/ 
-FILE_PATTERNS          = libmsrpc.h 
-RECURSIVE              = YES
-EXCLUDE                =
-EXCLUDE_PATTERNS       = 
-EXAMPLE_PATH           = 
-EXAMPLE_PATTERNS       = 
-IMAGE_PATH             = 
-INPUT_FILTER           = 
-FILTER_SOURCE_FILES    = NO
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-ALPHABETICAL_INDEX     = YES
-COLS_IN_ALPHA_INDEX    = 1
-IGNORE_PREFIX          = 
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-GENERATE_HTML          = YES
-HTML_OUTPUT            = .
-HTML_HEADER            = 
-HTML_FOOTER            = 
-HTML_STYLESHEET        = 
-HTML_ALIGN_MEMBERS     = YES
-GENERATE_HTMLHELP      = NO
-GENERATE_CHI           = NO
-BINARY_TOC             = NO
-TOC_EXPAND             = NO
-DISABLE_INDEX          = NO
-ENUM_VALUES_PER_LINE   = 3
-GENERATE_TREEVIEW      = NO
-TREEVIEW_WIDTH         = 250
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-GENERATE_LATEX         = NO
-LATEX_OUTPUT           = latex
-COMPACT_LATEX          = NO
-PAPER_TYPE             = a4wide
-EXTRA_PACKAGES         = 
-LATEX_HEADER           = 
-PDF_HYPERLINKS         = YES
-USE_PDFLATEX           = YES
-LATEX_BATCHMODE        = YES
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-GENERATE_RTF           = NO
-RTF_OUTPUT             = rtf
-COMPACT_RTF            = NO
-RTF_HYPERLINKS         = NO
-RTF_STYLESHEET_FILE    = 
-RTF_EXTENSIONS_FILE    = 
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-GENERATE_MAN           = NO
-MAN_OUTPUT             = man
-MAN_EXTENSION          = .3
-MAN_LINKS              = NO
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML           = NO
-#---------------------------------------------------------------------------
-# configuration options related to the preprocessor   
-#---------------------------------------------------------------------------
-ENABLE_PREPROCESSING   = NO
-MACRO_EXPANSION        = NO
-EXPAND_ONLY_PREDEF     = NO
-SEARCH_INCLUDES        = YES
-INCLUDE_PATH           = 
-INCLUDE_FILE_PATTERNS  = 
-PREDEFINED             = 
-EXPAND_AS_DEFINED      = 
-SKIP_FUNCTION_MACROS   = YES
-#---------------------------------------------------------------------------
-# configuration::additions related to external references   
-#---------------------------------------------------------------------------
-TAGFILES               = 
-GENERATE_TAGFILE       = 
-ALLEXTERNALS           = NO
-PERL_PATH              = /usr/bin/perl
-#---------------------------------------------------------------------------
-# configuration options related to the dot tool   
-#---------------------------------------------------------------------------
-HAVE_DOT               = NO
-CLASS_GRAPH            = YES
-COLLABORATION_GRAPH    = YES
-TEMPLATE_RELATIONS     = YES
-INCLUDE_GRAPH          = YES
-INCLUDED_BY_GRAPH      = YES
-GRAPHICAL_HIERARCHY    = YES
-DOT_PATH               = 
-DOTFILE_DIRS           = 
-MAX_DOT_GRAPH_WIDTH    = 1024
-MAX_DOT_GRAPH_HEIGHT   = 1024
-GENERATE_LEGEND        = YES
-DOT_CLEANUP            = YES
-#---------------------------------------------------------------------------
-# configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-SEARCHENGINE           = NO
-CGI_NAME               = search.cgi
-CGI_URL                = 
-DOC_URL                = 
-DOC_ABSPATH            = 
-BIN_ABSPATH            = /usr/local/bin/
-EXT_DOC_PATHS          = 
diff --git a/source3/libmsrpc/cac_lsarpc.c b/source3/libmsrpc/cac_lsarpc.c
deleted file mode 100644 (file)
index 5ff8f51..0000000
+++ /dev/null
@@ -1,1255 +0,0 @@
-
-/* 
- *  Unix SMB/CIFS implementation.
- *  MS-RPC client library implementation (LSA pipe)
- *  Copyright (C) Chris Nicholls              2005.
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "libmsrpc.h"
-#include "libsmb_internal.h"
-
-int cac_LsaOpenPolicy( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct LsaOpenPolicy *op )
-{
-       SMBCSRV *srv = NULL;
-       POLICY_HND *policy = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !mem_ctx || !op ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       op->out.pol = NULL;
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       /*see if there is already an active session on this pipe, if not then open one */
-       if ( !hnd->_internal.pipes[PI_LSARPC] ) {
-               pipe_hnd =
-                       cli_rpc_pipe_open_noauth( srv->cli, PI_LSARPC,
-                                                 &hnd->status );
-
-               if ( !pipe_hnd ) {
-                       hnd->status = NT_STATUS_UNSUCCESSFUL;
-                       return CAC_FAILURE;
-               }
-
-               hnd->_internal.pipes[PI_LSARPC] = True;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       policy = TALLOC_P( mem_ctx, POLICY_HND );
-       if ( !policy ) {
-               errno = ENOMEM;
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       /*need to make sure that our nt status is good otherwise check might fail below */
-       hnd->status = NT_STATUS_OK;
-
-       if ( hnd->_internal.srv_level >= SRV_WIN_2K ) {
-
-               /*try using open_policy2, if this fails try again in next block using open_policy, if that works then adjust hnd->_internal.srv_level */
-
-               /*we shouldn't need to modify the access mask to make it work here */
-               hnd->status =
-                       rpccli_lsa_open_policy2( pipe_hnd, mem_ctx,
-                                                op->in.security_qos,
-                                                op->in.access, policy );
-
-       }
-
-       if ( hnd->_internal.srv_level < SRV_WIN_2K
-            || !NT_STATUS_IS_OK( hnd->status ) ) {
-               hnd->status =
-                       rpccli_lsa_open_policy( pipe_hnd, mem_ctx,
-                                               op->in.security_qos,
-                                               op->in.access, policy );
-
-               if ( hnd->_internal.srv_level > SRV_WIN_NT4
-                    && NT_STATUS_IS_OK( hnd->status ) ) {
-                       /*change the server level to 1 */
-                       hnd->_internal.srv_level = SRV_WIN_NT4;
-               }
-
-       }
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.pol = policy;
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaClosePolicy( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       POLICY_HND * pol )
-{
-
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !pol )
-               return CAC_SUCCESS;     /*if the policy handle doesnt exist then it's already closed */
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status = rpccli_lsa_Close( pipe_hnd, mem_ctx, pol );
-
-       TALLOC_FREE( pol );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaGetNamesFromSids( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct LsaGetNamesFromSids *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       int result = -1;
-
-       int i;
-
-       /*buffers for outputs */
-       char **domains = NULL;
-       char **names = NULL;
-       enum lsa_SidType *types = NULL;
-
-       CacSidInfo *sids_out = NULL;
-       DOM_SID *unknown_out = NULL;
-       int num_unknown = 0;
-
-       int num_sids;
-
-       int found_idx;
-       int unknown_idx;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !mem_ctx || !op || !op->in.pol || !op->in.sids ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       num_sids = op->in.num_sids;
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-
-
-       /*now actually lookup the names */
-       hnd->status =
-               rpccli_lsa_lookup_sids( pipe_hnd, mem_ctx, op->in.pol,
-                                       op->in.num_sids, op->in.sids,
-                                       &domains, &names, &types );
-
-       if ( NT_STATUS_IS_OK( hnd->status ) ) {
-               /*this is the easy part, just make the out.sids array */
-               if (num_sids) {
-                       sids_out = TALLOC_ARRAY( mem_ctx, CacSidInfo, num_sids );
-                       if ( !sids_out ) {
-                               errno = ENOMEM;
-                               hnd->status = NT_STATUS_NO_MEMORY;
-                               return CAC_FAILURE;
-                       }
-               } else {
-                       sids_out = NULL;
-               }
-
-               for ( i = 0; i < num_sids; i++ ) {
-                       sids_out[i].sid = op->in.sids[i];
-                       sids_out[i].name = names[i];
-                       sids_out[i].domain = domains[i];
-               }
-
-               result = CAC_SUCCESS;
-       } else if ( NT_STATUS_V( hnd->status ) ==
-                   NT_STATUS_V( STATUS_SOME_UNMAPPED ) ) {
-               /*first find out how many couldn't be looked up */
-
-               for ( i = 0; i < num_sids; i++ ) {
-                       if ( names[i] == NULL ) {
-                               num_unknown++;
-                       }
-               }
-
-               if ( num_unknown >= num_sids ) {
-                       hnd->status = NT_STATUS_UNSUCCESSFUL;
-                       return CAC_FAILURE;
-               }
-
-               if ( num_sids - num_unknown) {
-                       sids_out =
-                               TALLOC_ARRAY( mem_ctx, CacSidInfo,
-                                     ( num_sids - num_unknown ) );
-                       if ( !sids_out ) {
-                               errno = ENOMEM;
-                               hnd->status = NT_STATUS_NO_MEMORY;
-                               return CAC_FAILURE;
-                       }
-               } else {
-                       sids_out = NULL;
-               }
-
-               if (num_unknown) {
-                       unknown_out = TALLOC_ARRAY( mem_ctx, DOM_SID, num_unknown );
-                       if ( !unknown_out ) {
-                               errno = ENOMEM;
-                               hnd->status = NT_STATUS_NO_MEMORY;
-                               return CAC_FAILURE;
-                       }
-               } else {
-                       unknown_out = NULL;
-               }
-               found_idx = unknown_idx = 0;
-
-               /*now we can actually do the real work */
-               for ( i = 0; i < num_sids; i++ ) {
-                       if ( names[i] != NULL ) {
-                               sids_out[found_idx].sid = op->in.sids[i];
-                               sids_out[found_idx].name = names[i];
-                               sids_out[found_idx].domain = domains[i];
-
-                               found_idx++;
-                       } else {        /*then this one didnt work out */
-                               unknown_out[unknown_idx] = op->in.sids[i];
-
-                               unknown_idx++;
-                       }
-               }
-
-               result = CAC_PARTIAL_SUCCESS;
-       } else {                /*then it failed for some reason */
-               return CAC_FAILURE;
-       }
-
-       op->out.num_found = num_sids - num_unknown;
-       op->out.sids = sids_out;
-       op->out.unknown = unknown_out;
-
-       return result;
-
-}
-
-int cac_LsaGetSidsFromNames( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct LsaGetSidsFromNames *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       int result = -1;
-
-       int i;
-
-       /*buffers for outputs */
-       DOM_SID *sids = NULL;
-       enum lsa_SidType *types = NULL;
-
-       CacSidInfo *sids_out = NULL;
-       char **unknown_out = NULL;
-       int num_unknown = 0;
-
-       int num_names;
-
-       int found_idx = 0;
-       int unknown_idx = 0;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !mem_ctx || !op || !op->in.pol || !op->in.names ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       num_names = op->in.num_names;
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-
-       /*now actually lookup the names */
-       hnd->status =
-               rpccli_lsa_lookup_names( pipe_hnd, mem_ctx, op->in.pol,
-                                        num_names,
-                                        ( const char ** ) op->in.names, NULL,
-                                        1, &sids, &types );
-
-       if ( NT_STATUS_IS_OK( hnd->status ) ) {
-               /*this is the easy part, just make the out.sids array */
-               if (num_names) {
-                       sids_out = TALLOC_ARRAY( mem_ctx, CacSidInfo, num_names );
-                       if ( !sids_out ) {
-                               errno = ENOMEM;
-                               hnd->status = NT_STATUS_NO_MEMORY;
-                               return CAC_FAILURE;
-                       }
-               } else {
-                       sids_out = NULL;
-               }
-
-               for ( i = 0; i < num_names; i++ ) {
-                       sids_out[i].sid = sids[i];
-                       sids_out[i].name =
-                               talloc_strdup( mem_ctx, op->in.names[i] );
-                       sids_out[i].domain = NULL;
-               }
-
-               result = CAC_SUCCESS;
-       } else if ( NT_STATUS_V( hnd->status ) ==
-                   NT_STATUS_V( STATUS_SOME_UNMAPPED ) ) {
-               /*first find out how many couldn't be looked up */
-
-               for ( i = 0; i < num_names; i++ ) {
-                       if ( types[i] == SID_NAME_UNKNOWN ) {
-                               num_unknown++;
-                       }
-               }
-
-               if ( num_unknown >= num_names ) {
-                       hnd->status = NT_STATUS_UNSUCCESSFUL;
-                       return CAC_FAILURE;
-               }
-
-               if (num_names - num_unknown) {
-                       sids_out =
-                               TALLOC_ARRAY( mem_ctx, CacSidInfo,
-                                     ( num_names - num_unknown ) );
-                       if ( !sids_out ) {
-                               errno = ENOMEM;
-                               hnd->status = NT_STATUS_NO_MEMORY;
-                               return CAC_FAILURE;
-                       }
-               } else {
-                       sids_out = NULL;
-               }
-
-               if (num_unknown) {
-                       unknown_out = TALLOC_ARRAY( mem_ctx, char *, num_unknown );
-                       if ( !unknown_out ) {
-                               errno = ENOMEM;
-                               hnd->status = NT_STATUS_NO_MEMORY;
-                               return CAC_FAILURE;
-                       }
-               } else {
-                       unknown_out = NULL;
-               }
-
-               unknown_idx = found_idx = 0;
-
-               /*now we can actually do the real work */
-               for ( i = 0; i < num_names; i++ ) {
-                       if ( types[i] != SID_NAME_UNKNOWN ) {
-                               sids_out[found_idx].sid = sids[i];
-                               sids_out[found_idx].name =
-                                       talloc_strdup( mem_ctx,
-                                                      op->in.names[i] );
-                               sids_out[found_idx].domain = NULL;
-
-                               found_idx++;
-                       } else {        /*then this one didnt work out */
-                               unknown_out[unknown_idx] =
-                                       talloc_strdup( mem_ctx,
-                                                      op->in.names[i] );
-
-                               unknown_idx++;
-                       }
-               }
-
-               result = CAC_PARTIAL_SUCCESS;
-       } else {                /*then it failed for some reason */
-               return CAC_FAILURE;
-       }
-
-       op->out.num_found = num_names - num_unknown;
-       op->out.sids = sids_out;
-       op->out.unknown = unknown_out;
-
-       return result;
-
-}
-
-int cac_LsaFetchSid( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                    struct LsaFetchSid *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       int result = -1;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !mem_ctx || !op || !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       op->out.local_sid = NULL;
-       op->out.domain_sid = NULL;
-
-       if ( ( op->in.info_class & CAC_LOCAL_INFO ) == CAC_LOCAL_INFO ) {
-               DOM_SID *local_sid = NULL;
-               char *dom_name = NULL;
-
-               hnd->status =
-                       rpccli_lsa_query_info_policy( pipe_hnd, mem_ctx,
-                                                     op->in.pol,
-                                                     CAC_LOCAL_INFO,
-                                                     &dom_name, &local_sid );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-                       result = CAC_FAILURE;
-                       goto domain;
-               }
-
-               op->out.local_sid = talloc( mem_ctx, CacSidInfo );
-               if ( !op->out.local_sid ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       result = CAC_FAILURE;
-                       goto domain;
-               }
-
-               op->out.local_sid->domain = dom_name;
-
-               sid_copy( &op->out.local_sid->sid, local_sid );
-               TALLOC_FREE( local_sid );
-       }
-
-      domain:
-
-       if ( ( op->in.info_class & CAC_DOMAIN_INFO ) == CAC_DOMAIN_INFO ) {
-               DOM_SID *domain_sid;
-               char *dom_name;
-
-               hnd->status =
-                       rpccli_lsa_query_info_policy( pipe_hnd, mem_ctx,
-                                                     op->in.pol,
-                                                     CAC_DOMAIN_INFO,
-                                                     &dom_name,
-                                                     &domain_sid );
-               if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-                       /*if we succeeded above, report partial success */
-                       result = CAC_FAILURE;
-                       goto done;
-               } else if ( result == CAC_FAILURE ) {
-                       /*if we failed above but succeded here then report partial success */
-                       result = CAC_PARTIAL_SUCCESS;
-               }
-
-               op->out.domain_sid = talloc( mem_ctx, CacSidInfo );
-               if ( !op->out.domain_sid ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       result = CAC_FAILURE;
-                       goto done;
-               }
-
-               op->out.domain_sid->domain = dom_name;
-               sid_copy( &op->out.domain_sid->sid, domain_sid );
-               TALLOC_FREE( domain_sid );
-       }
-
-      done:
-       return result;
-}
-
-int cac_LsaQueryInfoPolicy( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                           struct LsaQueryInfoPolicy *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       char *domain_name = NULL;
-       char *dns_name = NULL;
-       char *forest_name = NULL;
-       struct GUID *domain_guid = NULL;
-       DOM_SID *domain_sid = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*only works if info_class parm is 12 */
-       hnd->status =
-               rpccli_lsa_query_info_policy2( pipe_hnd, mem_ctx, op->in.pol,
-                                              12, &domain_name, &dns_name,
-                                              &forest_name, &domain_guid,
-                                              &domain_sid );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.domain_name = domain_name;
-       op->out.dns_name = dns_name;
-       op->out.forest_name = forest_name;
-       op->out.domain_guid = domain_guid;
-       op->out.domain_sid = domain_sid;
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaEnumSids( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                    struct LsaEnumSids *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 num_sids;
-       DOM_SID *sids;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_lsa_enum_sids( pipe_hnd, mem_ctx, op->in.pol,
-                                     &( op->out.resume_idx ),
-                                     op->in.pref_max_sids, &num_sids,
-                                     &sids );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.num_sids = num_sids;
-       op->out.sids = sids;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_LsaEnumAccountRights( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             struct LsaEnumAccountRights *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 count = 0;
-       char **privs = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.name && !op->in.sid ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.name && !op->in.sid ) {
-               DOM_SID *user_sid = NULL;
-               enum lsa_SidType *type;
-
-               /*lookup the SID */
-               hnd->status =
-                       rpccli_lsa_lookup_names( pipe_hnd, mem_ctx,
-                                                op->in.pol, 1,
-                                                ( const char ** ) &( op->in.
-                                                                     name ),
-                                                NULL, 1, &user_sid, &type );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               op->in.sid = user_sid;
-       }
-
-       hnd->status =
-               rpccli_lsa_enum_account_rights( pipe_hnd, mem_ctx, op->in.pol,
-                                               op->in.sid, &count, &privs );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.num_privs = count;
-       op->out.priv_names = privs;
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaEnumTrustedDomains( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                              struct LsaEnumTrustedDomains *op )
-{
-       struct rpc_pipe_client *pipe_hnd;
-
-       uint32 num_domains;
-       char **domain_names;
-       DOM_SID *domain_sids;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_lsa_enum_trust_dom( pipe_hnd, mem_ctx, op->in.pol,
-                                          &( op->out.resume_idx ),
-                                          &num_domains, &domain_names,
-                                          &domain_sids );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.num_domains = num_domains;
-       op->out.domain_names = domain_names;
-       op->out.domain_sids = domain_sids;
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaOpenTrustedDomain( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             struct LsaOpenTrustedDomain *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       POLICY_HND *dom_pol = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.pol || !op->in.access || !op->in.domain_sid ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       dom_pol = talloc( mem_ctx, POLICY_HND );
-       if ( !dom_pol ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               errno = ENOMEM;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_lsa_open_trusted_domain( pipe_hnd, mem_ctx, op->in.pol,
-                                               op->in.domain_sid,
-                                               op->in.access, dom_pol );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.domain_pol = dom_pol;
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaQueryTrustedDomainInfo( CacServerHandle * hnd,
-                                  TALLOC_CTX * mem_ctx,
-                                  struct LsaQueryTrustedDomainInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       LSA_TRUSTED_DOMAIN_INFO *dom_info;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.pol || !op->in.info_class ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.domain_sid && !op->in.domain_name ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.domain_sid ) {
-               hnd->status =
-                       rpccli_lsa_query_trusted_domain_info_by_sid( pipe_hnd,
-                                                                    mem_ctx,
-                                                                    op->in.
-                                                                    pol,
-                                                                    op->in.
-                                                                    info_class,
-                                                                    op->in.
-                                                                    domain_sid,
-                                                                    &dom_info );
-       } else if ( op->in.domain_name ) {
-               hnd->status =
-                       rpccli_lsa_query_trusted_domain_info_by_name
-                       ( pipe_hnd, mem_ctx, op->in.pol, op->in.info_class,
-                         op->in.domain_name, &dom_info );
-       }
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.info = dom_info;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_LsaEnumPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct LsaEnumPrivileges *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 num_privs;
-       char **priv_names;
-       uint32 *high_bits;
-       uint32 *low_bits;
-
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_lsa_enum_privilege( pipe_hnd, mem_ctx, op->in.pol,
-                                          &( op->out.resume_idx ),
-                                          op->in.pref_max_privs, &num_privs,
-                                          &priv_names, &high_bits,
-                                          &low_bits );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.num_privs = num_privs;
-       op->out.priv_names = priv_names;
-       op->out.high_bits = high_bits;
-       op->out.low_bits = low_bits;
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaOpenAccount( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct LsaOpenAccount *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       POLICY_HND *user_pol = NULL;
-
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.sid && !op->in.name ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*look up the user's SID if we have to */
-       if ( op->in.name && !op->in.sid ) {
-               DOM_SID *user_sid = NULL;
-               enum lsa_SidType *type;
-
-               /*lookup the SID */
-               hnd->status =
-                       rpccli_lsa_lookup_names( pipe_hnd, mem_ctx,
-                                                op->in.pol, 1,
-                                                ( const char ** ) &( op->in.
-                                                                     name ),
-                                                NULL, 1, &user_sid, &type );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               op->in.sid = user_sid;
-       }
-
-       user_pol = talloc( mem_ctx, POLICY_HND );
-       if ( !user_pol ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_lsa_open_account( pipe_hnd, mem_ctx, op->in.pol,
-                                        op->in.sid, op->in.access,
-                                        user_pol );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               TALLOC_FREE( user_pol );
-               return CAC_FAILURE;
-       }
-
-       op->out.user = user_pol;
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_LsaAddPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                         struct LsaAddPrivileges *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       DOM_SID *user_sid = NULL;
-       enum lsa_SidType *type = NULL;
-
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol || !op->in.priv_names ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.sid && !op->in.name ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.name && !op->in.sid ) {
-               /*lookup the SID */
-               hnd->status =
-                       rpccli_lsa_lookup_names( pipe_hnd, mem_ctx,
-                                                op->in.pol, 1,
-                                                ( const char ** ) &( op->in.
-                                                                     name ),
-                                                NULL, 1, &user_sid, &type );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               op->in.sid = user_sid;
-       }
-
-       hnd->status =
-               rpccli_lsa_add_account_rights( pipe_hnd, mem_ctx, op->in.pol,
-                                              *( op->in.sid ),
-                                              op->in.num_privs,
-                                              ( const char ** ) op->in.
-                                              priv_names );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaRemovePrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct LsaRemovePrivileges *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       DOM_SID *user_sid = NULL;
-       enum lsa_SidType *type = NULL;
-
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol || !op->in.priv_names ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.sid && !op->in.name ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.name && !op->in.sid ) {
-               /*lookup the SID */
-               hnd->status =
-                       rpccli_lsa_lookup_names( pipe_hnd, mem_ctx,
-                                                op->in.pol, 1,
-                                                ( const char ** ) &( op->in.
-                                                                     name ),
-                                                NULL, 1, &user_sid, &type );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               op->in.sid = user_sid;
-       }
-
-       hnd->status =
-               rpccli_lsa_remove_account_rights( pipe_hnd, mem_ctx,
-                                                 op->in.pol, *( op->in.sid ),
-                                                 False, op->in.num_privs,
-                                                 ( const char ** ) op->in.
-                                                 priv_names );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaClearPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                           struct LsaClearPrivileges *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       DOM_SID *user_sid = NULL;
-       enum lsa_SidType *type = NULL;
-
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.sid && !op->in.name ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.name && !op->in.sid ) {
-               /*lookup the SID */
-               hnd->status =
-                       rpccli_lsa_lookup_names( pipe_hnd, mem_ctx,
-                                                op->in.pol, 1,
-                                                ( const char ** ) &( op->in.
-                                                                     name ),
-                                                NULL, 1, &user_sid, &type );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               op->in.sid = user_sid;
-       }
-
-       hnd->status =
-               rpccli_lsa_remove_account_rights( pipe_hnd, mem_ctx,
-                                                 op->in.pol, *( op->in.sid ),
-                                                 True, 0, NULL );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaSetPrivileges( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                         struct LsaAddPrivileges *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       DOM_SID *user_sid = NULL;
-       enum lsa_SidType *type = NULL;
-
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol || !op->in.priv_names ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.sid && !op->in.name ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.name && !op->in.sid ) {
-               /*lookup the SID */
-               hnd->status =
-                       rpccli_lsa_lookup_names( pipe_hnd, mem_ctx,
-                                                op->in.pol, 1,
-                                                ( const char ** ) &( op->in.
-                                                                     name ),
-                                                NULL, 1, &user_sid, &type );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               op->in.sid = user_sid;
-       }
-
-       /*first remove all privileges */
-       hnd->status =
-               rpccli_lsa_remove_account_rights( pipe_hnd, mem_ctx,
-                                                 op->in.pol, *( op->in.sid ),
-                                                 True, 0, NULL );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_lsa_add_account_rights( pipe_hnd, mem_ctx, op->in.pol,
-                                              *( op->in.sid ),
-                                              op->in.num_privs,
-                                              ( const char ** ) op->in.
-                                              priv_names );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_LsaGetSecurityObject( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             struct LsaGetSecurityObject *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       /*this is taken from rpcclient/cmd_lsarpc.c */
-       uint16 info_level = 4;
-
-       SEC_DESC_BUF *sec_out = NULL;
-
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_LSARPC] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.pol ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_LSARPC );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_lsa_query_secobj( pipe_hnd, mem_ctx, op->in.pol,
-                                        info_level, &sec_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.sec = sec_out;
-
-       return CAC_FAILURE;
-}
diff --git a/source3/libmsrpc/cac_samr.c b/source3/libmsrpc/cac_samr.c
deleted file mode 100644 (file)
index 4c25f95..0000000
+++ /dev/null
@@ -1,2706 +0,0 @@
-
-/* 
- *  Unix SMB/CIFS implementation.
- *  MS-RPC client library implementation (SAMR pipe)
- *  Copyright (C) Chris Nicholls              2005.
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "libmsrpc.h"
-#include "libmsrpc_internal.h"
-
-/*used by cac_SamGetNamesFromRids*/
-#define SAMR_RID_UNKNOWN 8
-
-#define SAMR_ENUM_MAX_SIZE 0xffff
-
-/*not sure what this is.. taken from rpcclient/cmd_samr.c*/
-#define SAMR_LOOKUP_FLAGS 0x000003e8
-
-DOM_SID *cac_get_domain_sid( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            uint32 des_access );
-
-int cac_SamConnect( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                   struct SamConnect *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       POLICY_HND *sam_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || op->in.access == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       /*initialize for samr pipe if we have to */
-       if ( !hnd->_internal.pipes[PI_SAMR] ) {
-               if ( !
-                    ( pipe_hnd =
-                      cli_rpc_pipe_open_noauth( srv->cli, PI_SAMR,
-                                                &hnd->status ) ) ) {
-                       return CAC_FAILURE;
-               }
-
-               hnd->_internal.pipes[PI_SAMR] = True;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       sam_out = talloc( mem_ctx, POLICY_HND );
-       if ( !sam_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       if ( hnd->_internal.srv_level >= SRV_WIN_2K_SP3 ) {
-               hnd->status =
-                       rpccli_samr_connect4( pipe_hnd, mem_ctx,
-                                             op->in.access, sam_out );
-       }
-
-       if ( hnd->_internal.srv_level < SRV_WIN_2K_SP3
-            || !NT_STATUS_IS_OK( hnd->status ) ) {
-               /*if sam_connect4 failed, the use sam_connect and lower srv_level */
-
-               hnd->status =
-                       rpccli_samr_connect( pipe_hnd, mem_ctx, op->in.access,
-                                            sam_out );
-
-               if ( NT_STATUS_IS_OK( hnd->status )
-                    && hnd->_internal.srv_level > SRV_WIN_2K ) {
-                       hnd->_internal.srv_level = SRV_WIN_2K;
-               }
-       }
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.sam = sam_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamClose( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                 POLICY_HND * sam )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !sam || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status = rpccli_samr_close( pipe_hnd, mem_ctx, sam );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-/*this is an internal function. Due to a circular dependency, it must be prototyped in libmsrpc.h (which I don't want to do)
- * cac_SamOpenDomain() is the only function that calls it, so I just put the definition here
- */
-
-/*attempts to find the sid of the domain we are connected to*/
-DOM_SID *cac_get_domain_sid( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            uint32 des_access )
-{
-       struct LsaOpenPolicy lop;
-       struct LsaFetchSid fs;
-
-       DOM_SID *sid;
-
-       ZERO_STRUCT( lop );
-       ZERO_STRUCT( fs );
-
-       lop.in.access = des_access;
-       lop.in.security_qos = True;
-
-       if ( !cac_LsaOpenPolicy( hnd, mem_ctx, &lop ) )
-               return NULL;
-
-       fs.in.pol = lop.out.pol;
-       fs.in.info_class = CAC_DOMAIN_INFO;
-
-       if ( !cac_LsaFetchSid( hnd, mem_ctx, &fs ) )
-               return NULL;
-
-       cac_LsaClosePolicy( hnd, mem_ctx, lop.out.pol );
-
-       if ( !fs.out.domain_sid )
-               return NULL;
-
-       sid = ( DOM_SID * ) TALLOC_MEMDUP( mem_ctx,
-                                          &( fs.out.domain_sid->sid ),
-                                          sizeof( DOM_SID ) );
-
-       if ( !sid ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-       }
-
-       return sid;
-
-}
-
-int cac_SamOpenDomain( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct SamOpenDomain *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       DOM_SID *sid_buf;
-       POLICY_HND *sam_out;
-       POLICY_HND *pol_out;
-
-       struct SamLookupDomain sld;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || op->in.access == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.sam ) {
-               /*use cac_SamConnect() since it does the session setup */
-               struct SamConnect sc;
-
-               ZERO_STRUCT( sc );
-
-               sc.in.access = op->in.access;
-
-               if ( !cac_SamConnect( hnd, mem_ctx, &sc ) ) {
-                       return CAC_FAILURE;
-               }
-
-               sam_out = sc.out.sam;
-       } else {
-               sam_out = op->in.sam;
-       }
-
-       if ( !op->in.sid ) {
-               /*find the sid for the SAM's domain */
-
-               /*try using cac_SamLookupDomain() first */
-               ZERO_STRUCT( sld );
-
-               sld.in.sam = sam_out;
-               sld.in.name = hnd->domain;
-
-               if ( cac_SamLookupDomain( hnd, mem_ctx, &sld ) ) {
-                       /*then we got the sid */
-                       sid_buf = sld.out.sid;
-               } else {
-                       /*try to get it from the LSA */
-                       sid_buf =
-                               cac_get_domain_sid( hnd, mem_ctx,
-                                                   op->in.access );
-               }
-       } else {
-               /*we already have the sid for the domain we want */
-               sid_buf = op->in.sid;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       pol_out = talloc( mem_ctx, POLICY_HND );
-       if ( !pol_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       /*now open the domain */
-       hnd->status =
-               rpccli_samr_open_domain( pipe_hnd, mem_ctx, sam_out,
-                                        op->in.access, sid_buf, pol_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.sam = sam_out;
-       op->out.dom_hnd = pol_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamOpenUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                    struct SamOpenUser *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 *rid_buf = NULL;
-
-       uint32 num_rids = 0;
-       uint32 *rid_types = NULL;
-
-       POLICY_HND *user_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || op->in.access == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.rid == 0 && op->in.name == NULL ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.rid == 0 && op->in.name ) {
-               /*lookup the name and then set rid_buf */
-
-               hnd->status =
-                       rpccli_samr_lookup_names( pipe_hnd, mem_ctx,
-                                                 op->in.dom_hnd,
-                                                 SAMR_LOOKUP_FLAGS, 1,
-                                                 ( const char ** ) &op->in.
-                                                 name, &num_rids, &rid_buf,
-                                                 &rid_types );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               if ( num_rids == 0 || rid_buf == NULL
-                    || rid_types[0] == SAMR_RID_UNKNOWN ) {
-                       hnd->status = NT_STATUS_INVALID_PARAMETER;
-                       return CAC_FAILURE;
-               }
-
-               TALLOC_FREE( rid_types );
-
-       } else {
-               rid_buf = &op->in.rid;
-       }
-
-       user_out = talloc( mem_ctx, POLICY_HND );
-       if ( !user_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_open_user( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                      op->in.access, *rid_buf, user_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.user_hnd = user_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamCreateUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct SamCreateUser *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       POLICY_HND *user_out = NULL;
-       uint32 rid_out;
-
-   /**found in rpcclient/cmd_samr.c*/
-       uint32 unknown = 0xe005000b;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || !op->in.name || op->in.acb_mask == 0
-            || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       user_out = talloc( mem_ctx, POLICY_HND );
-       if ( !user_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_create_dom_user( pipe_hnd, mem_ctx,
-                                            op->in.dom_hnd, op->in.name,
-                                            op->in.acb_mask, unknown,
-                                            user_out, &rid_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.user_hnd = user_out;
-       op->out.rid = rid_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamDeleteUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      POLICY_HND * user_hnd )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !user_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_delete_dom_user( pipe_hnd, mem_ctx, user_hnd );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamEnumUsers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                     struct SamEnumUsers *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 resume_idx_out = 0;
-       char **names_out = NULL;
-       uint32 *rids_out = NULL;
-       uint32 num_users_out = 0;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       /*this is a hack.. but is the only reliable way to know if everything has been enumerated */
-       if ( op->out.done == True )
-               return CAC_FAILURE;
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       resume_idx_out = op->out.resume_idx;
-
-       hnd->status =
-               rpccli_samr_enum_dom_users( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                           &resume_idx_out, op->in.acb_mask,
-                                           SAMR_ENUM_MAX_SIZE, &names_out,
-                                           &rids_out, &num_users_out );
-
-
-       if ( NT_STATUS_IS_OK( hnd->status ) )
-               op->out.done = True;
-
-       /*if there are no more entries, the operation will return NT_STATUS_OK. 
-        * We want to return failure if no results were returned*/
-       if ( !NT_STATUS_IS_OK( hnd->status )
-            && NT_STATUS_V( hnd->status ) !=
-            NT_STATUS_V( STATUS_MORE_ENTRIES ) )
-               return CAC_FAILURE;
-
-       op->out.resume_idx = resume_idx_out;
-       op->out.num_users = num_users_out;
-       op->out.rids = rids_out;
-       op->out.names = names_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetNamesFromRids( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct SamGetNamesFromRids *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 num_names_out;
-       char **names_out;
-       uint32 *name_types_out;
-
-
-       uint32 i = 0;
-
-       CacLookupRidsRecord *map_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.rids && op->in.num_rids != 0 ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.num_rids == 0 ) {
-               /*nothing to do */
-               op->out.num_names = 0;
-               return CAC_SUCCESS;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_lookup_rids( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                        op->in.num_rids, op->in.rids,
-                                        &num_names_out, &names_out,
-                                        &name_types_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status )
-            && !NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) )
-               return CAC_FAILURE;
-
-       if (num_names_out) {
-               map_out = TALLOC_ARRAY( mem_ctx, CacLookupRidsRecord, num_names_out );
-               if ( !map_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       return CAC_FAILURE;
-               }
-       } else {
-               map_out = NULL;
-       }
-
-       for ( i = 0; i < num_names_out; i++ ) {
-               if ( name_types_out[i] == SAMR_RID_UNKNOWN ) {
-                       map_out[i].found = False;
-                       map_out[i].name = NULL;
-                       map_out[i].type = 0;
-               } else {
-                       map_out[i].found = True;
-                       map_out[i].name =
-                               talloc_strdup( mem_ctx, names_out[i] );
-                       map_out[i].type = name_types_out[i];
-               }
-               map_out[i].rid = op->in.rids[i];
-       }
-
-       TALLOC_FREE( names_out );
-       TALLOC_FREE( name_types_out );
-
-       op->out.num_names = num_names_out;
-       op->out.map = map_out;
-
-       if ( NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) )
-               return CAC_PARTIAL_SUCCESS;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetRidsFromNames( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct SamGetRidsFromNames *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 num_rids_out;
-       uint32 *rids_out;
-       uint32 *rid_types_out;
-
-       uint32 i = 0;
-
-       CacLookupRidsRecord *map_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.names && op->in.num_names != 0 ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.num_names == 0 ) {
-               /*then we don't have to do anything */
-               op->out.num_rids = 0;
-               return CAC_SUCCESS;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_lookup_names( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                         SAMR_LOOKUP_FLAGS, op->in.num_names,
-                                         ( const char ** ) op->in.names,
-                                         &num_rids_out, &rids_out,
-                                         &rid_types_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status )
-            && !NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) )
-               return CAC_FAILURE;
-
-       if (num_rids_out) {
-               map_out = TALLOC_ARRAY( mem_ctx, CacLookupRidsRecord, num_rids_out );
-               if ( !map_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       return CAC_FAILURE;
-               }
-       } else {
-               map_out = NULL;
-       }
-
-       for ( i = 0; i < num_rids_out; i++ ) {
-
-               if ( rid_types_out[i] == SAMR_RID_UNKNOWN ) {
-                       map_out[i].found = False;
-                       map_out[i].rid = 0;
-                       map_out[i].type = 0;
-               } else {
-                       map_out[i].found = True;
-                       map_out[i].rid = rids_out[i];
-                       map_out[i].type = rid_types_out[i];
-               }
-
-               map_out[i].name = talloc_strdup( mem_ctx, op->in.names[i] );
-       }
-
-       op->out.num_rids = num_rids_out;
-       op->out.map = map_out;
-
-       TALLOC_FREE( rids_out );
-       TALLOC_FREE( rid_types_out );
-
-       if ( NT_STATUS_EQUAL( hnd->status, STATUS_SOME_UNMAPPED ) )
-               return CAC_PARTIAL_SUCCESS;
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_SamGetGroupsForUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct SamGetGroupsForUser *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       DOM_GID *groups = NULL;
-       uint32 num_groups_out = 0;
-
-       uint32 *rids_out = NULL;
-       uint32 *attr_out = NULL;
-
-       uint32 i;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.user_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_usergroups( pipe_hnd, mem_ctx,
-                                             op->in.user_hnd,
-                                             &num_groups_out, &groups );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-
-       if (num_groups_out) {
-               rids_out = TALLOC_ARRAY( mem_ctx, uint32, num_groups_out );
-               if ( !rids_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       return CAC_FAILURE;
-               }
-               attr_out = TALLOC_ARRAY( mem_ctx, uint32, num_groups_out );
-               if ( !attr_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       return CAC_FAILURE;
-               }
-       } else {
-               rids_out = NULL;
-               attr_out = NULL;
-       }
-
-       for ( i = 0; i < num_groups_out; i++ ) {
-               rids_out[i] = groups[i].g_rid;
-               attr_out[i] = groups[i].attr;
-       }
-
-       TALLOC_FREE( groups );
-
-       op->out.num_groups = num_groups_out;
-       op->out.rids = rids_out;
-       op->out.attributes = attr_out;
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_SamOpenGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                     struct SamOpenGroup *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       POLICY_HND *group_hnd_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || op->in.access == 0 || op->in.rid == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       group_hnd_out = talloc( mem_ctx, POLICY_HND );
-       if ( !group_hnd_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_open_group( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                       op->in.access, op->in.rid,
-                                       group_hnd_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.group_hnd = group_hnd_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamCreateGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SamCreateGroup *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       POLICY_HND *group_hnd_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.name || op->in.name[0] == '\0'
-            || op->in.access == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       group_hnd_out = talloc( mem_ctx, POLICY_HND );
-       if ( !group_hnd_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_create_dom_group( pipe_hnd, mem_ctx,
-                                             op->in.dom_hnd, op->in.name,
-                                             op->in.access, group_hnd_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.group_hnd = group_hnd_out;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamDeleteGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       POLICY_HND * group_hnd )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !group_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_delete_dom_group( pipe_hnd, mem_ctx, group_hnd );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamGetGroupMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                           struct SamGetGroupMembers *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 num_mem_out;
-       uint32 *rids_out;
-       uint32 *attr_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.group_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_groupmem( pipe_hnd, mem_ctx,
-                                           op->in.group_hnd, &num_mem_out,
-                                           &rids_out, &attr_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.num_members = num_mem_out;
-       op->out.rids = rids_out;
-       op->out.attributes = attr_out;
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_SamAddGroupMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct SamAddGroupMember *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.group_hnd || op->in.rid == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_add_groupmem( pipe_hnd, mem_ctx, op->in.group_hnd,
-                                         op->in.rid );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamRemoveGroupMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             struct SamRemoveGroupMember *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.group_hnd || op->in.rid == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_del_groupmem( pipe_hnd, mem_ctx, op->in.group_hnd,
-                                         op->in.rid );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamClearGroupMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             POLICY_HND * group_hnd )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       int result = CAC_SUCCESS;
-
-       int i = 0;
-
-       uint32 num_mem = 0;
-       uint32 *rid = NULL;
-       uint32 *attr = NULL;
-
-       NTSTATUS status;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !group_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_groupmem( pipe_hnd, mem_ctx, group_hnd,
-                                           &num_mem, &rid, &attr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       /*try to delete the users one by one */
-       for ( i = 0; i < num_mem && NT_STATUS_IS_OK( hnd->status ); i++ ) {
-               hnd->status =
-                       rpccli_samr_del_groupmem( pipe_hnd, mem_ctx,
-                                                 group_hnd, rid[i] );
-       }
-
-       /*if not all members could be removed, then try to re-add the members that were already deleted */
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               status = NT_STATUS_OK;
-
-               for ( i -= 1; i >= 0 && NT_STATUS_IS_OK( status ); i-- ) {
-                       status = rpccli_samr_add_groupmem( pipe_hnd, mem_ctx,
-                                                          group_hnd,
-                                                          rid[i] );
-               }
-
-               /*we return with the NTSTATUS error that we got when trying to delete users */
-               if ( !NT_STATUS_IS_OK( status ) )
-                       result = CAC_FAILURE;
-       }
-
-       TALLOC_FREE( attr );
-
-       return result;
-}
-
-int cac_SamSetGroupMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                           struct SamSetGroupMembers *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 i = 0;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.group_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*use cac_SamClearGroupMembers() to clear them */
-       if ( !cac_SamClearGroupMembers( hnd, mem_ctx, op->in.group_hnd ) )
-               return CAC_FAILURE;     /*hnd->status is already set */
-
-
-       for ( i = 0; i < op->in.num_members && NT_STATUS_IS_OK( hnd->status );
-             i++ ) {
-               hnd->status =
-                       rpccli_samr_add_groupmem( pipe_hnd, mem_ctx,
-                                                 op->in.group_hnd,
-                                                 op->in.rids[i] );
-       }
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamEnumGroups( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct SamEnumGroups *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 i = 0;
-
-       uint32 resume_idx_out = 0;
-       char **names_out = NULL;
-       char **desc_out = NULL;
-       uint32 *rids_out = NULL;
-       uint32 num_groups_out = 0;
-
-       struct acct_info *acct_buf = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       /*using this BOOL is the only reliable way to know that we are done */
-       if ( op->out.done == True )     /*we return failure so the call will break out of a loop */
-               return CAC_FAILURE;
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       resume_idx_out = op->out.resume_idx;
-
-       hnd->status =
-               rpccli_samr_enum_dom_groups( pipe_hnd, mem_ctx,
-                                            op->in.dom_hnd, &resume_idx_out,
-                                            SAMR_ENUM_MAX_SIZE, &acct_buf,
-                                            &num_groups_out );
-
-
-       if ( NT_STATUS_IS_OK( hnd->status ) ) {
-               op->out.done = True;
-       } else if ( NT_STATUS_V( hnd->status ) !=
-                   NT_STATUS_V( STATUS_MORE_ENTRIES ) ) {
-               /*if there are no more entries, the operation will return NT_STATUS_OK. 
-                * We want to return failure if no results were returned*/
-               return CAC_FAILURE;
-       }
-
-       if (num_groups_out) {
-               names_out = TALLOC_ARRAY( mem_ctx, char *, num_groups_out );
-               if ( !names_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       TALLOC_FREE( acct_buf );
-                       return CAC_FAILURE;
-               }
-
-               desc_out = TALLOC_ARRAY( mem_ctx, char *, num_groups_out );
-               if ( !desc_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       TALLOC_FREE( acct_buf );
-                       TALLOC_FREE( names_out );
-                       return CAC_FAILURE;
-               }
-
-               rids_out = TALLOC_ARRAY( mem_ctx, uint32, num_groups_out );
-               if ( !rids_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       TALLOC_FREE( acct_buf );
-                       TALLOC_FREE( names_out );
-                       TALLOC_FREE( desc_out );
-                       return CAC_FAILURE;
-               }
-       } else {
-               names_out = NULL;
-               desc_out = NULL;
-               rids_out = NULL;
-       }
-
-       for ( i = 0; i < num_groups_out; i++ ) {
-               names_out[i] =
-                       talloc_strdup( mem_ctx, acct_buf[i].acct_name );
-               desc_out[i] = talloc_strdup( mem_ctx, acct_buf[i].acct_desc );
-               rids_out[i] = acct_buf[i].rid;
-
-               if ( !names_out[i] || !desc_out[i] ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       return CAC_FAILURE;
-               }
-       }
-
-       op->out.resume_idx = resume_idx_out;
-       op->out.num_groups = num_groups_out;
-       op->out.rids = rids_out;
-       op->out.names = names_out;
-       op->out.descriptions = desc_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamEnumAliases( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SamEnumAliases *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 i = 0;
-
-       uint32 resume_idx_out = 0;
-       char **names_out = NULL;
-       char **desc_out = NULL;
-       uint32 *rids_out = NULL;
-       uint32 num_als_out = 0;
-
-       struct acct_info *acct_buf = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       /*this is a hack.. but is the only reliable way to know if everything has been enumerated */
-       if ( op->out.done == True ) {
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       resume_idx_out = op->out.resume_idx;
-
-       hnd->status =
-               rpccli_samr_enum_als_groups( pipe_hnd, mem_ctx,
-                                            op->in.dom_hnd, &resume_idx_out,
-                                            SAMR_ENUM_MAX_SIZE, &acct_buf,
-                                            &num_als_out );
-
-
-       if ( NT_STATUS_IS_OK( hnd->status ) )
-               op->out.done = True;
-
-       /*if there are no more entries, the operation will return NT_STATUS_OK. 
-        * We want to return failure if no results were returned*/
-       if ( !NT_STATUS_IS_OK( hnd->status )
-            && NT_STATUS_V( hnd->status ) !=
-            NT_STATUS_V( STATUS_MORE_ENTRIES ) )
-               return CAC_FAILURE;
-
-       if (num_als_out) {
-               names_out = TALLOC_ARRAY( mem_ctx, char *, num_als_out );
-               if ( !names_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       TALLOC_FREE( acct_buf );
-                       return CAC_FAILURE;
-               }
-
-               desc_out = TALLOC_ARRAY( mem_ctx, char *, num_als_out );
-               if ( !desc_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       TALLOC_FREE( acct_buf );
-                       TALLOC_FREE( names_out );
-                       return CAC_FAILURE;
-               }
-
-               rids_out = TALLOC_ARRAY( mem_ctx, uint32, num_als_out );
-               if ( !rids_out ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       TALLOC_FREE( acct_buf );
-                       TALLOC_FREE( names_out );
-                       TALLOC_FREE( desc_out );
-                       return CAC_FAILURE;
-               }
-       } else {
-               names_out = NULL;
-               desc_out = NULL;
-               rids_out = NULL;
-       }
-
-       for ( i = 0; i < num_als_out; i++ ) {
-               names_out[i] =
-                       talloc_strdup( mem_ctx, acct_buf[i].acct_name );
-               desc_out[i] = talloc_strdup( mem_ctx, acct_buf[i].acct_desc );
-               rids_out[i] = acct_buf[i].rid;
-
-               if ( !names_out[i] || !desc_out[i] ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       return CAC_FAILURE;
-               }
-       }
-
-       op->out.resume_idx = resume_idx_out;
-       op->out.num_aliases = num_als_out;
-       op->out.rids = rids_out;
-       op->out.names = names_out;
-       op->out.descriptions = desc_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamCreateAlias( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SamCreateAlias *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       POLICY_HND *als_hnd_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.name || op->in.name[0] == '\0' || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       als_hnd_out = talloc( mem_ctx, POLICY_HND );
-       if ( !als_hnd_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_create_dom_alias( pipe_hnd, mem_ctx,
-                                             op->in.dom_hnd, op->in.name,
-                                             als_hnd_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.alias_hnd = als_hnd_out;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamOpenAlias( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                     struct SamOpenAlias *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       POLICY_HND *als_hnd_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || op->in.access == 0 || op->in.rid == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       als_hnd_out = talloc( mem_ctx, POLICY_HND );
-       if ( !als_hnd_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_open_alias( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                       op->in.access, op->in.rid,
-                                       als_hnd_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.alias_hnd = als_hnd_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamDeleteAlias( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       POLICY_HND * alias_hnd )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !alias_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_delete_dom_alias( pipe_hnd, mem_ctx, alias_hnd );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamAddAliasMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct SamAddAliasMember *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.alias_hnd || !op->in.sid || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_add_aliasmem( pipe_hnd, mem_ctx, op->in.alias_hnd,
-                                         op->in.sid );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamRemoveAliasMember( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             struct SamRemoveAliasMember *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.alias_hnd || !op->in.sid || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_del_aliasmem( pipe_hnd, mem_ctx, op->in.alias_hnd,
-                                         op->in.sid );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetAliasMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                           struct SamGetAliasMembers *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 num_mem_out;
-       DOM_SID *sids_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.alias_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_aliasmem( pipe_hnd, mem_ctx,
-                                           op->in.alias_hnd, &num_mem_out,
-                                           &sids_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.num_members = num_mem_out;
-       op->out.sids = sids_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamClearAliasMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             POLICY_HND * alias_hnd )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       int result = CAC_SUCCESS;
-
-       int i = 0;
-
-       uint32 num_mem = 0;
-       DOM_SID *sid = NULL;
-
-       NTSTATUS status;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !alias_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_aliasmem( pipe_hnd, mem_ctx, alias_hnd,
-                                           &num_mem, &sid );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       /*try to delete the users one by one */
-       for ( i = 0; i < num_mem && NT_STATUS_IS_OK( hnd->status ); i++ ) {
-               hnd->status =
-                       rpccli_samr_del_aliasmem( pipe_hnd, mem_ctx,
-                                                 alias_hnd, &sid[i] );
-       }
-
-       /*if not all members could be removed, then try to re-add the members that were already deleted */
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               status = NT_STATUS_OK;
-
-               for ( i -= 1; i >= 0 && NT_STATUS_IS_OK( status ); i-- ) {
-                       status = rpccli_samr_add_aliasmem( pipe_hnd, mem_ctx,
-                                                          alias_hnd,
-                                                          &sid[i] );
-               }
-
-               /*we return with the NTSTATUS error that we got when trying to delete users */
-               if ( !NT_STATUS_IS_OK( status ) )
-                       result = CAC_FAILURE;
-       }
-
-       TALLOC_FREE( sid );
-       return result;
-}
-
-int cac_SamSetAliasMembers( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                           struct SamSetAliasMembers *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       uint32 i = 0;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.alias_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*use cac_SamClearAliasMembers() to clear them */
-       if ( !cac_SamClearAliasMembers( hnd, mem_ctx, op->in.alias_hnd ) )
-               return CAC_FAILURE;     /*hnd->status is already set */
-
-
-       for ( i = 0; i < op->in.num_members && NT_STATUS_IS_OK( hnd->status );
-             i++ ) {
-               hnd->status =
-                       rpccli_samr_add_aliasmem( pipe_hnd, mem_ctx,
-                                                 op->in.alias_hnd,
-                                                 &( op->in.sids[i] ) );
-       }
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamUserChangePasswd( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct SamUserChangePasswd *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.username || !op->in.password
-            || !op->in.new_password || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       /*open a session on SAMR if we don't have one */
-       if ( !hnd->_internal.pipes[PI_SAMR] ) {
-               if ( !
-                    ( pipe_hnd =
-                      cli_rpc_pipe_open_noauth( srv->cli, PI_SAMR,
-                                                &hnd->status ) ) ) {
-                       return CAC_FAILURE;
-               }
-
-               hnd->_internal.pipes[PI_SAMR] = True;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_chgpasswd_user( pipe_hnd, mem_ctx,
-                                           op->in.username,
-                                           op->in.new_password,
-                                           op->in.password );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamEnableUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      POLICY_HND * user_hnd )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_USERINFO_CTR *ctr;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !user_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*info_level = 21 is the only level that I have found to work reliably. It would be nice if user_level = 10 worked. */
-       hnd->status =
-               rpccli_samr_query_userinfo( pipe_hnd, mem_ctx, user_hnd, 0x10,
-                                           &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-   /**check the ACB mask*/
-       if ( ( ctr->info.id16->acb_info & ACB_DISABLED ) == ACB_DISABLED ) {
-               /*toggle the disabled bit */
-               ctr->info.id16->acb_info ^= ACB_DISABLED;
-       } else {
-               /*the user is already enabled so just return success */
-               return CAC_SUCCESS;
-       }
-
-       /*now set the userinfo */
-       hnd->status =
-               rpccli_samr_set_userinfo2( pipe_hnd, mem_ctx, user_hnd, 0x10,
-                                          &srv->cli->user_session_key, ctr );
-
-       /*this will only work properly if we use set_userinfo2 - fail if it is not supported */
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamDisableUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       POLICY_HND * user_hnd )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_USERINFO_CTR *ctr;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !user_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_userinfo( pipe_hnd, mem_ctx, user_hnd, 0x10,
-                                           &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       if ( ( ctr->info.id16->acb_info & ACB_DISABLED ) == ACB_DISABLED ) {
-               /*then the user is already disabled */
-               return CAC_SUCCESS;
-       }
-
-       /*toggle the disabled bit */
-       ctr->info.id16->acb_info ^= ACB_DISABLED;
-
-       /*this will only work properly if we use set_userinfo2 */
-       hnd->status =
-               rpccli_samr_set_userinfo2( pipe_hnd, mem_ctx, user_hnd, 0x10,
-                                          &srv->cli->user_session_key, ctr );
-
-       /*this will only work properly if we use set_userinfo2 fail if it is not supported */
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamSetPassword( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SamSetPassword *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_USERINFO_CTR ctr;
-       SAM_USER_INFO_24 info24;
-       uint8 pw[516];
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.user_hnd || !op->in.password || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       ZERO_STRUCT( ctr );
-       ZERO_STRUCT( info24 );
-
-       encode_pw_buffer( pw, op->in.password, STR_UNICODE );
-
-       init_sam_user_info24( &info24, ( char * ) pw, 24 );
-
-       ctr.switch_value = 24;
-       ctr.info.id24 = &info24;
-
-       hnd->status =
-               rpccli_samr_set_userinfo( pipe_hnd, mem_ctx, op->in.user_hnd,
-                                         24, &srv->cli->user_session_key,
-                                         &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetUserInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SamGetUserInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_USERINFO_CTR *ctr;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.user_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_userinfo( pipe_hnd, mem_ctx,
-                                           op->in.user_hnd, 21, &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.info = cac_MakeUserInfo( mem_ctx, ctr );
-
-       if ( !op->out.info ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamSetUserInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SamSetUserInfo *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_USERINFO_CTR *ctr;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.user_hnd || !op->in.info || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       ctr = cac_MakeUserInfoCtr( mem_ctx, op->in.info );
-       if ( !ctr ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( hnd->_internal.srv_level >= SRV_WIN_NT4 ) {
-               hnd->status =
-                       rpccli_samr_set_userinfo2( pipe_hnd, mem_ctx,
-                                                  op->in.user_hnd, 21,
-                                                  &srv->cli->
-                                                  user_session_key, ctr );
-       }
-
-       if ( hnd->_internal.srv_level < SRV_WIN_NT4
-            || !NT_STATUS_IS_OK( hnd->status ) ) {
-               hnd->status =
-                       rpccli_samr_set_userinfo( pipe_hnd, mem_ctx,
-                                                 op->in.user_hnd, 21,
-                                                 &srv->cli->user_session_key,
-                                                 ctr );
-
-               if ( NT_STATUS_IS_OK( hnd->status )
-                    && hnd->_internal.srv_level > SRV_WIN_NT4 ) {
-                       hnd->_internal.srv_level = SRV_WIN_NT4;
-               }
-       }
-
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_SamGetUserInfoCtr( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct SamGetUserInfoCtr *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_USERINFO_CTR *ctr_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.user_hnd || op->in.info_class == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_userinfo( pipe_hnd, mem_ctx,
-                                           op->in.user_hnd,
-                                           op->in.info_class, &ctr_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.ctr = ctr_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamSetUserInfoCtr( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct SamSetUserInfoCtr *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.user_hnd || !op->in.ctr || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-
-       hnd->status =
-               rpccli_samr_set_userinfo( pipe_hnd, mem_ctx, op->in.user_hnd,
-                                         op->in.ctr->switch_value,
-                                         &srv->cli->user_session_key,
-                                         op->in.ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamRenameUser( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct SamRenameUser *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_USERINFO_CTR ctr;
-       SAM_USER_INFO_7 info7;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.user_hnd || !op->in.new_name
-            || op->in.new_name[0] == '\0' || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       ZERO_STRUCT( ctr );
-       ZERO_STRUCT( info7 );
-
-       init_sam_user_info7( &info7, op->in.new_name );
-
-       ctr.switch_value = 7;
-       ctr.info.id7 = &info7;
-
-       hnd->status =
-               rpccli_samr_set_userinfo( pipe_hnd, mem_ctx, op->in.user_hnd,
-                                         7, &srv->cli->user_session_key,
-                                         &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_SamGetGroupInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SamGetGroupInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       GROUP_INFO_CTR *ctr;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.group_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-
-       /*get a GROUP_INFO_1 structure */
-       hnd->status =
-               rpccli_samr_query_groupinfo( pipe_hnd, mem_ctx,
-                                            op->in.group_hnd, 1, &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.info = cac_MakeGroupInfo( mem_ctx, ctr );
-       if ( !op->out.info ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamSetGroupInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SamSetGroupInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       GROUP_INFO_CTR *ctr = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.group_hnd || !op->in.info || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       ctr = cac_MakeGroupInfoCtr( mem_ctx, op->in.info );
-       if ( !ctr ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_set_groupinfo( pipe_hnd, mem_ctx,
-                                          op->in.group_hnd, ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamRenameGroup( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SamRenameGroup *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       GROUP_INFO_CTR ctr;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.group_hnd || !op->in.new_name
-            || op->in.new_name[0] == '\0' || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       ZERO_STRUCT( ctr );
-
-       init_samr_group_info2( &ctr.group.info2, op->in.new_name );
-       ctr.switch_value1 = 2;
-
-       hnd->status =
-               rpccli_samr_set_groupinfo( pipe_hnd, mem_ctx,
-                                          op->in.group_hnd, &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetAliasInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SamGetAliasInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       ALIAS_INFO_CTR ctr;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.alias_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*get a GROUP_INFO_1 structure */
-       hnd->status =
-               rpccli_samr_query_alias_info( pipe_hnd, mem_ctx,
-                                             op->in.alias_hnd, 1, &ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.info = cac_MakeAliasInfo( mem_ctx, ctr );
-       if ( !op->out.info ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-
-}
-
-int cac_SamSetAliasInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SamSetAliasInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       ALIAS_INFO_CTR *ctr = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.alias_hnd || !op->in.info || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       ctr = cac_MakeAliasInfoCtr( mem_ctx, op->in.info );
-       if ( !ctr ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_set_aliasinfo( pipe_hnd, mem_ctx,
-                                          op->in.alias_hnd, ctr );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetDomainInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                         struct SamGetDomainInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_UNK_CTR ctr;
-       SAM_UNK_INFO_1 info1;
-       SAM_UNK_INFO_2 info2;
-       SAM_UNK_INFO_12 info12;
-
-       /*use this to keep track of a failed call */
-       NTSTATUS status_buf = NT_STATUS_OK;
-
-       uint16 fail_count = 0;
-
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.dom_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*first try with info 1 */
-       hnd->status =
-               rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                           1, &ctr );
-
-       if ( NT_STATUS_IS_OK( hnd->status ) ) {
-               /*then we buffer the SAM_UNK_INFO_1 structure */
-               info1 = ctr.info.inf1;
-       } else {
-               /*then the call failed, store the status and ZERO out the info structure */
-               ZERO_STRUCT( info1 );
-               status_buf = hnd->status;
-               fail_count++;
-       }
-
-       /*try again for the next one */
-       hnd->status =
-               rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                           2, &ctr );
-
-       if ( NT_STATUS_IS_OK( hnd->status ) ) {
-               /*store the info */
-               info2 = ctr.info.inf2;
-       } else {
-               /*ZERO out the structure and store the bad status */
-               ZERO_STRUCT( info2 );
-               status_buf = hnd->status;
-               fail_count++;
-       }
-
-       /*once more */
-       hnd->status =
-               rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                           12, &ctr );
-
-       if ( NT_STATUS_IS_OK( hnd->status ) ) {
-               info12 = ctr.info.inf12;
-       } else {
-               ZERO_STRUCT( info12 );
-               status_buf = hnd->status;
-               fail_count++;
-       }
-
-       /*return failure if all 3 calls failed */
-       if ( fail_count == 3 )
-               return CAC_FAILURE;
-
-       op->out.info = cac_MakeDomainInfo( mem_ctx, &info1, &info2, &info12 );
-
-       if ( !op->out.info ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       if ( fail_count > 0 ) {
-               hnd->status = status_buf;
-               return CAC_PARTIAL_SUCCESS;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetDomainInfoCtr( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct SamGetDomainInfoCtr *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_UNK_CTR *ctr_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.dom_hnd || op->in.info_class == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       ctr_out = talloc( mem_ctx, SAM_UNK_CTR );
-       if ( !ctr_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_dom_info( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                           op->in.info_class, ctr_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.info = ctr_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetDisplayInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct SamGetDisplayInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       SAM_DISPINFO_CTR ctr_out;
-
-       uint32 max_entries_buf = 0;
-       uint32 max_size_buf = 0;
-
-       uint32 resume_idx_out;
-       uint32 num_entries_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.dom_hnd || op->in.info_class == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( op->out.done == True )     /*this is done so we can use the function as a loop condition */
-               return CAC_FAILURE;
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.max_entries == 0 || op->in.max_size == 0 ) {
-               get_query_dispinfo_params( op->out.loop_count,
-                                          &max_entries_buf, &max_size_buf );
-       } else {
-               max_entries_buf = op->in.max_entries;
-               max_size_buf = op->in.max_size;
-       }
-
-       resume_idx_out = op->out.resume_idx;
-
-       hnd->status =
-               rpccli_samr_query_dispinfo( pipe_hnd, mem_ctx, op->in.dom_hnd,
-                                           &resume_idx_out,
-                                           op->in.info_class,
-                                           &num_entries_out, max_entries_buf,
-                                           max_size_buf, &ctr_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status )
-            && !NT_STATUS_EQUAL( hnd->status, STATUS_MORE_ENTRIES ) ) {
-               /*be defensive, maybe they'll call again without zeroing the struct */
-               op->out.loop_count = 0;
-               op->out.resume_idx = 0;
-               return CAC_FAILURE;
-       }
-
-       if ( NT_STATUS_IS_OK( hnd->status ) ) {
-               /*we want to quit once the function is called next. so it can be used in a loop */
-               op->out.done = True;
-       }
-
-       op->out.resume_idx = resume_idx_out;
-       op->out.num_entries = num_entries_out;
-       op->out.ctr = ctr_out;
-       op->out.loop_count++;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamLookupDomain( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SamLookupDomain *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       DOM_SID *sid_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.sam || !op->in.name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       sid_out = talloc( mem_ctx, DOM_SID );
-       if ( !sid_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_lookup_domain( pipe_hnd, mem_ctx, op->in.sam,
-                                          op->in.name, sid_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.sid = sid_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamGetSecurityObject( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                             struct SamGetSecurityObject *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       /*this number taken from rpcclient/cmd_samr.c, I think it is the only supported level */
-       uint32 sec_info = DACL_SECURITY_INFORMATION;
-
-       SEC_DESC_BUF *sec_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.pol || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SAMR );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_samr_query_sec_obj( pipe_hnd, mem_ctx, op->in.pol,
-                                          sec_info, mem_ctx, &sec_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.sec = sec_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SamFlush( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                 struct SamFlush *op )
-{
-       struct SamOpenDomain od;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.dom_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( !cac_SamClose( hnd, mem_ctx, op->in.dom_hnd ) )
-               return CAC_FAILURE;
-
-       ZERO_STRUCT( od );
-       od.in.access =
-               ( op->in.access ) ? op->in.access : MAXIMUM_ALLOWED_ACCESS;
-       od.in.sid = op->in.sid;
-
-       if ( !cac_SamOpenDomain( hnd, mem_ctx, &od ) )
-               return CAC_FAILURE;
-
-       /*this function does not use an output parameter to make it as convenient as possible to use */
-       *op->in.dom_hnd = *od.out.dom_hnd;
-
-       TALLOC_FREE( od.out.dom_hnd );
-
-       return CAC_SUCCESS;
-}
diff --git a/source3/libmsrpc/cac_svcctl.c b/source3/libmsrpc/cac_svcctl.c
deleted file mode 100644 (file)
index c5385ec..0000000
+++ /dev/null
@@ -1,631 +0,0 @@
-
-/* 
- *  Unix SMB/CIFS implementation.
- *  MS-RPC client library implementation (SVCCTL pipe)
- *  Copyright (C) Chris Nicholls              2005.
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "libmsrpc.h"
-#include "libsmb_internal.h"
-
-#define WAIT_SLEEP_TIME 300000
-
-int cac_WaitForService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       POLICY_HND * svc_hnd, uint32 state, uint32 timeout,
-                       SERVICE_STATUS * status );
-
-int cac_SvcOpenScm( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                   struct SvcOpenScm *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       POLICY_HND *scm_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || op->in.access == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       /*initialize for samr pipe if we have to */
-       if ( !hnd->_internal.pipes[PI_SVCCTL] ) {
-               if ( !
-                    ( pipe_hnd =
-                      cli_rpc_pipe_open_noauth( srv->cli, PI_SVCCTL,
-                                                &( hnd->status ) ) ) ) {
-                       hnd->status = NT_STATUS_UNSUCCESSFUL;
-                       return CAC_FAILURE;
-               }
-
-               hnd->_internal.pipes[PI_SVCCTL] = True;
-       }
-
-       scm_out = talloc( mem_ctx, POLICY_HND );
-       if ( !scm_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_open_scm( pipe_hnd, mem_ctx, scm_out,
-                                     op->in.access );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.scm_hnd = scm_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SvcClose( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                 POLICY_HND * scm_hnd )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !scm_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status = rpccli_svcctl_CloseServiceHandle( pipe_hnd, mem_ctx, scm_hnd );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SvcEnumServices( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SvcEnumServices *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       uint32 type_buf = 0;
-       uint32 state_buf = 0;
-
-       uint32 num_svc_out = 0;
-
-       ENUM_SERVICES_STATUS *svc_buf = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.scm_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       type_buf =
-               ( op->in.type !=
-                 0 ) ? op->in.
-               type : ( SVCCTL_TYPE_DRIVER | SVCCTL_TYPE_WIN32 );
-       state_buf = ( op->in.state != 0 ) ? op->in.state : SVCCTL_STATE_ALL;
-
-       err = rpccli_svcctl_enumerate_services( pipe_hnd, mem_ctx,
-                                               op->in.scm_hnd, type_buf,
-                                               state_buf, &num_svc_out,
-                                               &svc_buf );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.services =
-               cac_MakeServiceArray( mem_ctx, svc_buf, num_svc_out );
-
-       if ( !op->out.services ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       TALLOC_FREE( svc_buf );
-
-       op->out.num_services = num_svc_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SvcOpenService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SvcOpenService *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       POLICY_HND *svc_hnd_out = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.scm_hnd || !op->in.name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       svc_hnd_out = talloc( mem_ctx, POLICY_HND );
-       if ( !svc_hnd_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_open_service( pipe_hnd, mem_ctx, op->in.scm_hnd,
-                                         svc_hnd_out, op->in.name,
-                                         op->in.access );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.svc_hnd = svc_hnd_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SvcControlService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct SvcControlService *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       SERVICE_STATUS status_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.control < SVCCTL_CONTROL_STOP
-            || op->in.control > SVCCTL_CONTROL_SHUTDOWN ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx,
-                                            op->in.svc_hnd, op->in.control,
-                                            &status_out );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-int cac_SvcGetStatus( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                     struct SvcGetStatus *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       SERVICE_STATUS status_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_query_status( pipe_hnd, mem_ctx, op->in.svc_hnd,
-                                         &status_out );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.status = status_out;
-
-       return CAC_SUCCESS;
-}
-
-
-
-/*Internal function - similar to code found in utils/net_rpc_service.c
- * Waits for a service to reach a specific state.
- * svc_hnd - Handle to the service
- * state   - the state we are waiting for
- * timeout - number of seconds to wait
- * returns CAC_FAILURE if the state is never reached
- *      or CAC_SUCCESS if the state is reached
- */
-int cac_WaitForService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       POLICY_HND * svc_hnd, uint32 state, uint32 timeout,
-                       SERVICE_STATUS * status )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       /*number of milliseconds we have spent */
-       uint32 time_spent = 0;
-       WERROR err;
-
-       if ( !hnd || !mem_ctx || !svc_hnd || !status )
-               return CAC_FAILURE;
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       while ( status->state != state && time_spent < ( timeout * 1000000 )
-               && NT_STATUS_IS_OK( hnd->status ) ) {
-               /*if this is the first call, then we _just_ got the status.. sleep now */
-               usleep( WAIT_SLEEP_TIME );
-               time_spent += WAIT_SLEEP_TIME;
-
-               err = rpccli_svcctl_query_status( pipe_hnd, mem_ctx, svc_hnd,
-                                                 status );
-               hnd->status = werror_to_ntstatus( err );
-       }
-
-       if ( status->state == state )
-               return CAC_SUCCESS;
-
-       return CAC_FAILURE;
-}
-
-int cac_SvcStartService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SvcStartService *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       SERVICE_STATUS status_buf;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.num_parms != 0 && op->in.parms == NULL ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_start_service( pipe_hnd, mem_ctx, op->in.svc_hnd,
-                                          ( const char ** ) op->in.parms,
-                                          op->in.num_parms );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       if ( op->in.timeout == 0 )
-               return CAC_SUCCESS;
-
-       return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd,
-                                  SVCCTL_RUNNING, op->in.timeout,
-                                  &status_buf );
-}
-
-int cac_SvcStopService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct SvcStopService *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       SERVICE_STATUS status_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx,
-                                            op->in.svc_hnd,
-                                            SVCCTL_CONTROL_STOP,
-                                            &status_out );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.status = status_out;
-
-       if ( op->in.timeout == 0 )
-               return CAC_SUCCESS;
-
-       return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd,
-                                  SVCCTL_STOPPED, op->in.timeout,
-                                  &op->out.status );
-}
-
-int cac_SvcPauseService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct SvcPauseService *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       SERVICE_STATUS status_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx,
-                                            op->in.svc_hnd,
-                                            SVCCTL_CONTROL_PAUSE,
-                                            &status_out );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.status = status_out;
-
-       if ( op->in.timeout == 0 )
-               return CAC_SUCCESS;
-
-       return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd,
-                                  SVCCTL_PAUSED, op->in.timeout,
-                                  &op->out.status );
-}
-
-int cac_SvcContinueService( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                           struct SvcContinueService *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       SERVICE_STATUS status_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_control_service( pipe_hnd, mem_ctx,
-                                            op->in.svc_hnd,
-                                            SVCCTL_CONTROL_CONTINUE,
-                                            &status_out );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.status = status_out;
-
-       if ( op->in.timeout == 0 )
-               return CAC_SUCCESS;
-
-       return cac_WaitForService( hnd, mem_ctx, op->in.svc_hnd,
-                                  SVCCTL_RUNNING, op->in.timeout,
-                                  &op->out.status );
-}
-
-int cac_SvcGetDisplayName( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct SvcGetDisplayName *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       fstring disp_name_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_get_dispname( pipe_hnd, mem_ctx, op->in.svc_hnd,
-                                         disp_name_out );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.display_name = talloc_strdup( mem_ctx, disp_name_out );
-
-       if ( !op->out.display_name ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_SvcGetServiceConfig( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                            struct SvcGetServiceConfig *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       WERROR err;
-
-       SERVICE_CONFIG config_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.svc_hnd || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_SVCCTL );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       err = rpccli_svcctl_query_config( pipe_hnd, mem_ctx, op->in.svc_hnd,
-                                         &config_out );
-       hnd->status = werror_to_ntstatus( err );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       if ( !cac_InitCacServiceConfig
-            ( mem_ctx, &config_out, &op->out.config ) ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-
-}
diff --git a/source3/libmsrpc/cac_winreg.c b/source3/libmsrpc/cac_winreg.c
deleted file mode 100644 (file)
index 0470d2a..0000000
+++ /dev/null
@@ -1,1177 +0,0 @@
-
-/* 
- *  Unix SMB/CIFS implementation.
- *  MS-RPC client library implementation (WINREG pipe)
- *  Copyright (C) Chris Nicholls              2005.
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "libmsrpc.h"
-#include "libmsrpc_internal.h"
-
-NTSTATUS cac_delete_subkeys_recursive(struct rpc_pipe_client * pipe_hnd,
-                                     TALLOC_CTX * mem_ctx, POLICY_HND * key);
-
-int cac_RegConnect( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                   struct RegConnect *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       POLICY_HND *key = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.root || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return CAC_FAILURE;
-       }
-
-       /*initialize for winreg pipe if we have to */
-       if ( !hnd->_internal.pipes[PI_WINREG] ) {
-               if ( !
-                    ( pipe_hnd =
-                      cli_rpc_pipe_open_noauth( srv->cli, PI_WINREG,
-                                                &hnd->status ) ) ) {
-                       return CAC_FAILURE;
-               }
-
-               hnd->_internal.pipes[PI_WINREG] = True;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       key = talloc( mem_ctx, POLICY_HND );
-       if ( !key ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_winreg_Connect( pipe_hnd, mem_ctx, op->in.root,
-                                      op->in.access, key );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.key = key;
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegClose( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                 POLICY_HND * key )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !key || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status = rpccli_winreg_CloseKey( pipe_hnd, mem_ctx, key );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegOpenKey( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                   struct RegOpenKey *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct winreg_String key_string;
-
-       POLICY_HND *key_out;
-       POLICY_HND *parent_key;
-
-       char *key_name = NULL;
-       uint32 reg_type = 0;
-
-       struct RegConnect rc;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-
-       key_out = talloc( mem_ctx, POLICY_HND );
-       if ( !key_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.parent_key ) {
-               /*then we need to connect to the registry */
-               if ( !cac_ParseRegPath( op->in.name, &reg_type, &key_name ) ) {
-                       hnd->status = NT_STATUS_INVALID_PARAMETER;
-                       return CAC_FAILURE;
-               }
-
-               /*use cac_RegConnect because it handles the session setup */
-               ZERO_STRUCT( rc );
-
-               rc.in.access = op->in.access;
-               rc.in.root = reg_type;
-
-               if ( !cac_RegConnect( hnd, mem_ctx, &rc ) ) {
-                       return CAC_FAILURE;
-               }
-
-      /**if they only specified the root key, return the key we just opened*/
-               if ( key_name == NULL ) {
-                       op->out.key = rc.out.key;
-                       return CAC_SUCCESS;
-               }
-
-               parent_key = rc.out.key;
-       } else {
-               parent_key = op->in.parent_key;
-               key_name = op->in.name;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       key_string.name = key_name;
-       hnd->status =
-               rpccli_winreg_OpenKey( pipe_hnd, mem_ctx, parent_key,
-                                      key_string, 0, op->in.access,
-                                      key_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       if ( !op->in.parent_key ) {
-               /*then close the one that we opened above */
-               hnd->status =
-                       rpccli_winreg_CloseKey( pipe_hnd, mem_ctx,
-                                               parent_key );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-                       return CAC_FAILURE;
-               }
-       }
-
-       op->out.key = key_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegEnumKeys( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                    struct RegEnumKeys *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       /*buffers for rpccli_reg_enum_key call */
-       fstring key_name_in;
-       fstring class_name_in;
-
-       /*output buffers */
-       char **key_names_out = NULL;
-       char **class_names_out = NULL;
-       time_t *mod_times_out = NULL;
-       uint32 num_keys_out = 0;
-       uint32 resume_idx = 0;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       /* This is to avoid useless rpc calls, if the last call 
-          exhausted all the keys, then we don't need to go 
-          through everything again */
-
-       if ( NT_STATUS_V( hnd->status ) ==
-            NT_STATUS_V( NT_STATUS_GUIDS_EXHAUSTED ) )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || op->in.max_keys == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /* The only way to know how many keys to expect is to 
-          assume max_keys keys will be found */
-
-       key_names_out = TALLOC_ARRAY( mem_ctx, char *, op->in.max_keys );
-       if ( !key_names_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       class_names_out = TALLOC_ARRAY( mem_ctx, char *, op->in.max_keys );
-       if ( !class_names_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               TALLOC_FREE( key_names_out );
-               return CAC_FAILURE;
-       }
-
-       mod_times_out = TALLOC_ARRAY( mem_ctx, time_t, op->in.max_keys );
-       if ( !mod_times_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               TALLOC_FREE( key_names_out );
-               TALLOC_FREE( class_names_out );
-
-               return CAC_FAILURE;
-       }
-
-       resume_idx = op->out.resume_idx;
-
-       do {
-#if 0
-               hnd->status =
-                       rpccli_winreg_EnumKey( pipe_hnd, mem_ctx, op->in.key,
-                                               resume_idx, key_name_in,
-                                               class_name_in,
-                                               &mod_times_out );
-#endif
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-                       /*don't increment any values */
-                       break;
-               }
-
-               key_names_out[num_keys_out] =
-                       talloc_strdup( mem_ctx, key_name_in );
-
-               class_names_out[num_keys_out] =
-                       talloc_strdup( mem_ctx, class_name_in );
-
-               if ( !key_names_out[num_keys_out]
-                    || !class_names_out[num_keys_out] ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       break;
-               }
-
-               resume_idx++;
-               num_keys_out++;
-       } while ( num_keys_out < op->in.max_keys );
-
-       if ( CAC_OP_FAILED( hnd->status ) ) {
-               op->out.num_keys = 0;
-               return CAC_FAILURE;
-       }
-
-       op->out.resume_idx = resume_idx;
-       op->out.num_keys = num_keys_out;
-       op->out.key_names = key_names_out;
-       op->out.class_names = class_names_out;
-       op->out.mod_times = mod_times_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegCreateKey( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                     struct RegCreateKey *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       POLICY_HND *key_out;
-       struct RegOpenKey rok;
-       struct winreg_String key_string, class_string;
-       enum winreg_CreateAction action = 0;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.parent_key || !op->in.key_name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       /*first try to open the key - we use cac_RegOpenKey(). this doubles as a way to ensure the winreg pipe is initialized */
-       ZERO_STRUCT( rok );
-
-       rok.in.name = op->in.key_name;
-       rok.in.access = op->in.access;
-       rok.in.parent_key = op->in.parent_key;
-
-       if ( cac_RegOpenKey( hnd, mem_ctx, &rok ) ) {
-               /*then we got the key, return */
-               op->out.key = rok.out.key;
-               return CAC_SUCCESS;
-       }
-
-       /*just be ultra-safe */
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       key_out = talloc( mem_ctx, POLICY_HND );
-       if ( !key_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       key_string.name = op->in.key_name;
-       class_string.name = op->in.class_name;
-       hnd->status =
-               rpccli_winreg_CreateKey( pipe_hnd, mem_ctx, op->in.parent_key,
-                                        key_string, class_string, 0,
-                                        op->in.access, NULL, key_out,
-                                        &action );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       op->out.key = key_out;
-
-       return CAC_SUCCESS;
-
-}
-
-NTSTATUS cac_delete_subkeys_recursive( struct rpc_pipe_client * pipe_hnd,
-                                    TALLOC_CTX * mem_ctx, POLICY_HND * key )
-{
-       POLICY_HND subkey;
-       fstring subkey_name;
-       int cur_key = 0;
-       NTSTATUS status;
-       uint32 num_subkeys, max_subkeylen, max_classlen;
-       uint32 num_values, max_valnamelen, maxvalbufsize;
-       char *name_buffer; 
-       struct winreg_String class_string;
-
-       NTTIME modtime;
-       uint32 secdescsize;
-
-       /* First get the max subkey name length */
-
-       class_string.name = NULL;
-       status = rpccli_winreg_QueryInfoKey( pipe_hnd, mem_ctx, key, 
-                                            &class_string, &num_subkeys, 
-                                            &max_subkeylen, &max_classlen,
-                                            &num_values, &max_valnamelen,
-                                            &maxvalbufsize, &secdescsize, 
-                                            &modtime );
-
-
-       if ( !NT_STATUS_IS_OK( status ) ) {
-               return status;
-       }
-
-       if ( (name_buffer = TALLOC_ARRAY( mem_ctx, char, max_subkeylen )) == NULL ) {
-               d_fprintf(stderr, "Memory allocation error.\n");
-               return NT_STATUS_NO_MEMORY;
-       }
-
-
-       while ( NT_STATUS_IS_OK( status ) ) {
-               struct winreg_String key_string;
-               struct winreg_StringBuf subkey_string;
-               fstring subkeyname;
-
-               memset( name_buffer, 0x0, max_subkeylen );
-               subkey_string.name = name_buffer;
-               subkey_string.length = 0;
-               subkey_string.size = max_subkeylen;
-
-               status = rpccli_winreg_EnumKey(pipe_hnd, mem_ctx, key, cur_key, 
-                       &subkey_string, NULL, NULL);
-
-               if ( !NT_STATUS_IS_OK( status ) )
-                       break;
-
-               /* copy the keyname and add the terminating NULL */
-
-               StrnCpy( subkeyname, subkey_string.name, 
-                        MIN(subkey_string.length, sizeof(subkeyname)-1) );
-               subkeyname[MIN(subkey_string.length, sizeof(subkeyname)-1)] = '\0';
-
-               /*try to open the key with full access */
-
-               key_string.name = subkeyname;
-               status = rpccli_winreg_OpenKey( pipe_hnd, mem_ctx, key,
-                                               key_string, 0, REG_KEY_ALL,
-                                               &subkey );
-
-               if ( !NT_STATUS_IS_OK( status ) )
-                       break;
-
-               status = cac_delete_subkeys_recursive( pipe_hnd, mem_ctx,
-                                                   &subkey );
-
-               if ( !W_ERROR_EQUAL( ntstatus_to_werror(status), WERR_NO_MORE_ITEMS )
-                    && !NT_STATUS_IS_OK( status ) )
-                       break;
-
-               /*flush the key just to be safe */
-               rpccli_winreg_FlushKey( pipe_hnd, mem_ctx, key );
-
-               /*close the key that we opened */
-               rpccli_winreg_CloseKey( pipe_hnd, mem_ctx, &subkey );
-
-               /*now we delete the subkey */
-               key_string.name = subkey_name;
-               status = rpccli_winreg_DeleteKey( pipe_hnd, mem_ctx, key,
-                                                 key_string );
-
-               cur_key++;
-       }
-
-
-       return status;
-}
-
-
-
-int cac_RegDeleteKey( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                     struct RegDeleteKey *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct winreg_String key_string;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.parent_key || !op->in.name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( op->in.recursive ) {
-
-               /* first open the key, and then delete all of 
-                  it's subkeys recursively */
-
-               struct RegOpenKey rok;
-
-               ZERO_STRUCT( rok );
-
-               rok.in.parent_key = op->in.parent_key;
-               rok.in.name = op->in.name;
-               rok.in.access = REG_KEY_ALL;
-
-               if ( !cac_RegOpenKey( hnd, mem_ctx, &rok ) )
-                       return CAC_FAILURE;
-
-               hnd->status = cac_delete_subkeys_recursive( pipe_hnd, mem_ctx,
-                                                   rok.out.key );
-
-               /*close the key that we opened */
-               cac_RegClose( hnd, mem_ctx, rok.out.key );
-
-               if ( NT_STATUS_V( hnd->status ) !=
-                    NT_STATUS_V( NT_STATUS_GUIDS_EXHAUSTED )
-                    && !NT_STATUS_IS_OK( hnd->status ) )
-                       return CAC_FAILURE;
-
-               /*now go on to actually delete the key */
-       }
-
-       key_string.name = op->in.name;
-       hnd->status =
-               rpccli_winreg_DeleteKey( pipe_hnd, mem_ctx, op->in.parent_key,
-                                        key_string );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegDeleteValue( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                       struct RegDeleteValue *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct winreg_String value_string;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.parent_key || !op->in.name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       value_string.name = op->in.name;
-       hnd->status =
-               rpccli_winreg_DeleteValue( pipe_hnd, mem_ctx,
-                                          op->in.parent_key, value_string );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegQueryKeyInfo( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                        struct RegQueryKeyInfo *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       uint32 num_subkeys_out = 0;
-       uint32 long_subkey_out = 0;
-       uint32 long_class_out = 0;
-       uint32 num_values_out = 0;
-       uint32 long_value_out = 0;
-       uint32 long_data_out = 0;
-       uint32 secdesc_size = 0;
-       NTTIME mod_time;
-       struct winreg_String class_string;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.key || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status = rpccli_winreg_QueryInfoKey( pipe_hnd, mem_ctx, 
-                                                 op->in.key,
-                                                 &class_string,
-                                                 &num_subkeys_out,
-                                                 &long_subkey_out,
-                                                 &long_class_out,
-                                                 &num_values_out,
-                                                 &long_value_out,
-                                                 &long_data_out,
-                                                 &secdesc_size, &mod_time );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       if ( !class_string.name ) {
-               op->out.class_name = talloc_strdup( mem_ctx, "" );
-       } else {
-               op->out.class_name = talloc_strdup( mem_ctx, class_string.name );
-       }
-
-       if ( !op->out.class_name ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       op->out.num_subkeys = num_subkeys_out;
-       op->out.longest_subkey = long_subkey_out;
-       op->out.longest_class = long_class_out;
-       op->out.num_values = num_values_out;
-       op->out.longest_value_name = long_value_out;
-       op->out.longest_value_data = long_data_out;
-       op->out.security_desc_size = secdesc_size;
-       op->out.last_write_time = nt_time_to_unix( mod_time );
-
-       return CAC_FAILURE;
-}
-
-int cac_RegQueryValue( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct RegQueryValue *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct winreg_String value_string;
-       REGVAL_BUFFER buffer;
-       REG_VALUE_DATA *data_out = NULL;
-       enum winreg_Type val_type;
-       uint8 *buf;
-       uint32 buf_size = 4096;
-       uint32 length = 0;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.key || !op->in.val_name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       value_string.name = op->in.val_name;
-
-       if ( ( buf = TALLOC_ARRAY( mem_ctx, uint8, buf_size ) ) == NULL ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       hnd->status = rpccli_winreg_QueryValue( pipe_hnd, mem_ctx, op->in.key,
-                                               value_string, &val_type, buf,
-                                               &buf_size, &length );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       init_regval_buffer( &buffer, buf, length );
-
-       data_out = cac_MakeRegValueData( mem_ctx, val_type, buffer );
-       if ( !data_out ) {
-               if ( errno == ENOMEM )
-                       hnd->status = NT_STATUS_NO_MEMORY;
-               else
-                       hnd->status = NT_STATUS_INVALID_PARAMETER;
-
-               return CAC_FAILURE;
-       }
-
-       op->out.type = val_type;
-       op->out.data = data_out;
-
-       return CAC_SUCCESS;
-}
-
-
-int cac_RegEnumValues( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct RegEnumValues *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       char *name_buffer;
-       REGVAL_BUFFER val_buf;
-       uint32 *types_out = NULL;
-       REG_VALUE_DATA **values_out = NULL;
-       char **val_names_out = NULL;
-       uint32 num_values_out = 0;
-       uint32 resume_idx = 0;
-       uint32 num_subkeys, max_subkeylen, max_classlen;
-       uint32 num_values, max_valnamelen, maxvalbufsize;
-       struct winreg_String class_string;
-       NTTIME modtime;
-       uint32 secdescsize;
-       uint8 *buffer;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       /* This is to avoid useless rpc calls, if the last 
-          call exhausted all the keys, then we don't need 
-          to go through everything again */
-
-       if ( NT_STATUS_V( hnd->status ) ==
-            NT_STATUS_V( NT_STATUS_GUIDS_EXHAUSTED ) )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.key || op->in.max_values == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*we need to assume that the max number of values will be enumerated */
-       types_out = TALLOC_ARRAY( mem_ctx, uint32, op->in.max_values );
-
-       if ( !types_out ) {
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       values_out = TALLOC_ARRAY( mem_ctx, REG_VALUE_DATA *, 
-                                  op->in.max_values );
-
-       if ( !values_out ) {
-               TALLOC_FREE( types_out );
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       val_names_out = TALLOC_ARRAY( mem_ctx, char *, op->in.max_values );
-
-       if ( !val_names_out ) {
-               TALLOC_FREE( types_out );
-               TALLOC_FREE( values_out );
-               hnd->status = NT_STATUS_NO_MEMORY;
-               return CAC_FAILURE;
-       }
-
-       resume_idx = op->out.resume_idx;
-
-       class_string.name = NULL;
-       hnd->status = rpccli_winreg_QueryInfoKey( pipe_hnd, mem_ctx, op->in.key, 
-                                            &class_string, &num_subkeys, 
-                                            &max_subkeylen, &max_classlen,
-                                            &num_values, &max_valnamelen,
-                                            &maxvalbufsize, &secdescsize, 
-                                            &modtime );
-
-       if ( !NT_STATUS_IS_OK(hnd->status) ) {
-               TALLOC_FREE( types_out );
-               TALLOC_FREE( values_out );
-
-               return CAC_FAILURE;
-       }
-
-       if ( (buffer = TALLOC_ARRAY( mem_ctx, uint8, maxvalbufsize )) == NULL ) {
-               TALLOC_FREE( types_out );
-               TALLOC_FREE( values_out );
-               hnd->status = NT_STATUS_NO_MEMORY;
-
-               return CAC_FAILURE;
-       }
-
-       if ( (name_buffer = TALLOC_ARRAY(mem_ctx, char, max_valnamelen)) == NULL ) {
-               TALLOC_FREE( types_out );
-               TALLOC_FREE( values_out );
-               TALLOC_FREE( buffer );
-               hnd->status = NT_STATUS_NO_MEMORY;
-
-               return CAC_FAILURE;
-       }
-               
-       do {
-               uint32 data_size = maxvalbufsize;
-               uint32 data_length = 0;
-               struct winreg_ValNameBuf name_buf;
-
-               memset( name_buffer, 0x0, max_valnamelen );
-               name_buf.name = name_buffer;
-               name_buf.size = max_valnamelen;
-               name_buf.length = 0;
-               
-               hnd->status = rpccli_winreg_EnumValue( pipe_hnd, mem_ctx, 
-                                                      op->in.key,
-                                                      resume_idx, &name_buf,
-                                                      &types_out[num_values_out], buffer,
-                                                      &data_size,
-                                                      &data_length );
-
-               if ( !NT_STATUS_IS_OK( hnd->status ) )
-                       break;
-
-               ZERO_STRUCT( val_buf );
-               init_regval_buffer(  &val_buf, buffer, data_length );
-
-               values_out[num_values_out] = cac_MakeRegValueData( mem_ctx,
-                                                                  types_out[num_values_out],
-                                                                  val_buf );
-               val_names_out[num_values_out] = TALLOC_ARRAY( mem_ctx, char, name_buf.length+1 );
-
-               if ( !val_names_out[num_values_out]
-                    || !values_out[num_values_out] ) {
-                       hnd->status = NT_STATUS_NO_MEMORY;
-                       break;
-               }
-
-               StrnCpy( val_names_out[num_values_out], name_buf.name, name_buf.length );
-               (val_names_out[num_values_out])[name_buf.length] = '\0';
-
-               num_values_out++;
-               resume_idx++;
-       } while ( num_values_out < op->in.max_values );
-
-       if ( CAC_OP_FAILED( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.types = types_out;
-       op->out.num_values = num_values_out;
-       op->out.value_names = val_names_out;
-       op->out.values = values_out;
-       op->out.resume_idx = resume_idx;
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegSetValue( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                    struct RegSetValue *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct winreg_String value_string;
-
-       RPC_DATA_BLOB *buffer;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.key || !op->in.val_name || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       buffer = cac_MakeRpcDataBlob( mem_ctx, op->in.type, op->in.value );
-
-       if ( !buffer ) {
-               if ( errno == ENOMEM )
-                       hnd->status = NT_STATUS_NO_MEMORY;
-               else
-                       hnd->status = NT_STATUS_INVALID_PARAMETER;
-
-               return CAC_FAILURE;
-       }
-
-       value_string.name = op->in.val_name;
-       hnd->status =
-               rpccli_winreg_SetValue( pipe_hnd, mem_ctx, op->in.key,
-                                       value_string, op->in.type,
-                                       buffer->buffer, buffer->buf_len );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       /*flush */
-       hnd->status = rpccli_winreg_FlushKey( pipe_hnd, mem_ctx, op->in.key );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
-
-
-
-int cac_RegGetVersion( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                      struct RegGetVersion *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       uint32 version_out;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.key || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_winreg_GetVersion( pipe_hnd, mem_ctx, op->in.key,
-                                         &version_out );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       op->out.version = version_out;
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegGetKeySecurity( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct RegGetKeySecurity *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct KeySecurityData keysec;
-
-       ZERO_STRUCT( keysec );
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.key || op->in.info_type == 0 || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status =
-               rpccli_winreg_GetKeySecurity( pipe_hnd, mem_ctx, op->in.key,
-                                             op->in.info_type, &keysec );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-#if 0  /* FIX ME!!!!  unmarshall the security descriptor */
-       op->out.size = buf.sd_size;
-       op->out.descriptor = dup_sec_desc( mem_ctx, buf.sd );
-#endif
-
-       if ( op->out.descriptor == NULL ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_RegSetKeySecurity( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                          struct RegSetKeySecurity *op )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct KeySecurityData keysec;
-
-       ZERO_STRUCT( keysec );
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_WINREG] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !op->in.key || op->in.info_type == 0 || op->in.size == 0
-            || !op->in.descriptor || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_WINREG );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /* FIXME!!! Marshall in the input sec_desc to struct KeySecurityData */
-       hnd->status =
-               rpccli_winreg_SetKeySecurity( pipe_hnd, mem_ctx, op->in.key,
-                                             op->in.info_type, &keysec );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_Shutdown( CacServerHandle * hnd, TALLOC_CTX * mem_ctx,
-                 struct Shutdown *op )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-       struct initshutdown_String msg_string;
-       struct initshutdown_String_sub s;
-
-       char *msg;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       if ( !op || !mem_ctx ) {
-               hnd->status = NT_STATUS_INVALID_PARAMETER;
-               return CAC_FAILURE;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       /*initialize for winreg pipe if we have to */
-       if ( !hnd->_internal.pipes[PI_INITSHUTDOWN] ) {
-               if ( !
-                    ( pipe_hnd =
-                      cli_rpc_pipe_open_noauth( srv->cli, PI_INITSHUTDOWN,
-                                                &( hnd->status ) ) ) ) {
-                       return CAC_FAILURE;
-               }
-
-               hnd->_internal.pipes[PI_INITSHUTDOWN] = True;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_INITSHUTDOWN );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       msg = ( op->in.message !=
-               NULL ) ? op->in.message : talloc_strdup( mem_ctx, "" );
-       msg_string.name = &s;
-       msg_string.name->name = msg;
-
-       hnd->status = NT_STATUS_OK;
-
-       if ( hnd->_internal.srv_level > SRV_WIN_NT4 ) {
-               hnd->status =
-                       rpccli_initshutdown_InitEx( pipe_hnd, mem_ctx, NULL,
-                                                   &msg_string,
-                                                   op->in.timeout,
-                                                   op->in.reboot,
-                                                   op->in.force,
-                                                   op->in.reason );
-       }
-
-       if ( hnd->_internal.srv_level < SRV_WIN_2K
-            || !NT_STATUS_IS_OK( hnd->status ) ) {
-               hnd->status =
-                       rpccli_initshutdown_Init( pipe_hnd, mem_ctx, NULL,
-                                                 &msg_string, op->in.timeout,
-                                                 op->in.reboot,
-                                                 op->in.force );
-
-               hnd->_internal.srv_level = SRV_WIN_NT4;
-       }
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-int cac_AbortShutdown( CacServerHandle * hnd, TALLOC_CTX * mem_ctx )
-{
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd )
-               return CAC_FAILURE;
-
-       if ( !hnd->_internal.ctx || !hnd->_internal.pipes[PI_INITSHUTDOWN] ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       pipe_hnd = cac_GetPipe( hnd, PI_INITSHUTDOWN );
-       if ( !pipe_hnd ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return CAC_FAILURE;
-       }
-
-       hnd->status = rpccli_initshutdown_Abort( pipe_hnd, mem_ctx, NULL );
-
-       if ( !NT_STATUS_IS_OK( hnd->status ) )
-               return CAC_FAILURE;
-
-       return CAC_SUCCESS;
-}
diff --git a/source3/libmsrpc/libmsrpc.c b/source3/libmsrpc/libmsrpc.c
deleted file mode 100644 (file)
index 1211702..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-
-/* 
- *  Unix SMB/CIFS implementation.
- *  MS-RPC client library implementation
- *  Copyright (C) Chris Nicholls              2005.
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "libmsrpc.h"
-#include "libmsrpc_internal.h"
-#include "libsmbclient.h"
-#include "libsmb_internal.h"
-
-int cac_InitHandleData( CacServerHandle * hnd );
-
-/*this function is based on code found in smbc_init_context() (libsmb/libsmbclient.c)*/
-void cac_Init( int debug )
-{
-       if ( debug < 0 || debug > 99 )
-               debug = 0;
-
-       DEBUGLEVEL = debug;
-
-       setup_logging( "libmsrpc", True );
-}
-
-int cac_InitHandleMem( CacServerHandle * hnd )
-{
-       hnd->username = SMB_MALLOC_ARRAY( char, sizeof( fstring ) );
-
-       if ( !hnd->username )
-               return CAC_FAILURE;
-
-       hnd->username[0] = '\0';
-
-       hnd->domain = SMB_MALLOC_ARRAY( char, sizeof( fstring ) );
-       if ( !hnd->domain )
-               return CAC_FAILURE;
-
-       hnd->domain[0] = '\0';
-
-       hnd->netbios_name = SMB_MALLOC_ARRAY( char, sizeof( fstring ) );
-       if ( !hnd->netbios_name )
-               return CAC_FAILURE;
-
-       hnd->netbios_name[0] = '\0';
-
-       hnd->password = SMB_MALLOC_ARRAY( char, sizeof( fstring ) );
-       if ( !hnd->password )
-               return CAC_FAILURE;
-
-       hnd->password[0] = '\0';
-
-       hnd->server = SMB_MALLOC_ARRAY( char, sizeof( fstring ) );
-       if ( !hnd->server )
-               return CAC_FAILURE;
-
-       hnd->server[0] = '\0';
-
-       return CAC_SUCCESS;
-}
-
-CacServerHandle *cac_NewServerHandle( BOOL allocate_fields )
-{
-       CacServerHandle *hnd;
-
-       hnd = SMB_MALLOC_P( CacServerHandle );
-
-       if ( !hnd ) {
-               errno = ENOMEM;
-               return NULL;
-       }
-
-       ZERO_STRUCTP( hnd );
-
-       if ( allocate_fields == True ) {
-               if ( !cac_InitHandleMem( hnd ) ) {
-                       SAFE_FREE( hnd );
-                       return NULL;
-               }
-       }
-
-       hnd->_internal.ctx = smbc_new_context(  );
-       if ( !hnd->_internal.ctx ) {
-               cac_FreeHandle( hnd );
-               return NULL;
-       }
-
-       hnd->_internal.ctx->callbacks.auth_fn = cac_GetAuthDataFn;
-
-       /*add defaults */
-       hnd->debug = 0;
-
-       /*start at the highest and it will fall down after trying the functions */
-       hnd->_internal.srv_level = SRV_WIN_2K3;
-
-       hnd->_internal.user_supplied_ctx = False;
-
-       return hnd;
-}
-
-int cac_InitHandleData( CacServerHandle * hnd )
-{
-       /*store any automatically initialized values */
-       if ( !hnd->netbios_name ) {
-               hnd->netbios_name =
-                       SMB_STRDUP( hnd->_internal.ctx->netbios_name );
-       } else if ( hnd->netbios_name[0] == '\0' ) {
-               strncpy( hnd->netbios_name, hnd->_internal.ctx->netbios_name,
-                        sizeof( fstring ) );
-       }
-
-       if ( !hnd->username ) {
-               hnd->username = SMB_STRDUP( hnd->_internal.ctx->user );
-       } else if ( hnd->username[0] == '\0' ) {
-               strncpy( hnd->username, hnd->_internal.ctx->user,
-                        sizeof( fstring ) );
-       }
-
-       if ( !hnd->domain ) {
-               hnd->domain = SMB_STRDUP( hnd->_internal.ctx->workgroup );
-       } else if ( hnd->domain[0] == '\0' ) {
-               strncpy( hnd->domain, hnd->_internal.ctx->workgroup,
-                        sizeof( fstring ) );
-       }
-
-       return CAC_SUCCESS;
-}
-
-void cac_SetAuthDataFn( CacServerHandle * hnd, smbc_get_auth_data_fn auth_fn )
-{
-       hnd->_internal.ctx->callbacks.auth_fn = auth_fn;
-}
-
-void cac_SetSmbcContext( CacServerHandle * hnd, SMBCCTX * ctx )
-{
-
-       SAFE_FREE( hnd->_internal.ctx );
-
-       hnd->_internal.user_supplied_ctx = True;
-
-       hnd->_internal.ctx = ctx;
-
-   /*_try_ to avoid any problems that might occur if cac_Connect() isn't called*/
-       /*cac_InitHandleData(hnd); */
-}
-
-/*used internally*/
-SMBCSRV *cac_GetServer( CacServerHandle * hnd )
-{
-       SMBCSRV *srv;
-
-       if ( !hnd || !hnd->_internal.ctx ) {
-               return NULL;
-       }
-
-       srv = smbc_attr_server( hnd->_internal.ctx, hnd->server, "IPC$",
-                               hnd->domain, hnd->username, hnd->password,
-                               NULL );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_UNSUCCESSFUL;
-               DEBUG( 1,
-                      ( "cac_GetServer: Could not find server connection.\n" ) );
-       }
-
-       return srv;
-}
-
-
-int cac_Connect( CacServerHandle * hnd, const char *srv )
-{
-       if ( !hnd ) {
-               return CAC_FAILURE;
-       }
-
-       /*these values should be initialized by the user */
-       if ( !hnd->server && !srv ) {
-               return CAC_FAILURE;
-       }
-
-
-       /*change the server name in the server handle if necessary */
-       if ( srv && hnd->server && strcmp( hnd->server, srv ) == 0 ) {
-               SAFE_FREE( hnd->server );
-               hnd->server = SMB_STRDUP( srv );
-       }
-
-
-       /*first see if the context has already been setup */
-       if ( !( hnd->_internal.ctx->internal->_initialized ) ) {
-               hnd->_internal.ctx->debug = hnd->debug;
-
-               /*initialize the context */
-               if ( !smbc_init_context( hnd->_internal.ctx ) ) {
-                       return CAC_FAILURE;
-               }
-       }
-
-       /*copy any uninitialized values out of the smbc context into the handle */
-       if ( !cac_InitHandleData( hnd ) ) {
-               return CAC_FAILURE;
-       }
-
-       DEBUG( 3, ( "cac_Connect: Username:     %s\n", hnd->username ) );
-       DEBUG( 3, ( "cac_Connect: Domain:       %s\n", hnd->domain ) );
-       DEBUG( 3, ( "cac_Connect: Netbios Name: %s\n", hnd->netbios_name ) );
-
-       if ( !cac_GetServer( hnd ) ) {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-
-}
-
-
-void cac_FreeHandle( CacServerHandle * hnd )
-{
-       if ( !hnd )
-               return;
-
-       /*only free the context if we created it */
-       if ( !hnd->_internal.user_supplied_ctx ) {
-               smbc_free_context( hnd->_internal.ctx, True );
-       }
-
-       SAFE_FREE( hnd->netbios_name );
-       SAFE_FREE( hnd->domain );
-       SAFE_FREE( hnd->username );
-       SAFE_FREE( hnd->password );
-       SAFE_FREE( hnd->server );
-       SAFE_FREE( hnd );
-
-}
-
-void cac_InitCacTime( CacTime * cactime, NTTIME nttime )
-{
-       float high, low;
-       uint32 sec;
-
-       if ( !cactime )
-               return;
-
-       ZERO_STRUCTP( cactime );
-
-       /*this code is taken from display_time() found in rpcclient/cmd_samr.c */
-       if ( nttime == 0 )
-               return;
-
-       if ( nttime == 0x80000000000000LL )
-               return;
-
-       high = 65536;
-       high = high / 10000;
-       high = high * 65536;
-       high = high / 1000;
-       high = high * ( ~( nttime >> 32 ) );
-
-       low = ~( nttime & 0xFFFFFFFF );
-       low = low / ( 1000 * 1000 * 10 );
-
-       sec = high + low;
-
-       cactime->days = sec / ( 60 * 60 * 24 );
-       cactime->hours =
-               ( sec - ( cactime->days * 60 * 60 * 24 ) ) / ( 60 * 60 );
-       cactime->minutes =
-               ( sec - ( cactime->days * 60 * 60 * 24 ) -
-                 ( cactime->hours * 60 * 60 ) ) / 60;
-       cactime->seconds =
-               sec - ( cactime->days * 60 * 60 * 24 ) -
-               ( cactime->hours * 60 * 60 ) - ( cactime->minutes * 60 );
-}
-
-void cac_GetAuthDataFn( const char *pServer,
-                       const char *pShare,
-                       char *pWorkgroup,
-                       int maxLenWorkgroup,
-                       char *pUsername,
-                       int maxLenUsername,
-                       char *pPassword, int maxLenPassword )
-{
-       char temp[sizeof( fstring )];
-
-       static char authUsername[sizeof( fstring )];
-       static char authWorkgroup[sizeof( fstring )];
-       static char authPassword[sizeof( fstring )];
-       static char authSet = 0;
-
-       char *pass = NULL;
-
-
-       if ( authSet ) {
-               strncpy( pWorkgroup, authWorkgroup, maxLenWorkgroup - 1 );
-               strncpy( pUsername, authUsername, maxLenUsername - 1 );
-               strncpy( pPassword, authPassword, maxLenPassword - 1 );
-       } else {
-               d_printf( "Domain: [%s] ", pWorkgroup );
-               fgets( temp, sizeof( fstring ), stdin );
-
-               if ( temp[strlen( temp ) - 1] == '\n' ) {       /* A new line? */
-                       temp[strlen( temp ) - 1] = '\0';
-               }
-
-
-               if ( temp[0] != '\0' ) {
-                       strncpy( pWorkgroup, temp, maxLenWorkgroup - 1 );
-                       strncpy( authWorkgroup, temp, maxLenWorkgroup - 1 );
-               }
-
-               d_printf( "Username: [%s] ", pUsername );
-               fgets( temp, sizeof( fstring ), stdin );
-
-               if ( temp[strlen( temp ) - 1] == '\n' ) {       /* A new line? */
-                       temp[strlen( temp ) - 1] = '\0';
-               }
-
-               if ( temp[0] != '\0' ) {
-                       strncpy( pUsername, temp, maxLenUsername - 1 );
-                       strncpy( authUsername, pUsername,
-                                maxLenUsername - 1 );
-               }
-
-               pass = getpass( "Password: " );
-               if ( pass )
-                       fstrcpy( temp, pass );
-               if ( temp[strlen( temp ) - 1] == '\n' ) {       /* A new line? */
-                       temp[strlen( temp ) - 1] = '\0';
-               }
-               if ( temp[0] != '\0' ) {
-                       strncpy( pPassword, temp, maxLenPassword - 1 );
-                       strncpy( authPassword, pPassword,
-                                maxLenPassword - 1 );
-               }
-               authSet = 1;
-       }
-}
diff --git a/source3/libmsrpc/libmsrpc_internal.c b/source3/libmsrpc/libmsrpc_internal.c
deleted file mode 100644 (file)
index 5c80509..0000000
+++ /dev/null
@@ -1,775 +0,0 @@
-
-/* 
- *  Unix SMB/CIFS implementation.
- *  MS-RPC client internal functions
- *  Copyright (C) Chris Nicholls              2005.
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "libmsrpc.h"
-#include "libmsrpc_internal.h"
-
-char *cac_unistr_to_str( TALLOC_CTX * mem_ctx, uint16 * src, int num_bytes );
-char *talloc_unistr2_to_ascii( TALLOC_CTX * mem_ctx, UNISTR2 str );
-char *cac_unistr_ascii( TALLOC_CTX * mem_ctx, UNISTR src );
-
-/*used to get a struct rpc_pipe_client* to be passed into rpccli* calls*/
-struct rpc_pipe_client *cac_GetPipe( CacServerHandle * hnd, int pi_idx )
-{
-       SMBCSRV *srv = NULL;
-       struct rpc_pipe_client *pipe_hnd = NULL;
-
-       if ( !hnd ) {
-               return NULL;
-       }
-
-       if ( hnd->_internal.pipes[pi_idx] == False ) {
-               hnd->status = NT_STATUS_INVALID_HANDLE;
-               return NULL;
-       }
-
-       srv = cac_GetServer( hnd );
-       if ( !srv ) {
-               hnd->status = NT_STATUS_INVALID_CONNECTION;
-               return NULL;
-       }
-
-       pipe_hnd = srv->cli->pipe_list;
-
-       while ( pipe_hnd != NULL && pipe_hnd->pipe_idx != pi_idx ) {
-               pipe_hnd = pipe_hnd->next;
-       }
-
-       return pipe_hnd;
-}
-
-/*takes a string like HKEY_LOCAL_MACHINE\HARDWARE\ACPI and returns the reg_type code and then a pointer to the start of the path (HARDWARE)*/
-int cac_ParseRegPath( char *path, uint32 * reg_type, char **key_name )
-{
-
-       if ( !path )
-               return CAC_FAILURE;
-
-       if ( strncmp( path, "HKLM", 4 ) == 0 ) {
-               *reg_type = HKEY_LOCAL_MACHINE;
-               *key_name = ( path[4] == '\\' ) ? path + 5 : NULL;
-       } else if ( strncmp( path, "HKEY_LOCAL_MACHINE", 18 ) == 0 ) {
-               *reg_type = HKEY_LOCAL_MACHINE;
-               *key_name = ( path[18] == '\\' ) ? path + 19 : NULL;
-       } else if ( strncmp( path, "HKCR", 4 ) == 0 ) {
-               *reg_type = HKEY_CLASSES_ROOT;
-               *key_name = ( path[4] == '\\' ) ? path + 5 : NULL;
-       } else if ( strncmp( path, "HKEY_CLASSES_ROOT", 17 ) == 0 ) {
-               *reg_type = HKEY_CLASSES_ROOT;
-               *key_name = ( path[17] == '\\' ) ? path + 18 : NULL;
-       } else if ( strncmp( path, "HKU", 3 ) == 0 ) {
-               *reg_type = HKEY_USERS;
-               *key_name = ( path[3] == '\\' ) ? path + 4 : NULL;
-       } else if ( strncmp( path, "HKEY_USERS", 10 ) == 0 ) {
-               *reg_type = HKEY_USERS;
-               *key_name = ( path[10] == '\\' ) ? path + 11 : NULL;
-       } else if ( strncmp( path, "HKPD", 4 ) == 0 ) {
-               *reg_type = HKEY_PERFORMANCE_DATA;
-               *key_name = ( path[4] == '\\' ) ? path + 5 : NULL;
-       } else if ( strncmp( path, "HKEY_PERFORMANCE_DATA", 21 ) == 0 ) {
-               *reg_type = HKEY_PERFORMANCE_DATA;
-               *key_name = ( path[21] == '\\' ) ? path + 22 : NULL;
-       } else {
-               return CAC_FAILURE;
-       }
-
-       return CAC_SUCCESS;
-}
-
-
-
-RPC_DATA_BLOB *cac_MakeRpcDataBlob( TALLOC_CTX * mem_ctx, uint32 data_type,
-                                   REG_VALUE_DATA data )
-{
-       RPC_DATA_BLOB *blob = NULL;
-       int i;
-       uint32 size = 0;
-       uint8 *multi = NULL;
-       uint32 multi_idx = 0;
-
-       blob = talloc( mem_ctx, RPC_DATA_BLOB );
-
-       if ( !blob ) {
-               errno = ENOMEM;
-               return NULL;
-       }
-
-       switch ( data_type ) {
-       case REG_SZ:
-               init_rpc_blob_str( blob, data.reg_sz,
-                                  strlen( data.reg_sz ) + 1 );
-               break;
-
-       case REG_EXPAND_SZ:
-               init_rpc_blob_str( blob, data.reg_expand_sz,
-                                  strlen( data.reg_sz ) + 1 );
-               break;
-
-       case REG_BINARY:
-               init_rpc_blob_bytes( blob, data.reg_binary.data,
-                                    data.reg_binary.data_length );
-               break;
-
-       case REG_DWORD:
-               init_rpc_blob_uint32( blob, data.reg_dword );
-               break;
-
-       case REG_DWORD_BIG_ENDIAN:
-               init_rpc_blob_uint32( blob, data.reg_dword_be );
-               break;
-
-       case REG_MULTI_SZ:
-               /*need to find the size */
-               for ( i = 0; i < data.reg_multi_sz.num_strings; i++ ) {
-                       size += strlen( data.reg_multi_sz.strings[i] ) + 1;
-               }
-
-        /**need a whole bunch of unicode strings in a row (seperated by null characters), with an extra null-character on the end*/
-
-               multi = TALLOC_ZERO_ARRAY( mem_ctx, uint8, ( size + 1 ) * 2 );  /*size +1 for the extra null character */
-               if ( !multi ) {
-                       errno = ENOMEM;
-                       break;
-               }
-
-               /*do it using rpcstr_push() */
-               multi_idx = 0;
-               for ( i = 0; i < data.reg_multi_sz.num_strings; i++ ) {
-                       size_t len =
-                               strlen( data.reg_multi_sz.strings[i] ) + 1;
-
-                       rpcstr_push( ( multi + multi_idx ),
-                                    data.reg_multi_sz.strings[i], len * 2,
-                                    STR_TERMINATE );
-
-                       /* x2 becuase it is a uint8 buffer */
-                       multi_idx += len * 2;
-               }
-
-               /*now initialize the buffer as binary data */
-               init_rpc_blob_bytes( blob, multi, ( size + 1 ) * 2 );
-
-               break;
-
-       default:
-               TALLOC_FREE( blob );
-               blob = NULL;
-               return NULL;
-       }
-
-       if ( !( blob->buffer ) ) {
-               TALLOC_FREE( blob );
-               return NULL;
-       }
-
-       return blob;
-}
-
-/*turns a string in a uint16 array to a char array*/
-char *cac_unistr_to_str( TALLOC_CTX * mem_ctx, uint16 * src, int num_bytes )
-{
-       char *buf;
-
-       int i = 0;
-
-       uint32 str_len = 0;
-
-       /*don't allocate more space than we need */
-       while ( ( str_len ) < num_bytes / 2 && src[str_len] != 0x0000 )
-               str_len++;
-
-       /*need room for a '\0' */
-       str_len++;
-
-       buf = TALLOC_ARRAY( mem_ctx, char, str_len );
-
-       if ( !buf ) {
-               return NULL;
-       }
-
-       for ( i = 0; i < num_bytes / 2; i++ ) {
-               buf[i] = ( ( char * ) src )[2 * i];
-       }
-
-       buf[str_len - 1] = '\0';
-
-       return buf;
-}
-
-REG_VALUE_DATA *cac_MakeRegValueData( TALLOC_CTX * mem_ctx, uint32 data_type,
-                                     REGVAL_BUFFER buf )
-{
-       REG_VALUE_DATA *data;
-
-       uint32 i;
-
-       /*all of the following used for MULTI_SZ data */
-       uint32 size = 0;
-       uint32 len = 0;
-       uint32 multi_idx = 0;
-       uint32 num_strings = 0;
-       char **strings = NULL;
-
-       data = talloc( mem_ctx, REG_VALUE_DATA );
-       if ( !data ) {
-               errno = ENOMEM;
-               return NULL;
-       }
-
-       switch ( data_type ) {
-       case REG_SZ:
-               data->reg_sz =
-                       cac_unistr_to_str( mem_ctx, buf.buffer, buf.buf_len );
-               if ( !data->reg_sz ) {
-                       TALLOC_FREE( data );
-                       errno = ENOMEM;
-                       data = NULL;
-               }
-
-               break;
-
-       case REG_EXPAND_SZ:
-               data->reg_expand_sz =
-                       cac_unistr_to_str( mem_ctx, buf.buffer, buf.buf_len );
-
-               if ( !data->reg_expand_sz ) {
-                       TALLOC_FREE( data );
-                       errno = ENOMEM;
-                       data = NULL;
-               }
-
-               break;
-
-       case REG_BINARY:
-               size = buf.buf_len;
-
-               data->reg_binary.data_length = size;
-
-               if (size) {
-                       data->reg_binary.data =
-                               ( uint8 * ) TALLOC_MEMDUP( mem_ctx, buf.buffer, size );
-                       if ( !data->reg_binary.data ) {
-                               TALLOC_FREE( data );
-                               errno = ENOMEM;
-                               data = NULL;
-                       }
-               } else {
-                       data->reg_binary.data = NULL;
-               }
-               break;
-
-       case REG_DWORD:
-               data->reg_dword = *( ( uint32 * ) buf.buffer );
-               break;
-
-       case REG_DWORD_BIG_ENDIAN:
-               data->reg_dword_be = *( ( uint32 * ) buf.buffer );
-               break;
-
-       case REG_MULTI_SZ:
-               size = buf.buf_len;
-
-               /*find out how many strings there are. size is # of bytes and we want to work uint16 */
-               for ( i = 0; i < ( size / 2 - 1 ); i++ ) {
-                       if ( buf.buffer[i] == 0x0000 )
-                               num_strings++;
-
-                       /*buffer is suppsed to be terminated with \0\0, but it might not be */
-                       if ( buf.buffer[i] == 0x0000
-                            && buf.buffer[i + 1] == 0x0000 )
-                               break;
-               }
-
-               if (num_strings) {
-                       strings = TALLOC_ARRAY( mem_ctx, char *, num_strings );
-
-                       if ( !strings ) {
-                               errno = ENOMEM;
-                               TALLOC_FREE( data );
-                               break;
-                       }
-               } else {
-                       strings = NULL;
-               }
-
-               if ( num_strings == 0 ) /*then our work here is done */
-                       break;
-
-               for ( i = 0; i < num_strings; i++ ) {
-                       /*find out how many characters are in this string */
-                       len = 0;
-                       /*make sure we don't go past the end of the buffer and keep looping until we have a uni \0 */
-                       while ( multi_idx + len < size / 2
-                               && buf.buffer[multi_idx + len] != 0x0000 )
-                               len++;
-
-                       /*stay aware of the \0\0 */
-                       len++;
-
-                       strings[i] = TALLOC_ZERO_ARRAY( mem_ctx, char, len );
-
-                       /*pull out the unicode string */
-                       rpcstr_pull( strings[i], ( buf.buffer + multi_idx ),
-                                    len, -1, STR_TERMINATE );
-
-                       /*keep track of where we are in the bigger array */
-                       multi_idx += len;
-               }
-
-               data->reg_multi_sz.num_strings = num_strings;
-               data->reg_multi_sz.strings = strings;
-
-               break;
-
-       default:
-               TALLOC_FREE( data );
-               data = NULL;
-       }
-
-       return data;
-}
-
-SAM_USERINFO_CTR *cac_MakeUserInfoCtr( TALLOC_CTX * mem_ctx,
-                                      CacUserInfo * info )
-{
-       SAM_USERINFO_CTR *ctr = NULL;
-
-       /*the flags we are 'setting'- include/passdb.h */
-       uint32 flags =
-               ACCT_USERNAME | ACCT_FULL_NAME | ACCT_PRIMARY_GID |
-               ACCT_DESCRIPTION | ACCT_COMMENT | ACCT_HOME_DIR |
-               ACCT_HOME_DRIVE | ACCT_LOGON_SCRIPT | ACCT_PROFILE |
-               ACCT_WORKSTATIONS | ACCT_FLAGS;
-
-       NTTIME logon_time;
-       NTTIME logoff_time;
-       NTTIME kickoff_time;
-       NTTIME pass_last_set_time;
-       NTTIME pass_can_change_time;
-       NTTIME pass_must_change_time;
-
-       UNISTR2 user_name;
-       UNISTR2 full_name;
-       UNISTR2 home_dir;
-       UNISTR2 dir_drive;
-       UNISTR2 log_scr;
-       UNISTR2 prof_path;
-       UNISTR2 desc;
-       UNISTR2 wkstas;
-       UNISTR2 mung_dial;
-       UNISTR2 unk;
-
-       ctr = talloc( mem_ctx, SAM_USERINFO_CTR );
-       if ( !ctr )
-               return NULL;
-
-       ZERO_STRUCTP( ctr->info.id23 );
-
-       ctr->info.id21 = talloc( mem_ctx, SAM_USER_INFO_21 );
-       if ( !ctr->info.id21 )
-               return NULL;
-
-       ctr->switch_value = 21;
-
-       ZERO_STRUCTP( ctr->info.id21 );
-
-       unix_to_nt_time( &logon_time, info->logon_time );
-       unix_to_nt_time( &logoff_time, info->logoff_time );
-       unix_to_nt_time( &kickoff_time, info->kickoff_time );
-       unix_to_nt_time( &pass_last_set_time, info->pass_last_set_time );
-       unix_to_nt_time( &pass_can_change_time, info->pass_can_change_time );
-       unix_to_nt_time( &pass_must_change_time,
-                        info->pass_must_change_time );
-
-       /*initialize the strings */
-       init_unistr2( &user_name, info->username, UNI_STR_TERMINATE );
-       init_unistr2( &full_name, info->full_name, UNI_STR_TERMINATE );
-       init_unistr2( &home_dir, info->home_dir, UNI_STR_TERMINATE );
-       init_unistr2( &dir_drive, info->home_drive, UNI_STR_TERMINATE );
-       init_unistr2( &log_scr, info->logon_script, UNI_STR_TERMINATE );
-       init_unistr2( &prof_path, info->profile_path, UNI_STR_TERMINATE );
-       init_unistr2( &desc, info->description, UNI_STR_TERMINATE );
-       init_unistr2( &wkstas, info->workstations, UNI_STR_TERMINATE );
-       init_unistr2( &unk, "\0", UNI_STR_TERMINATE );
-       init_unistr2( &mung_dial, info->dial, UNI_STR_TERMINATE );
-
-       /*manually set passmustchange */
-       ctr->info.id21->passmustchange =
-               ( info->pass_must_change ) ? 0x01 : 0x00;
-
-       init_sam_user_info21W( ctr->info.id21, &logon_time, &logoff_time, &kickoff_time, &pass_last_set_time, &pass_can_change_time, &pass_must_change_time, &user_name, &full_name, &home_dir, &dir_drive, &log_scr, &prof_path, &desc, &wkstas, &unk, &mung_dial, info->lm_password, info->nt_password, info->rid, info->group_rid, info->acb_mask, flags, 168,       /*logon divs */
-                              info->logon_hours,
-                              info->bad_passwd_count, info->logon_count );
-
-       return ctr;
-
-}
-
-char *talloc_unistr2_to_ascii( TALLOC_CTX * mem_ctx, UNISTR2 str )
-{
-       char *buf = NULL;
-
-       if ( !mem_ctx )
-               return NULL;
-
-       buf = TALLOC_ARRAY( mem_ctx, char, ( str.uni_str_len + 1 ) );
-       if ( !buf )
-               return NULL;
-
-       unistr2_to_ascii( buf, &str, str.uni_str_len + 1 );
-
-       return buf;
-}
-
-CacUserInfo *cac_MakeUserInfo( TALLOC_CTX * mem_ctx, SAM_USERINFO_CTR * ctr )
-{
-       CacUserInfo *info = NULL;
-       SAM_USER_INFO_21 *id21 = NULL;
-
-       if ( !ctr || ctr->switch_value != 21 )
-               return NULL;
-
-       info = talloc( mem_ctx, CacUserInfo );
-       if ( !info )
-               return NULL;
-
-       id21 = ctr->info.id21;
-
-       ZERO_STRUCTP( info );
-
-       info->logon_time = nt_time_to_unix( id21->logon_time );
-       info->logoff_time = nt_time_to_unix( id21->logoff_time );
-       info->kickoff_time = nt_time_to_unix( id21->kickoff_time );
-       info->pass_last_set_time =
-               nt_time_to_unix( id21->pass_last_set_time );
-       info->pass_can_change_time =
-               nt_time_to_unix( id21->pass_can_change_time );
-       info->pass_must_change_time =
-               nt_time_to_unix( id21->pass_must_change_time );
-
-       info->username =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_user_name );
-       if ( !info->username )
-               return NULL;
-
-       info->full_name =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_full_name );
-       if ( !info->full_name )
-               return NULL;
-
-       info->home_dir =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_home_dir );
-       if ( !info->home_dir )
-               return NULL;
-
-       info->home_drive =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_dir_drive );
-       if ( !info->home_drive )
-               return NULL;
-
-       info->logon_script =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_logon_script );
-       if ( !info->logon_script )
-               return NULL;
-
-       info->profile_path =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_profile_path );
-       if ( !info->profile_path )
-               return NULL;
-
-       info->description =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_acct_desc );
-       if ( !info->description )
-               return NULL;
-
-       info->workstations =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_workstations );
-       if ( !info->workstations )
-               return NULL;
-
-       info->dial =
-               talloc_unistr2_to_ascii( mem_ctx, id21->uni_munged_dial );
-       if ( !info->dial )
-               return NULL;
-
-       info->rid = id21->user_rid;
-       info->group_rid = id21->group_rid;
-       info->acb_mask = id21->acb_info;
-       info->bad_passwd_count = id21->bad_password_count;
-       info->logon_count = id21->logon_count;
-
-       memcpy( info->nt_password, id21->nt_pwd, 8 );
-       memcpy( info->lm_password, id21->lm_pwd, 8 );
-
-       info->logon_hours =
-               ( LOGON_HRS * ) TALLOC_MEMDUP( mem_ctx, &( id21->logon_hrs ),
-                                              sizeof( LOGON_HRS ) );
-       if ( !info->logon_hours )
-               return NULL;
-
-       info->pass_must_change = ( id21->passmustchange ) ? True : False;
-
-       return info;
-}
-
-CacGroupInfo *cac_MakeGroupInfo( TALLOC_CTX * mem_ctx, GROUP_INFO_CTR * ctr )
-{
-       CacGroupInfo *info = NULL;
-
-       if ( !mem_ctx || !ctr || ctr->switch_value1 != 1 )
-               return NULL;
-
-       info = talloc( mem_ctx, CacGroupInfo );
-       if ( !info )
-               return NULL;
-
-       info->name =
-               talloc_unistr2_to_ascii( mem_ctx,
-                                        ctr->group.info1.uni_acct_name );
-       if ( !info->name )
-               return NULL;
-
-       info->description =
-               talloc_unistr2_to_ascii( mem_ctx,
-                                        ctr->group.info1.uni_acct_desc );
-       if ( !info->description )
-               return NULL;
-
-       info->num_members = ctr->group.info1.num_members;
-
-       return info;
-}
-
-GROUP_INFO_CTR *cac_MakeGroupInfoCtr( TALLOC_CTX * mem_ctx,
-                                     CacGroupInfo * info )
-{
-       GROUP_INFO_CTR *ctr = NULL;
-
-       if ( !mem_ctx || !info )
-               return NULL;
-
-       ctr = talloc( mem_ctx, GROUP_INFO_CTR );
-       if ( !ctr )
-               return NULL;
-
-       ctr->switch_value1 = 1;
-
-       init_samr_group_info1( &( ctr->group.info1 ), info->name,
-                              info->description, info->num_members );
-
-       return ctr;
-}
-
-CacAliasInfo *cac_MakeAliasInfo( TALLOC_CTX * mem_ctx, ALIAS_INFO_CTR ctr )
-{
-       CacGroupInfo *info = NULL;
-
-       if ( !mem_ctx || ctr.level != 1 )
-               return NULL;
-
-       info = talloc( mem_ctx, CacAliasInfo );
-       if ( !info )
-               return NULL;
-
-       info->name =
-               talloc_unistr2_to_ascii( mem_ctx,
-                                        *( ctr.alias.info1.name.string ) );
-       if ( !info->name )
-               return NULL;
-
-       info->description =
-               talloc_unistr2_to_ascii( mem_ctx,
-                                        *( ctr.alias.info1.description.
-                                           string ) );
-       if ( !info->name )
-               return NULL;
-
-       info->num_members = ctr.alias.info1.num_member;
-
-       return info;
-}
-
-ALIAS_INFO_CTR *cac_MakeAliasInfoCtr( TALLOC_CTX * mem_ctx,
-                                     CacAliasInfo * info )
-{
-       ALIAS_INFO_CTR *ctr = NULL;
-
-       if ( !mem_ctx || !info )
-               return NULL;
-
-       ctr = talloc( mem_ctx, ALIAS_INFO_CTR );
-       if ( !ctr )
-               return NULL;
-
-       ctr->level = 1;
-
-       init_samr_alias_info1( &( ctr->alias.info1 ), info->name,
-                              info->num_members, info->description );
-
-       return ctr;
-}
-
-CacDomainInfo *cac_MakeDomainInfo( TALLOC_CTX * mem_ctx,
-                                  SAM_UNK_INFO_1 * info1,
-                                  SAM_UNK_INFO_2 * info2,
-                                  SAM_UNK_INFO_12 * info12 )
-{
-       CacDomainInfo *info = NULL;
-
-       if ( !mem_ctx || !info1 || !info2 || !info12 )
-               return NULL;
-
-       info = talloc( mem_ctx, CacDomainInfo );
-       if ( !info )
-               return NULL;
-
-       info->min_pass_length = info1->min_length_password;
-       info->pass_history = info1->password_history;
-
-       cac_InitCacTime( &( info->expire ), info1->expire );
-       cac_InitCacTime( &( info->min_pass_age ), info1->min_passwordage );
-
-       info->server_role = info2->server_role;
-       info->num_users = info2->num_domain_usrs;
-       info->num_domain_groups = info2->num_domain_grps;
-       info->num_local_groups = info2->num_local_grps;
-
-       /*if these have been ZERO'd out we need to know. uni_str_len will be 0 */
-       if ( info2->uni_comment.uni_str_len == 0 ) {
-               info->comment = talloc_strdup( mem_ctx, "\0" );
-       } else {
-               info->comment =
-                       talloc_unistr2_to_ascii( mem_ctx,
-                                                info2->uni_comment );
-       }
-
-       if ( info2->uni_domain.uni_str_len == 0 ) {
-               info->domain_name = talloc_strdup( mem_ctx, "\0" );
-       } else {
-               info->domain_name =
-                       talloc_unistr2_to_ascii( mem_ctx, info2->uni_domain );
-       }
-
-       if ( info2->uni_server.uni_str_len == 0 ) {
-               info->server_name = talloc_strdup( mem_ctx, "\0" );
-       } else {
-               info->server_name =
-                       talloc_unistr2_to_ascii( mem_ctx, info2->uni_server );
-       }
-
-
-       cac_InitCacTime( &( info->lockout_duration ), info12->duration );
-       cac_InitCacTime( &( info->lockout_reset ), info12->reset_count );
-       info->num_bad_attempts = info12->bad_attempt_lockout;
-
-       return info;
-}
-
-char *cac_unistr_ascii( TALLOC_CTX * mem_ctx, UNISTR src )
-{
-       char *buf;
-       uint32 len;
-
-       if ( !mem_ctx || !src.buffer )
-               return NULL;
-
-       len = unistrlen( src.buffer ) + 1;
-
-       buf = TALLOC_ZERO_ARRAY( mem_ctx, char, len );
-       if ( !buf )
-               return NULL;
-
-       rpcstr_pull( buf, src.buffer, len, -1, STR_TERMINATE );
-
-       return buf;
-}
-
-CacService *cac_MakeServiceArray( TALLOC_CTX * mem_ctx,
-                                 ENUM_SERVICES_STATUS * svc,
-                                 uint32 num_services )
-{
-       int i;
-       CacService *services = NULL;
-
-       if ( !mem_ctx || !svc )
-               return NULL;
-
-       if (num_services) {
-               services = TALLOC_ZERO_ARRAY( mem_ctx, CacService, num_services );
-               if ( !services )
-                       return NULL;
-       } else {
-               services = NULL;
-       }
-
-       for ( i = 0; i < num_services; i++ ) {
-               services[i].service_name =
-                       cac_unistr_ascii( mem_ctx, svc[i].servicename );
-               services[i].display_name =
-                       cac_unistr_ascii( mem_ctx, svc[i].displayname );
-
-               if ( !services[i].service_name || !services[i].display_name )
-                       return NULL;
-
-               services[i].status = svc[i].status;
-       }
-
-       return services;
-}
-
-int cac_InitCacServiceConfig( TALLOC_CTX * mem_ctx, SERVICE_CONFIG * src,
-                             CacServiceConfig * dest )
-{
-       if ( !src || !dest )
-               return CAC_FAILURE;
-
-       dest->exe_path =
-               talloc_unistr2_to_ascii( mem_ctx, *src->executablepath );
-       if ( !dest->exe_path )
-               return CAC_FAILURE;
-
-       dest->load_order_group =
-               talloc_unistr2_to_ascii( mem_ctx, *src->loadordergroup );
-       if ( !dest->load_order_group )
-               return CAC_FAILURE;
-
-       dest->dependencies =
-               talloc_unistr2_to_ascii( mem_ctx, *src->dependencies );
-       if ( !dest->dependencies )
-               return CAC_FAILURE;
-
-       dest->start_name =
-               talloc_unistr2_to_ascii( mem_ctx, *src->startname );
-       if ( !dest->start_name )
-               return CAC_FAILURE;
-
-       dest->display_name =
-               talloc_unistr2_to_ascii( mem_ctx, *src->displayname );
-       if ( !dest->display_name )
-               return CAC_FAILURE;
-
-       dest->type = src->service_type;
-       dest->start_type = src->start_type;
-       dest->error_control = src->error_control;
-       dest->tag_id = src->tag_id;
-
-       return CAC_SUCCESS;
-}
index 820a904ea4f9c34ab3095dd270f0ce3c6325a8a1..78cc63de50f8d2dcfdfa81275432378d7a0f3851 100644 (file)
@@ -98,7 +98,7 @@ static NTSTATUS cli_session_setup_lanman2(struct cli_state *cli,
 
        /* send a session setup command */
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,10, 0, True);
+       set_message(cli->outbuf,10, 0, True);
        SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
        
@@ -168,7 +168,7 @@ static NTSTATUS cli_session_setup_guest(struct cli_state *cli)
        uint32 capabilities = cli_session_setup_capabilities(cli);
 
        memset(cli->outbuf, '\0', smb_size);
-       set_message(NULL,cli->outbuf,13,0,True);
+       set_message(cli->outbuf,13,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
                        
@@ -228,7 +228,7 @@ static NTSTATUS cli_session_setup_plaintext(struct cli_state *cli,
        fstr_sprintf( lanman, "Samba %s", SAMBA_VERSION_STRING);
 
        memset(cli->outbuf, '\0', smb_size);
-       set_message(NULL,cli->outbuf,13,0,True);
+       set_message(cli->outbuf,13,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
                        
@@ -377,7 +377,7 @@ static NTSTATUS cli_session_setup_nt1(struct cli_state *cli, const char *user,
        /* send a session setup command */
        memset(cli->outbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,13,0,True);
+       set_message(cli->outbuf,13,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
                        
@@ -457,7 +457,7 @@ static BOOL cli_session_setup_blob_send(struct cli_state *cli, DATA_BLOB blob)
        /* send a session setup command */
        memset(cli->outbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,12,0,True);
+       set_message(cli->outbuf,12,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
 
        cli_setup_packet(cli);
@@ -765,7 +765,7 @@ static NTSTATUS cli_session_setup_ntlmssp(struct cli_state *cli, const char *use
                }
        }
 
-       /* we have a reference counter on ntlmssp_state, if we are signing
+       /* we have a reference conter on ntlmssp_state, if we are signing
           then the state will be kept by the signing engine */
 
        ntlmssp_end(&ntlmssp_state);
@@ -978,6 +978,7 @@ NTSTATUS cli_session_setup(struct cli_state *cli,
        }
 
        return NT_STATUS_OK;
+
 }
 
 /****************************************************************************
@@ -987,7 +988,7 @@ NTSTATUS cli_session_setup(struct cli_state *cli,
 BOOL cli_ulogoff(struct cli_state *cli)
 {
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,2,0,True);
+       set_message(cli->outbuf,2,0,True);
        SCVAL(cli->outbuf,smb_com,SMBulogoffX);
        cli_setup_packet(cli);
        SSVAL(cli->outbuf,smb_vwv0,0xFF);
@@ -1064,7 +1065,7 @@ BOOL cli_send_tconX(struct cli_state *cli,
        slprintf(fullshare, sizeof(fullshare)-1,
                 "\\\\%s\\%s", cli->desthost, share);
 
-       set_message(NULL,cli->outbuf,4, 0, True);
+       set_message(cli->outbuf,4, 0, True);
        SCVAL(cli->outbuf,smb_com,SMBtconX);
        cli_setup_packet(cli);
 
@@ -1115,7 +1116,7 @@ BOOL cli_send_tconX(struct cli_state *cli,
 BOOL cli_tdis(struct cli_state *cli)
 {
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,0,0,True);
+       set_message(cli->outbuf,0,0,True);
        SCVAL(cli->outbuf,smb_com,SMBtdis);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
@@ -1147,7 +1148,7 @@ void cli_negprot_send(struct cli_state *cli)
        memset(cli->outbuf,'\0',smb_size);
 
        /* setup the protocol strings */
-       set_message(NULL,cli->outbuf,0,0,True);
+       set_message(cli->outbuf,0,0,True);
 
        p = smb_buf(cli->outbuf);
        for (numprots=0;
@@ -1187,7 +1188,7 @@ BOOL cli_negprot(struct cli_state *cli)
             numprots++)
                plength += strlen(prots[numprots].name)+2;
     
-       set_message(NULL,cli->outbuf,0,plength,True);
+       set_message(cli->outbuf,0,plength,True);
 
        p = smb_buf(cli->outbuf);
        for (numprots=0;
@@ -1720,7 +1721,7 @@ NTSTATUS cli_raw_tcon(struct cli_state *cli,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf, 0, 0, True);
+       set_message(cli->outbuf, 0, 0, True);
        SCVAL(cli->outbuf,smb_com,SMBtcon);
        cli_setup_packet(cli);
 
index 7a6ee17f4aaf87d25c017d6ebd86bf5e24c8c6a0..f170834fa923725f44a52c275f91875409c5f2cd 100644 (file)
@@ -69,7 +69,7 @@ BOOL cli_send_mailslot(struct messaging_context *msg_ctx,
        /* Setup the smb part. */
        ptr -= 4; /* XXX Ugliness because of handling of tcp SMB length. */
        memcpy(tmp,ptr,4);
-       set_message(NULL,ptr,17,strlen(mailslot) + 1 + len,True);
+       set_message(ptr,17,strlen(mailslot) + 1 + len,True);
        memcpy(ptr,tmp,4);
 
        SCVAL(ptr,smb_com,SMBtrans);
index a23e0184d7c3a2ffa862a3352bd3fabfecd65138..1e3af9a3d7844c31ffabb4dcdc1cca3960a2ecce 100644 (file)
@@ -48,18 +48,15 @@ int cli_set_port(struct cli_state *cli, int port)
  *MUST* be of size BUFFER_SIZE+SAFETY_MARGIN.
  The timeout is in milliseconds
 
- This is exactly the same as receive_smb except that it can be set to never return
+ This is exactly the same as receive_smb except that it never returns
  a session keepalive packet (just as receive_smb used to do).
  receive_smb was changed to return keepalives as the oplock processing means this call
  should never go into a blocking read.
 ****************************************************************************/
 
-static ssize_t client_receive_smb(struct cli_state *cli, BOOL eat_keepalives, size_t maxlen)
+static ssize_t client_receive_smb(int fd,char *buffer, unsigned int timeout, size_t maxlen)
 {
        ssize_t len;
-       int fd = cli->fd;
-       char *buffer = cli->inbuf;
-       unsigned int timeout = cli->timeout;
 
        for(;;) {
                len = receive_smb_raw(fd, buffer, timeout, maxlen);
@@ -71,22 +68,8 @@ static ssize_t client_receive_smb(struct cli_state *cli, BOOL eat_keepalives, si
                }
 
                /* Ignore session keepalive packets. */
-               if (eat_keepalives && (CVAL(buffer,0) == SMBkeepalive)) {
-                       continue;
-               }
-               break;
-       }
-
-       if (cli_encryption_on(cli)) {
-               NTSTATUS status = cli_decrypt_message(cli);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("SMB decryption failed on incoming packet! Error %s\n",
-                               nt_errstr(status)));
-                       cli->smb_rw_error = READ_BAD_DECRYPT;
-                       close(cli->fd);
-                       cli->fd = -1;
-                       return -1;
-               }
+               if(CVAL(buffer,0) != SMBkeepalive)
+                       break;
        }
        show_msg(buffer);
        return len;
@@ -96,7 +79,7 @@ static ssize_t client_receive_smb(struct cli_state *cli, BOOL eat_keepalives, si
  Recv an smb.
 ****************************************************************************/
 
-BOOL cli_receive_smb_internal(struct cli_state *cli, BOOL eat_keepalives)
+BOOL cli_receive_smb(struct cli_state *cli)
 {
        ssize_t len;
 
@@ -105,12 +88,7 @@ BOOL cli_receive_smb_internal(struct cli_state *cli, BOOL eat_keepalives)
                return False; 
 
  again:
-       len = client_receive_smb(cli, eat_keepalives, 0);
-
-       if (len >= 0 && !eat_keepalives && (CVAL(cli->inbuf,0) == SMBkeepalive)) {
-               /* Give back the keepalive. */
-               return True;
-       }
+       len = client_receive_smb(cli->fd,cli->inbuf,cli->timeout, 0);
        
        if (len > 0) {
                /* it might be an oplock break request */
@@ -166,29 +144,10 @@ BOOL cli_receive_smb_internal(struct cli_state *cli, BOOL eat_keepalives)
                close(cli->fd);
                cli->fd = -1;
                return False;
-       }
-
+       };
        return True;
 }
 
-/****************************************************************************
- Recv an smb - eat keepalives.
-****************************************************************************/
-
-BOOL cli_receive_smb(struct cli_state *cli)
-{
-       return cli_receive_smb_internal(cli, True);
-}
-
-/****************************************************************************
- Recv an smb - return keepalives.
-****************************************************************************/
-
-BOOL cli_receive_smb_return_keepalive(struct cli_state *cli)
-{
-       return cli_receive_smb_internal(cli, False);
-}
-
 /****************************************************************************
  Read the data portion of a readX smb.
  The timeout is in milliseconds
@@ -205,7 +164,6 @@ ssize_t cli_receive_smb_data(struct cli_state *cli, char *buffer, size_t len)
 
 /****************************************************************************
  Read a smb readX header.
- We can only use this if encryption and signing are off.
 ****************************************************************************/
 
 BOOL cli_receive_smb_readX_header(struct cli_state *cli)
@@ -218,7 +176,7 @@ BOOL cli_receive_smb_readX_header(struct cli_state *cli)
  again:
 
        /* Read up to the size of a readX header reply. */
-       len = client_receive_smb(cli, True, (smb_size - 4) + 24);
+       len = client_receive_smb(cli->fd, cli->inbuf, cli->timeout, (smb_size - 4) + 24);
        
        if (len > 0) {
                /* it might be an oplock break request */
@@ -296,7 +254,7 @@ static ssize_t write_socket(int fd, const char *buf, size_t len)
                                                                                                                                             
         DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
         ret = write_data(fd,buf,len);
-
+                                                                                                                                            
         DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
         if(ret <= 0)
                 DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
@@ -314,36 +272,18 @@ BOOL cli_send_smb(struct cli_state *cli)
        size_t len;
        size_t nwritten=0;
        ssize_t ret;
-       char *buf_out = cli->outbuf;
-       BOOL enc_on = cli_encryption_on(cli);
 
        /* fd == -1 causes segfaults -- Tom (tom@ninja.nl) */
-       if (cli->fd == -1) {
+       if (cli->fd == -1)
                return False;
-       }
 
        cli_calculate_sign_mac(cli);
 
-       if (enc_on) {
-               NTSTATUS status = cli_encrypt_message(cli, &buf_out);
-               if (!NT_STATUS_IS_OK(status)) {
-                       close(cli->fd);
-                       cli->fd = -1;
-                       cli->smb_rw_error = WRITE_ERROR;
-                       DEBUG(0,("Error in encrypting client message. Error %s\n",
-                               nt_errstr(status) ));
-                       return False;
-               }
-       }
-
-       len = smb_len(buf_out) + 4;
+       len = smb_len(cli->outbuf) + 4;
 
        while (nwritten < len) {
-               ret = write_socket(cli->fd,buf_out+nwritten,len - nwritten);
+               ret = write_socket(cli->fd,cli->outbuf+nwritten,len - nwritten);
                if (ret <= 0) {
-                       if (enc_on) {
-                               cli_free_enc_buffer(cli, buf_out);
-                       }
                        close(cli->fd);
                        cli->fd = -1;
                        cli->smb_rw_error = WRITE_ERROR;
@@ -353,14 +293,10 @@ BOOL cli_send_smb(struct cli_state *cli)
                }
                nwritten += ret;
        }
-
-       cli_free_enc_buffer(cli, buf_out);
-
        /* Increment the mid so we can tell between responses. */
        cli->mid++;
-       if (!cli->mid) {
+       if (!cli->mid)
                cli->mid++;
-       }
        return True;
 }
 
@@ -401,7 +337,7 @@ void cli_setup_packet(struct cli_state *cli)
 
 void cli_setup_bcc(struct cli_state *cli, void *p)
 {
-       set_message_bcc(NULL,cli->outbuf, PTR_DIFF(p, smb_buf(cli->outbuf)));
+       set_message_bcc(cli->outbuf, PTR_DIFF(p, smb_buf(cli->outbuf)));
 }
 
 /****************************************************************************
@@ -607,8 +543,6 @@ void cli_shutdown(struct cli_state *cli)
        SAFE_FREE(cli->inbuf);
 
        cli_free_signing_context(cli);
-       cli_free_encryption_context(cli);
-
        data_blob_free(&cli->secblob);
        data_blob_free(&cli->user_session_key);
 
@@ -689,7 +623,7 @@ BOOL cli_echo(struct cli_state *cli, uint16 num_echos,
        SMB_ASSERT(length < 1024);
 
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,1,length,True);
+       set_message(cli->outbuf,1,length,True);
        SCVAL(cli->outbuf,smb_com,SMBecho);
        SSVAL(cli->outbuf,smb_tid,65535);
        SSVAL(cli->outbuf,smb_vwv0,num_echos);
index 374fdfa5e48a5480373d41d11a170874f4966fe6..be018074eb5d521b7ae969cee596e5a2891ccc06 100644 (file)
@@ -83,7 +83,6 @@ static NTSTATUS cli_smb_rw_error_to_ntstatus(struct cli_state *cli)
                case WRITE_ERROR:
                        return NT_STATUS_UNEXPECTED_NETWORK_ERROR;
                case READ_BAD_SIG:
-               case READ_BAD_DECRYPT:
                        return NT_STATUS_INVALID_PARAMETER;
                default:
                        break;
@@ -133,10 +132,6 @@ const char *cli_errstr(struct cli_state *cli)
                                slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                                        "Server packet had invalid SMB signature!");
                                break;
-                       case READ_BAD_DECRYPT:
-                               slprintf(cli_error_message, sizeof(cli_error_message) - 1,
-                                       "Server packet could not be decrypted !");
-                               break;
                        default:
                                slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                                        "Unknown error code %d\n", cli->smb_rw_error );
index 7e29c1bf1ab6db7271abb717b7075520bf78cce0..c7b39f0b8d7fb93435a6890889091cd118345ccf 100644 (file)
@@ -389,7 +389,7 @@ BOOL cli_rename(struct cli_state *cli, const char *fname_src, const char *fname_
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,1, 0, True);
+       set_message(cli->outbuf,1, 0, True);
 
        SCVAL(cli->outbuf,smb_com,SMBmv);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -426,7 +426,7 @@ BOOL cli_ntrename(struct cli_state *cli, const char *fname_src, const char *fnam
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf, 4, 0, True);
+       set_message(cli->outbuf, 4, 0, True);
 
        SCVAL(cli->outbuf,smb_com,SMBntrename);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -464,7 +464,7 @@ BOOL cli_nt_hardlink(struct cli_state *cli, const char *fname_src, const char *f
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf, 4, 0, True);
+       set_message(cli->outbuf, 4, 0, True);
 
        SCVAL(cli->outbuf,smb_com,SMBntrename);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -502,7 +502,7 @@ BOOL cli_unlink_full(struct cli_state *cli, const char *fname, uint16 attrs)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,1, 0,True);
+       set_message(cli->outbuf,1, 0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBunlink);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -547,7 +547,7 @@ BOOL cli_mkdir(struct cli_state *cli, const char *dname)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,0, 0,True);
+       set_message(cli->outbuf,0, 0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBmkdir);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -582,7 +582,7 @@ BOOL cli_rmdir(struct cli_state *cli, const char *dname)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,0, 0, True);
+       set_message(cli->outbuf,0, 0, True);
 
        SCVAL(cli->outbuf,smb_com,SMBrmdir);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -664,7 +664,7 @@ int cli_nt_create_full(struct cli_state *cli, const char *fname,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,24,0,True);
+       set_message(cli->outbuf,24,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBntcreateX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -758,7 +758,7 @@ int cli_open(struct cli_state *cli, const char *fname, int flags, int share_mode
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,15,0,True);
+       set_message(cli->outbuf,15,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBopenX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -805,7 +805,7 @@ BOOL cli_close(struct cli_state *cli, int fnum)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,3,0,True);
+       set_message(cli->outbuf,3,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBclose);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -837,7 +837,7 @@ NTSTATUS cli_locktype(struct cli_state *cli, int fnum,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0', smb_size);
 
-       set_message(NULL,cli->outbuf,8,0,True);
+       set_message(cli->outbuf,8,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBlockingX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -889,7 +889,7 @@ BOOL cli_lock(struct cli_state *cli, int fnum,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0', smb_size);
 
-       set_message(NULL,cli->outbuf,8,0,True);
+       set_message(cli->outbuf,8,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBlockingX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -942,7 +942,7 @@ BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,8,0,True);
+       set_message(cli->outbuf,8,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBlockingX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -994,7 +994,7 @@ BOOL cli_lock64(struct cli_state *cli, int fnum,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0', smb_size);
 
-       set_message(NULL,cli->outbuf,8,0,True);
+       set_message(cli->outbuf,8,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBlockingX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -1049,7 +1049,7 @@ BOOL cli_unlock64(struct cli_state *cli, int fnum, SMB_BIG_UINT offset, SMB_BIG_
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,8,0,True);
+       set_message(cli->outbuf,8,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBlockingX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -1196,7 +1196,7 @@ BOOL cli_getattrE(struct cli_state *cli, int fd,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,1,0,True);
+       set_message(cli->outbuf,1,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBgetattrE);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -1248,7 +1248,7 @@ BOOL cli_getatr(struct cli_state *cli, const char *fname,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,0,0,True);
+       set_message(cli->outbuf,0,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBgetatr);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -1300,7 +1300,7 @@ BOOL cli_setattrE(struct cli_state *cli, int fd,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,7,0,True);
+       set_message(cli->outbuf,7,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBsetattrE);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -1339,7 +1339,7 @@ BOOL cli_setatr(struct cli_state *cli, const char *fname, uint16 attr, time_t t)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,8,0,True);
+       set_message(cli->outbuf,8,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBsetatr);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -1381,7 +1381,7 @@ BOOL cli_chkpath(struct cli_state *cli, const char *path)
                *path2 = '\\';
        
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,0,0,True);
+       set_message(cli->outbuf,0,0,True);
        SCVAL(cli->outbuf,smb_com,SMBcheckpath);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
@@ -1408,7 +1408,7 @@ BOOL cli_chkpath(struct cli_state *cli, const char *path)
 BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail)
 {
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,0,0,True);
+       set_message(cli->outbuf,0,0,True);
        SCVAL(cli->outbuf,smb_com,SMBdskattr);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
@@ -1437,7 +1437,7 @@ int cli_ctemp(struct cli_state *cli, const char *path, char **tmp_path)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,3,0,True);
+       set_message(cli->outbuf,3,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBctemp);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -1487,7 +1487,7 @@ NTSTATUS cli_raw_ioctl(struct cli_state *cli, int fnum, uint32 code, DATA_BLOB *
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf, 3, 0, True);
+       set_message(cli->outbuf, 3, 0, True);
        SCVAL(cli->outbuf,smb_com,SMBioctl);
        cli_setup_packet(cli);
 
index 48865c98caf613ba4a0b6976deaebb934c84f788..d2f759b1929f51091b0b9cf54e3dcb36fb677f79 100644 (file)
@@ -2,7 +2,6 @@
    Unix SMB/CIFS implementation.
    FS info functions
    Copyright (C) Stefan (metze) Metzmacher     2003
-   Copyright (C) Jeremy Allison 2007.
    
    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
@@ -302,326 +301,3 @@ cleanup:
 
        return ret;     
 }
-
-/******************************************************************************
- Send/receive the request encryption blob.
-******************************************************************************/
-
-static NTSTATUS enc_blob_send_receive(struct cli_state *cli, DATA_BLOB *in, DATA_BLOB *out, DATA_BLOB *param_out)
-{
-       uint16 setup;
-       char param[4];
-       char *rparam=NULL, *rdata=NULL;
-       unsigned int rparam_count=0, rdata_count=0;
-       NTSTATUS status = NT_STATUS_OK;
-
-       setup = TRANSACT2_SETFSINFO;
-
-       SSVAL(param,0,0);
-       SSVAL(param,2,SMB_REQUEST_TRANSPORT_ENCRYPTION);
-
-       if (!cli_send_trans(cli, SMBtrans2,
-                               NULL,
-                               0, 0,
-                               &setup, 1, 0,
-                               param, 4, 0,
-                               (char *)in->data, in->length, CLI_BUFFER_SIZE)) {
-               status = cli_nt_error(cli);
-               goto out;
-       }
-
-       if (!cli_receive_trans(cli, SMBtrans2,
-                               &rparam, &rparam_count,
-                               &rdata, &rdata_count)) {
-               status = cli_nt_error(cli);
-               goto out;
-       }
-
-       if (cli_is_error(cli)) {
-               status = cli_nt_error(cli);
-               if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-                       goto out;
-               }
-       }
-
-       *out = data_blob(rdata, rdata_count);
-       *param_out = data_blob(rparam, rparam_count);
-
-  out:
-
-       SAFE_FREE(rparam);
-       SAFE_FREE(rdata);
-       return status;
-}
-
-/******************************************************************************
- Make a client state struct.
-******************************************************************************/
-
-static struct smb_trans_enc_state *make_cli_enc_state(enum smb_trans_enc_type smb_enc_type)
-{
-       struct smb_trans_enc_state *es = NULL;
-       es = SMB_MALLOC_P(struct smb_trans_enc_state);
-       if (!es) {
-               return NULL;
-       }
-       ZERO_STRUCTP(es);
-       es->smb_enc_type = smb_enc_type;
-
-       if (smb_enc_type == SMB_TRANS_ENC_GSS) {
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-               es->s.gss_state = SMB_MALLOC_P(struct smb_tran_enc_state_gss);
-               if (!es->s.gss_state) {
-                       SAFE_FREE(es);
-                       return NULL;
-               }
-               ZERO_STRUCTP(es->s.gss_state);
-#else
-               DEBUG(0,("make_cli_enc_state: no krb5 compiled.\n"));
-               SAFE_FREE(es);
-               return NULL;
-#endif
-       }
-       return es;
-}
-
-/******************************************************************************
- Start a raw ntlmssp encryption.
-******************************************************************************/
-
-NTSTATUS cli_raw_ntlm_smb_encryption_start(struct cli_state *cli, 
-                               const char *user,
-                               const char *pass,
-                               const char *domain)
-{
-       DATA_BLOB blob_in = data_blob_null;
-       DATA_BLOB blob_out = data_blob_null;
-       DATA_BLOB param_out = data_blob_null;
-       NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
-       struct smb_trans_enc_state *es = make_cli_enc_state(SMB_TRANS_ENC_NTLM);
-
-       if (!es) {
-               return NT_STATUS_NO_MEMORY;
-       }
-       status = ntlmssp_client_start(&es->s.ntlmssp_state);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto fail;
-       }
-
-       ntlmssp_want_feature(es->s.ntlmssp_state, NTLMSSP_FEATURE_SESSION_KEY);
-       es->s.ntlmssp_state->neg_flags |= (NTLMSSP_NEGOTIATE_SIGN|NTLMSSP_NEGOTIATE_SEAL);
-
-       if (!NT_STATUS_IS_OK(status = ntlmssp_set_username(es->s.ntlmssp_state, user))) {
-               goto fail;
-       }
-       if (!NT_STATUS_IS_OK(status = ntlmssp_set_domain(es->s.ntlmssp_state, domain))) {
-               goto fail;
-       }
-       if (!NT_STATUS_IS_OK(status = ntlmssp_set_password(es->s.ntlmssp_state, pass))) {
-               goto fail;
-       }
-
-       do {
-               status = ntlmssp_update(es->s.ntlmssp_state, blob_in, &blob_out);
-               data_blob_free(&blob_in);
-               data_blob_free(&param_out);
-               if (NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED) || NT_STATUS_IS_OK(status)) {
-                       status = enc_blob_send_receive(cli, &blob_out, &blob_in, &param_out);
-               }
-               if (param_out.length == 2) {
-                       es->enc_ctx_num = SVAL(param_out.data, 0);
-               }
-               data_blob_free(&blob_out);
-       } while (NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED));
-
-       data_blob_free(&blob_in);
-
-       if (NT_STATUS_IS_OK(status)) {
-               /* Replace the old state, if any. */
-               if (cli->trans_enc_state) {
-                       common_free_encryption_state(&cli->trans_enc_state);
-               }
-               cli->trans_enc_state = es;
-               cli->trans_enc_state->enc_on = True;
-               es = NULL;
-       }
-
-  fail:
-
-       common_free_encryption_state(&es);
-       return status;
-}
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-
-#ifndef SMB_GSS_REQUIRED_FLAGS
-#define SMB_GSS_REQUIRED_FLAGS (GSS_C_CONF_FLAG|GSS_C_INTEG_FLAG|GSS_C_MUTUAL_FLAG|GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG)
-#endif
-
-/******************************************************************************
- Get client gss blob to send to a server.
-******************************************************************************/
-
-static NTSTATUS make_cli_gss_blob(struct smb_trans_enc_state *es,
-                               const char *service,
-                               const char *host,
-                               NTSTATUS status_in,
-                               DATA_BLOB spnego_blob_in,
-                               DATA_BLOB *p_blob_out)
-{
-       const char *krb_mechs[] = {OID_KERBEROS5, NULL};
-       OM_uint32 ret;
-       OM_uint32 min;
-       gss_name_t srv_name;
-       gss_buffer_desc input_name;
-       gss_buffer_desc *p_tok_in;
-       gss_buffer_desc tok_out, tok_in;
-       DATA_BLOB blob_out = data_blob_null;
-       DATA_BLOB blob_in = data_blob_null;
-       char *host_princ_s = NULL;
-       OM_uint32 ret_flags = 0;
-       NTSTATUS status = NT_STATUS_OK;
-
-       gss_OID_desc nt_hostbased_service =
-       {10, CONST_DISCARD(char *,"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x04")};
-
-       memset(&tok_out, '\0', sizeof(tok_out));
-
-       /* Get a ticket for the service@host */
-       asprintf(&host_princ_s, "%s@%s", service, host);
-       if (host_princ_s == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       input_name.value = host_princ_s;
-       input_name.length = strlen(host_princ_s) + 1;
-
-       ret = gss_import_name(&min,
-                               &input_name,
-                               &nt_hostbased_service,
-                               &srv_name);
-
-       if (ret != GSS_S_COMPLETE) {
-               SAFE_FREE(host_princ_s);
-               return map_nt_error_from_gss(ret, min);
-       }
-
-       if (spnego_blob_in.length == 0) {
-               p_tok_in = GSS_C_NO_BUFFER;
-       } else {
-               /* Remove the SPNEGO wrapper */
-               if (!spnego_parse_auth_response(spnego_blob_in, status_in, OID_KERBEROS5, &blob_in)) {
-                       status = NT_STATUS_UNSUCCESSFUL;
-                       goto fail;
-               }
-               tok_in.value = blob_in.data;
-               tok_in.length = blob_in.length;
-               p_tok_in = &tok_in;
-       }
-
-       ret = gss_init_sec_context(&min,
-                               GSS_C_NO_CREDENTIAL, /* Use our default cred. */
-                               &es->s.gss_state->gss_ctx,
-                               srv_name,
-                               GSS_C_NO_OID, /* default OID. */
-                               GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG | GSS_C_SEQUENCE_FLAG,
-                               GSS_C_INDEFINITE,       /* requested ticket lifetime. */
-                               NULL,   /* no channel bindings */
-                               p_tok_in,
-                               NULL,   /* ignore mech type */
-                               &tok_out,
-                               &ret_flags,
-                               NULL);  /* ignore time_rec */
-
-       status = map_nt_error_from_gss(ret, min);
-       if (!NT_STATUS_IS_OK(status) && !NT_STATUS_EQUAL(status,NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-               ADS_STATUS adss = ADS_ERROR_GSS(ret, min);
-               DEBUG(10,("make_cli_gss_blob: gss_init_sec_context failed with %s\n",
-                       ads_errstr(adss)));
-               goto fail;
-       }
-
-       if ((ret_flags & SMB_GSS_REQUIRED_FLAGS) != SMB_GSS_REQUIRED_FLAGS) {
-               status = NT_STATUS_ACCESS_DENIED;
-       }
-
-       blob_out = data_blob(tok_out.value, tok_out.length);
-
-       /* Wrap in an SPNEGO wrapper */
-       *p_blob_out = gen_negTokenTarg(krb_mechs, blob_out);
-
-  fail:
-
-       data_blob_free(&blob_out);
-       data_blob_free(&blob_in);
-       SAFE_FREE(host_princ_s);
-       gss_release_name(&min, &srv_name);
-       if (tok_out.value) {
-               gss_release_buffer(&min, &tok_out);
-       }
-       return status;
-}
-
-/******************************************************************************
- Start a SPNEGO gssapi encryption context.
-******************************************************************************/
-
-NTSTATUS cli_gss_smb_encryption_start(struct cli_state *cli)
-{
-       DATA_BLOB blob_recv = data_blob_null;
-       DATA_BLOB blob_send = data_blob_null;
-       DATA_BLOB param_out = data_blob_null;
-       NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
-       fstring fqdn;
-       const char *servicename;
-       struct smb_trans_enc_state *es = make_cli_enc_state(SMB_TRANS_ENC_GSS);
-
-       if (!es) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       name_to_fqdn(fqdn, cli->desthost);
-       strlower_m(fqdn);
-
-       servicename = "cifs";
-       status = make_cli_gss_blob(es, servicename, fqdn, NT_STATUS_OK, blob_recv, &blob_send);
-       if (!NT_STATUS_EQUAL(status,NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-               servicename = "host";
-               status = make_cli_gss_blob(es, servicename, fqdn, NT_STATUS_OK, blob_recv, &blob_send);
-               if (!NT_STATUS_EQUAL(status,NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-                       goto fail;
-               }
-       }
-
-       do {
-               data_blob_free(&blob_recv);
-               status = enc_blob_send_receive(cli, &blob_send, &blob_recv, &param_out);
-               if (param_out.length == 2) {
-                       es->enc_ctx_num = SVAL(param_out.data, 0);
-               }
-               data_blob_free(&blob_send);
-               status = make_cli_gss_blob(es, servicename, fqdn, status, blob_recv, &blob_send);
-       } while (NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED));
-       data_blob_free(&blob_recv);
-
-       if (NT_STATUS_IS_OK(status)) {
-               /* Replace the old state, if any. */
-               if (cli->trans_enc_state) {
-                       common_free_encryption_state(&cli->trans_enc_state);
-               }
-               cli->trans_enc_state = es;
-               cli->trans_enc_state->enc_on = True;
-               es = NULL;
-       }
-
-  fail:
-
-       common_free_encryption_state(&es);
-       return status;
-}
-#else
-NTSTATUS cli_gss_smb_encryption_start(struct cli_state *cli)
-{
-       return NT_STATUS_NOT_SUPPORTED;
-}
-#endif
index 31012e6011de236e727d9100d38801c8fc2acc70..5da63096b13b48863d231c32072dd3bd6e98e013 100644 (file)
@@ -417,7 +417,7 @@ int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute,
                memset(cli->outbuf,'\0',smb_size);
                memset(cli->inbuf,'\0',smb_size);
 
-               set_message(NULL,cli->outbuf,2,0,True);
+               set_message(cli->outbuf,2,0,True);
 
                SCVAL(cli->outbuf,smb_com,SMBsearch);
 
@@ -474,7 +474,7 @@ int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute,
                memset(cli->outbuf,'\0',smb_size);
                memset(cli->inbuf,'\0',smb_size);
 
-               set_message(NULL,cli->outbuf,2,0,True);
+               set_message(cli->outbuf,2,0,True);
                SCVAL(cli->outbuf,smb_com,SMBfclose);
                SSVAL(cli->outbuf,smb_tid,cli->cnum);
                cli_setup_packet(cli);
index 252f2cd72534239e849c4be180e26d6f69fd1bb2..46d7c1c3befae3e13a7873a7714299b9de3faa80 100644 (file)
@@ -29,7 +29,7 @@ int cli_message_start_build(struct cli_state *cli, char *host, char *username)
 
        /* construct a SMBsendstrt command */
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,0,0,True);
+       set_message(cli->outbuf,0,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsendstrt);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
@@ -74,7 +74,7 @@ int cli_message_text_build(struct cli_state *cli, char *msg, int len, int grp)
        char *p;
 
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,1,0,True);
+       set_message(cli->outbuf,1,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsendtxt);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
@@ -124,7 +124,7 @@ int cli_message_end_build(struct cli_state *cli, int grp)
        char *p;
 
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,1,0,True);
+       set_message(cli->outbuf,1,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsendend);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
 
index 041de41cada3330228842d93618804fbe60d17e5..387c40b401c987f3bb1b4a1fd039f77265e5e488 100644 (file)
@@ -31,7 +31,7 @@ BOOL cli_oplock_ack(struct cli_state *cli, int fnum, unsigned char level)
        cli->outbuf = buf;
 
         memset(buf,'\0',smb_size);
-        set_message(NULL,buf,8,0,True);
+        set_message(buf,8,0,True);
 
         SCVAL(buf,smb_com,SMBlockingX);
        SSVAL(buf,smb_tid, cli->cnum);
index 08737f87e4222a55bc68fea26c79ea125f1c02bc..9e55e5cef37c1a879143ad3cb03d98413dceaa13 100644 (file)
@@ -193,7 +193,7 @@ int cli_spl_open(struct cli_state *cli, const char *fname, int flags, int share_
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,15,0,True);
+       set_message(cli->outbuf,15,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBsplopen);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -240,7 +240,7 @@ BOOL cli_spl_close(struct cli_state *cli, int fnum)
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,3,0,True);
+       set_message(cli->outbuf,3,0,True);
 
        SCVAL(cli->outbuf,smb_com,SMBsplclose);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
index 7e479dc00a0686fe08fefa994c0c59e2ab0c801b..ed80dfaf1a7f848b71622a507de610740d09567d 100644 (file)
@@ -34,7 +34,7 @@ static BOOL cli_issue_read(struct cli_state *cli, int fnum, off_t offset,
        if ((SMB_BIG_UINT)offset >> 32) 
                bigoffset = True;
 
-       set_message(NULL,cli->outbuf,bigoffset ? 12 : 10,0,True);
+       set_message(cli->outbuf,bigoffset ? 12 : 10,0,True);
                
        SCVAL(cli->outbuf,smb_com,SMBreadX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -76,9 +76,7 @@ ssize_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_
         * rounded down to a multiple of 1024.
         */
 
-       if (client_is_signing_on(cli) == False &&
-                       cli_encryption_on(cli) == False &&
-                       (cli->posix_capabilities & CIFS_UNIX_LARGE_READ_CAP)) {
+       if (client_is_signing_on(cli) == False && (cli->posix_capabilities & CIFS_UNIX_LARGE_READ_CAP)) {
                readsize = CLI_SAMBA_MAX_POSIX_LARGE_READX_SIZE;
        } else if (cli->capabilities & CAP_LARGE_READX) {
                if (cli->is_samba) {
@@ -205,7 +203,7 @@ static BOOL cli_issue_readraw(struct cli_state *cli, int fnum, off_t offset,
        memset(cli->outbuf,'\0',smb_size);
        memset(cli->inbuf,'\0',smb_size);
 
-       set_message(NULL,cli->outbuf,10,0,True);
+       set_message(cli->outbuf,10,0,True);
                
        SCVAL(cli->outbuf,smb_com,SMBreadbraw);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -314,9 +312,9 @@ static BOOL cli_issue_write(struct cli_state *cli, int fnum, off_t offset,
        }
 
        if (large_writex)
-               set_message(NULL,cli->outbuf,14,0,True);
+               set_message(cli->outbuf,14,0,True);
        else
-               set_message(NULL,cli->outbuf,12,0,True);
+               set_message(cli->outbuf,12,0,True);
        
        SCVAL(cli->outbuf,smb_com,SMBwriteX);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
@@ -428,7 +426,7 @@ ssize_t cli_smbwrite(struct cli_state *cli,
                memset(cli->outbuf,'\0',smb_size);
                memset(cli->inbuf,'\0',smb_size);
 
-               set_message(NULL,cli->outbuf,5, 0,True);
+               set_message(cli->outbuf,5, 0,True);
 
                SCVAL(cli->outbuf,smb_com,SMBwrite);
                SSVAL(cli->outbuf,smb_tid,cli->cnum);
index 752983377cac3ca315044d0ea86ca52d8819f9f2..e859dce95674f6f96d68aab33b599e907b03892b 100644 (file)
@@ -43,7 +43,7 @@ BOOL cli_send_trans(struct cli_state *cli, int trans,
        this_ldata = MIN(ldata,cli->max_xmit - (500+lsetup*2+this_lparam));
 
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,14+lsetup,0,True);
+       set_message(cli->outbuf,14+lsetup,0,True);
        SCVAL(cli->outbuf,smb_com,trans);
        SSVAL(cli->outbuf,smb_tid, cli->cnum);
        cli_setup_packet(cli);
@@ -112,7 +112,7 @@ BOOL cli_send_trans(struct cli_state *cli, int trans,
                        this_lparam = MIN(lparam-tot_param,cli->max_xmit - 500); /* hack */
                        this_ldata = MIN(ldata-tot_data,cli->max_xmit - (500+this_lparam));
 
-                       set_message(NULL,cli->outbuf,trans==SMBtrans?8:9,0,True);
+                       set_message(cli->outbuf,trans==SMBtrans?8:9,0,True);
                        SCVAL(cli->outbuf,smb_com,(trans==SMBtrans ? SMBtranss : SMBtranss2));
                        
                        outparam = smb_buf(cli->outbuf);
@@ -358,7 +358,7 @@ BOOL cli_send_nt_trans(struct cli_state *cli,
        this_ldata = MIN(ldata,cli->max_xmit - (500+lsetup*2+this_lparam));
 
        memset(cli->outbuf,'\0',smb_size);
-       set_message(NULL,cli->outbuf,19+lsetup,0,True);
+       set_message(cli->outbuf,19+lsetup,0,True);
        SCVAL(cli->outbuf,smb_com,SMBnttrans);
        SSVAL(cli->outbuf,smb_tid, cli->cnum);
        cli_setup_packet(cli);
@@ -419,7 +419,7 @@ BOOL cli_send_nt_trans(struct cli_state *cli,
                        this_lparam = MIN(lparam-tot_param,cli->max_xmit - 500); /* hack */
                        this_ldata = MIN(ldata-tot_data,cli->max_xmit - (500+this_lparam));
 
-                       set_message(NULL,cli->outbuf,18,0,True);
+                       set_message(cli->outbuf,18,0,True);
                        SCVAL(cli->outbuf,smb_com,SMBnttranss);
 
                        /* XXX - these should probably be aligned */
index 412126eecac14805febf8c4fcfa7fe9caa106f49..ce826ae999ec34bd84969ccd78ae50b97ac3e4ca 100644 (file)
@@ -4,7 +4,6 @@
  *  Copyright (C) Andrew Tridgell 2001
  *  Copyright (C) Andrew Bartlett 2001
  *  Copyright (C) Tim Potter 2000
- *  Copyright (C) Jeremy Allison 2007
  *  
  *  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
@@ -1503,108 +1502,3 @@ WERROR ntstatus_to_werror(NTSTATUS error)
        /* a lame guess */
        return W_ERROR(NT_STATUS_V(error) & 0xffff);
 }
-
-#if defined(HAVE_GSSAPI)
-/*******************************************************************************
- Map between gssapi errors and NT status. I made these up :-(. JRA.
-*******************************************************************************/
-
-static const struct {
-               unsigned long gss_err;
-               NTSTATUS ntstatus;
-} gss_to_ntstatus_errormap[] = {
-#if defined(GSS_S_CALL_INACCESSIBLE_READ)
-               {GSS_S_CALL_INACCESSIBLE_READ, NT_STATUS_INVALID_PARAMETER},
-#endif
-#if defined(GSS_S_CALL_INACCESSIBLE_WRITE)
-               {GSS_S_CALL_INACCESSIBLE_WRITE, NT_STATUS_INVALID_PARAMETER},
-#endif
-#if defined(GSS_S_CALL_BAD_STRUCTURE)
-               {GSS_S_CALL_BAD_STRUCTURE, NT_STATUS_INVALID_PARAMETER},
-#endif
-#if defined(GSS_S_BAD_MECH)
-               {GSS_S_BAD_MECH, NT_STATUS_INVALID_PARAMETER},
-#endif
-#if defined(GSS_S_BAD_NAME)
-               {GSS_S_BAD_NAME, NT_STATUS_INVALID_ACCOUNT_NAME},
-#endif
-#if defined(GSS_S_BAD_NAMETYPE)
-               {GSS_S_BAD_NAMETYPE, NT_STATUS_INVALID_PARAMETER},
-#endif
-#if defined(GSS_S_BAD_BINDINGS)
-               {GSS_S_BAD_BINDINGS, NT_STATUS_INVALID_PARAMETER},
-#endif
-#if defined(GSS_S_BAD_STATUS)
-               {GSS_S_BAD_STATUS, NT_STATUS_UNSUCCESSFUL},
-#endif
-#if defined(GSS_S_BAD_SIG)
-               {GSS_S_BAD_SIG, NT_STATUS_ACCESS_DENIED},
-#endif
-#if defined(GSS_S_NO_CRED)
-               {GSS_S_NO_CRED, NT_STATUS_ACCESS_DENIED},
-#endif
-#if defined(GSS_S_NO_CONTEXT)
-               {GSS_S_NO_CONTEXT, NT_STATUS_ACCESS_DENIED},
-#endif
-#if defined(GSS_S_DEFECTIVE_TOKEN)
-               {GSS_S_DEFECTIVE_TOKEN, NT_STATUS_ACCESS_DENIED},
-#endif
-#if defined(GSS_S_DEFECTIVE_CREDENTIAL)
-               {GSS_S_DEFECTIVE_CREDENTIAL, NT_STATUS_ACCESS_DENIED},
-#endif
-#if defined(GSS_S_CREDENTIALS_EXPIRED)
-               {GSS_S_CREDENTIALS_EXPIRED, NT_STATUS_PASSWORD_EXPIRED},
-#endif
-#if defined(GSS_S_CONTEXT_EXPIRED)
-               {GSS_S_CONTEXT_EXPIRED, NT_STATUS_PASSWORD_EXPIRED},
-#endif
-#if defined(GSS_S_BAD_QOP)
-               {GSS_S_BAD_QOP, NT_STATUS_ACCESS_DENIED},
-#endif
-#if defined(GSS_S_UNAUTHORIZED)
-               {GSS_S_UNAUTHORIZED, NT_STATUS_ACCESS_DENIED},
-#endif
-#if defined(GSS_S_UNAVAILABLE)
-               {GSS_S_UNAVAILABLE, NT_STATUS_UNSUCCESSFUL},
-#endif
-#if defined(GSS_S_DUPLICATE_ELEMENT)
-               {GSS_S_DUPLICATE_ELEMENT, NT_STATUS_INVALID_PARAMETER},
-#endif
-#if defined(GSS_S_NAME_NOT_MN)
-               {GSS_S_NAME_NOT_MN, NT_STATUS_INVALID_PARAMETER},
-#endif
-               { 0, NT_STATUS_OK }
-};
-
-/*********************************************************************
- Map an NT error code from a gssapi error code.
-*********************************************************************/
-
-NTSTATUS map_nt_error_from_gss(uint32 gss_maj, uint32 minor)
-{
-       int i = 0;
-
-       if (gss_maj == GSS_S_COMPLETE) {
-               return NT_STATUS_OK;
-       }
-
-       if (gss_maj == GSS_S_CONTINUE_NEEDED) {
-               return NT_STATUS_MORE_PROCESSING_REQUIRED;
-       }
-
-       if (gss_maj == GSS_S_FAILURE) {
-               return map_nt_error_from_unix((int)minor);
-       }
-       
-       /* Look through list */
-       while(gss_to_ntstatus_errormap[i].gss_err != 0) {
-               if (gss_to_ntstatus_errormap[i].gss_err == gss_maj) {
-                       return gss_to_ntstatus_errormap[i].ntstatus;
-               }
-               i++;
-       }
-
-       /* Default return */
-       return NT_STATUS_ACCESS_DENIED;
-}
-#endif
index 73940087865e1ce83f551e6de98f24e2aac6d554..45226a028cbc57289596cfd1b657cb91ea7310b2 100644 (file)
@@ -2471,15 +2471,16 @@ net_share_enum_rpc(struct cli_state *cli,
                    void *state)
 {
         int i;
-       NTSTATUS result;
-       uint32 enum_hnd;
+       WERROR result;
+       ENUM_HND enum_hnd;
         uint32 info_level = 1;
        uint32 preferred_len = 0xffffffff;
-       struct srvsvc_NetShareCtr1 ctr1;
-       union srvsvc_NetShareCtr ctr;
+        uint32 type;
+       SRV_SHARE_INFO_CTR ctr;
+       fstring name = "";
+        fstring comment = "";
         void *mem_ctx;
        struct rpc_pipe_client *pipe_hnd;
-       uint32 numentries;
         NTSTATUS nt_status;
 
         /* Open the server service pipe */
@@ -2497,28 +2498,37 @@ net_share_enum_rpc(struct cli_state *cli,
                 return -1; 
         }
 
-       ZERO_STRUCT(ctr1);
-       ctr.ctr1 = &ctr1;
-
         /* Issue the NetShareEnum RPC call and retrieve the response */
-       enum_hnd = 0;
-       result = rpccli_srvsvc_NetShareEnum(pipe_hnd, mem_ctx, NULL,
-                                           &info_level, &ctr, preferred_len,
-                                           &numentries, &enum_hnd);
+       init_enum_hnd(&enum_hnd, 0);
+       result = rpccli_srvsvc_net_share_enum(pipe_hnd,
+                                              mem_ctx,
+                                              info_level,
+                                              &ctr,
+                                              preferred_len,
+                                              &enum_hnd);
 
         /* Was it successful? */
-       if (!NT_STATUS_IS_OK(result) || numentries == 0) {
+       if (!W_ERROR_IS_OK(result) || ctr.num_entries == 0) {
                 /*  Nope.  Go clean up. */
                goto done;
         }
 
         /* For each returned entry... */
-        for (i = 0; i < numentries; i++) {
+        for (i = 0; i < ctr.num_entries; i++) {
+
+                /* pull out the share name */
+                rpcstr_pull_unistr2_fstring(
+                        name, &ctr.share.info1[i].info_1_str.uni_netname);
+
+                /* pull out the share's comment */
+                rpcstr_pull_unistr2_fstring(
+                        comment, &ctr.share.info1[i].info_1_str.uni_remark);
+
+                /* Get the type value */
+                type = ctr.share.info1[i].info_1.type;
 
                 /* Add this share to the list */
-                (*fn)(ctr.ctr1->array[i].name, 
-                                         ctr.ctr1->array[i].type, 
-                                         ctr.ctr1->array[i].comment, state);
+                (*fn)(name, type, comment, state);
         }
 
 done:
@@ -2529,7 +2539,7 @@ done:
         TALLOC_FREE(mem_ctx);
 
         /* Tell 'em if it worked */
-        return NT_STATUS_IS_OK(result) ? 0 : -1;
+        return W_ERROR_IS_OK(result) ? 0 : -1;
 }
 
 
@@ -4076,7 +4086,7 @@ sec_desc_parse(TALLOC_CTX *ctx,
        fstring tok;
        SEC_DESC *ret = NULL;
        size_t sd_size;
-       DOM_SID *grp_sid=NULL;
+       DOM_SID *group_sid=NULL;
         DOM_SID *owner_sid=NULL;
        SEC_ACL *dacl=NULL;
        int revision=1;
@@ -4121,15 +4131,15 @@ sec_desc_parse(TALLOC_CTX *ctx,
                }
 
                if (StrnCaseCmp(tok,"GROUP:", 6) == 0) {
-                       if (grp_sid) {
+                       if (group_sid) {
                                DEBUG(5, ("GROUP specified more than once!\n"));
                                goto done;
                        }
-                       grp_sid = SMB_CALLOC_ARRAY(DOM_SID, 1);
-                       if (!grp_sid ||
+                       group_sid = SMB_CALLOC_ARRAY(DOM_SID, 1);
+                       if (!group_sid ||
                            !convert_string_to_sid(ipc_cli, pol,
                                                    numeric,
-                                                   grp_sid, tok+6)) {
+                                                   group_sid, tok+6)) {
                                DEBUG(5, ("Failed to parse group sid\n"));
                                goto done;
                        }
@@ -4137,15 +4147,15 @@ sec_desc_parse(TALLOC_CTX *ctx,
                }
 
                if (StrnCaseCmp(tok,"GROUP+:", 7) == 0) {
-                       if (grp_sid) {
+                       if (group_sid) {
                                DEBUG(5, ("GROUP specified more than once!\n"));
                                goto done;
                        }
-                       grp_sid = SMB_CALLOC_ARRAY(DOM_SID, 1);
-                       if (!grp_sid ||
+                       group_sid = SMB_CALLOC_ARRAY(DOM_SID, 1);
+                       if (!group_sid ||
                            !convert_string_to_sid(ipc_cli, pol,
                                                    False,
-                                                   grp_sid, tok+6)) {
+                                                   group_sid, tok+6)) {
                                DEBUG(5, ("Failed to parse group sid\n"));
                                goto done;
                        }
@@ -4183,10 +4193,10 @@ sec_desc_parse(TALLOC_CTX *ctx,
        }
 
        ret = make_sec_desc(ctx, revision, SEC_DESC_SELF_RELATIVE, 
-                           owner_sid, grp_sid, NULL, dacl, &sd_size);
+                           owner_sid, group_sid, NULL, dacl, &sd_size);
 
   done:
-       SAFE_FREE(grp_sid);
+       SAFE_FREE(group_sid);
        SAFE_FREE(owner_sid);
 
        return ret;
@@ -5132,7 +5142,7 @@ cacl_set(TALLOC_CTX *ctx,
        SEC_DESC *sd = NULL, *old;
         SEC_ACL *dacl = NULL;
        DOM_SID *owner_sid = NULL; 
-       DOM_SID *grp_sid = NULL;
+       DOM_SID *group_sid = NULL;
        uint32 i, j;
        size_t sd_size;
        int ret = 0;
@@ -5257,7 +5267,7 @@ cacl_set(TALLOC_CTX *ctx,
        case SMBC_XATTR_MODE_SET:
                old = sd;
                 owner_sid = old->owner_sid;
-                grp_sid = old->group_sid;
+                group_sid = old->group_sid;
                 dacl = old->dacl;
                break;
 
@@ -5266,7 +5276,7 @@ cacl_set(TALLOC_CTX *ctx,
                 break;
 
         case SMBC_XATTR_MODE_CHGRP:
-                grp_sid = sd->group_sid;
+                group_sid = sd->group_sid;
                 break;
        }
 
@@ -5275,7 +5285,7 @@ cacl_set(TALLOC_CTX *ctx,
 
        /* Create new security descriptor and set it */
        sd = make_sec_desc(ctx, old->revision, SEC_DESC_SELF_RELATIVE, 
-                          owner_sid, grp_sid, NULL, dacl, &sd_size);
+                          owner_sid, group_sid, NULL, dacl, &sd_size);
 
        fnum = cli_nt_create(cli, filename,
                              WRITE_DAC_ACCESS | WRITE_OWNER_ACCESS);
diff --git a/source3/libsmb/smb_seal.c b/source3/libsmb/smb_seal.c
deleted file mode 100644 (file)
index 33352b8..0000000
+++ /dev/null
@@ -1,496 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   SMB Transport encryption (sealing) code.
-   Copyright (C) Jeremy Allison 2007.
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-
-/******************************************************************************
- Pull out the encryption context for this packet. 0 means global context.
-******************************************************************************/
-
-NTSTATUS get_enc_ctx_num(char *buf, uint16 *p_enc_ctx_num)
-{
-       if (smb_len(buf) < 8) {
-               return NT_STATUS_INVALID_BUFFER_SIZE;
-       }
-
-       if (buf[4] == (char)0xFF) {
-               if (buf[5] == 'S' && buf [6] == 'M' && buf[7] == 'B') {
-                       /* Not an encrypted buffer. */
-                       return NT_STATUS_NOT_FOUND;
-               }
-               if (buf[5] == 'E') {
-                       *p_enc_ctx_num = SVAL(buf,6);
-                       return NT_STATUS_OK;
-               }
-       }
-       return NT_STATUS_INVALID_NETWORK_RESPONSE;
-}
-
-/******************************************************************************
- Generic code for client and server.
- Is encryption turned on ?
-******************************************************************************/
-
-BOOL common_encryption_on(struct smb_trans_enc_state *es)
-{
-       return ((es != NULL) && es->enc_on);
-}
-
-/******************************************************************************
- Generic code for client and server.
- NTLM decrypt an incoming buffer.
- Abartlett tells me that SSPI puts the signature first before the encrypted
- output, so cope with the same for compatibility.
-******************************************************************************/
-
-NTSTATUS common_ntlm_decrypt_buffer(NTLMSSP_STATE *ntlmssp_state, char *buf)
-{
-       NTSTATUS status;
-       size_t buf_len = smb_len(buf) + 4; /* Don't forget the 4 length bytes. */
-       size_t data_len;
-       char *inbuf;
-       DATA_BLOB sig;
-
-       if (buf_len < 8 + NTLMSSP_SIG_SIZE) {
-               return NT_STATUS_BUFFER_TOO_SMALL;
-       }
-
-       inbuf = (char *)smb_xmemdup(buf, buf_len);
-
-       /* Adjust for the signature. */
-       data_len = buf_len - 8 - NTLMSSP_SIG_SIZE;
-
-       /* Point at the signature. */
-       sig = data_blob_const(inbuf+8, NTLMSSP_SIG_SIZE);
-
-       status = ntlmssp_unseal_packet(ntlmssp_state,
-               (unsigned char *)inbuf + 8 + NTLMSSP_SIG_SIZE, /* 4 byte len + 0xFF 'E' <enc> <ctx> */
-               data_len,
-               (unsigned char *)inbuf + 8 + NTLMSSP_SIG_SIZE,
-               data_len,
-               &sig);
-
-       if (!NT_STATUS_IS_OK(status)) {
-               SAFE_FREE(inbuf);
-               return status;
-       }
-
-       memcpy(buf + 8, inbuf + 8 + NTLMSSP_SIG_SIZE, data_len);
-
-       /* Reset the length. */
-       smb_setlen(inbuf, buf, data_len + 4);
-
-       SAFE_FREE(inbuf);
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Generic code for client and server.
- NTLM encrypt an outgoing buffer. Return the encrypted pointer in ppbuf_out.
- Abartlett tells me that SSPI puts the signature first before the encrypted
- output, so do the same for compatibility.
-******************************************************************************/
-
-NTSTATUS common_ntlm_encrypt_buffer(NTLMSSP_STATE *ntlmssp_state,
-                               uint16 enc_ctx_num,
-                               char *buf,
-                               char **ppbuf_out)
-{
-       NTSTATUS status;
-       char *buf_out;
-       size_t data_len = smb_len(buf) - 4; /* Ignore the 0xFF SMB bytes. */
-       DATA_BLOB sig;
-
-       *ppbuf_out = NULL;
-
-       if (data_len == 0) {
-               return NT_STATUS_BUFFER_TOO_SMALL;
-       }
-
-       /* 
-        * We know smb_len can't return a value > 128k, so no int overflow
-        * check needed.
-        */
-
-       buf_out = SMB_XMALLOC_ARRAY(char, 8 + NTLMSSP_SIG_SIZE + data_len);
-
-       /* Copy the data from the original buffer. */
-
-       memcpy(buf_out + 8 + NTLMSSP_SIG_SIZE, buf + 8, data_len);
-
-       smb_set_enclen(buf_out, smb_len(buf) + NTLMSSP_SIG_SIZE, enc_ctx_num);
-
-       sig = data_blob(NULL, NTLMSSP_SIG_SIZE);
-
-       status = ntlmssp_seal_packet(ntlmssp_state,
-               (unsigned char *)buf_out + 8 + NTLMSSP_SIG_SIZE, /* 4 byte len + 0xFF 'S' <enc> <ctx> */
-               data_len,
-               (unsigned char *)buf_out + 8 + NTLMSSP_SIG_SIZE,
-               data_len,
-               &sig);
-
-       if (!NT_STATUS_IS_OK(status)) {
-               data_blob_free(&sig);
-               SAFE_FREE(buf_out);
-               return status;
-       }
-
-       /* First 16 data bytes are signature for SSPI compatibility. */
-       memcpy(buf_out + 8, sig.data, NTLMSSP_SIG_SIZE);
-       *ppbuf_out = buf_out;
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Generic code for client and server.
- gss-api decrypt an incoming buffer. We insist that the size of the
- unwrapped buffer must be smaller or identical to the incoming buffer.
-******************************************************************************/
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-static NTSTATUS common_gss_decrypt_buffer(struct smb_tran_enc_state_gss *gss_state, char *buf)
-{
-       gss_ctx_id_t gss_ctx = gss_state->gss_ctx;
-       OM_uint32 ret = 0;
-       OM_uint32 minor = 0;
-       int flags_got = 0;
-       gss_buffer_desc in_buf, out_buf;
-       size_t buf_len = smb_len(buf) + 4; /* Don't forget the 4 length bytes. */
-
-       if (buf_len < 8) {
-               return NT_STATUS_BUFFER_TOO_SMALL;
-       }
-
-       in_buf.value = buf + 8;
-       in_buf.length = buf_len - 8;
-
-       ret = gss_unwrap(&minor,
-                       gss_ctx,
-                       &in_buf,
-                       &out_buf,
-                       &flags_got,             /* did we get sign+seal ? */
-                       (gss_qop_t *) NULL);    
-
-       if (ret != GSS_S_COMPLETE) {
-               ADS_STATUS adss = ADS_ERROR_GSS(ret, minor);
-               DEBUG(0,("common_gss_encrypt_buffer: gss_unwrap failed. Error %s\n",
-                       ads_errstr(adss) ));
-               return map_nt_error_from_gss(ret, minor);
-       }
-
-       if (out_buf.length > in_buf.length) {
-               DEBUG(0,("common_gss_encrypt_buffer: gss_unwrap size (%u) too large (%u) !\n",
-                       (unsigned int)out_buf.length,
-                       (unsigned int)in_buf.length ));
-               gss_release_buffer(&minor, &out_buf);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       memcpy(buf + 8, out_buf.value, out_buf.length);
-       smb_setlen((char *)out_buf.value, buf, out_buf.length + 4);
-
-       gss_release_buffer(&minor, &out_buf);
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Generic code for client and server.
- gss-api encrypt an outgoing buffer. Return the alloced encrypted pointer in buf_out.
-******************************************************************************/
-
-static NTSTATUS common_gss_encrypt_buffer(struct smb_tran_enc_state_gss *gss_state,
-                                       uint16 enc_ctx_num,
-                                       char *buf,
-                                       char **ppbuf_out)
-{
-       gss_ctx_id_t gss_ctx = gss_state->gss_ctx;
-       OM_uint32 ret = 0;
-       OM_uint32 minor = 0;
-       int flags_got = 0;
-       gss_buffer_desc in_buf, out_buf;
-       size_t buf_len = smb_len(buf) + 4; /* Don't forget the 4 length bytes. */
-
-       *ppbuf_out = NULL;
-
-       if (buf_len < 8) {
-               return NT_STATUS_BUFFER_TOO_SMALL;
-       }
-
-       in_buf.value = buf + 8;
-       in_buf.length = buf_len - 8;
-
-       ret = gss_wrap(&minor,
-                       gss_ctx,
-                       True,                   /* we want sign+seal. */
-                       GSS_C_QOP_DEFAULT,
-                       &in_buf,
-                       &flags_got,             /* did we get sign+seal ? */
-                       &out_buf);
-
-       if (ret != GSS_S_COMPLETE) {
-               ADS_STATUS adss = ADS_ERROR_GSS(ret, minor);
-               DEBUG(0,("common_gss_encrypt_buffer: gss_wrap failed. Error %s\n",
-                       ads_errstr(adss) ));
-               return map_nt_error_from_gss(ret, minor);
-       }
-
-       if (!flags_got) {
-               /* Sign+seal not supported. */
-               gss_release_buffer(&minor, &out_buf);
-               return NT_STATUS_NOT_SUPPORTED;
-       }
-
-       /* Ya see - this is why I *hate* gss-api. I don't 
-        * want to have to malloc another buffer of the
-        * same size + 8 bytes just to get a continuous
-        * header + buffer, but gss won't let me pass in
-        * a pre-allocated buffer. Bastards (and you know
-        * who you are....). I might fix this by
-        * going to "encrypt_and_send" passing in a file
-        * descriptor and doing scatter-gather write with
-        * TCP cork on Linux. But I shouldn't have to
-        * bother :-*(. JRA.
-        */
-
-       *ppbuf_out = (char *)SMB_MALLOC(out_buf.length + 8); /* We know this can't wrap. */
-       if (!*ppbuf_out) {
-               gss_release_buffer(&minor, &out_buf);
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       memcpy(*ppbuf_out+8, out_buf.value, out_buf.length);
-       smb_set_enclen(*ppbuf_out, out_buf.length + 4, enc_ctx_num);
-
-       gss_release_buffer(&minor, &out_buf);
-       return NT_STATUS_OK;
-}
-#endif
-
-/******************************************************************************
- Generic code for client and server.
- Encrypt an outgoing buffer. Return the alloced encrypted pointer in buf_out.
-******************************************************************************/
-
-NTSTATUS common_encrypt_buffer(struct smb_trans_enc_state *es, char *buffer, char **buf_out)
-{
-       if (!common_encryption_on(es)) {
-               /* Not encrypting. */
-               *buf_out = buffer;
-               return NT_STATUS_OK;
-       }
-
-       switch (es->smb_enc_type) {
-               case SMB_TRANS_ENC_NTLM:
-                       return common_ntlm_encrypt_buffer(es->s.ntlmssp_state, es->enc_ctx_num, buffer, buf_out);
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-               case SMB_TRANS_ENC_GSS:
-                       return common_gss_encrypt_buffer(es->s.gss_state, es->enc_ctx_num, buffer, buf_out);
-#endif
-               default:
-                       return NT_STATUS_NOT_SUPPORTED;
-       }
-}
-
-/******************************************************************************
- Generic code for client and server.
- Decrypt an incoming SMB buffer. Replaces the data within it.
- New data must be less than or equal to the current length.
-******************************************************************************/
-
-NTSTATUS common_decrypt_buffer(struct smb_trans_enc_state *es, char *buf)
-{
-       if (!common_encryption_on(es)) {
-               /* Not decrypting. */
-               return NT_STATUS_OK;
-       }
-
-       switch (es->smb_enc_type) {
-               case SMB_TRANS_ENC_NTLM:
-                       return common_ntlm_decrypt_buffer(es->s.ntlmssp_state, buf);
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-               case SMB_TRANS_ENC_GSS:
-                       return common_gss_decrypt_buffer(es->s.gss_state, buf);
-#endif
-               default:
-                       return NT_STATUS_NOT_SUPPORTED;
-       }
-}
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-/******************************************************************************
- Shutdown a gss encryption state.
-******************************************************************************/
-
-static void common_free_gss_state(struct smb_tran_enc_state_gss **pp_gss_state)
-{
-       OM_uint32 minor = 0;
-       struct smb_tran_enc_state_gss *gss_state = *pp_gss_state;
-
-       if (gss_state->creds != GSS_C_NO_CREDENTIAL) {
-               gss_release_cred(&minor, &gss_state->creds);
-       }
-       if (gss_state->gss_ctx != GSS_C_NO_CONTEXT) {
-               gss_delete_sec_context(&minor, &gss_state->gss_ctx, NULL);
-       }
-       SAFE_FREE(*pp_gss_state);
-}
-#endif
-
-/******************************************************************************
- Shutdown an encryption state.
-******************************************************************************/
-
-void common_free_encryption_state(struct smb_trans_enc_state **pp_es)
-{
-       struct smb_trans_enc_state *es = *pp_es;
-
-       if (es == NULL) {
-               return;
-       }
-
-       if (es->smb_enc_type == SMB_TRANS_ENC_NTLM) {
-               if (es->s.ntlmssp_state) {
-                       ntlmssp_end(&es->s.ntlmssp_state);
-               }
-       }
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-       if (es->smb_enc_type == SMB_TRANS_ENC_GSS) {
-               /* Free the gss context handle. */
-               if (es->s.gss_state) {
-                       common_free_gss_state(&es->s.gss_state);
-               }
-       }
-#endif
-       SAFE_FREE(es);
-       *pp_es = NULL;
-}
-
-/******************************************************************************
- Free an encryption-allocated buffer.
-******************************************************************************/
-
-void common_free_enc_buffer(struct smb_trans_enc_state *es, char *buf)
-{
-       if (!common_encryption_on(es)) {
-               return;
-       }
-
-       if (es->smb_enc_type == SMB_TRANS_ENC_NTLM) {
-               SAFE_FREE(buf);
-               return;
-       }
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-       if (es->smb_enc_type == SMB_TRANS_ENC_GSS) {
-               OM_uint32 min;
-               gss_buffer_desc rel_buf;
-               rel_buf.value = buf;
-               rel_buf.length = smb_len(buf) + 4;
-               gss_release_buffer(&min, &rel_buf);
-       }
-#endif
-}
-
-/******************************************************************************
- Client side encryption.
-******************************************************************************/
-
-/******************************************************************************
- Is client encryption on ?
-******************************************************************************/
-
-BOOL cli_encryption_on(struct cli_state *cli)
-{
-       /* If we supported multiple encrytion contexts
-        * here we'd look up based on tid.
-        */
-       return common_encryption_on(cli->trans_enc_state);
-}
-
-/******************************************************************************
- Shutdown a client encryption state.
-******************************************************************************/
-
-void cli_free_encryption_context(struct cli_state *cli)
-{
-       common_free_encryption_state(&cli->trans_enc_state);
-}
-
-/******************************************************************************
- Free an encryption-allocated buffer.
-******************************************************************************/
-
-void cli_free_enc_buffer(struct cli_state *cli, char *buf)
-{
-       /* We know this is an smb buffer, and we
-        * didn't malloc, only copy, for a keepalive,
-        * so ignore session keepalives. */
-
-       if(CVAL(buf,0) == SMBkeepalive) {
-               return;
-       }
-
-       /* If we supported multiple encrytion contexts
-        * here we'd look up based on tid.
-        */
-       common_free_enc_buffer(cli->trans_enc_state, buf);
-}
-
-/******************************************************************************
- Decrypt an incoming buffer.
-******************************************************************************/
-
-NTSTATUS cli_decrypt_message(struct cli_state *cli)
-{
-       NTSTATUS status;
-       uint16 enc_ctx_num;
-
-       /* Ignore session keepalives. */
-       if(CVAL(cli->inbuf,0) == SMBkeepalive) {
-               return NT_STATUS_OK;
-       }
-
-       status = get_enc_ctx_num(cli->inbuf, &enc_ctx_num);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-
-       if (enc_ctx_num != cli->trans_enc_state->enc_ctx_num) {
-               return NT_STATUS_INVALID_HANDLE;
-       }
-
-       return common_decrypt_buffer(cli->trans_enc_state, cli->inbuf);
-}
-
-/******************************************************************************
- Encrypt an outgoing buffer. Return the encrypted pointer in buf_out.
-******************************************************************************/
-
-NTSTATUS cli_encrypt_message(struct cli_state *cli, char **buf_out)
-{
-       /* Ignore session keepalives. */
-       if(CVAL(cli->outbuf,0) == SMBkeepalive) {
-               return NT_STATUS_OK;
-       }
-
-       /* If we supported multiple encrytion contexts
-        * here we'd look up based on tid.
-        */
-       return common_encrypt_buffer(cli->trans_enc_state, cli->outbuf, buf_out);
-}
index bbfd4be3554659274d031f087b95c343c6846185..baf2a0071cbc64fcf50ef4ad2330bddc61b23898 100644 (file)
@@ -201,9 +201,9 @@ static void hexdump( const char * label, const char * s, size_t len )
  * perfect fits.
  */
 static size_t macosxfs_encoding_pull(
-       void *cd,                                   /* Encoder handle */
-       const char **inbuf, size_t *inbytesleft,    /* Script string */
-       char **outbuf, size_t *outbytesleft)        /* UTF-16-LE string */
+       void *cd,                               /* Encoder handle */
+       char **inbuf, size_t *inbytesleft,      /* Script string */
+       char **outbuf, size_t *outbytesleft)    /* UTF-16-LE string */
 {
        static const int script_code = kCFStringEncodingUTF8;
        static CFMutableStringRef cfstring = NULL;
@@ -323,9 +323,9 @@ static size_t macosxfs_encoding_pull(
 }
 
 static size_t macosxfs_encoding_push(
-       void *cd,                                   /* Encoder handle */
-       const char **inbuf, size_t *inbytesleft,    /* UTF-16-LE string */
-       char **outbuf, size_t *outbytesleft)        /* Script string */
+       void *cd,                               /* Encoder handle */
+       char **inbuf, size_t *inbytesleft,      /* UTF-16-LE string */
+       char **outbuf, size_t *outbytesleft)    /* Script string */
 {
        static const int script_code = kCFStringEncodingUTF8;
        static CFMutableStringRef cfstring = NULL;
@@ -373,7 +373,7 @@ static size_t macosxfs_encoding_push(
        charsconverted = CFStringGetBytes(
                cfstring, CFRangeMake(0,cfsize),
                script_code, 0, False,
-               (uint8_t *)(*outbuf), *outbytesleft, &outsize);
+               *outbuf, *outbytesleft, &outsize);
 
        if (0 == charsconverted) {
                debug_out("String conversion: "
index 76a03e9ffb5d5d7659b4a68a0f8d5115eae2aa27..ca27cf0ac3af4d12567c76a065616c8741fc06fc 100644 (file)
@@ -791,10 +791,6 @@ static BOOL vfswrap_lock(vfs_handle_struct *handle, files_struct *fsp, int fd, i
        BOOL result;
 
        START_PROFILE(syscall_fcntl_lock);
-
-       /* SMB_VFS_GETLOCK should be used to query lock status. */
-       SMB_ASSERT(op != SMB_F_GETLK);
-
        result =  fcntl_lock(fd, op, offset, count, type);
        END_PROFILE(syscall_fcntl_lock);
        return result;
index b9d78a8ba9e0668b52c82dd161e3dd3efa9b2436..dc03506194b278f422ab59ac2133675e8fec4149 100644 (file)
@@ -32,6 +32,15 @@ extern BOOL global_in_nmbd;
 
 extern BOOL override_logfile;
 
+/* are we running as a daemon ? */
+static BOOL is_daemon;
+
+/* fork or run in foreground ? */
+static BOOL Fork = True;
+
+/* log to standard output ? */
+static BOOL log_stdout;
+
 /* have we found LanMan clients yet? */
 BOOL found_lm_clients = False;
 
@@ -609,7 +618,7 @@ static void process(void)
  Open the socket communication.
  **************************************************************************** */
 
-static BOOL open_sockets(enum smb_server_mode server_mode, int port)
+static BOOL open_sockets(BOOL isdaemon, int port)
 {
        /*
         * The sockets opened here will be used to receive broadcast
@@ -619,13 +628,12 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port)
         * now deprecated.
         */
 
-       if ( server_mode == SERVER_MODE_INETD ) {
-               ClientNMB = 0;
-       } else {
+       if ( isdaemon )
                ClientNMB = open_socket_in(SOCK_DGRAM, port,
                                           0, interpret_addr(lp_socket_address()),
                                           True);
-       }
+       else
+               ClientNMB = 0;
   
        ClientDGRAM = open_socket_in(SOCK_DGRAM, DGRAM_PORT,
                                           3, interpret_addr(lp_socket_address()),
@@ -654,21 +662,16 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port)
  int main(int argc, const char *argv[])
 {
        pstring logfile;
+       static BOOL opt_interactive;
        poptContext pc;
-       const char *p_lmhosts = dyn_LMHOSTSFILE;
-       BOOL no_process_group = False;
-       BOOL log_stdout = False;
-       enum smb_server_mode server_mode = SERVER_MODE_DAEMON;
+       static char *p_lmhosts = dyn_LMHOSTSFILE;
+       static BOOL no_process_group = False;
        int opt;
-
        struct poptOption long_options[] = {
        POPT_AUTOHELP
-       {"daemon", 'D', POPT_ARG_VAL, &server_mode, SERVER_MODE_DAEMON,
-               "Become a daemon(default)" },
-       {"interactive", 'i', POPT_ARG_VAL, &server_mode,
-               SERVER_MODE_INTERACTIVE, "Run interactive (not a daemon)" },
-       {"foreground", 'F', POPT_ARG_VAL, &server_mode,
-               SERVER_MODE_FOREGROUND, "Run daemon in foreground (for daemontools & etc)" },
+       {"daemon", 'D', POPT_ARG_VAL, &is_daemon, True, "Become a daemon(default)" },
+       {"interactive", 'i', POPT_ARG_VAL, &opt_interactive, True, "Run interactive (not a daemon)" },
+       {"foreground", 'F', POPT_ARG_VAL, &Fork, False, "Run daemon in foreground (for daemontools & etc)" },
        {"no-process-group", 0, POPT_ARG_VAL, &no_process_group, True, "Don't create a new process group" },
        {"log-stdout", 'S', POPT_ARG_VAL, &log_stdout, True, "Log to stdout" },
        {"hosts", 'H', POPT_ARG_STRING, &p_lmhosts, 'H', "Load a netbios hosts file"},
@@ -726,11 +729,12 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port)
        BlockSignals(True, SIGUSR2);
 #endif
 
-       if (server_mode == SERVER_MODE_INTERACTIVE) {
+       if ( opt_interactive ) {
+               Fork = False;
                log_stdout = True;
        }
 
-       if (log_stdout && server_mode == SERVER_MODE_DAEMON) {
+       if ( log_stdout && Fork ) {
                DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
                exit(1);
        }
@@ -757,19 +761,14 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port)
 
        set_samba_nb_type();
 
-       if (is_a_socket(0)) {
-               if (server_mode == SERVER_MODE_DAEMON) {
-                       DEBUG(0,("standard input is a socket, "
-                                   "assuming -F option\n"));
-               }
-               server_mode = SERVER_MODE_INETD;
+       if (!is_daemon && !is_a_socket(0)) {
+               DEBUG(0,("standard input is not a socket, assuming -D option\n"));
+               is_daemon = True;
        }
-
-       if (server_mode == SERVER_MODE_DAEMON) {
+  
+       if (is_daemon && !opt_interactive) {
                DEBUG( 2, ( "Becoming a daemon.\n" ) );
-               become_daemon(True, no_process_group);
-       } else if (server_mode == SERVER_MODE_FOREGROUND) {
-               become_daemon(False, no_process_group);
+               become_daemon(Fork, no_process_group);
        }
 
 #if HAVE_SETPGID
@@ -777,7 +776,7 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port)
         * If we're interactive we want to set our own process group for 
         * signal management.
         */
-       if (server_mode == SERVER_MODE_INTERACTIVE && !no_process_group)
+       if (opt_interactive && !no_process_group)
                setpgid( (pid_t)0, (pid_t)0 );
 #endif
 
@@ -816,7 +815,7 @@ static BOOL open_sockets(enum smb_server_mode server_mode, int port)
 
        DEBUG( 3, ( "Opening sockets %d\n", global_nmb_port ) );
 
-       if ( !open_sockets( server_mode, global_nmb_port ) ) {
+       if ( !open_sockets( is_daemon, global_nmb_port ) ) {
                kill_async_dns_child();
                return 1;
        }
index bf01075d1421008843655c9722ba6a55e17170e7..875e13fdc8861f0a4128b54a41e7b45d4ec8c30e 100644 (file)
@@ -1904,7 +1904,7 @@ BOOL send_mailslot(BOOL unique, const char *mailslot,char *buf, size_t len,
        /* Setup the smb part. */
        ptr -= 4; /* XXX Ugliness because of handling of tcp SMB length. */
        memcpy(tmp,ptr,4);
-       set_message(NULL,ptr,17,strlen(mailslot) + 1 + len,True);
+       set_message(ptr,17,strlen(mailslot) + 1 + len,True);
        memcpy(ptr,tmp,4);
 
        SCVAL(ptr,smb_com,SMBtrans);
index 84e3658e844426e37c9184ad0671018a78609a0c..8b15073ed0083f0087a55797537b54934ebd716a 100644 (file)
@@ -384,6 +384,7 @@ typedef struct {
        char *fstype;
        char **szVfsObjects;
        char *szMSDfsProxy;
+       char *szAioWriteBehind;
        char *szDfree;
        int iMinPrintSpace;
        int iMaxPrintJobs;
@@ -524,6 +525,7 @@ static service sDefault = {
        NULL,                   /* fstype */
        NULL,                   /* vfs objects */
        NULL,                   /* szMSDfsProxy */
+       NULL,                   /* szAioWriteBehind */
        NULL,                   /* szDfree */
        0,                      /* iMinPrintSpace */
        1000,                   /* iMaxPrintJobs */
@@ -990,6 +992,7 @@ static struct parm_struct parm_table[] = {
        {"allocation roundup size", P_INTEGER, P_LOCAL, &sDefault.iallocation_roundup_size, NULL, NULL, FLAG_ADVANCED}, 
        {"aio read size", P_INTEGER, P_LOCAL, &sDefault.iAioReadSize, NULL, NULL, FLAG_ADVANCED}, 
        {"aio write size", P_INTEGER, P_LOCAL, &sDefault.iAioWriteSize, NULL, NULL, FLAG_ADVANCED}, 
+       {"aio write behind", P_STRING, P_LOCAL, &sDefault.szAioWriteBehind, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
        {"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED}, 
        {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_ADVANCED}, 
        {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
@@ -1034,7 +1037,7 @@ static struct parm_struct parm_table[] = {
        {"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, FLAG_ADVANCED}, 
        {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_ADVANCED}, 
-       {"keepalive", P_INTEGER, P_GLOBAL, &Globals.iKeepalive, NULL, NULL, FLAG_ADVANCED}, 
+       {"keepalive", P_INTEGER, P_GLOBAL, &Globals.iKeepalive, NULL, NULL, FLAG_ADVANCED},
        {"change notify", P_BOOL, P_LOCAL, &sDefault.bChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
        {"directory name cache size", P_INTEGER, P_LOCAL, &sDefault.iDirectoryNameCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
        {"kernel change notify", P_BOOL, P_LOCAL, &sDefault.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
@@ -1666,7 +1669,7 @@ static void init_globals(BOOL first_time_only)
        Globals.bWinbindUseDefaultDomain = False;
        Globals.bWinbindTrustedDomainsOnly = False;
        Globals.bWinbindNestedGroups = True;
-       Globals.winbind_expand_groups = 1;      
+       Globals.winbind_expand_groups = 1;
        Globals.szWinbindNssInfo = str_list_make("template", NULL);
        Globals.bWinbindRefreshTickets = False;
        Globals.bWinbindOfflineLogon = False;
@@ -2073,6 +2076,7 @@ FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
+FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
 FN_LOCAL_STRING(lp_dfree_command, szDfree)
 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
@@ -2593,7 +2597,7 @@ static int add_a_service(const service *pservice, const char *name)
 }
 
 /***************************************************************************
-  Canonicalize by converting to lowercase.
+  Convert a string to uppercase and remove whitespaces.
 ***************************************************************************/
 
 static char *canonicalize_servicename(const char *src)
@@ -4077,7 +4081,9 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
                parm_ptr =
                        ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
                                                            &sDefault);
+       }
 
+       if (snum >= 0) {
                if (!ServicePtrs[snum]->copymap)
                        init_copymap(ServicePtrs[snum]);
 
index cc123bff22fa86cde087a011e69603f6eae0c433..a945867967bc0c4b4a7a245c2bae14940226d653 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    LDAP protocol helper functions for SAMBA
-   Copyright (C) Jean François Micouleau      1998
+   Copyright (C) Jean François Micouleau       1998
    Copyright (C) Gerald Carter                 2001-2003
    Copyright (C) Shahms King                   2001
    Copyright (C) Andrew Bartlett               2002-2003
index c5c1e29ecf650829f89fb7640b84f607dd92e11e..771adb96e3dbf9c63751de8bf29d1bee86ed1448 100644 (file)
@@ -104,7 +104,7 @@ BOOL secrets_store(const char *key, const void *data, size_t size)
        if (!tdb)
                return False;
        return tdb_trans_store(tdb, string_tdb_data(key),
-                              make_tdb_data((uint8 *)data, size),
+                              make_tdb_data((const uint8 *)data, size),
                               TDB_REPLACE) == 0;
 }
 
@@ -499,6 +499,20 @@ BOOL secrets_fetch_trusted_domain_password(const char *domain, char** pwd,
        return True;
 }
 
+/************************************************************************
+ Routine to set the trust account password for a domain.
+************************************************************************/
+
+BOOL secrets_store_trust_account_password(const char *domain, uint8 new_pwd[16])
+{
+       struct machine_acct_pass pass;
+
+       pass.mod_time = time(NULL);
+       memcpy(pass.hash, new_pwd, 16);
+
+       return secrets_store(trust_keystr(domain), (void *)&pass, sizeof(pass));
+}
+
 /**
  * Routine to store the password for trusted domain
  *
@@ -555,78 +569,40 @@ the password is assumed to be a null terminated ascii string
 BOOL secrets_store_machine_password(const char *pass, const char *domain, uint32 sec_channel)
 {
        char *key = NULL;
-       BOOL ret = False;
+       BOOL ret;
        uint32 last_change_time;
        uint32 sec_channel_type;
 
-       if (tdb_transaction_start(tdb) == -1) {
-               DEBUG(5, ("tdb_transaction_start failed: %s\n",
-                         tdb_errorstr(tdb)));
+       asprintf(&key, "%s/%s", SECRETS_MACHINE_PASSWORD, domain);
+       if (!key)
                return False;
-       }
-
-       if (asprintf(&key, "%s/%s", SECRETS_MACHINE_PASSWORD, domain) == -1) {
-               DEBUG(5, ("asprintf failed\n"));
-               goto fail;
-       }
        strupper_m(key);
 
        ret = secrets_store(key, pass, strlen(pass)+1);
        SAFE_FREE(key);
 
-       if (!ret) {
-               DEBUG(5, ("secrets_store failed: %s\n",
-                         tdb_errorstr(tdb)));
-               goto fail;
-       }
+       if (!ret)
+               return ret;
 
-       if (asprintf(&key, "%s/%s", SECRETS_MACHINE_LAST_CHANGE_TIME,
-                    domain) == -1) {
-               DEBUG(5, ("asprintf failed\n"));
-               goto fail;
-       }
+       asprintf(&key, "%s/%s", SECRETS_MACHINE_LAST_CHANGE_TIME, domain);
+       if (!key)
+               return False;
        strupper_m(key);
 
        SIVAL(&last_change_time, 0, time(NULL));
        ret = secrets_store(key, &last_change_time, sizeof(last_change_time));
        SAFE_FREE(key);
 
-       if (!ret) {
-               DEBUG(5, ("secrets_store failed: %s\n",
-                         tdb_errorstr(tdb)));
-               goto fail;
-       }
-
-       if (asprintf(&key, "%s/%s", SECRETS_MACHINE_SEC_CHANNEL_TYPE,
-                    domain) == -1) {
-               DEBUG(5, ("asprintf failed\n"));
-               goto fail;
-       }
+       asprintf(&key, "%s/%s", SECRETS_MACHINE_SEC_CHANNEL_TYPE, domain);
+       if (!key)
+               return False;
        strupper_m(key);
 
        SIVAL(&sec_channel_type, 0, sec_channel);
        ret = secrets_store(key, &sec_channel_type, sizeof(sec_channel_type));
        SAFE_FREE(key);
 
-       if (!ret) {
-               DEBUG(5, ("secrets_store failed: %s\n",
-                         tdb_errorstr(tdb)));
-               goto fail;
-       }
-
-       if (tdb_transaction_commit(tdb) != 0) {
-               DEBUG(5, ("tdb_transaction_commit failed: %s\n",
-                         tdb_errorstr(tdb)));
-               return False;
-       }
-
-       return True;
-
- fail:
-       if (tdb_transaction_cancel(tdb) != 0) {
-               smb_panic("tdb_transaction_cancel failed!\n");
-       }
-       return False;
+       return ret;
 }
 
 /************************************************************************
@@ -678,6 +654,15 @@ char *secrets_fetch_machine_password(const char *domain,
        return ret;
 }
 
+/************************************************************************
+ Routine to delete the machine trust account password file for a domain.
+************************************************************************/
+
+BOOL trust_password_delete(const char *domain)
+{
+       return secrets_delete(trust_keystr(domain));
+}
+
 /************************************************************************
  Routine to delete the password for trusted domain
 ************************************************************************/
diff --git a/source3/python/README b/source3/python/README
deleted file mode 100644 (file)
index 04f7942..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-This directory contains Python bindings to allow you to access various
-aspects of Samba.  At the moment their status is "experimental" and
-they are not built by default.
-
-In order to be able to compile samba-python you need to have python
-and the python-dev packages installed.
-
-Python libraries are always built for a particular version of Python
-(2.2, 2.1, etc), and libraries built for one version will not be seen
-by another.  By default Samba's libraries are built for whatever is
-installed as "python" on your $PATH, but you can override this using
-the --with-python option.  For example
-
-  $ ./configure --with-python=python2.2
-
-To build:
-
-$ autoconf
-$ ./configure 
-$ make python_ext
-
-Now, you can install the modules:
-
-$ cp build/lib.*/*.so /usr/lib/python2.1/lib-dynload/
-
-(the directory /usr/lib/python2.1 may vary, depending on your installation)
-
-Samba-python should work now!
diff --git a/source3/python/examples/spoolss/changeid.py b/source3/python/examples/spoolss/changeid.py
deleted file mode 100755 (executable)
index 85fe0ef..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/python
-#
-# Display the changeid for a list of printers given on the command line
-#
-# Sample usage:
-#
-#     changeid.py '\\win2kdc1\magpie'
-#
-
-import sys
-from samba import spoolss
-
-if len(sys.argv) == 1:
-    print "Usage: changeid.py <printername>"
-    sys.exit(1)
-
-for printer in sys.argv[1:]:
-
-    # Open printer handle
-
-    try:
-        hnd = spoolss.openprinter(printer)
-    except:
-        print "error opening printer %s" % printer
-        sys.exit(1)
-
-    # Fetch and display changeid
-
-    info = hnd.getprinter(level = 0)
-    print info["change_id"]
-
-    # Clean up
-
-    spoolss.closeprinter(hnd)
diff --git a/source3/python/examples/spoolss/enumprinters.py b/source3/python/examples/spoolss/enumprinters.py
deleted file mode 100755 (executable)
index 478c46b..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-#
-# Display information on all printers on a print server.  Defaults to
-# printer info level 1.
-#
-# Example: enumprinters.py win2kdc1
-#
-
-import sys
-from samba import spoolss
-
-if len(sys.argv) < 2 or len(sys.argv) > 3:
-    print "Usage: enumprinters.py <servername> [infolevel]"
-    sys.exit(1)
-
-printserver = sys.argv[1]
-
-level = 1
-if len(sys.argv) == 3:
-    level = int(sys.argv[2])
-        
-# Get list of printers
-
-try:
-    printer_list = spoolss.enumprinters("\\\\%s" % printserver)
-except:
-    print "error enumerating printers on %s" % printserver
-    sys.exit(1)
-
-# Display basic info
-
-for printer in printer_list:
-    h = spoolss.openprinter("\\\\%s\\%s" % (printserver, printer))
-    info = h.getprinter(level = level)
-    print "Printer info %d for %s: %s" % (level, printer, info)
-    print
diff --git a/source3/python/examples/spoolss/psec.py b/source3/python/examples/spoolss/psec.py
deleted file mode 100755 (executable)
index 498a0ef..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env python
-#
-# Get or set the security descriptor on a printer
-#
-
-import sys, re, string
-from samba import spoolss
-
-if len(sys.argv) != 3:
-    print "Usage: psec.py getsec|setsec printername"
-    sys.exit(1)
-
-op = sys.argv[1]
-printername = sys.argv[2]
-
-# Display security descriptor
-
-if op == "getsec":
-
-    try:
-        hnd = spoolss.openprinter(printername)
-    except:
-        print "error opening printer %s" % printername
-        sys.exit(1)
-
-    secdesc = hnd.getprinter(level = 3)["security_descriptor"]
-
-    print secdesc["owner_sid"]
-    print secdesc["group_sid"]
-
-    for acl in secdesc["dacl"]["ace_list"]:
-        print "%d %d 0x%08x %s" % (acl["type"], acl["flags"],
-                                   acl["mask"], acl["trustee"])
-
-    spoolss.closeprinter(hnd)
-
-    sys.exit(0)
-
-# Set security descriptor
-
-if op == "setsec":
-
-    # Open printer
-
-    try:
-        hnd = spoolss.openprinter(printername,
-                                  creds = {"domain": "NPSD-TEST2",
-                                           "username": "Administrator",
-                                           "password": "penguin"})
-    except:
-        print "error opening printer %s" % printername
-        sys.exit(1)
-
-    # Read lines from standard input and build security descriptor
-
-    lines = sys.stdin.readlines()
-
-    secdesc = {}
-
-    secdesc["owner_sid"] = lines[0]
-    secdesc["group_sid"] = lines[1]
-
-    secdesc["revision"] = 1
-    secdesc["dacl"] = {}
-    secdesc["dacl"]["revision"] = 2
-    secdesc["dacl"]["ace_list"] = []
-
-    for acl in lines[2:]:
-        match = re.match("(\d+) (\d+) (0[xX][\dA-Fa-f]+) (\S+)", acl)
-        secdesc["dacl"]["ace_list"].append(
-            {"type": int(match.group(1)), "flags": int(match.group(2)),
-             "mask": string.atoi(match.group(3), 0), "trustee": match.group(4)})
-
-    # Build info3 structure
-
-    info3 = {}
-
-    info3["flags"] = 0x8004             # self-relative, dacl present
-    info3["level"] = 3
-    info3["security_descriptor"] = secdesc
-
-    hnd.setprinter(info3)
-
-    spoolss.closeprinter(hnd)
-    sys.exit(0)
-
-print "invalid operation %s" % op
-sys.exit(1)
diff --git a/source3/python/examples/tdbpack/oldtdbutil.py b/source3/python/examples/tdbpack/oldtdbutil.py
deleted file mode 100644 (file)
index ac435b8..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-#!/usr/bin/python
-#############################################################
-# tdbutil
-# 
-# Purpose:
-#   Contains functions that are used to pack and unpack data
-# from Samba's tdb databases.  Samba sometimes represents complex
-# data structures as a single value in a database.  These functions
-# allow other python scripts to package data types into a single python
-# string and unpackage them.
-#
-#
-# XXXXX: This code is no longer used; it's just here for testing
-# compatibility with the new (much faster) C implementation.
-#
-############################################################## 
-import string
-
-def pack(format,list):
-   retstring = ''
-   listind = 0
-   
-   # Cycle through format entries
-   for type in format:
-      # Null Terminated String
-      if (type == 'f' or type == 'P'):
-         retstring = retstring + list[listind] + "\000"
-      # 4 Byte Number
-      if (type == 'd'):
-         retstring = retstring + PackNum(list[listind],4)
-      # 2 Byte Number
-      if (type == 'w'):
-         retstring = retstring + PackNum(list[listind],2)
-      # Pointer Value
-      if (type == 'p'):
-         if (list[listind]):
-            retstring = retstring + PackNum(1,4)
-         else:
-            retstring = retstring + PackNum(0,4)
-      # Buffer and Length
-      if (type == 'B'):
-         # length
-         length = list[listind]
-         retstring = retstring + PackNum(length,4)
-         length = int(length)
-         listind = listind + 1
-         # buffer
-         retstring = retstring + list[listind][:length]
-         
-      listind = listind + 1
-      
-   return retstring
-
-def unpack(format,buffer):
-   retlist = []
-   bufind = 0
-   
-   lasttype = ""
-   for type in format:
-      # Pointer Value
-      if (type == 'p'):
-         newvalue = UnpackNum(buffer[bufind:bufind+4])
-         bufind = bufind + 4
-         if (newvalue):
-            newvalue = 1L
-         else:
-            newvalue = 0L
-         retlist.append(newvalue)
-      # Previous character till end of data
-      elif (type == '$'):
-         if (lasttype == 'f'):
-            while (bufind < len(buffer)):
-               newstring = ''
-               while (buffer[bufind] != '\000'):
-                  newstring = newstring + buffer[bufind]
-                  bufind = bufind + 1
-               bufind = bufind + 1
-               retlist.append(newstring)
-      # Null Terminated String
-      elif (type == 'f' or type == 'P'):
-         newstring = ''
-         while (buffer[bufind] != '\000'):
-            newstring = newstring + buffer[bufind]
-            bufind = bufind + 1
-         bufind = bufind + 1
-         retlist.append(newstring)
-      # 4 Byte Number
-      elif (type == 'd'):
-         newvalue = UnpackNum(buffer[bufind:bufind+4])
-         bufind = bufind + 4
-         retlist.append(newvalue)
-      # 2 Byte Number
-      elif (type == 'w'):
-         newvalue = UnpackNum(buffer[bufind:bufind+2])
-         bufind = bufind + 2
-         retlist.append(newvalue)
-      # Length and Buffer
-      elif (type == 'B'):
-         # Length
-         length = UnpackNum(buffer[bufind:bufind+4])
-         bufind = bufind + 4 
-         retlist.append(length)
-         length = int(length)
-         # Buffer
-         retlist.append(buffer[bufind:bufind+length])
-         bufind = bufind + length
-         
-      lasttype = type
-
-   return ((retlist,buffer[bufind:]))
-
-def PackNum(myint,size):
-    retstring = ''
-    size = size * 2
-    hint = hex(myint)[2:]
-
-    # Check for long notation
-    if (hint[-1:] == 'L'):
-       hint = hint[:-1]
-    
-    addon = size - len(hint)
-    for i in range(0,addon):
-       hint = '0' + hint
-    
-    while (size > 0):
-       val = string.atoi(hint[size-2:size],16)
-       retstring = retstring + chr(val)
-       size = size - 2
-    
-    return retstring
-   
-def UnpackNum(buffer):
-   size = len(buffer)
-   mystring = ''
-
-   for i in range(size-1,-1,-1):
-      val = hex(ord(buffer[i]))[2:]
-      if (len(val) == 1):
-         val = '0' + val
-      mystring = mystring + val
-   if (len(mystring) > 4):
-      return string.atol(mystring,16)
-   else:
-      return string.atoi(mystring,16)
diff --git a/source3/python/examples/tdbpack/tdbtimetrial.py b/source3/python/examples/tdbpack/tdbtimetrial.py
deleted file mode 100755 (executable)
index a72136a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#! /usr/bin/python
-
-def run_trial():
-    # import tdbutil
-    from samba.tdbpack import pack
-    
-    for i in xrange(500000):
-        pack("ddffd", (10, 2, "mbp", "martin", 0))
-        #s = "\n\0\0\0" + "\x02\0\0\0" + "mbp\0" + "martin\0" + "\0\0\0\0"
-
-if __name__ == '__main__':
-    run_trial()
diff --git a/source3/python/examples/tdbpack/test_tdbpack.py b/source3/python/examples/tdbpack/test_tdbpack.py
deleted file mode 100755 (executable)
index af2ba2b..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-#! /usr/bin/env python
-
-__doc__ = """test case for samba.tdbpack functions
-
-tdbpack provides a means of pickling values into binary formats
-compatible with that used by the samba tdbpack()/tdbunpack()
-functions.
-
-Numbers are always stored in little-endian format; strings are stored
-in either DOS or Unix codepage as appropriate.
-
-The format for any particular element is encoded as a short ASCII
-string, with one character per field."""
-
-# Copyright (C) 2002 Hewlett-Packard.
-
-__author__ = 'Martin Pool <mbp@sourcefrog.net>'
-
-import unittest
-import oldtdbutil
-import samba.tdbpack
-
-both_unpackers = (samba.tdbpack.unpack, oldtdbutil.unpack)
-both_packers = (samba.tdbpack.pack, oldtdbutil.pack)
-
-
-
-# #             ('B', [10, 'hello'], '\x0a\0\0\0hello'),
-#              ('BB', [11, 'hello\0world', 3, 'now'],
-#               '\x0b\0\0\0hello\0world\x03\0\0\0now'),
-#              ('pd', [1, 10], '\x01\0\0\0\x0a\0\0\0'),
-#              ('BBB', [5, 'hello', 0, '', 5, 'world'],
-#               '\x05\0\0\0hello\0\0\0\0\x05\0\0\0world'),
-
-             # strings are sequences in Python, there's no getting away
-             # from it
-#             ('ffff', 'evil', 'e\0v\0i\0l\0'),
-#              ('BBBB', 'evil',                   
-#               '\x01\0\0\0e'
-#               '\x01\0\0\0v'
-#               '\x01\0\0\0i'
-#               '\x01\0\0\0l'),
-
-#              ('', [], ''),
-
-#              # exercise some long strings
-#              ('PP', ['hello' * 255, 'world' * 255],
-#               'hello' * 255 + '\0' + 'world' * 255 + '\0'),
-#              ('PP', ['hello' * 40000, 'world' * 50000],
-#               'hello' * 40000 + '\0' + 'world' * 50000 + '\0'),
-#              ('B', [(5*51), 'hello' * 51], '\xff\0\0\0' + 'hello' * 51),
-#              ('BB', [(5 * 40000), 'hello' * 40000,
-#                      (5 * 50000), 'world' * 50000],
-#               '\x40\x0d\x03\0' + 'hello' * 40000 + '\x90\xd0\x03\x00' + 'world' * 50000),
-
-    
-class PackTests(unittest.TestCase):
-    symm_cases = [
-             ('w', [42], '\x2a\0'),
-             ('www', [42, 2, 69], '\x2a\0\x02\0\x45\0'),
-             ('wd', [42, 256], '\x2a\0\0\x01\0\0'),
-             ('w', [0], '\0\0'),
-             ('w', [255], '\xff\0'),
-             ('w', [256], '\0\x01'),
-             ('w', [0xdead], '\xad\xde'),
-             ('w', [0xffff], '\xff\xff'),
-             ('p', [0], '\0\0\0\0'),
-             ('p', [1], '\x01\0\0\0'),
-             ('d', [0x01020304], '\x04\x03\x02\x01'),
-             ('d', [0x7fffffff], '\xff\xff\xff\x7f'),
-             ('d', [0x80000000L], '\x00\x00\x00\x80'),
-             ('d', [0x80000069L], '\x69\x00\x00\x80'),
-             ('d', [0xffffffffL], '\xff\xff\xff\xff'),
-             ('d', [0xffffff00L], '\x00\xff\xff\xff'),
-             ('ddd', [1, 10, 50], '\x01\0\0\0\x0a\0\0\0\x32\0\0\0'),
-             ('ff', ['hello', 'world'], 'hello\0world\0'),
-             ('fP', ['hello', 'world'], 'hello\0world\0'),
-             ('PP', ['hello', 'world'], 'hello\0world\0'),
-             ('B', [0, ''], '\0\0\0\0'),
-# old implementation is wierd when string is not the right length             
-#             ('B', [2, 'hello'], '\x0a\0\0\0hello'),
-             ('B', [5, 'hello'], '\x05\0\0\0hello'),
-             ]
-
-    def test_symmetric(self):
-        """Cookbook of symmetric pack/unpack tests
-        """
-        for packer in [samba.tdbpack.pack]: # both_packers:
-            for unpacker in both_unpackers:
-                for format, values, expected in self.symm_cases:
-                    out_packed = packer(format, values)
-                    self.assertEquals(out_packed, expected)
-                    out, rest = unpacker(format, expected)
-                    self.assertEquals(rest, '')
-                    self.assertEquals(list(values), list(out))
-
-    def test_large(self):
-        """Test large pack/unpack strings"""
-        large_cases = [('w' * 1000, xrange(1000)), ]
-        for packer in both_packers:
-            for unpacker in both_unpackers:
-                for format, values in large_cases:
-                    packed = packer(format, values)
-                    out, rest = unpacker(format, packed)
-                    self.assertEquals(rest, '')
-                    self.assertEquals(list(values), list(out))
-
-                    
-    def test_pack(self):
-        """Cookbook of expected pack values
-
-        These can't be used for the symmetric test because the unpacked value is
-        not "canonical".
-        """
-        cases = [('w', (42,), '\x2a\0'),
-                 ]
-
-        for packer in both_packers:
-            for format, values, expected in cases:
-                self.assertEquals(packer(format, values), expected)
-
-    def test_unpack_extra(self):
-        # Test leftover data
-        for unpacker in both_unpackers:
-            for format, values, packed in self.symm_cases:
-                out, rest = unpacker(format, packed + 'hello sailor!')
-                self.assertEquals(rest, 'hello sailor!')
-                self.assertEquals(list(values), list(out))
-
-
-    def test_pack_extra(self):
-        """Leftover values when packing"""
-        cases = [
-            ('d', [10, 20], [10]),
-            ('d', [10, 'hello'], [10]),
-            ('ff', ['hello', 'world', 'sailor'], ['hello', 'world']),
-            ]
-        for unpacker in both_unpackers:
-            for packer in both_packers:
-                for format, values, chopped in cases:
-                    bin = packer(format, values)
-                    out, rest = unpacker(format, bin)
-                    self.assertEquals(list(out), list(chopped))
-                    self.assertEquals(rest, '')
-
-
-    def test_unpack(self):
-        """Cookbook of tricky unpack tests"""
-        cases = [
-                 # Apparently I couldn't think of any tests that weren't
-                 # symmetric :-/
-                 ]
-        for unpacker in both_unpackers:
-            for format, values, expected in cases:
-                out, rest = unpacker(format, expected)
-                self.assertEquals(rest, '')
-                self.assertEquals(list(values), list(out))
-
-
-    def test_pack_failures(self):
-        """Expected errors for incorrect packing"""
-        cases = [('w', []),
-#                 ('w', ()),
-#                 ('w', {}),
-                 ('ww', [2]),
-                 ('w', 2),
-#                  ('w', None),
-                 ('wwwwwwwwwwww', []),
-#                 ('w', [0x60A15EC5L]),
-#                 ('w', [None]),
-                 ('d', []),
-                 ('p', []),
-                 ('f', [2]),
-                 ('P', [None]),
-                 ('P', ()),
-                 ('f', [hex]),
-                 ('fw', ['hello']),
-#                  ('f', [u'hello']),
-                 ('B', [2]),
-                 (None, [2, 3, 4]),
-                 (ord('f'), [20]),
-                 # old code doesn't distinguish string from seq-of-char
-#                 (['w', 'w'], [2, 2]),
-                 # old code just ignores invalid characters
-#                 ('Q', [2]),
-#                 ('fQ', ['2', 3]),
-#                 ('fQ', ['2']),
-                 (2, [2]),
-                 # old code doesn't typecheck format
-#                 ({}, {})
-                 ]
-        for packer in both_packers:
-            for format, values in cases:
-                try:
-                    packer(format, values)
-                except StandardError:
-                    pass
-                else:
-                    raise AssertionError("didn't get exception: format %s, values %s, packer %s"
-                                         % (`format`, `values`, `packer`))
-
-
-    def test_unpack_failures(self):
-        """Expected errors for incorrect unpacking"""
-        cases = [
-# This ought to be illegal, but the old code doesn't prohibit it
-#                ('$', '', ValueError),
-#                ('Q', '', ValueError),
-#                ('Q$', '', ValueError),
-                 ('f', '', IndexError),
-                 ('d', '', IndexError),
-# This is an illegal packing, but the old code doesn't trap                 
-#                 ('d', '2', IndexError),
-#                 ('d', '22', IndexError),
-#                 ('d', '222', IndexError),
-#                 ('p', '\x01\0', IndexError),
-#                ('w', '2', IndexError),
-#                ('B', '\xff\0\0\0hello', IndexError),
-#                  ('B', '\xff\0', IndexError),
-                 ('w', '', IndexError),
-                 ('f', 'hello', IndexError),
-                 ('f', '', IndexError),
-#                ('B', '\x01\0\0\0', IndexError),
-#                 ('B', '\x05\0\0\0hell', IndexError),
-                 ('B', '\xff\xff\xff\xff', ValueError),
-#                 ('B', 'foobar', IndexError),
-#                 ('BB', '\x01\0\0\0a\x01', IndexError),
-                 ]
-
-        for unpacker in both_unpackers:
-            for format, values, throwable_class in cases:
-                try:
-                    unpacker(format, values)
-                except StandardError:
-                    pass
-                else:
-                    raise AssertionError("didn't get exception: format %s, values %s, unpacker %s"
-                                         % (`format`, `values`, `unpacker`))
-
-    def test_unpack_repeated(self):
-        cases = [(('df$',
-                  '\x00\x00\x00\x00HP C LaserJet 4500-PS\x00Windows 4.0\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.HLP\x00\x00RAW\x00\\print$\\WIN40\\0\\readme.wri\x00\\print$\\WIN40\\0\\pscript.drv\x00\\print$\\WIN40\\0\\pscript.hlp\x00'),
-                 ([0L, 'HP C LaserJet 4500-PS', 'Windows 4.0', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.HLP', '', 'RAW', '\\print$\\WIN40\\0\\readme.wri', '\\print$\\WIN40\\0\\pscript.drv', '\\print$\\WIN40\\0\\pscript.hlp'], ''))]
-        for unpacker in both_unpackers:
-            for input, expected in cases:
-                result = apply(unpacker, input)
-                if result != expected:
-                    raise AssertionError("%s:\n     input: %s\n    output: %s\n  expected: %s" % (`unpacker`, `input`, `result`, `expected`))
-        
-
-if __name__ == '__main__':
-    unittest.main()
-    
diff --git a/source3/python/gprinterdata b/source3/python/gprinterdata
deleted file mode 100755 (executable)
index cd06207..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-from gtkdictbrowser import GtkDictBrowser, hex_string
-import gtk
-from samba import spoolss
-import string
-import printerdata
-
-# Initialise printerdata dictionary
-
-if len(sys.argv) < 2 or len(sys.argv) > 3:
-    print "Usage: gprinterdata [--ex] <printer>"
-    print "where <printer> is a UNC printer name."
-    sys.exit(1)
-
-try:
-    host = string.replace(sys.argv[len(sys.argv) - 1], "/", "\\")
-    if sys.argv[1] == "--ex":
-        t = printerdata.printerdata_ex(host)
-    else:
-        t = printerdata.printerdata(host)
-except:
-    print "gprinterdata: error opening %s" % sys.argv[len(sys.argv) - 1]
-    sys.exit(1)
-
-# Create interface
-
-db = GtkDictBrowser(t)
-db.register_get_value_text_fn("", hex_string)
-db.build_ui('gprinterdata')
-
-# Override Python's handling of ctrl-c so we can break out of the
-# gui from the command line.
-
-import signal
-signal.signal(signal.SIGINT, signal.SIG_DFL)
-
-gtk.mainloop()
diff --git a/source3/python/gtdbtool b/source3/python/gtdbtool
deleted file mode 100755 (executable)
index 129f4fe..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-from gtkdictbrowser import GtkDictBrowser
-import gtk
-from samba import tdb
-import string
-
-# Open handle on tdb
-
-if len(sys.argv) != 2:
-    print "Usage: gdbtool <tdbfile>"
-    sys.exit(1)
-
-try:
-    t = tdb.open(sys.argv[1])
-except tdb.error, t:
-    print "gtdbtool: error opening %s: %s" % (sys.argv[1], t)
-    sys.exit(1)
-
-# Create interface
-
-db = GtkDictBrowser(t)
-
-def display_key_x00(key):
-    """Remove \x00 from all keys as they mucks up GTK."""
-    return string.replace(key, "\x00", "")
-
-db.register_get_key_text_fn(display_key_x00)
-
-db.build_ui('gtdbtool')
-
-# Override Python's handling of ctrl-c so we can break out of the
-# gui from the command line.
-
-import signal
-signal.signal(signal.SIGINT, signal.SIG_DFL)
-
-gtk.mainloop()
diff --git a/source3/python/gtkdictbrowser.py b/source3/python/gtkdictbrowser.py
deleted file mode 100755 (executable)
index dd8bed8..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-#!/usr/bin/python
-#
-# Browse a Python dictionary in a two pane graphical interface written
-# in GTK.
-#
-# The GtkDictBrowser class is supposed to be generic enough to allow
-# applications to override enough methods and produce a
-# domain-specific browser provided the information is presented as a
-# Python dictionary.
-#
-# Possible applications:
-#
-#   - Windows registry browser
-#   - SPOOLSS printerdata browser
-#   - tdb file browser
-#
-
-from gtk import *
-import string, re
-
-class GtkDictBrowser:
-
-    def __init__(self, dict):
-        self.dict = dict
-        
-        # This variable stores a list of (regexp, function) used to
-        # convert the raw value data to a displayable string.
-
-        self.get_value_text_fns = []
-        self.get_key_text = lambda x: x
-
-        # We can filter the list of keys displayed using a regex
-
-        self.filter_regex = ""
-
-    # Create and configure user interface widgets.  A string argument is
-    # used to set the window title.
-
-    def build_ui(self, title):
-        win = GtkWindow()
-        win.set_title(title)
-
-        win.connect("destroy", mainquit)
-
-        hpaned = GtkHPaned()
-        win.add(hpaned)
-        hpaned.set_border_width(5)
-        hpaned.show()
-
-        vbox = GtkVBox()
-        hpaned.add1(vbox)
-        vbox.show()
-
-        scrolled_win = GtkScrolledWindow()
-        scrolled_win.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
-        vbox.pack_start(scrolled_win)
-        scrolled_win.show()
-
-        hbox = GtkHBox()
-        vbox.pack_end(hbox, expand = 0, padding = 5)
-        hbox.show()
-
-        label = GtkLabel("Filter:")
-        hbox.pack_start(label, expand = 0, padding = 5)
-        label.show()
-
-        self.entry = GtkEntry()
-        hbox.pack_end(self.entry, padding = 5)
-        self.entry.show()
-
-        self.entry.connect("activate", self.filter_activated)
-        
-        self.list = GtkList()
-        self.list.set_selection_mode(SELECTION_MULTIPLE)
-        self.list.set_selection_mode(SELECTION_BROWSE)
-        scrolled_win.add_with_viewport(self.list)
-        self.list.show()
-
-        self.list.connect("select_child", self.key_selected)
-
-        scrolled_win = GtkScrolledWindow()
-        scrolled_win.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
-        hpaned.add2(scrolled_win)
-        scrolled_win.set_usize(500,400)
-        scrolled_win.show()
-        
-        self.text = GtkText()
-        self.text.set_editable(FALSE)
-        scrolled_win.add_with_viewport(self.text)
-        self.text.show()
-
-        self.text.connect("event", self.event_handler)
-
-        self.menu = GtkMenu()
-        self.menu.show()
-
-        self.font = load_font("fixed")
-
-        self.update_keylist()
-
-        win.show()
-
-    # Add a key to the left hand side of the user interface
-
-    def add_key(self, key):
-        display_key = self.get_key_text(key)
-        list_item = GtkListItem(display_key)
-        list_item.set_data("raw_key", key) # Store raw key in item data
-        self.list.add(list_item)
-        list_item.show()
-
-    # Event handler registered by build_ui()
-
-    def event_handler(self, event, menu):
-        return FALSE
-
-    # Set the text to appear in the right hand side of the user interface 
-
-    def set_value_text(self, item):
-
-        # Clear old old value in text window
-
-        self.text.delete_text(0, self.text.get_length())
-        
-        if type(item) == str:
-
-            # The text widget has trouble inserting text containing NULL
-            # characters.
-            
-            item = string.replace(item, "\x00", ".")
-            
-            self.text.insert(self.font, None, None, item)
-
-        else:
-
-            # A non-text item
-            
-            self.text.insert(self.font, None, None, repr(item))
-            
-    # This function is called when a key is selected in the left hand side
-    # of the user interface.
-
-    def key_selected(self, list, list_item):
-        key = list_item.children()[0].get()
-
-        # Look for a match in the value display function list
-
-        text = self.dict[list_item.get_data("raw_key")]
-
-        for entry in self.get_value_text_fns:
-            if re.match(entry[0], key):
-                text = entry[1](text)
-                break
-
-        self.set_value_text(text)
-
-    # Refresh the key list by removing all items and re-inserting them.
-    # Items are only inserted if they pass through the filter regexp.
-
-    def update_keylist(self):
-        self.list.remove_items(self.list.children())
-        self.set_value_text("")
-        for k in self.dict.keys():
-            if re.match(self.filter_regex, k):
-                self.add_key(k)
-
-    # Invoked when the user hits return in the filter text entry widget.
-
-    def filter_activated(self, entry):
-        self.filter_regex = entry.get_text()
-        self.update_keylist()
-
-    # Register a key display function
-
-    def register_get_key_text_fn(self, fn):
-        self.get_key_text = fn
-
-    # Register a value display function
-
-    def register_get_value_text_fn(self, regexp, fn):
-        self.get_value_text_fns.append((regexp, fn))
-
-#
-# A utility function to convert a string to the standard hex + ascii format.
-# To display all values in hex do:
-#   register_get_value_text_fn("", gtkdictbrowser.hex_string)
-#
-
-def hex_string(data):
-    """Return a hex dump of a string as a string.
-
-    The output produced is in the standard 16 characters per line hex +
-    ascii format:
-
-    00000000: 40 00 00 00 00 00 00 00  40 00 00 00 01 00 04 80  @....... @.......
-    00000010: 01 01 00 00 00 00 00 01  00 00 00 00              ........ ....
-    """
-    
-    pos = 0                             # Position in data
-    line = 0                            # Line of data
-    
-    hex = ""                            # Hex display
-    ascii = ""                          # ASCII display
-
-    result = ""
-    
-    while pos < len(data):
-        
-       # Start with header
-        
-       if pos % 16 == 0:
-            hex = "%08x: " % (line * 16)
-            ascii = ""
-            
-        # Add character
-            
-       hex = hex + "%02x " % (ord(data[pos]))
-        
-        if ord(data[pos]) < 32 or ord(data[pos]) > 176:
-            ascii = ascii + '.'
-        else:
-            ascii = ascii + data[pos]
-                
-        pos = pos + 1
-            
-        # Add separator if half way
-            
-       if pos % 16 == 8:
-            hex = hex + " "
-            ascii = ascii + " "
-
-        # End of line
-
-       if pos % 16 == 0:
-            result = result + "%s %s\n" % (hex, ascii)
-            line = line + 1
-            
-    # Leftover bits
-
-    if pos % 16 != 0:
-
-        # Pad hex string
-
-        for i in range(0, (16 - (pos % 16))):
-            hex = hex + "   "
-
-        # Half way separator
-
-        if (pos % 16) < 8:
-            hex = hex + " "
-
-        result = result + "%s %s\n" % (hex, ascii)
-
-    return result
-
-# For testing purposes, create a fixed dictionary to browse with
-
-if __name__ == "__main__":
-
-    dict = {"chicken": "ham", "spam": "fun", "subdict": {"a": "b", "c": "d"}}
-
-    db = GtkDictBrowser(dict)
-
-    db.build_ui("GtkDictBrowser")
-
-    # Override Python's handling of ctrl-c so we can break out of the
-    # gui from the command line.
-
-    import signal
-    signal.signal(signal.SIGINT, signal.SIG_DFL)
-
-    mainloop()
diff --git a/source3/python/py_common.c b/source3/python/py_common.c
deleted file mode 100644 (file)
index d423099..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_common.h"
-
-/* Return a tuple of (error code, error string) from a WERROR */
-
-PyObject *py_werror_tuple(WERROR werror)
-{
-       return Py_BuildValue("[is]", W_ERROR_V(werror), 
-                            dos_errstr(werror));
-}
-
-/* Return a tuple of (error code, error string) from a WERROR */
-
-PyObject *py_ntstatus_tuple(NTSTATUS ntstatus)
-{
-       return Py_BuildValue("[is]", NT_STATUS_V(ntstatus), 
-                            nt_errstr(ntstatus));
-}
-
-/* Initialise samba client routines */
-
-static BOOL initialised;
-
-void py_samba_init(void)
-{
-       if (initialised)
-               return;
-
-       load_case_tables();
-
-       /* Load configuration file */
-
-       if (!lp_load(dyn_CONFIGFILE, True, False, False, True))
-               fprintf(stderr, "Can't load %s\n", dyn_CONFIGFILE);
-
-       /* Misc other stuff */
-
-       load_interfaces();
-       init_names();
-
-       initialised = True;
-}
-
-/* Debuglevel routines */
-
-PyObject *get_debuglevel(PyObject *self, PyObject *args)
-{
-       PyObject *debuglevel;
-
-       if (!PyArg_ParseTuple(args, ""))
-               return NULL;
-
-       debuglevel = PyInt_FromLong(DEBUGLEVEL);
-
-       return debuglevel;
-}
-
-PyObject *set_debuglevel(PyObject *self, PyObject *args)
-{
-       int debuglevel;
-
-       if (!PyArg_ParseTuple(args, "i", &debuglevel))
-               return NULL;
-
-       DEBUGLEVEL = debuglevel;
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Initialise logging */
-
-PyObject *py_setup_logging(PyObject *self, PyObject *args, PyObject *kw)
-{
-       BOOL interactive = False;
-       char *logfilename = NULL;
-       static char *kwlist[] = {"interactive", "logfilename", NULL};
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "|is", kwlist, &interactive, &logfilename))
-               return NULL;
-       
-       if (interactive && logfilename) {
-               PyErr_SetString(PyExc_RuntimeError,
-                               "can't be interactive and set log file name");
-               return NULL;
-       }
-
-       if (interactive)
-               setup_logging("spoolss", True);
-
-       if (logfilename) {
-               lp_set_logfile(logfilename);
-               setup_logging(logfilename, False);
-               reopen_logs();
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Parse credentials from a python dictionary.  The dictionary can
-   only have the keys "username", "domain" and "password".  Return
-   True for valid credentials in which case the username, domain and
-   password are set to pointers to their values from the dicationary.
-   If returns False, the errstr is set to point at some mallocated
-   memory describing the error. */
-
-BOOL py_parse_creds(PyObject *creds, char **username, char **domain, 
-                   char **password, char **errstr)
-{
-       /* Initialise anonymous credentials */
-
-       *username = "";
-       *domain = "";
-       *password = "";
-
-       if (creds && PyDict_Size(creds) > 0) {
-               PyObject *username_obj, *password_obj, *domain_obj;
-               PyObject *key, *value;
-               int i;
-
-               /* Check for presence of required fields */
-
-               username_obj = PyDict_GetItemString(creds, "username");
-               domain_obj = PyDict_GetItemString(creds, "domain");
-               password_obj = PyDict_GetItemString(creds, "password");
-
-               if (!username_obj) {
-                       *errstr = SMB_STRDUP("no username field in credential");
-                       return False;
-               }
-
-               if (!domain_obj) {
-                       *errstr = SMB_STRDUP("no domain field in credential");
-                       return False;
-               }
-
-               if (!password_obj) {
-                       *errstr = SMB_STRDUP("no password field in credential");
-                       return False;
-               }
-
-               /* Check type of required fields */
-
-               if (!PyString_Check(username_obj)) {
-                       *errstr = SMB_STRDUP("username field is not string type");
-                       return False;
-               }
-
-               if (!PyString_Check(domain_obj)) {
-                       *errstr = SMB_STRDUP("domain field is not string type");
-                       return False;
-               }
-
-               if (!PyString_Check(password_obj)) {
-                       *errstr = SMB_STRDUP("password field is not string type");
-                       return False;
-               }
-
-               /* Look for any extra fields */
-
-               i = 0;
-
-               while (PyDict_Next(creds, &i, &key, &value)) {
-                       if (strcmp(PyString_AsString(key), "domain") != 0 &&
-                           strcmp(PyString_AsString(key), "username") != 0 &&
-                           strcmp(PyString_AsString(key), "password") != 0) {
-                               asprintf(errstr,
-                                        "creds contain extra field '%s'",
-                                        PyString_AsString(key));
-                               return False;
-                       }
-               }
-
-               /* Assign values */
-
-               *username = PyString_AsString(username_obj);
-               *domain = PyString_AsString(domain_obj);
-               *password = PyString_AsString(password_obj);
-       }
-
-       *errstr = NULL;
-
-       return True;
-}
-
-/* Return a cli_state to a RPC pipe on the given server.  Use the
-   credentials passed if not NULL.  If an error occurs errstr is set to a
-   string describing the error and NULL is returned.  If set, errstr must
-   be freed by calling free(). */
-
-struct cli_state *open_pipe_creds(char *server, PyObject *creds, 
-                                 int pipe_idx, char **errstr)
-{
-       char *username, *password, *domain;
-       struct cli_state *cli;
-       struct rpc_pipe_client *pipe_hnd;
-       NTSTATUS result;
-       
-       /* Extract credentials from the python dictionary */
-
-       if (!py_parse_creds(creds, &username, &domain, &password, errstr))
-               return NULL;
-
-       /* Now try to connect */
-
-       result = cli_full_connection(
-               &cli, NULL, server, NULL, 0, "IPC$", "IPC",
-               username, domain, password, 0, Undefined, NULL);
-       
-       if (!NT_STATUS_IS_OK(result)) {
-               *errstr = SMB_STRDUP("error connecting to IPC$ pipe");
-               return NULL;
-       }
-
-       pipe_hnd = cli_rpc_pipe_open_noauth(cli, pipe_idx, &result);
-       if (!pipe_hnd) {
-               cli_shutdown(cli);
-               asprintf(errstr, "error opening pipe index %d", pipe_idx);
-               return NULL;
-       }
-
-       *errstr = NULL;
-
-       return cli;
-}
-
-/* Return true if a dictionary contains a "level" key with an integer
-   value.  Set the value if so. */
-
-BOOL get_level_value(PyObject *dict, uint32 *level)
-{
-       PyObject *obj;
-
-       if (!(obj = PyDict_GetItemString(dict, "level")) ||
-           !PyInt_Check(obj))
-               return False;
-
-       if (level)
-               *level = PyInt_AsLong(obj);
-
-       return True;
-}
diff --git a/source3/python/py_common.h b/source3/python/py_common.h
deleted file mode 100644 (file)
index 04a8f61..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002-2003
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_COMMON_H
-#define _PY_COMMON_H
-
-#include "includes.h"
-
-/* This symbol is used in both includes.h and Python.h which causes an
-   annoying compiler warning. */
-
-#ifdef HAVE_FSTAT
-#undef HAVE_FSTAT
-#endif
-
-#include "Python.h"
-
-/* The following definitions come from python/py_common.c  */
-
-PyObject *py_werror_tuple(WERROR werror);
-PyObject *py_ntstatus_tuple(NTSTATUS ntstatus);
-void py_samba_init(void);
-PyObject *get_debuglevel(PyObject *self, PyObject *args);
-PyObject *set_debuglevel(PyObject *self, PyObject *args);
-PyObject *py_setup_logging(PyObject *self, PyObject *args, PyObject *kw);
-BOOL py_parse_creds(PyObject *creds, char **username, char **domain, 
-                   char **password, char **errstr);
-struct cli_state *open_pipe_creds(char *server, PyObject *creds, 
-                                 int pipe_idx, char **errstr);
-BOOL get_level_value(PyObject *dict, uint32 *level);
-
-/* The following definitions come from python/py_ntsec.c  */
-
-BOOL py_from_SID(PyObject **obj, DOM_SID *sid);
-BOOL py_to_SID(DOM_SID *sid, PyObject *obj);
-BOOL py_from_ACE(PyObject **dict, SEC_ACE *ace);
-BOOL py_to_ACE(SEC_ACE *ace, PyObject *dict);
-BOOL py_from_ACL(PyObject **dict, SEC_ACL *acl);
-BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict, TALLOC_CTX *mem_ctx);
-BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd);
-BOOL py_to_SECDESC(SEC_DESC **sd, PyObject *dict, TALLOC_CTX *mem_ctx);
-
-#endif /*  _PY_COMMON_H  */
diff --git a/source3/python/py_conv.c b/source3/python/py_conv.c
deleted file mode 100644 (file)
index 13d9ef9..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "py_conv.h"
-
-/* Helper for rpcstr_pull() function */
-
-static void fstr_pull(fstring str, UNISTR *uni)
-{
-       rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
-}
-
-static void fstr_pull2(fstring str, UNISTR2 *uni)
-{
-       rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
-}
-
-/* Convert a structure to a Python dict */
-
-PyObject *from_struct(void *s, struct pyconv *conv)
-{
-       PyObject *obj, *item;
-       int i;
-
-       obj = PyDict_New();
-
-       for (i = 0; conv[i].name; i++) {
-               switch (conv[i].type) {
-               case PY_UNISTR: {
-                       UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
-                       fstring str = "";
-
-                       if (u->buffer)
-                               fstr_pull(str, u);
-
-                       item = PyString_FromString(str);
-                       PyDict_SetItemString(obj, conv[i].name, item);
-
-                       break;
-               }
-               case PY_UNISTR2: {
-                       UNISTR2 *u = (UNISTR2 *)((char *)s + conv[i].offset);
-                       fstring str = "";
-
-                       if (u->buffer)
-                               fstr_pull2(str, u);
-
-                       item = PyString_FromString(str);
-                       PyDict_SetItemString(obj, conv[i].name, item);
-
-                       break;
-               }
-               case PY_UINT32: {
-                       uint32 *u = (uint32 *)((char *)s + conv[i].offset);
-
-                       item = PyInt_FromLong(*u);
-                       PyDict_SetItemString(obj, conv[i].name, item);
-                       
-                       break;
-               }
-               case PY_UINT16: {
-                       uint16 *u = (uint16 *)((char *)s + conv[i].offset);
-
-                       item = PyInt_FromLong(*u);
-                       PyDict_SetItemString(obj, conv[i].name, item);
-
-                       break;
-               }
-               case PY_STRING: {
-                       char *str = (char *)s + conv[i].offset;
-
-                       item = PyString_FromString(str);
-                       PyDict_SetItemString(obj, conv[i].name, item);
-
-                       break;
-               }
-               case PY_UID: {
-                       uid_t *uid = (uid_t *)((char *)s + conv[i].offset);
-
-                       item = PyInt_FromLong(*uid);
-                       PyDict_SetItemString(obj, conv[i].name, item);
-
-                       break;
-               }
-               case PY_GID: {
-                       gid_t *gid = (gid_t *)((char *)s + conv[i].offset);
-
-                       item = PyInt_FromLong(*gid);
-                       PyDict_SetItemString(obj, conv[i].name, item);
-
-                       break;
-               }
-               default:
-                       
-                       break;
-               }
-       }
-
-       return obj;
-}
-
-/* Convert a Python dict to a structure */
-
-BOOL to_struct(void *s, PyObject *dict, struct pyconv *conv)
-{
-       PyObject *visited, *key, *value;
-       BOOL result = False;
-       int i;
-
-       visited = PyDict_New();
-
-       for (i = 0; conv[i].name; i++) {
-               PyObject *obj;
-               
-               obj = PyDict_GetItemString(dict, conv[i].name);
-
-               if (!obj)
-                       goto done;
-               
-               switch (conv[i].type) {
-               case PY_UNISTR: {
-                       UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
-                       char *str = "";
-
-                       if (!PyString_Check(obj))
-                               goto done;
-
-                       str = PyString_AsString(obj);
-                       init_unistr(u, str);
-                       
-                       break;
-               }
-               case PY_UINT32: {
-                       uint32 *u = (uint32 *)((char *)s + conv[i].offset);
-
-                       if (!PyInt_Check(obj))
-                               goto done;
-
-                       *u = PyInt_AsLong(obj);
-
-                       break;
-               }
-               case PY_UINT16: {
-                       uint16 *u = (uint16 *)((char *)s + conv[i].offset);
-
-                       if (!PyInt_Check(obj)) 
-                               goto done;
-
-                       *u = PyInt_AsLong(obj);
-                       break;
-               }
-               default:
-                       break;
-               }
-
-               /* Mark as visited */
-
-               PyDict_SetItemString(visited, conv[i].name, 
-                                    PyInt_FromLong(1));
-       }
-
-       /* Iterate over each item in the input dictionary and see if it was
-          visited.  If it wasn't then the user has added some extra crap
-          to the dictionary. */
-
-       i = 0;
-
-       while (PyDict_Next(dict, &i, &key, &value)) {
-               if (!PyDict_GetItem(visited, key))
-                       goto done;
-       }
-
-       result = True;
-
-done:
-       /* We must decrement the reference count here or the visited
-          dictionary will not be freed. */
-              
-       Py_DECREF(visited);
-
-       return result;
-}
-
-/* Convert a NULL terminated list of NULL terminated unicode strings
-   to a list of (char *) strings */
-
-PyObject *from_unistr_list(uint16 *dependentfiles)
-{
-       PyObject *list;
-       int offset = 0;
-
-       list = PyList_New(0);
-
-       while (*(dependentfiles + offset) != 0) {
-               fstring name;
-               int len;
-
-               len = rpcstr_pull(name, dependentfiles + offset,
-                                 sizeof(fstring), -1, STR_TERMINATE);
-
-               offset += len / 2;
-               PyList_Append(list, PyString_FromString(name));
-       }
-
-       return list;
-}
diff --git a/source3/python/py_conv.h b/source3/python/py_conv.h
deleted file mode 100644 (file)
index c4baa84..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_CONV_H
-#define _PY_CONV_H
-
-#include "python/py_common.h"
-
-enum pyconv_types { PY_UNISTR, PY_UNISTR2, PY_UINT32, PY_UINT16, PY_STRING, 
-                   PY_UID, PY_GID };
-
-struct pyconv {
-       char *name;             /* Name of member */
-       enum pyconv_types type; /* Type */
-       size_t offset;          /* Offset into structure */
-};
-
-PyObject *from_struct(void *s, struct pyconv *conv);
-BOOL to_struct(void *s, PyObject *dict, struct pyconv *conv);
-PyObject *from_unistr_list(uint16 *dependentfiles);
-
-/* Another version of offsetof (-: */
-
-#undef offsetof
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-
-#endif /* _PY_CONV_H */
diff --git a/source3/python/py_lsa.c b/source3/python/py_lsa.c
deleted file mode 100644 (file)
index 6095fdf..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_lsa.h"
-
-PyObject *new_lsa_policy_hnd_object(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                                   POLICY_HND *pol)
-{
-       lsa_policy_hnd_object *o;
-
-       o = PyObject_New(lsa_policy_hnd_object, &lsa_policy_hnd_type);
-
-       o->cli = cli;
-       o->mem_ctx = mem_ctx;
-       memcpy(&o->pol, pol, sizeof(POLICY_HND));
-
-       return (PyObject*)o;
-}
-
-/* 
- * Exceptions raised by this module 
- */
-
-PyObject *lsa_error;           /* This indicates a non-RPC related error
-                                  such as name lookup failure */
-
-PyObject *lsa_ntstatus;                /* This exception is raised when a RPC call
-                                  returns a status code other than
-                                  NT_STATUS_OK */
-
-/*
- * Open/close lsa handles
- */
-
-static PyObject *lsa_open_policy(PyObject *self, PyObject *args, 
-                               PyObject *kw) 
-{
-       static char *kwlist[] = { "servername", "creds", "access", NULL };
-       char *server, *errstr;
-       PyObject *creds = NULL, *result = NULL;
-       uint32 desired_access = GENERIC_EXECUTE_ACCESS;
-       struct cli_state *cli = NULL;
-       NTSTATUS ntstatus;
-       TALLOC_CTX *mem_ctx = NULL;
-       POLICY_HND hnd;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|Oi", kwlist, &server, &creds, &desired_access))
-               return NULL;
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       if (server[0] != '\\' || server[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server += 2;
-
-       if (!(cli = open_pipe_creds(server, creds, PI_LSARPC, &errstr))) {
-               PyErr_SetString(lsa_error, errstr);
-               free(errstr);
-               return NULL;
-       }
-
-       if (!(mem_ctx = talloc_init("lsa_open_policy"))) {
-               PyErr_SetString(lsa_error, "unable to init talloc context\n");
-               goto done;
-       }
-
-       ntstatus = rpccli_lsa_open_policy(
-               cli->pipe_list, mem_ctx, True, desired_access, &hnd);
-
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               PyErr_SetObject(lsa_ntstatus, py_ntstatus_tuple(ntstatus));
-               goto done;
-       }
-
-       result = new_lsa_policy_hnd_object(cli->pipe_list, mem_ctx, &hnd);
-
-done:
-       if (!result) {
-               if (cli)
-                       cli_shutdown(cli);
-
-               talloc_destroy(mem_ctx);
-       }
-
-       return result;
-}
-
-static PyObject *lsa_close(PyObject *self, PyObject *args, PyObject *kw) 
-{
-       PyObject *po;
-       lsa_policy_hnd_object *hnd;
-       NTSTATUS result;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTuple(args, "O!", &lsa_policy_hnd_type, &po))
-               return NULL;
-
-       hnd = (lsa_policy_hnd_object *)po;
-
-       /* Call rpc function */
-
-       result = rpccli_lsa_Close(hnd->cli, hnd->mem_ctx, &hnd->pol);
-
-       /* Cleanup samba stuff */
-
-       cli_shutdown(hnd->cli);
-       talloc_destroy(hnd->mem_ctx);
-
-       /* Return value */
-
-       Py_INCREF(Py_None);
-       return Py_None; 
-}
-
-static PyObject *lsa_lookup_names(PyObject *self, PyObject *args)
-{
-       PyObject *py_names, *result = NULL;
-       NTSTATUS ntstatus;
-       lsa_policy_hnd_object *hnd = (lsa_policy_hnd_object *)self;
-       int num_names, i;
-       const char **names;
-       DOM_SID *sids;
-       TALLOC_CTX *mem_ctx = NULL;
-       enum lsa_SidType *name_types;
-
-       if (!PyArg_ParseTuple(args, "O", &py_names))
-               return NULL;
-
-       if (!PyList_Check(py_names) && !PyString_Check(py_names)) {
-               PyErr_SetString(PyExc_TypeError, "must be list or string");
-               return NULL;
-       }
-
-       if (!(mem_ctx = talloc_init("lsa_lookup_names"))) {
-               PyErr_SetString(lsa_error, "unable to init talloc context\n");
-               goto done;
-       }
-
-       if (PyList_Check(py_names)) {
-
-               /* Convert list to char ** array */
-
-               num_names = PyList_Size(py_names);
-               names = (const char **)_talloc(mem_ctx, num_names * sizeof(char *));
-               
-               for (i = 0; i < num_names; i++) {
-                       PyObject *obj = PyList_GetItem(py_names, i);
-                       
-                       names[i] = talloc_strdup(mem_ctx, PyString_AsString(obj));
-               }
-
-       } else {
-
-               /* Just a single element */
-
-               num_names = 1;
-               names = (const char **)_talloc(mem_ctx, sizeof(char *));
-
-               names[0] = PyString_AsString(py_names);
-       }
-
-       ntstatus = rpccli_lsa_lookup_names(
-               hnd->cli, mem_ctx, &hnd->pol, num_names, names, 
-               NULL, 1, &sids, &name_types);
-
-       if (!NT_STATUS_IS_OK(ntstatus) && NT_STATUS_V(ntstatus) != 0x107) {
-               PyErr_SetObject(lsa_ntstatus, py_ntstatus_tuple(ntstatus));
-               goto done;
-       }
-
-       result = PyList_New(num_names);
-
-       for (i = 0; i < num_names; i++) {
-               PyObject *sid_obj, *obj;
-
-               py_from_SID(&sid_obj, &sids[i]);
-
-               obj = Py_BuildValue("(Ni)", sid_obj, name_types[i]);
-
-               PyList_SetItem(result, i, obj);
-       }
-
- done:
-       talloc_destroy(mem_ctx);
-       
-       return result;
-}
-
-static PyObject *lsa_lookup_sids(PyObject *self, PyObject *args, 
-                                PyObject *kw) 
-{
-       PyObject *py_sids, *result = NULL;
-       NTSTATUS ntstatus;
-       int num_sids, i;
-       char **domains, **names;
-       uint32 *types;
-       lsa_policy_hnd_object *hnd = (lsa_policy_hnd_object *)self;
-       TALLOC_CTX *mem_ctx = NULL;
-       DOM_SID *sids;
-
-       if (!PyArg_ParseTuple(args, "O", &py_sids))
-               return NULL;
-
-       if (!PyList_Check(py_sids) && !PyString_Check(py_sids)) {
-               PyErr_SetString(PyExc_TypeError, "must be list or string");
-               return NULL;
-       }
-
-       if (!(mem_ctx = talloc_init("lsa_lookup_sids"))) {
-               PyErr_SetString(lsa_error, "unable to init talloc context\n");
-               goto done;
-       }
-
-       if (PyList_Check(py_sids)) {
-
-               /* Convert dictionary to char ** array */
-               
-               num_sids = PyList_Size(py_sids);
-               sids = (DOM_SID *)_talloc(mem_ctx, num_sids * sizeof(DOM_SID));
-               
-               memset(sids, 0, num_sids * sizeof(DOM_SID));
-               
-               for (i = 0; i < num_sids; i++) {
-                       PyObject *obj = PyList_GetItem(py_sids, i);
-                       
-                       if (!string_to_sid(&sids[i], PyString_AsString(obj))) {
-                               PyErr_SetString(PyExc_ValueError, "string_to_sid failed");
-                               goto done;
-                       }
-               }
-
-       } else {
-
-               /* Just a single element */
-
-               num_sids = 1;
-               sids = (DOM_SID *)_talloc(mem_ctx, sizeof(DOM_SID));
-
-               if (!string_to_sid(&sids[0], PyString_AsString(py_sids))) {
-                       PyErr_SetString(PyExc_ValueError, "string_to_sid failed");
-                       goto done;
-               }
-       }
-
-       ntstatus = rpccli_lsa_lookup_sids(
-               hnd->cli, mem_ctx, &hnd->pol, num_sids, sids, &domains, 
-               &names, &types);
-
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               PyErr_SetObject(lsa_ntstatus, py_ntstatus_tuple(ntstatus));
-               goto done;
-       }
-
-       result = PyList_New(num_sids);
-
-       for (i = 0; i < num_sids; i++) {
-               PyObject *obj;
-
-               obj = Py_BuildValue("{sssssi}", "username", names[i],
-                                   "domain", domains[i], "name_type", 
-                                   types[i]);
-
-               PyList_SetItem(result, i, obj);
-       }
-
- done:
-       talloc_destroy(mem_ctx);
-
-       return result;
-}
-
-static PyObject *lsa_enum_trust_dom(PyObject *self, PyObject *args)
-{
-       lsa_policy_hnd_object *hnd = (lsa_policy_hnd_object *)self;
-       NTSTATUS ntstatus;
-       uint32 enum_ctx = 0, num_domains, i;
-       char **domain_names;
-       DOM_SID *domain_sids;
-       PyObject *result;
-
-       if (!PyArg_ParseTuple(args, ""))
-               return NULL;
-       
-       ntstatus = rpccli_lsa_enum_trust_dom(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, &enum_ctx,
-               &num_domains, &domain_names, &domain_sids);
-
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               PyErr_SetObject(lsa_ntstatus, py_ntstatus_tuple(ntstatus));
-               return NULL;
-       }
-
-       result = PyList_New(num_domains);
-
-       for (i = 0; i < num_domains; i++) {
-               fstring sid_str;
-
-               sid_to_string(sid_str, &domain_sids[i]);
-               PyList_SetItem(
-                       result, i, 
-                       Py_BuildValue("(ss)", domain_names[i], sid_str));
-       }
-
-       return result;
-}
-
-/*
- * Method dispatch tables
- */
-
-static PyMethodDef lsa_hnd_methods[] = {
-
-       /* SIDs<->names */
-
-       { "lookup_sids", (PyCFunction)lsa_lookup_sids, 
-         METH_VARARGS | METH_KEYWORDS,
-         "Convert sids to names." },
-
-       { "lookup_names", (PyCFunction)lsa_lookup_names, 
-         METH_VARARGS | METH_KEYWORDS,
-         "Convert names to sids." },
-
-       /* Trusted domains */
-
-       { "enum_trusted_domains", (PyCFunction)lsa_enum_trust_dom, 
-         METH_VARARGS, 
-         "Enumerate trusted domains." },
-
-       { NULL }
-};
-
-static void py_lsa_policy_hnd_dealloc(PyObject* self)
-{
-       PyObject_Del(self);
-}
-
-static PyObject *py_lsa_policy_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(lsa_hnd_methods, self, attrname);
-}
-
-PyTypeObject lsa_policy_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "LSA Policy Handle",
-       sizeof(lsa_policy_hnd_object),
-       0,
-       py_lsa_policy_hnd_dealloc, /*tp_dealloc*/
-       0,          /*tp_print*/
-       py_lsa_policy_hnd_getattr,          /*tp_getattr*/
-       0,          /*tp_setattr*/
-       0,          /*tp_compare*/
-       0,          /*tp_repr*/
-       0,          /*tp_as_number*/
-       0,          /*tp_as_sequence*/
-       0,          /*tp_as_mapping*/
-       0,          /*tp_hash */
-};
-
-static PyMethodDef lsa_methods[] = {
-
-       /* Open/close lsa handles */
-       
-       { "open_policy", (PyCFunction)lsa_open_policy, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Open a policy handle" },
-       
-       { "close", (PyCFunction)lsa_close, 
-         METH_VARARGS, 
-         "Close a policy handle" },
-
-       /* Other stuff - this should really go into a samba config module
-          but for the moment let's leave it here. */
-
-       { "setup_logging", (PyCFunction)py_setup_logging, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Set up debug logging.\n"
-"\n"
-"Initialises Samba's debug logging system.  One argument is expected which\n"
-"is a boolean specifying whether debugging is interactive and sent to stdout\n"
-"or logged to a file.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> lsa.setup_logging(interactive = 1)" },
-
-       { "get_debuglevel", (PyCFunction)get_debuglevel, 
-         METH_VARARGS, 
-         "Set the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> lsa.get_debuglevel()\n"
-"0" },
-
-       { "set_debuglevel", (PyCFunction)set_debuglevel, 
-         METH_VARARGS, 
-         "Get the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> lsa.set_debuglevel(10)" },
-
-       { NULL }
-};
-
-static struct const_vals {
-       char *name;
-       uint32 value;
-} module_const_vals[] = {
-       { NULL }
-};
-
-static void const_init(PyObject *dict)
-{
-       struct const_vals *tmp;
-       PyObject *obj;
-
-       for (tmp = module_const_vals; tmp->name; tmp++) {
-               obj = PyInt_FromLong(tmp->value);
-               PyDict_SetItemString(dict, tmp->name, obj);
-               Py_DECREF(obj);
-       }
-}
-
-/*
- * Module initialisation 
- */
-
-void initlsa(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-       module = Py_InitModule("lsa", lsa_methods);
-       dict = PyModule_GetDict(module);
-
-       lsa_error = PyErr_NewException("lsa.error", NULL, NULL);
-       PyDict_SetItemString(dict, "error", lsa_error);
-
-       lsa_ntstatus = PyErr_NewException("lsa.ntstatus", NULL, NULL);
-       PyDict_SetItemString(dict, "ntstatus", lsa_ntstatus);
-
-       /* Initialise policy handle object */
-
-       lsa_policy_hnd_type.ob_type = &PyType_Type;
-
-       /* Initialise constants */
-
-       const_init(dict);
-
-       /* Do samba initialisation */
-
-       py_samba_init();
-
-       setup_logging("lsa", True);
-       DEBUGLEVEL = 10;
-}
diff --git a/source3/python/py_lsa.h b/source3/python/py_lsa.h
deleted file mode 100644 (file)
index 27e4802..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_LSA_H
-#define _PY_LSA_H
-
-#include "python/py_common.h"
-
-/* LSA policy handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct rpc_pipe_client *cli;
-       TALLOC_CTX *mem_ctx;
-       POLICY_HND pol;
-} lsa_policy_hnd_object;
-     
-/* Exceptions raised by this module */
-
-extern PyTypeObject lsa_policy_hnd_type;
-
-extern PyObject *lsa_error;
-
-#endif /* _PY_LSA_H */
diff --git a/source3/python/py_ntsec.c b/source3/python/py_ntsec.c
deleted file mode 100644 (file)
index 6cd59ae..0000000
+++ /dev/null
@@ -1,298 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_common.h"
-
-/* Convert a SID to a Python dict */
-
-BOOL py_from_SID(PyObject **obj, DOM_SID *sid)
-{
-       fstring sidstr;
-
-       if (!sid) {
-               Py_INCREF(Py_None);
-               *obj = Py_None;
-               return True;
-       }
-
-       if (!sid_to_string(sidstr, sid))
-               return False;
-
-       *obj = PyString_FromString(sidstr);
-
-       return True;
-}
-
-BOOL py_to_SID(DOM_SID *sid, PyObject *obj)
-{
-       if (!PyString_Check(obj))
-               return False;
-
-       return string_to_sid(sid, PyString_AsString(obj));
-}
-
-BOOL py_from_ACE(PyObject **dict, SEC_ACE *ace)
-{
-       PyObject *obj;
-
-       if (!ace) {
-               Py_INCREF(Py_None);
-               *dict = Py_None;
-               return True;
-       }
-
-       *dict = Py_BuildValue("{sisisi}", "type", ace->type,
-                               "flags", ace->flags,
-                               "mask", ace->access_mask);
-
-       if (py_from_SID(&obj, &ace->trustee)) {
-               PyDict_SetItemString(*dict, "trustee", obj);
-               Py_DECREF(obj);
-       }
-
-       return True;
-}
-
-BOOL py_to_ACE(SEC_ACE *ace, PyObject *dict)
-{
-       PyObject *obj;
-       uint8 ace_type, ace_flags;
-       DOM_SID trustee;
-       SEC_ACCESS sec_access;
-
-       if (!PyDict_Check(dict))
-               return False;
-
-       if (!(obj = PyDict_GetItemString(dict, "type")) ||
-           !PyInt_Check(obj))
-               return False;
-
-       ace_type = PyInt_AsLong(obj);
-
-       if (!(obj = PyDict_GetItemString(dict, "flags")) ||
-           !PyInt_Check(obj))
-               return False;
-
-       ace_flags = PyInt_AsLong(obj);
-
-       if (!(obj = PyDict_GetItemString(dict, "trustee")) ||
-           !PyString_Check(obj))
-               return False;
-
-       if (!py_to_SID(&trustee, obj))
-               return False;
-
-       if (!(obj = PyDict_GetItemString(dict, "mask")) ||
-           !PyInt_Check(obj))
-               return False;
-
-       sec_access = PyInt_AsLong(obj);
-
-       init_sec_ace(ace, &trustee, ace_type, sec_access, ace_flags);
-
-       /* Fill in size field */
-
-       ace->size = SEC_ACE_HEADER_SIZE + sid_size(&trustee);
-
-       return True;
-}
-
-BOOL py_from_ACL(PyObject **dict, SEC_ACL *acl)
-{
-       PyObject *ace_list;
-       int i;
-
-       if (!acl) {
-               Py_INCREF(Py_None);
-               *dict = Py_None;
-               return True;
-       }
-
-       ace_list = PyList_New(acl->num_aces);
-
-       for (i = 0; i < acl->num_aces; i++) {
-               PyObject *obj;
-
-               if (py_from_ACE(&obj, &acl->aces[i]))
-                       PyList_SetItem(ace_list, i, obj);
-       }
-
-       *dict = Py_BuildValue("{sisN}", "revision", acl->revision,
-                       "ace_list", ace_list);
-
-       return True;
-}
-
-BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict, TALLOC_CTX *mem_ctx)
-{
-       PyObject *obj;
-       uint32 i;
-
-       if (!(obj = PyDict_GetItemString(dict, "revision")) ||
-           !PyInt_Check(obj))
-               return False;
-
-       acl->revision = PyInt_AsLong(obj);
-
-       if (!(obj = PyDict_GetItemString(dict, "ace_list")) ||
-           !PyList_Check(obj)) 
-               return False;
-       
-       acl->num_aces = PyList_Size(obj);
-
-       acl->aces = TALLOC_ARRAY(mem_ctx, struct security_ace, acl->num_aces);
-       acl->size = SEC_ACL_HEADER_SIZE;
-
-       for (i = 0; i < acl->num_aces; i++) {
-               PyObject *py_ace = PyList_GetItem(obj, i);
-
-               if (!py_to_ACE(&acl->aces[i], py_ace))
-                       return False;
-
-               acl->size += acl->aces[i].size;
-       }
-
-       return True;
-}
-
-BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd)
-{
-       PyObject *obj;
-
-       *dict = PyDict_New();
-
-       obj = PyInt_FromLong(sd->revision);
-       PyDict_SetItemString(*dict, "revision", obj);
-       Py_DECREF(obj);
-
-       obj = PyInt_FromLong(sd->type);
-       PyDict_SetItemString(*dict, "type", obj);
-       Py_DECREF(obj);
-
-       if (py_from_SID(&obj, sd->owner_sid)) {
-               PyDict_SetItemString(*dict, "owner_sid", obj);
-               Py_DECREF(obj);
-       }
-
-       if (py_from_SID(&obj, sd->group_sid)) {
-               PyDict_SetItemString(*dict, "group_sid", obj);
-               Py_DECREF(obj);
-       }
-
-       if (py_from_ACL(&obj, sd->dacl)) {
-               PyDict_SetItemString(*dict, "dacl", obj);
-               Py_DECREF(obj);
-       }
-
-       if (py_from_ACL(&obj, sd->sacl)) {
-               PyDict_SetItemString(*dict, "sacl", obj);
-               Py_DECREF(obj);
-       }
-
-       return True;
-}
-
-BOOL py_to_SECDESC(SEC_DESC **sd, PyObject *dict, TALLOC_CTX *mem_ctx)
-{
-       PyObject *obj;
-       uint16 revision;
-       uint16 type = SEC_DESC_SELF_RELATIVE;
-       DOM_SID owner_sid, group_sid;
-       SEC_ACL sacl, dacl;
-       BOOL got_dacl = False, got_sacl = False;
-       BOOL got_owner_sid = False, got_group_sid = False;
-
-       ZERO_STRUCT(dacl); ZERO_STRUCT(sacl);
-       ZERO_STRUCT(owner_sid); ZERO_STRUCT(group_sid);
-
-       if (!(obj = PyDict_GetItemString(dict, "revision")))
-               return False;
-
-       revision = PyInt_AsLong(obj);
-
-       if ((obj = PyDict_GetItemString(dict, "type"))) {
-               if (obj != Py_None) {
-                       type = PyInt_AsLong(obj);
-               }
-       }
-
-       if ((obj = PyDict_GetItemString(dict, "owner_sid"))) {
-
-               if (obj != Py_None) {
-
-                       if (!py_to_SID(&owner_sid, obj))
-                               return False;
-
-                       got_owner_sid = True;
-               }
-       }
-
-       if ((obj = PyDict_GetItemString(dict, "group_sid"))) {
-
-               if (obj != Py_None) {
-
-                       if (!py_to_SID(&group_sid, obj))
-                               return False;
-                       
-                       got_group_sid = True;
-               }
-       }
-
-       if ((obj = PyDict_GetItemString(dict, "dacl"))) {
-
-               if (obj != Py_None) {
-
-                       if (!py_to_ACL(&dacl, obj, mem_ctx))
-                               return False;
-                       
-                       got_dacl = True;
-               }
-       }
-
-       if ((obj = PyDict_GetItemString(dict, "sacl"))) {
-
-               if (obj != Py_None) {
-
-                       if (!py_to_ACL(&sacl, obj, mem_ctx))
-                               return False;
-
-                       got_sacl = True;
-               }
-       }
-
-#if 0                          /* For new secdesc code */
-       *sd = make_sec_desc(mem_ctx, revision, 
-                           got_owner_sid ? &owner_sid : NULL, 
-                           got_group_sid ? &group_sid : NULL,
-                           got_sacl ? &sacl : NULL, 
-                           got_dacl ? &dacl : NULL);
-#else
-       {
-               size_t sd_size;
-
-               *sd = make_sec_desc(mem_ctx, revision, type,
-                           got_owner_sid ? &owner_sid : NULL, 
-                           got_group_sid ? &group_sid : NULL,
-                           got_sacl ? &sacl : NULL, 
-                           got_dacl ? &dacl : NULL, &sd_size);
-       }
-#endif
-
-       return True;
-}
diff --git a/source3/python/py_samr.c b/source3/python/py_samr.c
deleted file mode 100644 (file)
index 8f42e87..0000000
+++ /dev/null
@@ -1,675 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_samr.h"
-
-/* 
- * Exceptions raised by this module 
- */
-
-PyObject *samr_error;          /* This indicates a non-RPC related error
-                                  such as name lookup failure */
-
-PyObject *samr_ntstatus;       /* This exception is raised when a RPC call
-                                  returns a status code other than
-                                  NT_STATUS_OK */
-
-/* SAMR group handle object */
-
-static void py_samr_group_hnd_dealloc(PyObject* self)
-{
-       PyObject_Del(self);
-}
-
-static PyMethodDef samr_group_methods[] = {
-       { NULL }
-};
-
-static PyObject *py_samr_group_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(samr_group_methods, self, attrname);
-}
-
-PyTypeObject samr_group_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "SAMR Group Handle",
-       sizeof(samr_group_hnd_object),
-       0,
-       py_samr_group_hnd_dealloc, /*tp_dealloc*/
-       0,          /*tp_print*/
-       py_samr_group_hnd_getattr,          /*tp_getattr*/
-       0,          /*tp_setattr*/
-       0,          /*tp_compare*/
-       0,          /*tp_repr*/
-       0,          /*tp_as_number*/
-       0,          /*tp_as_sequence*/
-       0,          /*tp_as_mapping*/
-       0,          /*tp_hash */
-};
-
-PyObject *new_samr_group_hnd_object(struct cli_state *cli, TALLOC_CTX *mem_ctx,
-                                     POLICY_HND *pol)
-{
-       samr_group_hnd_object *o;
-
-       o = PyObject_New(samr_group_hnd_object, &samr_group_hnd_type);
-
-       o->cli = cli;
-       o->mem_ctx = mem_ctx;
-       memcpy(&o->group_pol, pol, sizeof(POLICY_HND));
-
-       return (PyObject*)o;
-}
-
-/* Alias handle object */
-
-static void py_samr_alias_hnd_dealloc(PyObject* self)
-{
-       PyObject_Del(self);
-}
-
-static PyMethodDef samr_alias_methods[] = {
-       { NULL }
-};
-
-static PyObject *py_samr_alias_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(samr_alias_methods, self, attrname);
-}
-
-PyTypeObject samr_alias_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "SAMR Alias Handle",
-       sizeof(samr_alias_hnd_object),
-       0,
-       py_samr_alias_hnd_dealloc, /*tp_dealloc*/
-       0,          /*tp_print*/
-       py_samr_alias_hnd_getattr,          /*tp_getattr*/
-       0,          /*tp_setattr*/
-       0,          /*tp_compare*/
-       0,          /*tp_repr*/
-       0,          /*tp_as_number*/
-       0,          /*tp_as_sequence*/
-       0,          /*tp_as_mapping*/
-       0,          /*tp_hash */
-};
-
-PyObject *new_samr_alias_hnd_object(struct cli_state *cli, TALLOC_CTX *mem_ctx,
-                                     POLICY_HND *pol)
-{
-       samr_alias_hnd_object *o;
-
-       o = PyObject_New(samr_alias_hnd_object, &samr_alias_hnd_type);
-
-       o->cli = cli;
-       o->mem_ctx = mem_ctx;
-       memcpy(&o->alias_pol, pol, sizeof(POLICY_HND));
-
-       return (PyObject*)o;
-}
-
-/* SAMR user handle object */
-
-static void py_samr_user_hnd_dealloc(PyObject* self)
-{
-       PyObject_Del(self);
-}
-
-static PyObject *samr_set_user_info2(PyObject *self, PyObject *args, 
-                                    PyObject *kw)
-{
-       samr_user_hnd_object *user_hnd = (samr_user_hnd_object *)self;
-       static char *kwlist[] = { "dict", NULL };
-       PyObject *info, *result = NULL;
-       SAM_USERINFO_CTR ctr;
-       TALLOC_CTX *mem_ctx;
-       uchar sess_key[16];
-       NTSTATUS ntstatus;
-       int level;
-       union {
-               SAM_USER_INFO_16 id16;
-               SAM_USER_INFO_21 id21;
-       } pinfo;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyDict_Type, &info))
-               return NULL;
-
-       if (!get_level_value(info, &level)) {
-               PyErr_SetString(samr_error, "invalid info level");
-               return NULL;
-       }       
-
-       ZERO_STRUCT(ctr);
-
-       ctr.switch_value = level;
-
-       switch(level) {
-       case 16:
-               ctr.info.id16 = &pinfo.id16;
-               
-               if (!py_to_SAM_USER_INFO_16(ctr.info.id16, info)) {
-                       PyErr_SetString(
-                               samr_error, "error converting user info");
-                       goto done;
-               }
-               
-               break;
-       case 21:
-               ctr.info.id21 = &pinfo.id21;
-
-               if (!py_to_SAM_USER_INFO_21(ctr.info.id21, info)) {
-                       PyErr_SetString(
-                               samr_error, "error converting user info");
-                       goto done;
-               }
-
-               break;
-       default:
-               PyErr_SetString(samr_error, "unsupported info level");
-               goto done;
-       }
-
-       /* Call RPC function */
-
-       if (!(mem_ctx = talloc_init("samr_set_user_info2"))) {
-               PyErr_SetString(
-                       samr_error, "unable to init talloc context\n");
-               goto done;
-       }
-
-       ntstatus = rpccli_samr_set_userinfo2(
-               user_hnd->cli, mem_ctx, &user_hnd->user_pol, level,
-               sess_key, &ctr);
-
-       talloc_destroy(mem_ctx);
-
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               PyErr_SetObject(samr_ntstatus, py_ntstatus_tuple(ntstatus));
-               goto done;
-       }
-
-       Py_INCREF(Py_None);
-       result = Py_None;
-       
-done:
-       return result;
-}
-
-static PyObject *samr_delete_dom_user(PyObject *self, PyObject *args, 
-                                     PyObject *kw)
-{
-       samr_user_hnd_object *user_hnd = (samr_user_hnd_object *)self;
-       static char *kwlist[] = { NULL };
-       NTSTATUS ntstatus;
-       TALLOC_CTX *mem_ctx;
-       PyObject *result = NULL;
-       
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "", kwlist))
-               return NULL;
-
-       if (!(mem_ctx = talloc_init("samr_delete_dom_user"))) {
-               PyErr_SetString(samr_error, "unable to init talloc context");
-               return NULL;
-       }
-
-       ntstatus = rpccli_samr_delete_dom_user(
-               user_hnd->cli, mem_ctx, &user_hnd->user_pol);
-
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               PyErr_SetObject(samr_ntstatus, py_ntstatus_tuple(ntstatus));
-               goto done;
-       }
-
-       Py_INCREF(Py_None);
-       result = Py_None;
-
-done:
-       talloc_destroy(mem_ctx);
-
-       return result;
-}
-
-static PyMethodDef samr_user_methods[] = {
-       { "delete_domain_user", (PyCFunction)samr_delete_dom_user,
-         METH_VARARGS | METH_KEYWORDS,
-         "Delete domain user." },
-       { "set_user_info2", (PyCFunction)samr_set_user_info2,
-         METH_VARARGS | METH_KEYWORDS,
-         "Set user info 2" },
-       { NULL }
-};
-
-static PyObject *py_samr_user_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(samr_user_methods, self, attrname);
-}
-
-PyTypeObject samr_user_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "SAMR User Handle",
-       sizeof(samr_user_hnd_object),
-       0,
-       py_samr_user_hnd_dealloc, /*tp_dealloc*/
-       0,          /*tp_print*/
-       py_samr_user_hnd_getattr,          /*tp_getattr*/
-       0,          /*tp_setattr*/
-       0,          /*tp_compare*/
-       0,          /*tp_repr*/
-       0,          /*tp_as_number*/
-       0,          /*tp_as_sequence*/
-       0,          /*tp_as_mapping*/
-       0,          /*tp_hash */
-};
-
-PyObject *new_samr_user_hnd_object(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                                  POLICY_HND *pol)
-{
-       samr_user_hnd_object *o;
-
-       o = PyObject_New(samr_user_hnd_object, &samr_user_hnd_type);
-
-       o->cli = cli;
-       o->mem_ctx = mem_ctx;
-       memcpy(&o->user_pol, pol, sizeof(POLICY_HND));
-
-       return (PyObject*)o;
-}
-
-/* SAMR connect handle object */
-
-static void py_samr_connect_hnd_dealloc(PyObject* self)
-{
-       PyObject_Del(self);
-}
-
-PyObject *new_samr_domain_hnd_object(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                                    POLICY_HND *pol)
-{
-       samr_domain_hnd_object *o;
-
-       o = PyObject_New(samr_domain_hnd_object, &samr_domain_hnd_type);
-
-       o->cli = cli;
-       o->mem_ctx = mem_ctx;
-       memcpy(&o->domain_pol, pol, sizeof(POLICY_HND));
-
-       return (PyObject*)o;
-}
-
-static PyObject *samr_open_domain(PyObject *self, PyObject *args, PyObject *kw)
-{
-       samr_connect_hnd_object *connect_hnd = (samr_connect_hnd_object *)self;
-       static char *kwlist[] = { "sid", "access", NULL };
-       uint32 desired_access = MAXIMUM_ALLOWED_ACCESS;
-       char *sid_str;
-       DOM_SID sid;
-       TALLOC_CTX *mem_ctx = NULL;
-       POLICY_HND domain_pol;
-       NTSTATUS ntstatus;
-       PyObject *result = NULL;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|i", kwlist, &sid_str, &desired_access))
-               return NULL;
-
-       if (!string_to_sid(&sid, sid_str)) {
-               PyErr_SetString(PyExc_TypeError, "string is not a sid");
-               return NULL;
-       }
-
-       if (!(mem_ctx = talloc_init("samr_open_domain"))) {
-               PyErr_SetString(samr_error, "unable to init talloc context");
-               return NULL;
-       }
-
-       ntstatus = rpccli_samr_open_domain(
-               connect_hnd->cli, mem_ctx, &connect_hnd->connect_pol,
-               desired_access, &sid, &domain_pol);
-                                       
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               PyErr_SetObject(samr_ntstatus, py_ntstatus_tuple(ntstatus));
-               goto done;
-       }
-
-       result = new_samr_domain_hnd_object(
-               connect_hnd->cli, mem_ctx, &domain_pol);
-
-done:
-       if (!result) {
-               if (mem_ctx)
-                       talloc_destroy(mem_ctx);
-       }
-
-       return result;
-}
-
-static PyMethodDef samr_connect_methods[] = {
-       { "open_domain", (PyCFunction)samr_open_domain,
-         METH_VARARGS | METH_KEYWORDS,
-         "Open a handle on a domain" },
-
-       { NULL }
-};
-
-static PyObject *py_samr_connect_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(samr_connect_methods, self, attrname);
-}
-
-PyTypeObject samr_connect_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "SAMR Connect Handle",
-       sizeof(samr_connect_hnd_object),
-       0,
-       py_samr_connect_hnd_dealloc, /*tp_dealloc*/
-       0,          /*tp_print*/
-       py_samr_connect_hnd_getattr,          /*tp_getattr*/
-       0,          /*tp_setattr*/
-       0,          /*tp_compare*/
-       0,          /*tp_repr*/
-       0,          /*tp_as_number*/
-       0,          /*tp_as_sequence*/
-       0,          /*tp_as_mapping*/
-       0,          /*tp_hash */
-};
-
-PyObject *new_samr_connect_hnd_object(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                                     POLICY_HND *pol)
-{
-       samr_connect_hnd_object *o;
-
-       o = PyObject_New(samr_connect_hnd_object, &samr_connect_hnd_type);
-
-       o->cli = cli;
-       o->mem_ctx = mem_ctx;
-       memcpy(&o->connect_pol, pol, sizeof(POLICY_HND));
-
-       return (PyObject*)o;
-}
-
-/* SAMR domain handle object */
-
-static void py_samr_domain_hnd_dealloc(PyObject* self)
-{
-       PyObject_Del(self);
-}
-
-static PyObject *samr_enum_dom_groups(PyObject *self, PyObject *args, 
-                                     PyObject *kw)
-{
-       samr_domain_hnd_object *domain_hnd = (samr_domain_hnd_object *)self;
-       static char *kwlist[] = { NULL };
-       TALLOC_CTX *mem_ctx;
-/*     uint32 desired_access = MAXIMUM_ALLOWED_ACCESS; */
-       uint32 start_idx, size, num_dom_groups;
-       struct acct_info *dom_groups;
-       NTSTATUS result;
-       PyObject *py_result = NULL;
-       
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
-               return NULL;
-
-       if (!(mem_ctx = talloc_init("samr_enum_dom_groups"))) {
-               PyErr_SetString(samr_error, "unable to init talloc context");
-               return NULL;
-       }
-
-       start_idx = 0;
-       size = 0xffff;
-
-       do {
-               result = rpccli_samr_enum_dom_groups(
-                       domain_hnd->cli, mem_ctx, &domain_hnd->domain_pol,
-                       &start_idx, size, &dom_groups, &num_dom_groups);
-
-               if (NT_STATUS_IS_OK(result) ||
-                   NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES)) {
-                       py_from_acct_info(&py_result, dom_groups,
-                                         num_dom_groups);
-               }
-
-       } while (NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES));
-
-       return py_result;
-}      
-
-static PyObject *samr_create_dom_user(PyObject *self, PyObject *args, 
-                                     PyObject *kw)
-{
-       samr_domain_hnd_object *domain_hnd = (samr_domain_hnd_object *)self;
-       static char *kwlist[] = { "account_name", "acb_info", NULL };
-       char *account_name;
-       NTSTATUS ntstatus;
-       uint32 unknown = 0xe005000b; /* Access mask? */
-       uint32 user_rid;
-       PyObject *result = NULL;
-       TALLOC_CTX *mem_ctx;
-       uint32 acb_info = ACB_NORMAL;
-       POLICY_HND user_pol;
-       
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|i", kwlist, &account_name, &acb_info))
-               return NULL;
-
-       if (!(mem_ctx = talloc_init("samr_create_dom_user"))) {
-               PyErr_SetString(samr_error, "unable to init talloc context");
-               return NULL;
-       }
-
-       ntstatus = rpccli_samr_create_dom_user(
-               domain_hnd->cli, mem_ctx, &domain_hnd->domain_pol,
-               account_name, acb_info, unknown, &user_pol, &user_rid);
-
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               PyErr_SetObject(samr_ntstatus, py_ntstatus_tuple(ntstatus));
-               talloc_destroy(mem_ctx);
-               goto done;
-       }
-
-       result = new_samr_user_hnd_object(
-               domain_hnd->cli, mem_ctx, &user_pol);
-
-done:
-
-       return result;
-}
-
-static PyMethodDef samr_domain_methods[] = {
-       { "enum_domain_groups", (PyCFunction)samr_enum_dom_groups,
-         METH_VARARGS | METH_KEYWORDS, "Enumerate domain groups" },
-       { "create_domain_user", (PyCFunction)samr_create_dom_user,
-         METH_VARARGS | METH_KEYWORDS, "Create domain user" },
-       { NULL }
-};
-
-static PyObject *py_samr_domain_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(samr_domain_methods, self, attrname);
-}
-
-PyTypeObject samr_domain_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "SAMR Domain Handle",
-       sizeof(samr_domain_hnd_object),
-       0,
-       py_samr_domain_hnd_dealloc, /*tp_dealloc*/
-       0,          /*tp_print*/
-       py_samr_domain_hnd_getattr,          /*tp_getattr*/
-       0,          /*tp_setattr*/
-       0,          /*tp_compare*/
-       0,          /*tp_repr*/
-       0,          /*tp_as_number*/
-       0,          /*tp_as_sequence*/
-       0,          /*tp_as_mapping*/
-       0,          /*tp_hash */
-};
-
-static PyObject *samr_connect(PyObject *self, PyObject *args, PyObject *kw)
-{
-       static char *kwlist[] = { "server", "creds", "access", NULL };
-       uint32 desired_access = MAXIMUM_ALLOWED_ACCESS;
-       char *server, *errstr;
-       struct cli_state *cli = NULL;
-       POLICY_HND hnd;
-       TALLOC_CTX *mem_ctx = NULL;
-       PyObject *result = NULL, *creds = NULL;
-       NTSTATUS ntstatus;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|Oi", kwlist, &server, &creds,
-                   &desired_access)) 
-               return NULL;
-
-       if (server[0] != '\\' || server[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server += 2;
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SAMR, &errstr))) {
-               PyErr_SetString(samr_error, errstr);
-               free(errstr);
-               return NULL;
-       }
-
-       if (!(mem_ctx = talloc_init("samr_connect"))) {
-               PyErr_SetString(samr_ntstatus,
-                               "unable to init talloc context\n");
-               goto done;
-       }
-
-       ntstatus = rpccli_samr_connect(cli->pipe_list, mem_ctx, desired_access, &hnd);
-
-       if (!NT_STATUS_IS_OK(ntstatus)) {
-               cli_shutdown(cli);
-               PyErr_SetObject(samr_ntstatus, py_ntstatus_tuple(ntstatus));
-               goto done;
-       }
-
-       result = new_samr_connect_hnd_object(cli->pipe_list, mem_ctx, &hnd);
-
-done:
-       if (!result) {
-               if (cli)
-                       cli_shutdown(cli);
-
-               if (mem_ctx)
-                       talloc_destroy(mem_ctx);
-       }
-
-       return result;
-}
-
-/*
- * Module initialisation 
- */
-
-static PyMethodDef samr_methods[] = {
-
-       /* Open/close samr connect handles */
-       
-       { "connect", (PyCFunction)samr_connect, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Open a connect handle" },
-       
-       { NULL }
-};
-
-static struct const_vals {
-       char *name;
-       uint32 value;
-} module_const_vals[] = {
-
-       /* Account control bits */
-
-       { "ACB_DISABLED", 0x0001 },
-       { "ACB_HOMDIRREQ", 0x0002 },
-       { "ACB_PWNOTREQ", 0x0004 },
-       { "ACB_TEMPDUP", 0x0008 },
-       { "ACB_NORMAL", 0x0010 },
-       { "ACB_MNS", 0x0020 },
-       { "ACB_DOMTRUST", 0x0040 },
-       { "ACB_WSTRUST", 0x0080 },
-       { "ACB_SVRTRUST", 0x0100 },
-       { "ACB_PWNOEXP", 0x0200 },
-       { "ACB_AUTOLOCK", 0x0400 },
-
-       { NULL }
-};
-
-static void const_init(PyObject *dict)
-{
-       struct const_vals *tmp;
-       PyObject *obj;
-
-       for (tmp = module_const_vals; tmp->name; tmp++) {
-               obj = PyInt_FromLong(tmp->value);
-               PyDict_SetItemString(dict, tmp->name, obj);
-               Py_DECREF(obj);
-       }
-}
-
-void initsamr(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-       module = Py_InitModule("samr", samr_methods);
-       dict = PyModule_GetDict(module);
-
-       samr_error = PyErr_NewException("samr.error", NULL, NULL);
-       PyDict_SetItemString(dict, "error", samr_error);
-
-       samr_ntstatus = PyErr_NewException("samr.ntstatus", NULL, NULL);
-       PyDict_SetItemString(dict, "ntstatus", samr_ntstatus);
-
-       /* Initialise policy handle object */
-
-       samr_connect_hnd_type.ob_type = &PyType_Type;
-       samr_domain_hnd_type.ob_type = &PyType_Type;
-       samr_user_hnd_type.ob_type = &PyType_Type;
-       samr_group_hnd_type.ob_type = &PyType_Type;
-       samr_alias_hnd_type.ob_type = &PyType_Type;
-
-       /* Initialise constants */
-
-       const_init(dict);
-
-       /* Do samba initialisation */
-
-       py_samba_init();
-
-       setup_logging("samr", True);
-       DEBUGLEVEL = 10;
-}
diff --git a/source3/python/py_samr.h b/source3/python/py_samr.h
deleted file mode 100644 (file)
index 78ee803..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_SAMR_H
-#define _PY_SAMR_H
-
-#include "python/py_common.h"
-
-/* SAMR connect policy handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct rpc_pipe_client *cli;
-       TALLOC_CTX *mem_ctx;
-       POLICY_HND connect_pol;
-} samr_connect_hnd_object;
-     
-/* SAMR domain policy handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct rpc_pipe_client *cli;
-       TALLOC_CTX *mem_ctx;
-       POLICY_HND domain_pol;
-} samr_domain_hnd_object;
-
-/* SAMR user policy handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct rpc_pipe_client *cli;
-       TALLOC_CTX *mem_ctx;
-       POLICY_HND user_pol;
-} samr_user_hnd_object;
-
-/* SAMR group policy handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct cli_state *cli;
-       TALLOC_CTX *mem_ctx;
-       POLICY_HND group_pol;
-} samr_group_hnd_object;
-     
-/* SAMR alias policy handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct cli_state *cli;
-       TALLOC_CTX *mem_ctx;
-       POLICY_HND alias_pol;
-} samr_alias_hnd_object;
-     
-extern PyTypeObject samr_connect_hnd_type, samr_domain_hnd_type,
-       samr_user_hnd_type, samr_group_hnd_type, samr_alias_hnd_type; 
-
-/* Exceptions raised by this module */
-
-extern PyObject *samr_error;
-
-/* The following definitions are from py_samr_conv.c */
-
-BOOL py_from_acct_info(PyObject **array, struct acct_info *info, int num_accts);
-BOOL py_from_SAM_USER_INFO_16(PyObject **dict, SAM_USER_INFO_16 *info);
-BOOL py_to_SAM_USER_INFO_16(SAM_USER_INFO_16 *info, PyObject *dict);
-BOOL py_from_SAM_USER_INFO_21(PyObject **dict, SAM_USER_INFO_21 *info);
-BOOL py_to_SAM_USER_INFO_21(SAM_USER_INFO_21 *info, PyObject *dict);
-
-#endif /* _PY_SAMR_H */
diff --git a/source3/python/py_samr_conv.c b/source3/python/py_samr_conv.c
deleted file mode 100644 (file)
index 193a2ec..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_samr.h"
-#include "python/py_conv.h"
-
-/*
- * Convert between SAM_USER_INFO_16 and Python
- */
-
-struct pyconv py_SAM_USER_INFO_16[] = {
-       { "acb_info", PY_UINT32, offsetof(SAM_USER_INFO_16, acb_info) },
-       { NULL }
-};
-
-BOOL py_from_SAM_USER_INFO_16(PyObject **dict, SAM_USER_INFO_16 *info)
-{
-       *dict = from_struct(info, py_SAM_USER_INFO_16);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(16));
-       return True;
-}
-
-BOOL py_to_SAM_USER_INFO_16(SAM_USER_INFO_16 *info, PyObject *dict)
-{
-       PyObject *obj, *dict_copy = PyDict_Copy(dict);
-       BOOL result = False;
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "level")) ||
-           !PyInt_Check(obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "level");
-
-       if (!to_struct(info, dict_copy, py_SAM_USER_INFO_16))
-               goto done;
-
-       result = True;
-
-done:
-       Py_DECREF(dict_copy);
-       return result;
-}
-
-/*
- * Convert between SAM_USER_INFO_21 and Python
- */
-
-struct pyconv py_SAM_USER_INFO_21[] = {
-       { NULL }
-};
-
-BOOL py_from_SAM_USER_INFO_21(PyObject **dict, SAM_USER_INFO_21 *info)
-{
-       *dict = from_struct(info, py_SAM_USER_INFO_21);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(21));
-       return True;
-}
-
-BOOL py_to_SAM_USER_INFO_21(SAM_USER_INFO_21 *info, PyObject *dict)
-{
-       PyObject *obj, *dict_copy = PyDict_Copy(dict);
-       BOOL result = False;
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "level")) ||
-           !PyInt_Check(obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "level");
-
-       if (!to_struct(info, dict_copy, py_SAM_USER_INFO_21))
-               goto done;
-
-       result = True;
-
-done:
-       Py_DECREF(dict_copy);
-       return result;
-}
-
-/*
- * Convert between acct_info and Python 
- */
-
-BOOL py_from_acct_info(PyObject **array, struct acct_info *info, int num_accts)
-{
-       int i;
-
-       *array = PyList_New(num_accts);
-
-       for (i = 0; i < num_accts; i++) {
-               PyObject *obj;  
-
-               obj = PyDict_New();
-               
-               PyDict_SetItemString(
-                       obj, "name", PyString_FromString(info[i].acct_name));
-
-               PyDict_SetItemString(
-                       obj, "description", 
-                       PyString_FromString(info[i].acct_desc));
-
-               PyDict_SetItemString(obj, "rid", PyInt_FromLong(info[i].rid));
-
-               PyList_SetItem(*array, i, obj);
-       }
-
-       return True;
-}
-
-BOOL py_to_acct_info(PRINTER_INFO_3 *info, PyObject *dict,
-                    TALLOC_CTX *mem_ctx)
-{
-       return False;
-}
diff --git a/source3/python/py_smb.c b/source3/python/py_smb.c
deleted file mode 100644 (file)
index 17b2a2d..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_smb.h"
-
-/* Create a new cli_state python object */
-
-PyObject *new_cli_state_object(struct cli_state *cli)
-{
-       cli_state_object *o;
-
-       o = PyObject_New(cli_state_object, &cli_state_type);
-
-       o->cli = cli;
-
-       return (PyObject*)o;
-}
-
-static PyObject *py_smb_connect(PyObject *self, PyObject *args, PyObject *kw)
-{
-       static char *kwlist[] = { "server", NULL };
-       struct cli_state *cli;
-       char *server;
-       struct in_addr ip;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &server))
-               return NULL;
-
-       if (!(cli = cli_initialise()))
-               return NULL;
-
-       ZERO_STRUCT(ip);
-
-       if (!NT_STATUS_IS_OK(cli_connect(cli, server, &ip)))
-               return NULL;
-
-       return new_cli_state_object(cli);
-}
-
-static PyObject *py_smb_session_request(PyObject *self, PyObject *args,
-                                       PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "called", "calling", NULL };
-       char *calling_name = NULL, *called_name;
-       struct nmb_name calling, called;
-       BOOL result;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s|s", kwlist, &called_name, 
-                                        &calling_name))
-               return NULL;
-
-       if (!calling_name)
-               calling_name = global_myname();
-
-       make_nmb_name(&calling, calling_name, 0x00);
-       make_nmb_name(&called, called_name, 0x20);
-
-       result = cli_session_request(cli->cli, &calling, &called);
-
-       return Py_BuildValue("i", result);
-}
-                                     
-static PyObject *py_smb_negprot(PyObject *self, PyObject *args, PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { NULL };
-       BOOL result;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
-               return NULL;
-
-       result = cli_negprot(cli->cli);
-
-       return Py_BuildValue("i", result);
-}
-
-static PyObject *py_smb_session_setup(PyObject *self, PyObject *args, 
-                                     PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "creds", NULL };
-       PyObject *creds;
-       char *username, *domain, *password, *errstr;
-       NTSTATUS result;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "|O", kwlist, &creds))
-               return NULL;
-
-       if (!py_parse_creds(creds, &username, &domain, &password, &errstr)) {
-               free(errstr);
-               return NULL;
-       }
-
-       result = cli_session_setup(
-               cli->cli, username, password, strlen(password) + 1,
-               password, strlen(password) + 1, domain);
-
-       if (cli_is_error(cli->cli)) {
-               PyErr_SetString(PyExc_RuntimeError, "session setup failed");
-               return NULL;
-       }
-
-       return Py_BuildValue("i", NT_STATUS_IS_OK(result));
-}
-
-static PyObject *py_smb_tconx(PyObject *self, PyObject *args, PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "service", NULL };
-       char *service;
-       BOOL result;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &service))
-               return NULL;
-
-       result = cli_send_tconX(
-               cli->cli, service, strequal(service, "IPC$") ? "IPC" : 
-               "?????", "", 1);
-
-       if (cli_is_error(cli->cli)) {
-               PyErr_SetString(PyExc_RuntimeError, "tconx failed");
-               return NULL;
-       }
-
-       return Py_BuildValue("i", result);
-}
-
-static PyObject *py_smb_nt_create_andx(PyObject *self, PyObject *args,
-                                      PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "filename", "desired_access", 
-                                 "file_attributes", "share_access",
-                                 "create_disposition", "create_options",
-                                 NULL };
-       char *filename;
-       uint32 desired_access, file_attributes = 0, 
-               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
-               create_disposition = OPENX_FILE_EXISTS_OPEN, create_options = 0;
-       int result;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "si|iiii", kwlist, &filename, &desired_access,
-                   &file_attributes, &share_access, &create_disposition,
-                   &create_options))
-               return NULL;
-
-       result = cli_nt_create_full(
-               cli->cli, filename, 0, desired_access, file_attributes,
-               share_access, create_disposition, create_options, 0);
-
-       if (cli_is_error(cli->cli)) {
-               PyErr_SetString(PyExc_RuntimeError, "nt_create_andx failed");
-               return NULL;
-       }
-
-       /* Return FID */
-
-       return PyInt_FromLong(result);
-}
-
-static PyObject *py_smb_open(PyObject *self, PyObject *args, PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "filename", "flags", 
-                                 "share_mode", NULL };
-       char *filename;
-       uint32 flags, share_mode = DENY_NONE;
-       int result;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "si|i", kwlist, &filename, &flags, &share_mode))
-               return NULL;
-
-       result = cli_open(cli->cli, filename, flags, share_mode);
-
-       if (cli_is_error(cli->cli)) {
-               PyErr_SetString(PyExc_RuntimeError, "open failed");
-               return NULL;
-       }
-
-       /* Return FID */
-
-       return PyInt_FromLong(result);
-}
-
-static PyObject *py_smb_read(PyObject *self, PyObject *args, PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "fnum", "offset", "size", NULL };
-       int fnum, offset=0, size=0;
-       ssize_t result;
-       SMB_OFF_T fsize;
-       char *data;
-       PyObject *ret;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "i|ii", kwlist, &fnum, &offset, &size))
-               return NULL;
-
-       if (!cli_qfileinfo(cli->cli, fnum, NULL, &fsize, NULL, NULL,
-                   NULL, NULL, NULL) &&
-           !cli_getattrE(cli->cli, fnum, NULL, &fsize, NULL, NULL, NULL)) {
-               PyErr_SetString(PyExc_RuntimeError, "getattrib failed");
-               return NULL;
-       }
-
-       if (offset < 0)
-               offset = 0;
-
-       if (size < 1 || size > fsize - offset)
-               size = fsize - offset;
-
-       if (!(data = SMB_XMALLOC_ARRAY(char, size))) {
-               PyErr_SetString(PyExc_RuntimeError, "malloc failed");
-               return NULL;
-       }
-
-       result = cli_read(cli->cli, fnum, data, (off_t) offset, (size_t) size);
-
-       if (result==-1 || cli_is_error(cli->cli)) {
-               SAFE_FREE(data);
-               PyErr_SetString(PyExc_RuntimeError, "read failed");
-               return NULL;
-       }
-
-       /* Return a python string */
-
-       ret = Py_BuildValue("s#", data, result);
-       SAFE_FREE(data);
-
-       return ret;
-}
-
-static PyObject *py_smb_close(PyObject *self, PyObject *args,
-                             PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "fnum", NULL };
-       BOOL result;
-       int fnum;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "i", kwlist, &fnum))
-               return NULL;
-
-       result = cli_close(cli->cli, fnum);
-
-       return PyInt_FromLong(result);
-}
-
-static PyObject *py_smb_unlink(PyObject *self, PyObject *args,
-                              PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "filename", NULL };
-       char *filename;
-       BOOL result;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s", kwlist, &filename))
-               return NULL;
-
-       result = cli_unlink(cli->cli, filename);
-
-       return PyInt_FromLong(result);
-}
-
-static PyObject *py_smb_query_secdesc(PyObject *self, PyObject *args,
-                                     PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "fnum", NULL };
-       PyObject *result = NULL;
-       SEC_DESC *secdesc = NULL;
-       int fnum;
-       TALLOC_CTX *mem_ctx = NULL;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "i", kwlist, &fnum))
-               return NULL;
-
-       mem_ctx = talloc_init("py_smb_query_secdesc");
-
-       secdesc = cli_query_secdesc(cli->cli, fnum, mem_ctx);
-
-       if (cli_is_error(cli->cli)) {
-               PyErr_SetString(PyExc_RuntimeError, "query_secdesc failed");
-               goto done;
-       }
-
-       if (!secdesc) {
-               Py_INCREF(Py_None);
-               result = Py_None;
-               goto done;
-       }
-
-       if (!py_from_SECDESC(&result, secdesc)) {
-               PyErr_SetString(
-                       PyExc_TypeError,
-                       "Invalid security descriptor returned");
-               goto done;
-       }
-
- done:
-       talloc_destroy(mem_ctx);
-
-       return result;
-       
-}
-
-static PyObject *py_smb_set_secdesc(PyObject *self, PyObject *args,
-                                   PyObject *kw)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-       static char *kwlist[] = { "fnum", "security_descriptor", NULL };
-       PyObject *result = NULL;
-       PyObject *py_secdesc;
-       SEC_DESC *secdesc;
-       TALLOC_CTX *mem_ctx = NULL;
-       int fnum;
-       BOOL err;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "iO", kwlist, &fnum, &py_secdesc))
-               return NULL;
-
-       mem_ctx = talloc_init("py_smb_set_secdesc");
-
-       if (!py_to_SECDESC(&secdesc, py_secdesc, mem_ctx)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "Invalid security descriptor");
-               goto done;
-       }
-
-       err = cli_set_secdesc(cli->cli, fnum, secdesc);
-
-       if (cli_is_error(cli->cli)) {
-               PyErr_SetString(PyExc_RuntimeError, "set_secdesc failed");
-               goto done;
-       }
-
-       result =  PyInt_FromLong(err);
- done:
-       talloc_destroy(mem_ctx);
-
-       return result;
-}
-
-static PyMethodDef smb_hnd_methods[] = {
-
-       /* Session and connection handling */
-
-       { "session_request", (PyCFunction)py_smb_session_request, 
-         METH_VARARGS | METH_KEYWORDS, "Request a session" },
-
-       { "negprot", (PyCFunction)py_smb_negprot, 
-         METH_VARARGS | METH_KEYWORDS, "Protocol negotiation" },
-
-       { "session_setup", (PyCFunction)py_smb_session_setup,
-         METH_VARARGS | METH_KEYWORDS, "Session setup" },
-
-       { "tconx", (PyCFunction)py_smb_tconx,
-         METH_VARARGS | METH_KEYWORDS, "Tree connect" },
-
-       /* File operations */
-
-       { "nt_create_andx", (PyCFunction)py_smb_nt_create_andx,
-         METH_VARARGS | METH_KEYWORDS, "NT Create&X" },
-
-       { "open", (PyCFunction)py_smb_open,
-         METH_VARARGS | METH_KEYWORDS,
-         "Open a file\n"
-"\n"
-"This function returns a fnum handle to an open file.  The file is\n"
-"opened with flags and optional share mode.  If unspecified, the\n"
-"default share mode is DENY_NONE\n"
-"\n"
-"Example:\n"
-"\n"
-">>> fnum=conn.open(filename, os.O_RDONLY)" },
-
-       { "read", (PyCFunction)py_smb_read,
-         METH_VARARGS | METH_KEYWORDS,
-         "Read from an open file\n"
-"\n"
-"This function returns a string read from an open file starting at\n"
-"offset for size bytes (until EOF is reached).  If unspecified, the\n"
-"default offset is 0, and default size is the remainder of the file.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> conn.read(fnum)           # read entire file\n"
-">>> conn.read(fnum,5)         # read entire file from offset 5\n"
-">>> conn.read(fnum,size=64)   # read 64 bytes from start of file\n"
-">>> conn.read(fnum,4096,1024) # read 1024 bytes from offset 4096\n" },
-
-       { "close", (PyCFunction)py_smb_close,
-         METH_VARARGS | METH_KEYWORDS, "Close" },
-
-       { "unlink", (PyCFunction)py_smb_unlink,
-         METH_VARARGS | METH_KEYWORDS, "Unlink" },
-
-       /* Security descriptors */
-
-       { "query_secdesc", (PyCFunction)py_smb_query_secdesc,
-         METH_VARARGS | METH_KEYWORDS, "Query security descriptor" },
-
-       { "set_secdesc", (PyCFunction)py_smb_set_secdesc,
-         METH_VARARGS | METH_KEYWORDS, "Set security descriptor" },
-
-       { NULL }
-};
-
-/*
- * Method dispatch tables
- */
-
-static PyMethodDef smb_methods[] = {
-
-       { "connect", (PyCFunction)py_smb_connect, METH_VARARGS | METH_KEYWORDS,
-         "Connect to a host" },
-
-       /* Other stuff - this should really go into a samba config module
-          but for the moment let's leave it here. */
-
-       { "setup_logging", (PyCFunction)py_setup_logging, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Set up debug logging.\n"
-"\n"
-"Initialises Samba's debug logging system.  One argument is expected which\n"
-"is a boolean specifying whether debugging is interactive and sent to stdout\n"
-"or logged to a file.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> smb.setup_logging(interactive = 1)" },
-
-       { "get_debuglevel", (PyCFunction)get_debuglevel, 
-         METH_VARARGS, 
-         "Set the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> smb.get_debuglevel()\n"
-"0" },
-
-       { "set_debuglevel", (PyCFunction)set_debuglevel, 
-         METH_VARARGS, 
-         "Get the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> smb.set_debuglevel(10)" },
-
-       { NULL }
-};
-
-static void py_cli_state_dealloc(PyObject* self)
-{
-       cli_state_object *cli = (cli_state_object *)self;
-
-       if (cli->cli)
-               cli_shutdown(cli->cli);
-
-       PyObject_Del(self);
-}
-
-static PyObject *py_cli_state_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(smb_hnd_methods, self, attrname);
-}
-
-PyTypeObject cli_state_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "SMB client connection",
-       sizeof(cli_state_object),
-       0,
-       py_cli_state_dealloc, /*tp_dealloc*/
-       0,          /*tp_print*/
-       py_cli_state_getattr,          /*tp_getattr*/
-       0,          /*tp_setattr*/
-       0,          /*tp_compare*/
-       0,          /*tp_repr*/
-       0,          /*tp_as_number*/
-       0,          /*tp_as_sequence*/
-       0,          /*tp_as_mapping*/
-       0,          /*tp_hash */
-};
-
-/*
- * Module initialisation 
- */
-
-void initsmb(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-       module = Py_InitModule("smb", smb_methods);
-       dict = PyModule_GetDict(module);
-
-       /* Initialise policy handle object */
-
-       cli_state_type.ob_type = &PyType_Type;
-
-       /* Do samba initialisation */
-
-       py_samba_init();
-
-       setup_logging("smb", True);
-       DEBUGLEVEL = 3;
-}
diff --git a/source3/python/py_smb.h b/source3/python/py_smb.h
deleted file mode 100644 (file)
index 781e0a3..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_SMB_H
-#define _PY_SMB_H
-
-#include "python/py_common.h"
-
-/* cli_state handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct cli_state *cli;
-} cli_state_object;
-
-/* Exceptions raised by this module */
-
-extern PyTypeObject cli_state_type;
-
-extern PyObject *smb_ntstatus;
-
-#endif /* _PY_SMB_H */
diff --git a/source3/python/py_spoolss.c b/source3/python/py_spoolss.c
deleted file mode 100644 (file)
index 2543324..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-
-/* Exceptions this module can raise */
-
-PyObject *spoolss_error, *spoolss_werror;
-
-/* 
- * Method dispatch table
- */
-
-static PyMethodDef spoolss_methods[] = {
-
-       /* Open/close printer handles */
-       
-       { "openprinter", (PyCFunction)spoolss_openprinter, METH_VARARGS | METH_KEYWORDS, 
-         "Open a printer by name in UNC format.\n"
-"\n"
-"Optionally a dictionary of (domain, username, password) may be given in\n"
-"which case they are used when opening the RPC pipe.  An access mask may\n"
-"also be given which defaults to MAXIMUM_ALLOWED_ACCESS.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> hnd = spoolss.openprinter(\"\\\\\\\\NPSD-PDC2\\\\meanie\")"},
-       
-       { "closeprinter", spoolss_closeprinter, METH_VARARGS, 
-         "Close a printer handle opened with openprinter or addprinter.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> spoolss.closeprinter(hnd)"},
-
-       { "addprinterex", (PyCFunction)spoolss_addprinterex, METH_VARARGS, 
-         "addprinterex()"},
-
-       /* Server enumeratation functions */
-
-       { "enumprinters", (PyCFunction)spoolss_enumprinters, 
-         METH_VARARGS | METH_KEYWORDS,
-         "Enumerate printers on a print server.\n"
-"\n"
-"Return a list of printers on a print server.  The credentials, info level\n"
-"and flags may be specified as keyword arguments.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> print spoolss.enumprinters(\"\\\\\\\\npsd-pdc2\")\n"
-"[{'comment': 'i am a comment', 'printer_name': 'meanie', 'flags': 8388608, \n"
-"  'description': 'meanie,Generic / Text Only,i am a location'}, \n"
-" {'comment': '', 'printer_name': 'fileprint', 'flags': 8388608, \n"
-"  'description': 'fileprint,Generic / Text Only,'}]"},
-
-       { "enumports", (PyCFunction)spoolss_enumports, 
-         METH_VARARGS | METH_KEYWORDS,
-         "Enumerate ports on a print server.\n"
-"\n"
-"Return a list of ports on a print server.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> print spoolss.enumports(\"\\\\\\\\npsd-pdc2\")\n"
-"[{'name': 'LPT1:'}, {'name': 'LPT2:'}, {'name': 'COM1:'}, \n"
-"{'name': 'COM2:'}, {'name': 'FILE:'}, {'name': '\\\\nautilus1\\zpekt3r'}]"},
-
-       { "enumprinterdrivers", (PyCFunction)spoolss_enumprinterdrivers, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Enumerate printer drivers on a print server.\n"
-"\n"
-"Return a list of printer drivers."},
-
-       /* Miscellaneous other commands */
-
-       { "getprinterdriverdir", (PyCFunction)spoolss_getprinterdriverdir, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Return printer driver directory.\n"
-"\n"
-"Return the printer driver directory for a given architecture.  The\n"
-"architecture defaults to \"Windows NT x86\"."},
-
-       /* Other stuff - this should really go into a samba config module
-          but for the moment let's leave it here. */
-
-       { "setup_logging", (PyCFunction)py_setup_logging, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Set up debug logging.\n"
-"\n"
-"Initialises Samba's debug logging system.  One argument is expected which\n"
-"is a boolean specifying whether debugging is interactive and sent to stdout\n"
-"or logged to a file.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> spoolss.setup_logging(interactive = 1)" },
-
-       { "get_debuglevel", (PyCFunction)get_debuglevel, 
-         METH_VARARGS, 
-         "Set the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> spoolss.get_debuglevel()\n"
-"0" },
-
-       { "set_debuglevel", (PyCFunction)set_debuglevel, 
-         METH_VARARGS, 
-         "Get the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> spoolss.set_debuglevel(10)" },
-
-       /* Printer driver routines */
-       
-       { "addprinterdriver", (PyCFunction)spoolss_addprinterdriver, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Add a printer driver." },
-
-       { "addprinterdriverex", (PyCFunction)spoolss_addprinterdriverex, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Add a printer driver." },
-
-       { "deleteprinterdriver", (PyCFunction)spoolss_deleteprinterdriver, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Delete a printer driver." },
-
-       { "deleteprinterdriverex", (PyCFunction)spoolss_deleteprinterdriverex, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Delete a printer driver." },
-
-       { NULL }
-};
-
-/* Methods attached to a spoolss handle object */
-
-static PyMethodDef spoolss_hnd_methods[] = {
-
-       /* Printer info */
-
-       { "getprinter", (PyCFunction)spoolss_hnd_getprinter, 
-           METH_VARARGS | METH_KEYWORDS,
-         "Get printer information.\n"
-"\n"
-"Return a dictionary of print information.  The info level defaults to 1.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> hnd.getprinter()\n"
-"{'comment': 'i am a comment', 'printer_name': '\\\\NPSD-PDC2\\meanie',\n"
-" 'description': '\\\\NPSD-PDC2\\meanie,Generic / Text Only,i am a location',\n"
-" 'flags': 8388608}"},
-
-       { "setprinter", (PyCFunction)spoolss_hnd_setprinter, 
-          METH_VARARGS | METH_KEYWORDS,
-         "Set printer information."},
-
-       /* Printer drivers */
-
-       { "getprinterdriver", (PyCFunction)spoolss_hnd_getprinterdriver, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Return printer driver information.\n"
-"\n"
-"Return a dictionary of printer driver information for the printer driver\n"
-"bound to this printer."},
-
-       /* Forms */
-
-       { "enumforms", (PyCFunction)spoolss_hnd_enumforms, 
-          METH_VARARGS | METH_KEYWORDS,
-         "Enumerate supported forms.\n"
-"\n"
-"Return a list of forms supported by this printer or print server."},
-
-       { "setform", (PyCFunction)spoolss_hnd_setform, 
-          METH_VARARGS | METH_KEYWORDS,
-         "Set form data.\n"
-"\n"
-"Set the form given by the dictionary argument."},
-
-       { "addform", (PyCFunction)spoolss_hnd_addform, 
-          METH_VARARGS | METH_KEYWORDS,
-         "Add a new form." },
-
-       { "getform", (PyCFunction)spoolss_hnd_getform, 
-          METH_VARARGS | METH_KEYWORDS,
-         "Get form properties." },
-
-       { "deleteform", (PyCFunction)spoolss_hnd_deleteform, 
-          METH_VARARGS | METH_KEYWORDS,
-         "Delete a form." },
-
-        /* Job related methods */
-
-        { "enumjobs", (PyCFunction)spoolss_hnd_enumjobs, 
-          METH_VARARGS | METH_KEYWORDS,
-          "Enumerate jobs." },
-
-        { "setjob", (PyCFunction)spoolss_hnd_setjob, 
-          METH_VARARGS | METH_KEYWORDS,
-          "Set job information." },
-
-        { "getjob", (PyCFunction)spoolss_hnd_getjob, 
-          METH_VARARGS | METH_KEYWORDS,
-          "Get job information." },
-
-        { "startpageprinter", (PyCFunction)spoolss_hnd_startpageprinter, 
-           METH_VARARGS | METH_KEYWORDS,
-          "Notify spooler that a page is about to be printed." },
-
-        { "endpageprinter", (PyCFunction)spoolss_hnd_endpageprinter, 
-           METH_VARARGS | METH_KEYWORDS,
-          "Notify spooler that a page is about to be printed." },
-
-        { "startdocprinter", (PyCFunction)spoolss_hnd_startdocprinter, 
-           METH_VARARGS | METH_KEYWORDS,
-          "Notify spooler that a document is about to be printed." },
-
-        { "enddocprinter", (PyCFunction)spoolss_hnd_enddocprinter, 
-           METH_VARARGS | METH_KEYWORDS,
-          "Notify spooler that a document is about to be printed." },
-
-        { "writeprinter", (PyCFunction)spoolss_hnd_writeprinter,
-          METH_VARARGS | METH_KEYWORDS,
-          "Write job data to a printer." },
-
-        { "addjob", (PyCFunction)spoolss_hnd_addjob,
-          METH_VARARGS | METH_KEYWORDS,
-          "Add a job to the list of print jobs." },
-
-        /* Printer data */
-
-        { "getprinterdata", (PyCFunction)spoolss_hnd_getprinterdata,
-           METH_VARARGS | METH_KEYWORDS,
-          "Get printer data." },
-
-        { "setprinterdata", (PyCFunction)spoolss_hnd_setprinterdata,
-           METH_VARARGS | METH_KEYWORDS,
-          "Set printer data." },
-
-        { "enumprinterdata", (PyCFunction)spoolss_hnd_enumprinterdata,
-           METH_VARARGS | METH_KEYWORDS,
-          "Enumerate printer data." },
-
-        { "deleteprinterdata", (PyCFunction)spoolss_hnd_deleteprinterdata,
-           METH_VARARGS | METH_KEYWORDS,
-          "Delete printer data." },
-
-        { "getprinterdataex", (PyCFunction)spoolss_hnd_getprinterdataex,
-           METH_VARARGS | METH_KEYWORDS,
-          "Get printer data." },
-
-        { "setprinterdataex", (PyCFunction)spoolss_hnd_setprinterdataex,
-           METH_VARARGS | METH_KEYWORDS,
-          "Set printer data." },
-
-        { "enumprinterdataex", (PyCFunction)spoolss_hnd_enumprinterdataex,
-           METH_VARARGS | METH_KEYWORDS,
-          "Enumerate printer data." },
-
-        { "deleteprinterdataex", (PyCFunction)spoolss_hnd_deleteprinterdataex,
-           METH_VARARGS | METH_KEYWORDS,
-          "Delete printer data." },
-
-        { "enumprinterkey", (PyCFunction)spoolss_hnd_enumprinterkey,
-           METH_VARARGS | METH_KEYWORDS,
-          "Enumerate printer key." },
-
-#if 0
-        /* Not implemented */
-
-        { "deleteprinterkey", (PyCFunction)spoolss_hnd_deleteprinterkey,
-           METH_VARARGS | METH_KEYWORDS,
-          "Delete printer key." },
-#endif
-
-       { NULL }
-
-};
-
-static void py_policy_hnd_dealloc(PyObject* self)
-{
-        spoolss_policy_hnd_object *hnd;
-
-        /* Close down policy handle and free talloc context */
-
-        hnd = (spoolss_policy_hnd_object*)self;
-
-        cli_shutdown(hnd->cli);
-        talloc_destroy(hnd->mem_ctx);
-
-       PyObject_Del(self);
-}
-
-static PyObject *py_policy_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(spoolss_hnd_methods, self, attrname);
-}
-
-static char spoolss_type_doc[] = 
-"Python wrapper for Windows NT SPOOLSS rpc pipe.";
-
-PyTypeObject spoolss_policy_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "spoolss.hnd",
-       sizeof(spoolss_policy_hnd_object),
-       0,
-       py_policy_hnd_dealloc,  /* tp_dealloc*/
-       0,                      /* tp_print*/
-       py_policy_hnd_getattr,  /* tp_getattr*/
-       0,                      /* tp_setattr*/
-       0,                      /* tp_compare*/
-       0,                      /* tp_repr*/
-       0,                      /* tp_as_number*/
-       0,                      /* tp_as_sequence*/
-       0,                      /* tp_as_mapping*/
-       0,                      /* tp_hash */
-       0,                      /* tp_call */
-       0,                      /* tp_str */
-       0,                      /* tp_getattro */
-       0,                      /* tp_setattro */
-       0,                      /* tp_as_buffer*/
-       Py_TPFLAGS_DEFAULT,     /* tp_flags */
-       spoolss_type_doc,       /* tp_doc */
-};
-
-/* Initialise constants */
-
-static struct const_vals {
-       char *name;
-       uint32 value;
-} module_const_vals[] = {
-       
-       /* Access permissions */
-
-       { "MAXIMUM_ALLOWED_ACCESS", MAXIMUM_ALLOWED_ACCESS },
-       { "SERVER_ALL_ACCESS", SERVER_ALL_ACCESS },
-       { "SERVER_READ", SERVER_READ },
-       { "SERVER_WRITE", SERVER_WRITE },
-       { "SERVER_EXECUTE", SERVER_EXECUTE },
-       { "SERVER_ACCESS_ADMINISTER", SERVER_ACCESS_ADMINISTER },
-       { "SERVER_ACCESS_ENUMERATE", SERVER_ACCESS_ENUMERATE },
-       { "PRINTER_ALL_ACCESS", PRINTER_ALL_ACCESS },
-       { "PRINTER_READ", PRINTER_READ },
-       { "PRINTER_WRITE", PRINTER_WRITE },
-       { "PRINTER_EXECUTE", PRINTER_EXECUTE },
-       { "PRINTER_ACCESS_ADMINISTER", PRINTER_ACCESS_ADMINISTER },
-       { "PRINTER_ACCESS_USE", PRINTER_ACCESS_USE },
-       { "JOB_ACCESS_ADMINISTER", JOB_ACCESS_ADMINISTER },
-       { "JOB_ALL_ACCESS", JOB_ALL_ACCESS },
-       { "JOB_READ", JOB_READ },
-       { "JOB_WRITE", JOB_WRITE },
-       { "JOB_EXECUTE", JOB_EXECUTE },
-       { "STANDARD_RIGHTS_ALL_ACCESS", STANDARD_RIGHTS_ALL_ACCESS },
-       { "STANDARD_RIGHTS_EXECUTE_ACCESS", STANDARD_RIGHTS_EXECUTE_ACCESS },
-       { "STANDARD_RIGHTS_READ_ACCESS", STANDARD_RIGHTS_READ_ACCESS },
-       { "STANDARD_RIGHTS_REQUIRED_ACCESS", STANDARD_RIGHTS_REQUIRED_ACCESS },
-       { "STANDARD_RIGHTS_WRITE_ACCESS", STANDARD_RIGHTS_WRITE_ACCESS },
-
-       /* Printer enumeration flags */
-
-       { "PRINTER_ENUM_DEFAULT", PRINTER_ENUM_DEFAULT },
-       { "PRINTER_ENUM_LOCAL", PRINTER_ENUM_LOCAL },
-       { "PRINTER_ENUM_CONNECTIONS", PRINTER_ENUM_CONNECTIONS },
-       { "PRINTER_ENUM_FAVORITE", PRINTER_ENUM_FAVORITE },
-       { "PRINTER_ENUM_NAME", PRINTER_ENUM_NAME },
-       { "PRINTER_ENUM_REMOTE", PRINTER_ENUM_REMOTE },
-       { "PRINTER_ENUM_SHARED", PRINTER_ENUM_SHARED },
-       { "PRINTER_ENUM_NETWORK", PRINTER_ENUM_NETWORK },
-
-       /* Form types */
-
-       { "FORM_USER", FORM_USER },
-       { "FORM_BUILTIN", FORM_BUILTIN },
-       { "FORM_PRINTER", FORM_PRINTER },
-
-       /* WERRORs */
-
-       { "WERR_OK", 0 },
-       { "WERR_BADFILE", 2 },
-       { "WERR_ACCESS_DENIED", 5 },
-       { "WERR_BADFID", 6 },
-       { "WERR_BADFUNC", 1 },
-       { "WERR_INSUFFICIENT_BUFFER", 122 },
-       { "WERR_NO_SUCH_SHARE", 67 },
-       { "WERR_ALREADY_EXISTS", 80 },
-       { "WERR_INVALID_PARAM", 87 },
-       { "WERR_NOT_SUPPORTED", 50 },
-       { "WERR_BAD_PASSWORD", 86 },
-       { "WERR_NOMEM", 8 },
-       { "WERR_INVALID_NAME", 123 },
-       { "WERR_UNKNOWN_LEVEL", 124 },
-       { "WERR_OBJECT_PATH_INVALID", 161 },
-       { "WERR_NO_MORE_ITEMS", 259 },
-       { "WERR_MORE_DATA", 234 },
-       { "WERR_UNKNOWN_PRINTER_DRIVER", 1797 },
-       { "WERR_INVALID_PRINTER_NAME", 1801 },
-       { "WERR_PRINTER_ALREADY_EXISTS", 1802 },
-       { "WERR_INVALID_DATATYPE", 1804 },
-       { "WERR_INVALID_ENVIRONMENT", 1805 },
-       { "WERR_INVALID_FORM_NAME", 1902 },
-       { "WERR_INVALID_FORM_SIZE", 1903 },
-       { "WERR_BUF_TOO_SMALL", 2123 },
-       { "WERR_JOB_NOT_FOUND", 2151 },
-       { "WERR_DEST_NOT_FOUND", 2152 },
-       { "WERR_NOT_LOCAL_DOMAIN", 2320 },
-       { "WERR_PRINTER_DRIVER_IN_USE", 3001 },
-       { "WERR_STATUS_MORE_ENTRIES  ", 0x0105 },
-
-       /* Job control constants */
-
-       { "JOB_CONTROL_PAUSE", JOB_CONTROL_PAUSE },
-       { "JOB_CONTROL_RESUME", JOB_CONTROL_RESUME },
-       { "JOB_CONTROL_CANCEL", JOB_CONTROL_CANCEL },
-       { "JOB_CONTROL_RESTART", JOB_CONTROL_RESTART },
-       { "JOB_CONTROL_DELETE", JOB_CONTROL_DELETE },
-
-       { NULL },
-};
-
-static void const_init(PyObject *dict)
-{
-       struct const_vals *tmp;
-       PyObject *obj;
-
-       for (tmp = module_const_vals; tmp->name; tmp++) {
-               obj = PyInt_FromLong(tmp->value);
-               PyDict_SetItemString(dict, tmp->name, obj);
-               Py_DECREF(obj);
-       }
-}
-
-/* Module initialisation */
-
-void initspoolss(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-       module = Py_InitModule("spoolss", spoolss_methods);
-       dict = PyModule_GetDict(module);
-
-       /* Exceptions we can raise */
-
-       spoolss_error = PyErr_NewException("spoolss.error", NULL, NULL);
-       PyDict_SetItemString(dict, "error", spoolss_error);
-
-       spoolss_werror = PyErr_NewException("spoolss.werror", NULL, NULL);
-       PyDict_SetItemString(dict, "werror", spoolss_werror);
-
-       /* Initialise policy handle object */
-
-       spoolss_policy_hnd_type.ob_type = &PyType_Type;
-
-       PyDict_SetItemString(dict, "spoolss.hnd", 
-                            (PyObject *)&spoolss_policy_hnd_type);
-
-       /* Initialise constants */
-
-       const_init(dict);
-
-       /* Do samba initialisation */
-
-       py_samba_init();
-}
diff --git a/source3/python/py_spoolss.h b/source3/python/py_spoolss.h
deleted file mode 100644 (file)
index 3988bc6..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_SPOOLSS_H
-#define _PY_SPOOLSS_H
-
-#include "python/py_common.h"
-
-/* Spoolss policy handle object */
-
-typedef struct {
-       PyObject_HEAD
-       struct rpc_pipe_client *cli;
-       TALLOC_CTX *mem_ctx;
-       POLICY_HND pol;
-} spoolss_policy_hnd_object;
-     
-/* Exceptions raised by this module */
-
-extern PyTypeObject spoolss_policy_hnd_type;
-
-extern PyObject *spoolss_error, *spoolss_werror;
-
-/* The following definitions come from python/py_spoolss_common.c */
-
-PyObject *new_spoolss_policy_hnd_object(struct cli_state *cli, 
-                                       TALLOC_CTX *mem_ctx, POLICY_HND *pol);
-
-/* The following definitions come from python/py_spoolss_drivers.c  */
-
-PyObject *spoolss_enumprinterdrivers(PyObject *self, PyObject *args,
-                                    PyObject *kw);
-PyObject *spoolss_hnd_getprinterdriver(PyObject *self, PyObject *args,
-                                  PyObject *kw);
-PyObject *spoolss_getprinterdriverdir(PyObject *self, PyObject *args, 
-                                     PyObject *kw);
-PyObject *spoolss_addprinterdriver(PyObject *self, PyObject *args,
-                                  PyObject *kw);
-PyObject *spoolss_addprinterdriverex(PyObject *self, PyObject *args,
-                                            PyObject *kw);
-PyObject *spoolss_deleteprinterdriver(PyObject *self, PyObject *args,
-                                     PyObject *kw);
-PyObject *spoolss_deleteprinterdriverex(PyObject *self, PyObject *args,
-                                       PyObject *kw);
-
-/* The following definitions come from python/py_spoolss_drivers_conv.c  */
-
-BOOL py_from_DRIVER_INFO_1(PyObject **dict, DRIVER_INFO_1 *info);
-BOOL py_to_DRIVER_INFO_1(DRIVER_INFO_1 *info, PyObject *dict);
-BOOL py_from_DRIVER_INFO_2(PyObject **dict, DRIVER_INFO_2 *info);
-BOOL py_to_DRIVER_INFO_2(DRIVER_INFO_2 *info, PyObject *dict);
-BOOL py_from_DRIVER_INFO_3(PyObject **dict, DRIVER_INFO_3 *info);
-BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict,
-                        TALLOC_CTX *mem_ctx);
-BOOL py_from_DRIVER_INFO_6(PyObject **dict, DRIVER_INFO_6 *info);
-BOOL py_to_DRIVER_INFO_6(DRIVER_INFO_6 *info, PyObject *dict);
-BOOL py_from_DRIVER_DIRECTORY_1(PyObject **dict, DRIVER_DIRECTORY_1 *info);
-BOOL py_to_DRIVER_DIRECTORY_1(DRIVER_DIRECTORY_1 *info, PyObject *dict);
-
-/* The following definitions come from python/py_spoolss_forms.c  */
-
-PyObject *spoolss_hnd_addform(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_getform(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_setform(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_deleteform(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_enumforms(PyObject *self, PyObject *args, PyObject *kw);
-
-/* The following definitions come from python/py_spoolss_forms_conv.c  */
-
-BOOL py_from_FORM_1(PyObject **dict, FORM_1 *form);
-BOOL py_to_FORM(FORM *form, PyObject *dict);
-
-/* The following definitions come from python/py_spoolss_jobs.c  */
-
-PyObject *spoolss_hnd_enumjobs(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_setjob(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_getjob(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_startpageprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_endpageprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_startdocprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_enddocprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_writeprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_addjob(PyObject *self, PyObject *args, PyObject *kw);
-
-/* The following definitions come from python/py_spoolss_jobs_conv.c  */
-
-BOOL py_from_JOB_INFO_1(PyObject **dict, JOB_INFO_1 *info);
-BOOL py_to_JOB_INFO_1(JOB_INFO_1 *info, PyObject *dict);
-BOOL py_from_JOB_INFO_2(PyObject **dict, JOB_INFO_2 *info);
-BOOL py_to_JOB_INFO_2(JOB_INFO_2 *info, PyObject *dict);
-BOOL py_from_DOC_INFO_1(PyObject **dict, DOC_INFO_1 *info);
-BOOL py_to_DOC_INFO_1(DOC_INFO_1 *info, PyObject *dict);
-
-/* The following definitions come from python/py_spoolss_ports.c  */
-
-PyObject *spoolss_enumports(PyObject *self, PyObject *args, PyObject *kw);
-
-/* The following definitions come from python/py_spoolss_ports_conv.c  */
-
-BOOL py_from_PORT_INFO_1(PyObject **dict, PORT_INFO_1 *info);
-BOOL py_to_PORT_INFO_1(PORT_INFO_1 *info, PyObject *dict);
-BOOL py_from_PORT_INFO_2(PyObject **dict, PORT_INFO_2 *info);
-BOOL py_to_PORT_INFO_2(PORT_INFO_2 *info, PyObject *dict);
-
-/* The following definitions come from python/py_spoolss_printerdata.c  */
-
-PyObject *spoolss_hnd_getprinterdata(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_setprinterdata(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_enumprinterdata(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_deleteprinterdata(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_getprinterdataex(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_setprinterdataex(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_enumprinterdataex(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_deleteprinterdataex(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_enumprinterkey(PyObject *self, PyObject *args,
-                                    PyObject *kw);
-PyObject *spoolss_hnd_deleteprinterkey(PyObject *self, PyObject *args,
-                                      PyObject *kw);
-
-/* The following definitions come from python/py_spoolss_printers.c  */
-
-PyObject *spoolss_openprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_closeprinter(PyObject *self, PyObject *args);
-PyObject *spoolss_hnd_getprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_hnd_setprinter(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_enumprinters(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *spoolss_addprinterex(PyObject *self, PyObject *args, PyObject *kw);
-
-/* The following definitions come from python/py_spoolss_printers_conv.c  */
-
-BOOL py_from_DEVICEMODE(PyObject **dict, DEVICEMODE *devmode);
-BOOL py_to_DEVICEMODE(DEVICEMODE *devmode, PyObject *dict);
-BOOL py_from_PRINTER_INFO_0(PyObject **dict, PRINTER_INFO_0 *info);
-BOOL py_to_PRINTER_INFO_0(PRINTER_INFO_0 *info, PyObject *dict);
-BOOL py_from_PRINTER_INFO_1(PyObject **dict, PRINTER_INFO_1 *info);
-BOOL py_to_PRINTER_INFO_1(PRINTER_INFO_1 *info, PyObject *dict);
-BOOL py_from_PRINTER_INFO_2(PyObject **dict, PRINTER_INFO_2 *info);
-BOOL py_to_PRINTER_INFO_2(PRINTER_INFO_2 *info, PyObject *dict,
-                         TALLOC_CTX *mem_ctx);
-BOOL py_from_PRINTER_INFO_3(PyObject **dict, PRINTER_INFO_3 *info);
-BOOL py_to_PRINTER_INFO_3(PRINTER_INFO_3 *info, PyObject *dict,
-                         TALLOC_CTX *mem_ctx);
-
-#endif /* _PY_SPOOLSS_H */
diff --git a/source3/python/py_spoolss_common.c b/source3/python/py_spoolss_common.c
deleted file mode 100644 (file)
index 32cb0ca..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2003
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-
-PyObject *new_spoolss_policy_hnd_object(struct cli_state *cli, 
-                                       TALLOC_CTX *mem_ctx, POLICY_HND *pol)
-{
-       spoolss_policy_hnd_object *o;
-
-       o = PyObject_New(spoolss_policy_hnd_object, &spoolss_policy_hnd_type);
-
-       o->cli = cli;
-       o->mem_ctx = mem_ctx;
-       memcpy(&o->pol, pol, sizeof(POLICY_HND));
-
-       return (PyObject*)o;
-}
diff --git a/source3/python/py_spoolss_drivers.c b/source3/python/py_spoolss_drivers.c
deleted file mode 100644 (file)
index 7e84aa1..0000000
+++ /dev/null
@@ -1,405 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-
-/* Enumerate printer drivers */
-
-PyObject *spoolss_enumprinterdrivers(PyObject *self, PyObject *args,
-                                    PyObject *kw)
-{
-       WERROR werror;
-       PyObject *result = NULL, *creds = NULL;
-       PRINTER_DRIVER_CTR ctr;
-       int level = 1, i;
-       uint32 num_drivers;
-       char *arch = "Windows NT x86", *server, *errstr;
-       static char *kwlist[] = {"server", "level", "creds", "arch", NULL};
-       struct cli_state *cli = NULL;
-       TALLOC_CTX *mem_ctx = NULL;
-       
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|iOs", kwlist, &server, &level, &creds,
-                   &arch)) 
-               return NULL;
-       
-       if (server[0] != '\\' || server[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server += 2;
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       /* Call rpc function */
-       
-       if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
-               PyErr_SetString(spoolss_error, errstr);
-               free(errstr);
-               goto done;
-       }
-
-       if (!(mem_ctx = talloc_init("spoolss_enumprinterdrivers"))) {
-               PyErr_SetString(
-                       spoolss_error, "unable to init talloc context\n");
-               goto done;
-       }       
-
-       werror = rpccli_spoolss_enumprinterdrivers(
-               cli->pipe_list, mem_ctx, level, arch,
-               &num_drivers, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               goto done;
-       }
-
-       /* Return value */
-
-       switch (level) {
-       case 1:
-               result = PyDict_New();
-               
-               for (i = 0; i < num_drivers; i++) {
-                       PyObject *value;
-                       fstring name;
-                       
-                       rpcstr_pull(name, ctr.info1[i].name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_DRIVER_INFO_1(&value, &ctr.info1[i]);
-
-                       PyDict_SetItemString(result, name, value);
-               }
-               
-               break;
-       case 2: 
-               result = PyDict_New();
-
-               for(i = 0; i < num_drivers; i++) {
-                       PyObject *value;
-                       fstring name;
-
-                       rpcstr_pull(name, ctr.info2[i].name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_DRIVER_INFO_2(&value, &ctr.info2[i]);
-
-                       PyDict_SetItemString(result, name, value);
-               }
-
-               break;
-       case 3: 
-               result = PyDict_New();
-
-               for(i = 0; i < num_drivers; i++) {
-                       PyObject *value;
-                       fstring name;
-
-                       rpcstr_pull(name, ctr.info3[i].name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_DRIVER_INFO_3(&value, &ctr.info3[i]);
-
-                       PyDict_SetItemString(result, name, value);
-               }
-
-               break;
-       case 6: 
-               result = PyDict_New();
-
-               for(i = 0; i < num_drivers; i++) {
-                       PyObject *value;
-                       fstring name;
-
-                       rpcstr_pull(name, ctr.info6[i].name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_DRIVER_INFO_6(&value, &ctr.info6[i]);
-
-                       PyList_SetItem(result, i, value);
-               }
-
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unknown info level");
-               goto done;
-       }
-       
- done:
-       if (cli)
-               cli_shutdown(cli);
-
-       if (mem_ctx)
-               talloc_destroy(mem_ctx);
-
-       return result;
-}
-
-/* Fetch printer driver */
-
-PyObject *spoolss_hnd_getprinterdriver(PyObject *self, PyObject *args,
-                                  PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *result = Py_None;
-       PRINTER_DRIVER_CTR ctr;
-       int level = 1;
-       char *arch = "Windows NT x86";
-       int version = 2;
-       static char *kwlist[] = {"level", "arch", NULL};
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "|is", kwlist, &level, &arch))
-               return NULL;
-
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_getprinterdriver(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, level, arch, version, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       /* Return value */
-       
-       switch (level) {
-       case 1:
-               py_from_DRIVER_INFO_1(&result, ctr.info1);
-               break;
-       case 2: 
-               py_from_DRIVER_INFO_2(&result, ctr.info2);
-               break;
-       case 3: 
-               py_from_DRIVER_INFO_3(&result, ctr.info3);
-               break;
-       case 6:
-               py_from_DRIVER_INFO_6(&result, ctr.info6);
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               return NULL;
-       }
-       
-       Py_INCREF(result);
-       return result;
-}
-
-/* Fetch printer driver directory */
-
-PyObject *spoolss_getprinterdriverdir(PyObject *self, PyObject *args, 
-                                     PyObject *kw)
-{
-       WERROR werror;
-       PyObject *result = NULL, *creds = NULL;
-       DRIVER_DIRECTORY_CTR ctr;
-       uint32 level = 1;
-       char *arch = "Windows NT x86", *server, *errstr;
-       static char *kwlist[] = {"server", "level", "arch", "creds", NULL};
-       struct cli_state *cli = NULL;
-       TALLOC_CTX *mem_ctx = NULL;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|isO", kwlist, &server, &level,
-                   &arch, &creds))
-               return NULL;
-
-       if (server[0] != '\\' || server[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server += 2;
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       /* Call rpc function */
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
-               PyErr_SetString(spoolss_error, errstr);
-               free(errstr);
-               goto done;
-       }
-       
-       if (!(mem_ctx = talloc_init("spoolss_getprinterdriverdir"))) {
-               PyErr_SetString(
-                       spoolss_error, "unable to init talloc context\n");
-               goto done;
-       }       
-
-       werror = rpccli_spoolss_getprinterdriverdir(
-               cli->pipe_list, mem_ctx, level, arch, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               goto done;
-       }
-
-       /* Return value */
-       
-       switch (level) {
-       case 1:
-               py_from_DRIVER_DIRECTORY_1(&result, ctr.info1);
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unknown info level");
-               goto done;      
-       }
-       
- done:
-       if (cli)
-               cli_shutdown(cli);
-       
-       if (mem_ctx)
-               talloc_destroy(mem_ctx);
-
-       return result;
-}
-
-PyObject *spoolss_addprinterdriver(PyObject *self, PyObject *args,
-                                  PyObject *kw)
-{
-       static char *kwlist[] = { "server", "info", "creds", NULL };
-       char *server, *errstr;
-       uint32 level;
-       PyObject *info, *result = NULL, *creds = NULL;
-       WERROR werror;
-       TALLOC_CTX *mem_ctx = NULL;
-       struct cli_state *cli = NULL;
-       PRINTER_DRIVER_CTR ctr;
-       union {
-               DRIVER_INFO_3 driver_3;
-       } dinfo;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "sO!|O", kwlist, &server, &PyDict_Type,
-                   &info, &creds))
-               return NULL;
-       
-       if (server[0] == '\\' || server[1] == '\\')
-               server += 2;
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       if (!(mem_ctx = talloc_init("spoolss_addprinterdriver"))) {
-               PyErr_SetString(
-                       spoolss_error, "unable to init talloc context\n");
-               return NULL;
-       }
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
-               PyErr_SetString(spoolss_error, errstr);
-               free(errstr);
-               goto done;
-       }
-
-       if (!get_level_value(info, &level)) {
-               PyErr_SetString(spoolss_error, "invalid info level");
-               goto done;
-       }
-
-       if (level != 3) {
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               goto done;
-       }
-
-       ZERO_STRUCT(ctr);
-       ZERO_STRUCT(dinfo);
-
-       switch(level) {
-       case 3:
-               ctr.info3 = &dinfo.driver_3;
-
-               if (!py_to_DRIVER_INFO_3(&dinfo.driver_3, info, mem_ctx)) {
-                       PyErr_SetString(spoolss_error,
-                                       "error converting to driver info 3");
-                       goto done;
-               }
-
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               goto done;
-       }
-
-       werror = rpccli_spoolss_addprinterdriver(cli->pipe_list, mem_ctx, level, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               goto done;
-       }
-
-       Py_INCREF(Py_None);
-       result = Py_None;
-
-done:
-       if (cli)
-               cli_shutdown(cli);
-
-       if (mem_ctx)
-               talloc_destroy(mem_ctx);
-       
-       return result;
-       
-}
-
-PyObject *spoolss_addprinterdriverex(PyObject *self, PyObject *args,
-                                            PyObject *kw)
-{
-       /* Not supported by Samba server */
-       
-       PyErr_SetString(spoolss_error, "Not implemented");
-       return NULL;
-}
-       
-PyObject *spoolss_deleteprinterdriver(PyObject *self, PyObject *args,
-                                     PyObject *kw)
-{
-       PyErr_SetString(spoolss_error, "Not implemented");
-       return NULL;
-}
-
-PyObject *spoolss_deleteprinterdriverex(PyObject *self, PyObject *args,
-                                       PyObject *kw)
-{
-       PyErr_SetString(spoolss_error, "Not implemented");
-       return NULL;
-}
diff --git a/source3/python/py_spoolss_drivers_conv.c b/source3/python/py_spoolss_drivers_conv.c
deleted file mode 100644 (file)
index 6d5ed4d..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-#include "python/py_conv.h"
-
-/* Structure/hash conversions */
-
-struct pyconv py_DRIVER_INFO_1[] = {
-       { "name", PY_UNISTR, offsetof(DRIVER_INFO_1, name) },
-       { NULL }
-};
-
-struct pyconv py_DRIVER_INFO_2[] = {
-       { "version", PY_UINT32, offsetof(DRIVER_INFO_2, version) },
-       { "name", PY_UNISTR, offsetof(DRIVER_INFO_2, name) },
-       { "architecture", PY_UNISTR, offsetof(DRIVER_INFO_2, architecture) },
-       { "driver_path", PY_UNISTR, offsetof(DRIVER_INFO_2, driverpath) },
-       { "data_file", PY_UNISTR, offsetof(DRIVER_INFO_2, datafile) },
-       { "config_file", PY_UNISTR, offsetof(DRIVER_INFO_2, configfile) },
-       { NULL }
-};
-
-struct pyconv py_DRIVER_INFO_3[] = {
-       { "version", PY_UINT32, offsetof(DRIVER_INFO_3, version) },
-       { "name", PY_UNISTR, offsetof(DRIVER_INFO_3, name) },
-       { "architecture", PY_UNISTR, offsetof(DRIVER_INFO_3, architecture) },
-       { "driver_path", PY_UNISTR, offsetof(DRIVER_INFO_3, driverpath) },
-       { "data_file", PY_UNISTR, offsetof(DRIVER_INFO_3, datafile) },
-       { "config_file", PY_UNISTR, offsetof(DRIVER_INFO_3, configfile) },
-       { "help_file", PY_UNISTR, offsetof(DRIVER_INFO_3, helpfile) },
-       { "monitor_name", PY_UNISTR, offsetof(DRIVER_INFO_3, monitorname) },
-       { "default_datatype", PY_UNISTR, offsetof(DRIVER_INFO_3, defaultdatatype) },
-       { NULL }
-};
-
-struct pyconv py_DRIVER_INFO_6[] = {
-       { "version", PY_UINT32, offsetof(DRIVER_INFO_6, version) },
-       { "name", PY_UNISTR, offsetof(DRIVER_INFO_6, name) },
-       { "architecture", PY_UNISTR, offsetof(DRIVER_INFO_6, architecture) },
-       { "driver_path", PY_UNISTR, offsetof(DRIVER_INFO_6, driverpath) },
-       { "data_file", PY_UNISTR, offsetof(DRIVER_INFO_6, datafile) },
-       { "config_file", PY_UNISTR, offsetof(DRIVER_INFO_6, configfile) },
-       { "help_file", PY_UNISTR, offsetof(DRIVER_INFO_6, helpfile) },
-       { "monitor_name", PY_UNISTR, offsetof(DRIVER_INFO_6, monitorname) },
-       { "default_datatype", PY_UNISTR, offsetof(DRIVER_INFO_6, defaultdatatype) },
-       /* driver_date */
-       { "padding", PY_UINT32, offsetof(DRIVER_INFO_6, padding) },
-       { "driver_version_low", PY_UINT32, offsetof(DRIVER_INFO_6, driver_version_low) },
-       { "driver_version_high", PY_UINT32, offsetof(DRIVER_INFO_6, driver_version_high) },
-       { "mfg_name", PY_UNISTR, offsetof(DRIVER_INFO_6, mfgname) },
-       { "oem_url", PY_UNISTR, offsetof(DRIVER_INFO_6, oem_url) },
-       { "hardware_id", PY_UNISTR, offsetof(DRIVER_INFO_6, hardware_id) },
-       { "provider", PY_UNISTR, offsetof(DRIVER_INFO_6, provider) },
-       
-       { NULL }
-};
-
-struct pyconv py_DRIVER_DIRECTORY_1[] = {
-       { "name", PY_UNISTR, offsetof(DRIVER_DIRECTORY_1, name) },
-       { NULL }
-};
-
-static uint16 *to_dependentfiles(PyObject *list, TALLOC_CTX *mem_ctx)
-{
-       uint32 elements, size=0, pos=0, i;
-       char *str;
-       uint16 *ret = NULL;
-       PyObject *borrowedRef;
-
-       if (!PyList_Check(list)) {
-               goto done;
-       }
-
-       /* calculate size for dependentfiles */
-       elements=PyList_Size(list);
-       for (i = 0; i < elements; i++) {
-               borrowedRef=PyList_GetItem(list, i);
-               if (!PyString_Check(borrowedRef)) 
-                       /* non string found, return error */
-                       goto done;
-               size+=PyString_Size(borrowedRef)+1;
-       }
-
-       if (!(ret = (uint16*)_talloc(mem_ctx,((size+1)*sizeof(uint16)))))
-               goto done;
-
-       /* create null terminated sequence of null terminated strings */
-       for (i = 0; i < elements; i++) {
-               borrowedRef=PyList_GetItem(list, i);
-               str=PyString_AsString(borrowedRef);
-               do {
-                       if (pos >= size) {
-                               /* dependentfiles too small.  miscalculated? */
-                               ret = NULL;
-                               goto done;
-                       }
-                       SSVAL(&ret[pos], 0, str[0]);
-                       pos++;
-               } while (*(str++));
-       }
-       /* final null */
-       ret[pos]='\0';
-
-done:
-       return ret;     
-}
-
-BOOL py_from_DRIVER_INFO_1(PyObject **dict, DRIVER_INFO_1 *info)
-{
-       *dict = from_struct(info, py_DRIVER_INFO_1);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(1));
-
-       return True;
-}
-
-BOOL py_to_DRIVER_INFO_1(DRIVER_INFO_1 *info, PyObject *dict)
-{
-       return False;
-}
-
-BOOL py_from_DRIVER_INFO_2(PyObject **dict, DRIVER_INFO_2 *info)
-{
-       *dict = from_struct(info, py_DRIVER_INFO_2);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(2));
-
-       return True;
-}
-
-BOOL py_to_DRIVER_INFO_2(DRIVER_INFO_2 *info, PyObject *dict)
-{
-       return False;
-}
-
-BOOL py_from_DRIVER_INFO_3(PyObject **dict, DRIVER_INFO_3 *info)
-{
-       *dict = from_struct(info, py_DRIVER_INFO_3);
-
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(3));
-
-       PyDict_SetItemString(
-               *dict, "dependent_files", 
-               from_unistr_list(info->dependentfiles));
-
-       return True;
-}
-
-BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict,
-                        TALLOC_CTX *mem_ctx)
-{
-       PyObject *obj, *dict_copy = PyDict_Copy(dict);
-       BOOL result = False;
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "dependent_files")))
-               goto done;
-
-       if (!(info->dependentfiles = to_dependentfiles(obj, mem_ctx)))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "dependent_files");
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "level")) ||
-           !PyInt_Check(obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "level");
-
-       if (!to_struct(info, dict_copy, py_DRIVER_INFO_3))
-           goto done;
-
-       result = True;
-
-done:
-       Py_DECREF(dict_copy);
-       return result;
-}
-
-BOOL py_from_DRIVER_INFO_6(PyObject **dict, DRIVER_INFO_6 *info)
-{
-       *dict = from_struct(info, py_DRIVER_INFO_6);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(6));
-       PyDict_SetItemString(
-               *dict, "dependent_files", 
-               from_unistr_list(info->dependentfiles));
-       return True;
-}
-
-BOOL py_to_DRIVER_INFO_6(DRIVER_INFO_6 *info, PyObject *dict)
-{
-       return False;
-}
-
-BOOL py_from_DRIVER_DIRECTORY_1(PyObject **dict, DRIVER_DIRECTORY_1 *info)
-{
-       *dict = from_struct(info, py_DRIVER_DIRECTORY_1);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(1));
-       return True;
-}
-
-BOOL py_to_DRIVER_DIRECTORY_1(DRIVER_DIRECTORY_1 *info, PyObject *dict)
-{
-       return False;
-}
diff --git a/source3/python/py_spoolss_forms.c b/source3/python/py_spoolss_forms.c
deleted file mode 100644 (file)
index df2067a..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-
-/* Add a form */
-
-PyObject *spoolss_hnd_addform(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *info;
-       FORM form;
-       int level;
-       static char *kwlist[] = {"form", NULL};
-
-       /* Parse parameters */
-       
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyDict_Type, &info))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       if (!py_to_FORM(&form, info)) {
-               PyErr_SetString(spoolss_error, "invalid form");
-               return NULL;
-       }
-
-       if (!get_level_value(info, &level)) {
-               PyErr_SetString(spoolss_error, "invalid info level");
-               return NULL;
-       }
-
-       if (level != 1) {
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               return NULL;
-       }
-       
-       switch (level) {
-       case 1: {
-               PyObject *obj = PyDict_GetItemString(info, "name");
-               char *form_name = PyString_AsString(obj);
-
-               init_unistr2(&form.name, form_name, UNI_STR_TERMINATE);
-               break;
-       }
-       default:
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               return NULL;
-       }
-               
-       werror = rpccli_spoolss_addform(hnd->cli, hnd->mem_ctx, &hnd->pol,
-                                       level, &form);
-
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Get form properties */
-
-PyObject *spoolss_hnd_getform(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *result;
-       char *form_name;
-       int level = 1;
-       static char *kwlist[] = {"form_name", "level", NULL};
-       FORM_1 form;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|i", kwlist, &form_name, &level))
-               return NULL;
-       
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_getform(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, form_name, level, &form);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       result = Py_None;
-
-       switch(level) {
-       case 1:
-               py_from_FORM_1(&result, &form);
-               break;
-       }
-
-       Py_INCREF(result);
-       return result;
-}
-
-/* Set form properties */
-
-PyObject *spoolss_hnd_setform(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *info, *form_name;
-       int level;
-       static char *kwlist[] = { "form", NULL};
-       FORM form;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyDict_Type, &info))
-               return NULL;
-
-       if (!get_level_value(info, &level)) {
-               PyErr_SetString(spoolss_error, "invalid info level");
-               return NULL;
-       }
-
-       if (level != 1) {
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               return NULL;
-       }
-
-       /* Call rpc function */
-
-       if (!py_to_FORM(&form, info)) {
-               PyErr_SetString(spoolss_error, "invalid form");
-               return NULL;
-       }
-
-       form_name = PyDict_GetItemString(info, "name");
-
-       werror = rpccli_spoolss_setform(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, level, 
-               PyString_AsString(form_name), &form);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Delete a form */
-
-PyObject *spoolss_hnd_deleteform(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       static char *kwlist[] = {"form_name", NULL};
-       char *form_name;
-
-       /* Parse parameters */
-       
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s", kwlist, &form_name))
-               return NULL;
-       
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_deleteform(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, form_name);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Enumerate forms */
-
-PyObject *spoolss_hnd_enumforms(PyObject *self, PyObject *args, PyObject *kw)
-{
-       PyObject *result;
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       uint32 level = 1, num_forms, i;
-       static char *kwlist[] = {"level", NULL};
-       FORM_1 *forms;
-
-       /* Parse parameters */
-       
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "|i", kwlist, &level))
-               return NULL;
-       
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_enumforms(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, level, &num_forms, &forms);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       switch(level) {
-       case 1:
-               result = PyDict_New();
-
-               for (i = 0; i < num_forms; i++) {
-                       PyObject *value;
-                       fstring name;
-
-                       rpcstr_pull(name, forms[i].name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_FORM_1(&value, &forms[i]);
-
-                       PyDict_SetItemString(
-                               value, "level", PyInt_FromLong(1));
-
-                       PyDict_SetItemString(result, name, value);
-               }
-
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unknown info level");
-               return NULL;
-       }
-
-       return result;
-}
diff --git a/source3/python/py_spoolss_forms_conv.c b/source3/python/py_spoolss_forms_conv.c
deleted file mode 100644 (file)
index ae990a5..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-#include "python/py_conv.h"
-
-struct pyconv py_FORM[] = {
-       { "flags", PY_UINT32, offsetof(FORM, flags) },
-       { "width", PY_UINT32, offsetof(FORM, size_x) },
-       { "length", PY_UINT32, offsetof(FORM, size_y) },
-       { "top", PY_UINT32, offsetof(FORM, top) },
-       { "left", PY_UINT32, offsetof(FORM, left) },
-       { "right", PY_UINT32, offsetof(FORM, right) },
-       { "bottom", PY_UINT32, offsetof(FORM, bottom) },
-       { NULL }
-};
-
-struct pyconv py_FORM_1[] = {
-       { "flags", PY_UINT32, offsetof(FORM_1, flag) },
-       { "width", PY_UINT32, offsetof(FORM_1, width) },
-       { "length", PY_UINT32, offsetof(FORM_1, length) },
-       { "top", PY_UINT32, offsetof(FORM_1, top) },
-       { "left", PY_UINT32, offsetof(FORM_1, left) },
-       { "right", PY_UINT32, offsetof(FORM_1, right) },
-       { "bottom", PY_UINT32, offsetof(FORM_1, bottom) },
-       { "name", PY_UNISTR, offsetof(FORM_1, name) },
-       { NULL }
-};
-
-BOOL py_from_FORM_1(PyObject **dict, FORM_1 *form)
-{
-       *dict = from_struct(form, py_FORM_1);
-
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(1));
-
-       return True;
-}
-
-BOOL py_to_FORM(FORM *form, PyObject *dict)
-{
-       PyObject *obj, *dict_copy = PyDict_Copy(dict);
-       char *name;
-       BOOL result = False;
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "name")) || 
-           !PyString_Check(obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "name");
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "level")) ||
-           !PyInt_Check(obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "level");
-
-       if (!to_struct(form, dict_copy, py_FORM))
-               goto done;
-
-       /* Careful!  We can't call PyString_AsString(obj) then delete
-          obj and still expect to have our pointer pointing somewhere
-          useful. */
-
-       obj = PyDict_GetItemString(dict, "name");
-       name = PyString_AsString(obj);
-
-       init_unistr2(&form->name, name, UNI_STR_TERMINATE);
-       
-       result = True;
-
-done:
-       Py_DECREF(dict_copy);
-       return result;
-}
diff --git a/source3/python/py_spoolss_jobs.c b/source3/python/py_spoolss_jobs.c
deleted file mode 100644 (file)
index 3c16002..0000000
+++ /dev/null
@@ -1,367 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-
-/* Enumerate jobs */
-
-PyObject *spoolss_hnd_enumjobs(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *result;
-       int level = 1;
-       uint32 i, num_jobs;
-       static char *kwlist[] = {"level", NULL};
-       JOB_INFO_CTR ctr;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "|i", kwlist, &level))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_enumjobs(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, level, 0, 1000, 
-               &num_jobs, &ctr);
-
-       /* Return value */
-       
-       result = Py_None;
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               goto done;
-       }
-
-       result = PyList_New(num_jobs);
-
-       switch (level) {
-       case 1: 
-               for (i = 0; i < num_jobs; i++) {
-                       PyObject *value;
-
-                       py_from_JOB_INFO_1(&value, &ctr.job.job_info_1[i]);
-
-                       PyList_SetItem(result, i, value);
-               }
-
-               break;
-       case 2:
-               for(i = 0; i < num_jobs; i++) {
-                       PyObject *value;
-
-                       py_from_JOB_INFO_2(&value, &ctr.job.job_info_2[i]);
-
-                       PyList_SetItem(result, i, value);
-               }
-               
-               break;
-       }
-
- done:
-       Py_INCREF(result);
-       return result;
-}
-
-/* Set job command */
-
-PyObject *spoolss_hnd_setjob(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       uint32 level = 0, command, jobid;
-       static char *kwlist[] = {"jobid", "command", "level", NULL};
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "ii|i", kwlist, &jobid, &command, &level))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_setjob(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, jobid, level, command);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-       
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Get job */
-
-PyObject *spoolss_hnd_getjob(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *result;
-       uint32 level = 1, jobid;
-       static char *kwlist[] = {"jobid", "level", NULL};
-       JOB_INFO_CTR ctr;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "i|i", kwlist, &jobid, &level))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_getjob(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, jobid, level, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       switch(level) {
-       case 1:
-               py_from_JOB_INFO_1(&result, &ctr.job.job_info_1[0]);
-               break;
-       case 2:
-               py_from_JOB_INFO_2(&result, &ctr.job.job_info_2[0]);
-               break;
-       }
-
-       return result;
-}
-
-/* Start page printer.  This notifies the spooler that a page is about to be
-   printed on the specified printer. */
-
-PyObject *spoolss_hnd_startpageprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       static char *kwlist[] = { NULL };
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_startpageprinter(
-               hnd->cli, hnd->mem_ctx, &hnd->pol);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-       
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* End page printer.  This notifies the spooler that a page has finished
-   being printed on the specified printer. */
-
-PyObject *spoolss_hnd_endpageprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       static char *kwlist[] = { NULL };
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_endpageprinter(
-               hnd->cli, hnd->mem_ctx, &hnd->pol);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-       
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Start doc printer.  This notifies the spooler that a document is about to be
-   printed on the specified printer. */
-
-PyObject *spoolss_hnd_startdocprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       static char *kwlist[] = { "document_info", NULL };
-       PyObject *info, *obj;
-       uint32 level, jobid;
-       char *document_name = NULL, *output_file = NULL, *data_type = NULL;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyDict_Type, &info))
-               return NULL;
-       
-       /* Check document_info parameter */
-
-       if (!get_level_value(info, &level)) {
-               PyErr_SetString(spoolss_error, "invalid info level");
-               return NULL;
-       }
-
-       if (level != 1) {
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               return NULL;
-       }
-
-       if ((obj = PyDict_GetItemString(info, "document_name"))) {
-
-               if (!PyString_Check(obj) && obj != Py_None) {
-                       PyErr_SetString(spoolss_error,
-                                       "document_name not a string");
-                       return NULL;
-               }
-               
-               if (PyString_Check(obj))
-                       document_name = PyString_AsString(obj);
-
-       } else {
-               PyErr_SetString(spoolss_error, "no document_name present");
-               return NULL;
-       }
-
-       if ((obj = PyDict_GetItemString(info, "output_file"))) {
-
-               if (!PyString_Check(obj) && obj != Py_None) {
-                       PyErr_SetString(spoolss_error,
-                                       "output_file not a string");
-                       return NULL;
-               }
-               
-               if (PyString_Check(obj))
-                       output_file = PyString_AsString(obj);
-
-       } else {
-               PyErr_SetString(spoolss_error, "no output_file present");
-               return NULL;
-       }
-
-       if ((obj = PyDict_GetItemString(info, "data_type"))) {
-               
-               if (!PyString_Check(obj) && obj != Py_None) {
-                       PyErr_SetString(spoolss_error,
-                                       "data_type not a string");
-                       return NULL;
-               }
-
-               if (PyString_Check(obj))
-                       data_type = PyString_AsString(obj);
-
-       } else {
-               PyErr_SetString(spoolss_error, "no data_type present");
-               return NULL;
-       }
-
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_startdocprinter(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, document_name,
-               output_file, data_type, &jobid);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-       
-       /* The return value is zero for an error (where does the status
-          code come from now??) and the return value is the jobid
-          allocated for the new job. */
-
-       return Py_BuildValue("i", jobid);
-}
-
-/* End doc printer.  This notifies the spooler that a document has finished
-   being printed on the specified printer. */
-
-PyObject *spoolss_hnd_enddocprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       static char *kwlist[] = { NULL };
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_enddocprinter(
-               hnd->cli, hnd->mem_ctx, &hnd->pol);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-       
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Write data to a printer */
-
-PyObject *spoolss_hnd_writeprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       static char *kwlist[] = { "data", NULL };
-       PyObject *data;
-       uint32 num_written;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyString_Type, &data))
-               return NULL;
-       
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_writeprinter(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, PyString_Size(data),
-               PyString_AsString(data), &num_written);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-PyObject *spoolss_hnd_addjob(PyObject *self, PyObject *args, PyObject *kw)
-{
-       PyErr_SetString(spoolss_error, "Not implemented");
-       return NULL;
-}
diff --git a/source3/python/py_spoolss_jobs_conv.c b/source3/python/py_spoolss_jobs_conv.c
deleted file mode 100644 (file)
index efd3bfe..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-#include "python/py_conv.h"
-
-struct pyconv py_JOB_INFO_1[] = {
-       { "jobid", PY_UINT32, offsetof(JOB_INFO_1, jobid) },
-       { "printer_name", PY_UNISTR, offsetof(JOB_INFO_1, printername) },
-       { "server_name", PY_UNISTR, offsetof(JOB_INFO_1, machinename) },
-       { "user_name", PY_UNISTR, offsetof(JOB_INFO_1, username) },
-       { "document_name", PY_UNISTR, offsetof(JOB_INFO_1, document) },
-       { "data_type", PY_UNISTR, offsetof(JOB_INFO_1, datatype) },
-       { "text_status", PY_UNISTR, offsetof(JOB_INFO_1, text_status) },
-       { "status", PY_UINT32, offsetof(JOB_INFO_1, status) },
-       { "priority", PY_UINT32, offsetof(JOB_INFO_1, priority) },
-       { "position", PY_UINT32, offsetof(JOB_INFO_1, position) },
-       { "total_pages", PY_UINT32, offsetof(JOB_INFO_1, totalpages) },
-       { "pages_printed", PY_UINT32, offsetof(JOB_INFO_1, pagesprinted) },
-       { NULL }
-};
-
-struct pyconv py_JOB_INFO_2[] = {
-       { "jobid", PY_UINT32, offsetof(JOB_INFO_2, jobid) },
-       { "printer_name", PY_UNISTR, offsetof(JOB_INFO_2, printername) },
-       { "server_name", PY_UNISTR, offsetof(JOB_INFO_2, machinename) },
-       { "user_name", PY_UNISTR, offsetof(JOB_INFO_2, username) },
-       { "document_name", PY_UNISTR, offsetof(JOB_INFO_2, document) },
-       { "notify_name", PY_UNISTR, offsetof(JOB_INFO_2, notifyname) },
-       { "data_type", PY_UNISTR, offsetof(JOB_INFO_2, datatype) },
-       { "print_processor", PY_UNISTR, offsetof(JOB_INFO_2, printprocessor) },
-       { "parameters", PY_UNISTR, offsetof(JOB_INFO_2, parameters) },
-       { "driver_name", PY_UNISTR, offsetof(JOB_INFO_2, drivername) },
-       { "text_status", PY_UNISTR, offsetof(JOB_INFO_2, text_status) },
-       { "status", PY_UINT32, offsetof(JOB_INFO_2, status) },
-       { "priority", PY_UINT32, offsetof(JOB_INFO_2, priority) },
-       { "position", PY_UINT32, offsetof(JOB_INFO_2, position) },
-       { "start_time", PY_UINT32, offsetof(JOB_INFO_2, starttime) },
-       { "until_time", PY_UINT32, offsetof(JOB_INFO_2, untiltime) },
-       { "total_pages", PY_UINT32, offsetof(JOB_INFO_2, totalpages) },
-       { "size", PY_UINT32, offsetof(JOB_INFO_2, size) },
-       { "time_elapsed", PY_UINT32, offsetof(JOB_INFO_2, timeelapsed) },
-       { "pages_printed", PY_UINT32, offsetof(JOB_INFO_2, pagesprinted) },
-       { NULL }
-};
-
-struct pyconv py_DOC_INFO_1[] = {
-       { "document_name", PY_UNISTR, offsetof(DOC_INFO_1, docname) },
-       { "output_file", PY_UNISTR, offsetof(DOC_INFO_1, outputfile) },
-       { "data_type", PY_UNISTR, offsetof(DOC_INFO_1, datatype) },
-       { NULL }
-};
-
-BOOL py_from_JOB_INFO_1(PyObject **dict, JOB_INFO_1 *info)
-{
-       *dict = from_struct(info, py_JOB_INFO_1);
-       return True;
-}
-
-BOOL py_to_JOB_INFO_1(JOB_INFO_1 *info, PyObject *dict)
-{
-       return False;
-}
-
-BOOL py_from_JOB_INFO_2(PyObject **dict, JOB_INFO_2 *info)
-{
-       *dict = from_struct(info, py_JOB_INFO_2);
-       return True;
-}
-
-BOOL py_to_JOB_INFO_2(JOB_INFO_2 *info, PyObject *dict)
-{
-       return False;
-}
-
-BOOL py_from_DOC_INFO_1(PyObject **dict, DOC_INFO_1 *info)
-{
-       *dict = from_struct(info, py_DOC_INFO_1);
-       return True;
-}
-
-BOOL py_to_DOC_INFO_1(DOC_INFO_1 *info, PyObject *dict)
-{
-       return to_struct(info, dict, py_DOC_INFO_1);
-}
diff --git a/source3/python/py_spoolss_ports.c b/source3/python/py_spoolss_ports.c
deleted file mode 100644 (file)
index 8dad35b..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-
-/* Enumerate ports */
-
-PyObject *spoolss_enumports(PyObject *self, PyObject *args, PyObject *kw)
-{
-       WERROR werror;
-       PyObject *result = NULL, *creds = NULL;
-       uint32 level = 1;
-       uint32 i, needed, num_ports;
-       static char *kwlist[] = {"server", "level", "creds", NULL};
-       TALLOC_CTX *mem_ctx = NULL;
-       struct cli_state *cli = NULL;
-       char *server, *errstr;
-       PORT_INFO_CTR ctr;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|iO", kwlist, &server, &level, &creds))
-               return NULL;
-       
-       if (server[0] != '\\' || server[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server += 2;
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
-               PyErr_SetString(spoolss_error, errstr);
-               free(errstr);
-               goto done;
-       }
-
-       if (!(mem_ctx = talloc_init("spoolss_enumports"))) {
-               PyErr_SetString(
-                       spoolss_error, "unable to init talloc context\n");
-               goto done;
-       }
-
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_enum_ports( 
-               cli->pipe_list, mem_ctx, level, &num_ports, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               goto done;
-       }
-
-       /* Return value */
-       
-       switch (level) {
-       case 1: 
-               result = PyDict_New();
-
-               for (i = 0; i < num_ports; i++) {
-                       PyObject *value;
-                       fstring name;
-
-                       rpcstr_pull(name, ctr.port.info_1[i].port_name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_PORT_INFO_1(&value, &ctr.port.info_1[i]);
-
-                       PyDict_SetItemString(
-                               value, "level", PyInt_FromLong(1));
-
-                       PyDict_SetItemString(result, name, value);
-               }
-
-               break;
-       case 2:
-               result = PyDict_New();
-
-               for(i = 0; i < num_ports; i++) {
-                       PyObject *value;
-                       fstring name;
-
-                       rpcstr_pull(name, ctr.port.info_2[i].port_name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_PORT_INFO_2(&value, &ctr.port.info_2[i]);
-
-                       PyDict_SetItemString(
-                               value, "level", PyInt_FromLong(2));
-
-                       PyDict_SetItemString(result, name, value);
-               }
-               
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unknown info level");
-               goto done;
-       }
-
- done:
-       if (cli)
-               cli_shutdown(cli);
-       
-       if (mem_ctx)
-               talloc_destroy(mem_ctx);
-
-       return result;
-}
diff --git a/source3/python/py_spoolss_ports_conv.c b/source3/python/py_spoolss_ports_conv.c
deleted file mode 100644 (file)
index 5e40b94..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-#include "python/py_conv.h"
-
-struct pyconv py_PORT_INFO_1[] = {
-       { "name", PY_UNISTR, offsetof(PORT_INFO_1, port_name) },
-       { NULL }
-};
-
-struct pyconv py_PORT_INFO_2[] = {
-       { "name", PY_UNISTR, offsetof(PORT_INFO_2, port_name) },
-       { "monitor_name", PY_UNISTR, offsetof(PORT_INFO_2, monitor_name) },
-       { "description", PY_UNISTR, offsetof(PORT_INFO_2, description) },
-       { "reserved", PY_UINT32, offsetof(PORT_INFO_2, reserved) },
-       { "type", PY_UINT32, offsetof(PORT_INFO_2, port_type) },
-       { NULL }
-};     
-
-BOOL py_from_PORT_INFO_1(PyObject **dict, PORT_INFO_1 *info)
-{
-       *dict = from_struct(info, py_PORT_INFO_1);
-       return True;
-}
-
-BOOL py_to_PORT_INFO_1(PORT_INFO_1 *info, PyObject *dict)
-{
-       return False;
-}
-
-BOOL py_from_PORT_INFO_2(PyObject **dict, PORT_INFO_2 *info)
-{
-       *dict = from_struct(info, py_PORT_INFO_2);
-       return True;
-}
-
-BOOL py_to_PORT_INFO_2(PORT_INFO_2 *info, PyObject *dict)
-{
-       return False;
-}
diff --git a/source3/python/py_spoolss_printerdata.c b/source3/python/py_spoolss_printerdata.c
deleted file mode 100644 (file)
index 5faac0e..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-#include "python/py_conv.h"
-
-static BOOL py_from_printerdata(PyObject **dict, char *key, char *value,
-                               uint16 data_type, uint8 *data, 
-                               uint32 data_size) 
-{
-       *dict = PyDict_New();
-
-       PyDict_SetItemString(*dict, "key", Py_BuildValue("s", key ? key : ""));
-       PyDict_SetItemString(*dict, "value", Py_BuildValue("s", value));
-       PyDict_SetItemString(*dict, "type", Py_BuildValue("i", data_type));
-
-       PyDict_SetItemString(*dict, "data", 
-                            Py_BuildValue("s#", data, data_size));
-
-       return True;
-}
-
-static BOOL py_to_printerdata(char **key, char **value, uint16 *data_type, 
-                             uint8 **data, uint32 *data_size, 
-                             PyObject *dict)
-{
-       PyObject *obj;
-
-       if ((obj = PyDict_GetItemString(dict, "key"))) {
-
-               if (!PyString_Check(obj)) {
-                       PyErr_SetString(spoolss_error,
-                                       "key not a string");
-                       return False;
-               }
-
-               if (key) {
-                       *key = PyString_AsString(obj);
-
-                       if (!key[0])
-                               *key = NULL;
-               }
-       } else
-               *key = NULL;
-
-       if ((obj = PyDict_GetItemString(dict, "value"))) {
-
-               if (!PyString_Check(obj)) {
-                       PyErr_SetString(spoolss_error,
-                                       "value not a string");
-                       return False;
-               }
-
-               *value = PyString_AsString(obj);
-       } else {
-               PyErr_SetString(spoolss_error, "no value present");
-               return False;
-       }
-
-       if ((obj = PyDict_GetItemString(dict, "type"))) {
-
-               if (!PyInt_Check(obj)) {
-                       PyErr_SetString(spoolss_error,
-                                       "type not an integer");
-                       return False;
-               }
-
-               *data_type = PyInt_AsLong(obj);
-       } else {
-               PyErr_SetString(spoolss_error, "no type present");
-               return False;
-       }
-       
-       if ((obj = PyDict_GetItemString(dict, "data"))) {
-
-               if (!PyString_Check(obj)) {
-                       PyErr_SetString(spoolss_error,
-                                       "data not a string");
-                       return False;
-               }
-
-               *data = PyString_AsString(obj);
-               *data_size = PyString_Size(obj);
-       } else {
-               PyErr_SetString(spoolss_error, "no data present");
-               return False;
-       }
-
-       return True;
-}
-
-PyObject *spoolss_hnd_getprinterdata(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "value", NULL };
-       char *valuename;
-       WERROR werror;
-       PyObject *result;
-       REGISTRY_VALUE value;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &valuename))
-               return NULL;
-
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_getprinterdata(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, valuename,
-               &value);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       py_from_printerdata(
-               &result, NULL, valuename, value.type, value.data_p, 
-               value.size);
-
-       return result;
-}
-
-PyObject *spoolss_hnd_setprinterdata(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "data", NULL };
-       PyObject *py_data;
-       char *valuename;
-       WERROR werror;
-       REGISTRY_VALUE value;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyDict_Type, &py_data))
-               return NULL;
-       
-       if (!py_to_printerdata(
-                   NULL, &valuename, &value.type, &value.data_p, 
-                   &value.size, py_data))
-               return NULL;
-
-       fstrcpy(value.valuename, valuename);
-       
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_setprinterdata(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, &value);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-PyObject *spoolss_hnd_enumprinterdata(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { NULL };
-       uint32 data_needed, value_needed, ndx = 0;
-       WERROR werror;
-       PyObject *result;
-       REGISTRY_VALUE value;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
-               return NULL;
-
-       /* Get max buffer sizes for value and data */
-
-       werror = rpccli_spoolss_enumprinterdata(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, ndx, 0, 0,
-               &value_needed, &data_needed, NULL);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       /* Iterate over all printerdata */
-
-       result = PyDict_New();
-
-       while (W_ERROR_IS_OK(werror)) {
-               PyObject *obj;
-
-               werror = rpccli_spoolss_enumprinterdata(
-                       hnd->cli, hnd->mem_ctx, &hnd->pol, ndx,
-                       value_needed, data_needed, NULL, NULL, &value);
-
-               if (py_from_printerdata(
-                           &obj, NULL, value.valuename, value.type, 
-                           value.data_p, value.size))
-                       PyDict_SetItemString(result, value.valuename, obj);
-
-               ndx++;
-       }
-
-       return result;
-}
-
-PyObject *spoolss_hnd_deleteprinterdata(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "value", NULL };
-       char *value;
-       WERROR werror;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &value))
-               return NULL;
-
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_deleteprinterdata(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, value);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-PyObject *spoolss_hnd_getprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "key", "value", NULL };
-       char *key, *valuename;
-       WERROR werror;
-       PyObject *result;
-       REGISTRY_VALUE value;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "ss", kwlist, &key, &valuename))
-               return NULL;
-
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_getprinterdataex(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, key,
-               valuename, &value);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       py_from_printerdata(
-               &result, key, valuename, value.type, value.data_p, value.size);
-
-       return result;
-}
-
-PyObject *spoolss_hnd_setprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "data", NULL };
-       PyObject *py_data;
-       char *keyname, *valuename;
-       WERROR werror;
-       REGISTRY_VALUE value;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyDict_Type, &py_data))
-               return NULL;
-       
-       if (!py_to_printerdata(
-                   &keyname, &valuename, &value.type, &value.data_p, &value.size, py_data))
-               return NULL;
-
-       fstrcpy(value.valuename,  valuename);
-
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_setprinterdataex(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, keyname, &value);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-PyObject *spoolss_hnd_enumprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "key", NULL };
-       uint32 i;
-       char *key;
-       WERROR werror;
-       PyObject *result;
-       REGVAL_CTR *ctr;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &key))
-               return NULL;
-
-       if (!(ctr = TALLOC_ZERO_P(hnd->mem_ctx, REGVAL_CTR))) {
-               PyErr_SetString(spoolss_error, "talloc failed");
-               return NULL;
-       }
-
-       /* Get max buffer sizes for value and data */
-
-       werror = rpccli_spoolss_enumprinterdataex(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, key, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       /* Iterate over all printerdata */
-
-       result = PyDict_New();
-
-       for (i = 0; i < regval_ctr_numvals(&ctr); i++) {
-               REGISTRY_VALUE *value;
-               PyObject *item;
-
-               item = PyDict_New();
-               value = regval_ctr_specific_value(&ctr, i);
-
-               if (py_from_printerdata(
-                           &item, key, value->valuename, value->type, 
-                           value->data_p, value->size))
-                       PyDict_SetItemString(result, value->valuename, item);
-       }
-       
-       return result;
-}
-
-PyObject *spoolss_hnd_deleteprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "key", "value", NULL };
-       char *key, *value;
-       WERROR werror;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "ss", kwlist, &key, &value))
-               return NULL;
-
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_deleteprinterdataex(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, key, value);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-PyObject *spoolss_hnd_enumprinterkey(PyObject *self, PyObject *args,
-                                    PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "key", NULL };
-       char *keyname;
-       WERROR werror;
-       uint32 keylist_len;
-       uint16 *keylist;
-       PyObject *result;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &keyname))
-               return NULL;
-
-       /* Call rpc function */
-
-       werror = rpccli_spoolss_enumprinterkey(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, keyname, &keylist, 
-               &keylist_len);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       result = from_unistr_list(keylist);
-
-       return result;
-}
-
-#if 0
-
-PyObject *spoolss_hnd_deleteprinterkey(PyObject *self, PyObject *args,
-                                      PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       static char *kwlist[] = { "key", NULL };
-       char *keyname;
-       WERROR werror;
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &keyname))
-               return NULL;
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-#endif
diff --git a/source3/python/py_spoolss_printers.c b/source3/python/py_spoolss_printers.c
deleted file mode 100644 (file)
index 3064758..0000000
+++ /dev/null
@@ -1,463 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-
-/* Open a printer */
-
-PyObject *spoolss_openprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       char *unc_name, *server, *errstr;
-       TALLOC_CTX *mem_ctx = NULL;
-       POLICY_HND hnd;
-       WERROR werror;
-       PyObject *result = NULL, *creds = NULL;
-       static char *kwlist[] = { "printername", "creds", "access", NULL };
-       uint32 desired_access = MAXIMUM_ALLOWED_ACCESS;
-       struct cli_state *cli;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|Oi", kwlist, &unc_name, &creds,
-                   &desired_access))
-               return NULL;
-
-       if (unc_name[0] != '\\' || unc_name[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server = SMB_STRDUP(unc_name + 2);
-
-       if (strchr(server, '\\')) {
-               char *c = strchr(server, '\\');
-               *c = 0;
-       }
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
-               PyErr_SetString(spoolss_error, errstr);
-               free(errstr);
-               goto done;
-       }
-
-       if (!(mem_ctx = talloc_init("spoolss_openprinter"))) {
-               PyErr_SetString(spoolss_error, 
-                               "unable to init talloc context\n");
-               goto done;
-       }
-
-       werror = rpccli_spoolss_open_printer_ex(
-               cli->pipe_list, mem_ctx, unc_name, "", desired_access, server, 
-               "", &hnd);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               goto done;
-       }
-
-       result = new_spoolss_policy_hnd_object(cli, mem_ctx, &hnd);
-
- done:
-       if (!result) {
-               if (cli)
-                       cli_shutdown(cli);
-
-               if (mem_ctx)
-                       talloc_destroy(mem_ctx);
-       }
-
-       SAFE_FREE(server);
-
-       return result;
-}
-
-/* Close a printer */
-
-PyObject *spoolss_closeprinter(PyObject *self, PyObject *args)
-{
-       PyObject *po;
-       spoolss_policy_hnd_object *hnd;
-       WERROR result;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTuple(args, "O!", &spoolss_policy_hnd_type, &po))
-               return NULL;
-
-       hnd = (spoolss_policy_hnd_object *)po;
-
-       /* Call rpc function */
-
-       result = rpccli_spoolss_close_printer(
-               hnd->cli, hnd->mem_ctx, &hnd->pol);
-
-       /* Return value */
-
-       Py_INCREF(Py_None);
-       return Py_None; 
-}
-
-/* Fetch printer information */
-
-PyObject *spoolss_hnd_getprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *result = NULL;
-       PRINTER_INFO_CTR ctr;
-       int level = 1;
-       static char *kwlist[] = {"level", NULL};
-       
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "|i", kwlist, &level))
-               return NULL;
-       
-       ZERO_STRUCT(ctr);
-
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_getprinter(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, level, &ctr);
-
-       /* Return value */
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       result = Py_None;
-
-       switch (level) {
-               
-       case 0:
-               py_from_PRINTER_INFO_0(&result, ctr.printers_0);
-               break;
-
-       case 1:
-               py_from_PRINTER_INFO_1(&result, ctr.printers_1);
-               break;
-
-       case 2:
-               py_from_PRINTER_INFO_2(&result, ctr.printers_2);
-               break;
-
-       case 3:
-               py_from_PRINTER_INFO_3(&result, ctr.printers_3);
-               break;
-       }
-
-       Py_INCREF(result);
-       return result;
-}
-
-/* Set printer information */
-
-PyObject *spoolss_hnd_setprinter(PyObject *self, PyObject *args, PyObject *kw)
-{
-       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
-       WERROR werror;
-       PyObject *info;
-       PRINTER_INFO_CTR ctr;
-       uint32 level;
-       static char *kwlist[] = {"dict", NULL};
-       union {
-               PRINTER_INFO_1 printers_1;
-               PRINTER_INFO_2 printers_2;
-               PRINTER_INFO_3 printers_3;
-       } pinfo;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!", kwlist, &PyDict_Type, &info))
-               return NULL;
-       
-       if (!get_level_value(info, &level)) {
-               PyErr_SetString(spoolss_error, "invalid info level");
-               return NULL;
-       }
-
-       if (level < 1 && level > 3) {
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               return NULL;
-       }
-
-       /* Fill in printer info */
-
-       ZERO_STRUCT(ctr);
-
-       switch (level) {
-       case 1:
-               ctr.printers_1 = &pinfo.printers_1;
-
-               if (!py_to_PRINTER_INFO_1(ctr.printers_1, info)){
-                       PyErr_SetString(spoolss_error, 
-                                       "error converting printer to info 1");
-                       return NULL;
-               }
-
-               break;
-       case 2:
-               ctr.printers_2 = &pinfo.printers_2;
-
-               if (!py_to_PRINTER_INFO_2(ctr.printers_2, info,
-                                         hnd->mem_ctx)){
-                       PyErr_SetString(spoolss_error, 
-                                       "error converting printer to info 2");
-                       return NULL;
-               }
-
-               break;
-       case 3:
-               ctr.printers_3 = &pinfo.printers_3;
-
-               if (!py_to_PRINTER_INFO_3(ctr.printers_3, info,
-                                         hnd->mem_ctx)) {
-                       PyErr_SetString(spoolss_error,
-                                       "error converting to printer info 3");
-                       return NULL;
-               }
-
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unsupported info level");
-               return NULL;
-       }
-
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_setprinter(
-               hnd->cli, hnd->mem_ctx, &hnd->pol, level, &ctr, 0);
-
-       /* Return value */
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               return NULL;
-       }
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Enumerate printers */
-
-PyObject *spoolss_enumprinters(PyObject *self, PyObject *args, PyObject *kw)
-{
-       WERROR werror;
-       PyObject *result = NULL, *creds = NULL;
-       PRINTER_INFO_CTR ctr;
-       int level = 1, flags = PRINTER_ENUM_LOCAL, i;
-       uint32 num_printers;
-       static char *kwlist[] = {"server", "name", "level", "flags", 
-                                "creds", NULL};
-       TALLOC_CTX *mem_ctx = NULL;
-       struct cli_state *cli = NULL;
-       char *server, *errstr, *name = NULL;
-
-       /* Parse parameters */
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|siiO", kwlist, &server, &name, &level, 
-                   &flags, &creds))
-               return NULL;
-       
-       if (server[0] != '\\' || server[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server += 2;
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
-               PyErr_SetString(spoolss_error, errstr);
-               free(errstr);
-               goto done;
-       }
-
-       if (!(mem_ctx = talloc_init("spoolss_enumprinters"))) {
-               PyErr_SetString(
-                       spoolss_error, "unable to init talloc context\n");
-               goto done;
-       }
-
-       /* This RPC is weird.  By setting the server name to different
-          values we can get different behaviour.  If however the server
-          name is not specified, we default it to being the full server
-          name as this is probably what the caller intended.  To pass a
-          NULL name, pass a value of "" */
-
-       if (!name)
-               name = server;
-       else {
-               if (!name[0])
-                       name = NULL;
-       }
-
-       /* Call rpc function */
-       
-       werror = rpccli_spoolss_enum_printers(
-               cli->pipe_list, mem_ctx, name, flags, level, &num_printers, &ctr);
-
-       if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
-               goto done;
-       }
-
-       /* Return value */
-       
-       switch (level) {
-       case 0: 
-               result = PyDict_New();
-
-               for (i = 0; i < num_printers; i++) {
-                       PyObject *value;
-                       fstring s;
-
-                       rpcstr_pull(s, ctr.printers_0[i].printername.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_PRINTER_INFO_0(&value, &ctr.printers_0[i]);
-
-                       PyDict_SetItemString(
-                               value, "level", PyInt_FromLong(0));
-
-                       PyDict_SetItemString(result, s, value);
-               }
-
-               break;
-       case 1:
-               result = PyDict_New();
-
-               for(i = 0; i < num_printers; i++) {
-                       PyObject *value;
-                       fstring s;
-
-                       rpcstr_pull(s, ctr.printers_1[i].name.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_PRINTER_INFO_1(&value, &ctr.printers_1[i]);
-
-                       PyDict_SetItemString(
-                               value, "level", PyInt_FromLong(1));
-
-                       PyDict_SetItemString(result, s, value);
-               }
-               
-               break;
-       case 2:
-               result = PyDict_New();
-
-               for(i = 0; i < num_printers; i++) {
-                       PyObject *value;
-                       fstring s;
-
-                       rpcstr_pull(s, ctr.printers_2[i].printername.buffer,
-                                   sizeof(fstring), -1, STR_TERMINATE);
-
-                       py_from_PRINTER_INFO_2(&value, &ctr.printers_2[i]);
-
-                       PyDict_SetItemString(
-                               value, "level", PyInt_FromLong(2));
-
-                       PyDict_SetItemString(result, s, value);
-               }
-               
-               break;
-       default:
-               PyErr_SetString(spoolss_error, "unknown info level");
-               goto done;
-       }
-
-done:
-       if (cli)
-               cli_shutdown(cli);
-
-       if (mem_ctx)
-               talloc_destroy(mem_ctx);
-
-       return result;
-}
-
-/* Add a printer */
-
-PyObject *spoolss_addprinterex(PyObject *self, PyObject *args, PyObject *kw)
-{
-       static char *kwlist[] = { "server", "printername", "info", "creds", 
-                                 NULL};
-       char *printername, *server, *errstr;
-       PyObject *info, *result = NULL, *creds = NULL;
-       struct cli_state *cli = NULL;
-       TALLOC_CTX *mem_ctx = NULL;
-       PRINTER_INFO_CTR ctr;
-       PRINTER_INFO_2 info2;
-       WERROR werror;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "ssO!|O!", kwlist, &server, &printername,
-                   &PyDict_Type, &info, &PyDict_Type, &creds))
-               return NULL;
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
-               PyErr_SetString(spoolss_error, errstr);
-               free(errstr);
-               goto done;
-       }
-
-       if (!(mem_ctx = talloc_init("spoolss_addprinterex"))) {
-               PyErr_SetString(
-                       spoolss_error, "unable to init talloc context\n");
-               goto done;
-       }
-
-       if (!py_to_PRINTER_INFO_2(&info2, info, mem_ctx)) {
-               PyErr_SetString(spoolss_error,
-                               "error converting to printer info 2");
-               goto done;
-       }
-
-       ctr.printers_2 = &info2;
-
-       werror = rpccli_spoolss_addprinterex(cli->pipe_list, mem_ctx, 2, &ctr);
-
-       Py_INCREF(Py_None);
-       result = Py_None;
-
-done:
-       if (cli)
-               cli_shutdown(cli);
-
-       if (mem_ctx)
-               talloc_destroy(mem_ctx);
-
-       return result;
-}
diff --git a/source3/python/py_spoolss_printers_conv.c b/source3/python/py_spoolss_printers_conv.c
deleted file mode 100644 (file)
index 7c3f040..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_spoolss.h"
-#include "python/py_conv.h"
-
-struct pyconv py_PRINTER_INFO_0[] = {
-       { "name", PY_UNISTR, offsetof(PRINTER_INFO_0, printername) },
-       { "server_name", PY_UNISTR, offsetof(PRINTER_INFO_0, servername) },
-
-       { "cjobs", PY_UINT32, offsetof(PRINTER_INFO_0, cjobs) },
-       { "total_jobs", PY_UINT32, offsetof(PRINTER_INFO_0, total_jobs) },
-       { "total_bytes", PY_UINT32, offsetof(PRINTER_INFO_0, total_bytes) },
-
-       { "year", PY_UINT16, offsetof(PRINTER_INFO_0, year) },
-       { "month", PY_UINT16, offsetof(PRINTER_INFO_0, month) },
-       { "day_of_week", PY_UINT16, offsetof(PRINTER_INFO_0, dayofweek) },
-       { "day", PY_UINT16, offsetof(PRINTER_INFO_0, day) },
-       { "hour", PY_UINT16, offsetof(PRINTER_INFO_0, hour) },
-       { "minute", PY_UINT16, offsetof(PRINTER_INFO_0, minute) },
-       { "second", PY_UINT16, offsetof(PRINTER_INFO_0, second) },
-       { "milliseconds", PY_UINT16, offsetof(PRINTER_INFO_0, milliseconds) },
-
-       { "global_counter", PY_UINT32, offsetof(PRINTER_INFO_0, global_counter) },
-       { "total_pages", PY_UINT32, offsetof(PRINTER_INFO_0, total_pages) },
-
-       { "major_version", PY_UINT16, offsetof(PRINTER_INFO_0, major_version) },
-       { "build_version", PY_UINT16, offsetof(PRINTER_INFO_0, build_version) },
-
-       { "unknown7", PY_UINT32, offsetof(PRINTER_INFO_0, unknown7) },
-       { "unknown8", PY_UINT32, offsetof(PRINTER_INFO_0, unknown8) },
-       { "unknown9", PY_UINT32, offsetof(PRINTER_INFO_0, unknown9) },
-       { "session_counter", PY_UINT32, offsetof(PRINTER_INFO_0, session_counter)},
-       { "unknown11", PY_UINT32, offsetof(PRINTER_INFO_0, unknown11) },
-       { "printer_errors", PY_UINT32, offsetof(PRINTER_INFO_0, printer_errors) },
-       { "unknown13", PY_UINT32, offsetof(PRINTER_INFO_0, unknown13) },
-       { "unknown14", PY_UINT32, offsetof(PRINTER_INFO_0, unknown14) },
-       { "unknown15", PY_UINT32, offsetof(PRINTER_INFO_0, unknown15) },
-       { "unknown16", PY_UINT32, offsetof(PRINTER_INFO_0, unknown16) },
-       { "change_id", PY_UINT32, offsetof(PRINTER_INFO_0, change_id) },
-       { "unknown18", PY_UINT32, offsetof(PRINTER_INFO_0, unknown18) },
-       { "status", PY_UINT32, offsetof(PRINTER_INFO_0, status) },
-       { "unknown20", PY_UINT32, offsetof(PRINTER_INFO_0, unknown20) },
-       { "c_setprinter", PY_UINT32, offsetof(PRINTER_INFO_0, c_setprinter) },
-       { "unknown22", PY_UINT32, offsetof(PRINTER_INFO_0, unknown22) },
-       { "unknown23", PY_UINT32, offsetof(PRINTER_INFO_0, unknown23) },
-       { "unknown24", PY_UINT32, offsetof(PRINTER_INFO_0, unknown24) },
-       { "unknown25", PY_UINT32, offsetof(PRINTER_INFO_0, unknown25) },
-       { "unknown26", PY_UINT32, offsetof(PRINTER_INFO_0, unknown26) },
-       { "unknown27", PY_UINT32, offsetof(PRINTER_INFO_0, unknown27) },
-       { "unknown28", PY_UINT32, offsetof(PRINTER_INFO_0, unknown28) },
-       { "unknown29", PY_UINT32, offsetof(PRINTER_INFO_0, unknown29) },
-
-       { NULL }
-};     
-
-struct pyconv py_PRINTER_INFO_1[] = {
-       { "name", PY_UNISTR, offsetof(PRINTER_INFO_1, name) },
-       { "description", PY_UNISTR, offsetof(PRINTER_INFO_1, description) },
-       { "comment", PY_UNISTR, offsetof(PRINTER_INFO_1, comment) },
-       { "flags", PY_UINT32, offsetof(PRINTER_INFO_1, flags) },
-       { NULL }
-};     
-
-struct pyconv py_PRINTER_INFO_2[] = {
-       { "server_name", PY_UNISTR, offsetof(PRINTER_INFO_2, servername) },
-       { "name", PY_UNISTR, offsetof(PRINTER_INFO_2, printername) },
-       { "share_name", PY_UNISTR, offsetof(PRINTER_INFO_2, sharename) },
-       { "port_name", PY_UNISTR, offsetof(PRINTER_INFO_2, portname) },
-       { "driver_name", PY_UNISTR, offsetof(PRINTER_INFO_2, drivername) },
-       { "comment", PY_UNISTR, offsetof(PRINTER_INFO_2, comment) },
-       { "location", PY_UNISTR, offsetof(PRINTER_INFO_2, location) },
-       { "datatype", PY_UNISTR, offsetof(PRINTER_INFO_2, datatype) },
-       { "sepfile", PY_UNISTR, offsetof(PRINTER_INFO_2, sepfile) },
-       { "print_processor", PY_UNISTR, offsetof(PRINTER_INFO_2, printprocessor) },
-       { "parameters", PY_UNISTR, offsetof(PRINTER_INFO_2, parameters) },
-       { "attributes", PY_UINT32, offsetof(PRINTER_INFO_2, attributes) },
-       { "default_priority", PY_UINT32, offsetof(PRINTER_INFO_2, defaultpriority) },
-       { "priority", PY_UINT32, offsetof(PRINTER_INFO_2, priority) },
-       { "start_time", PY_UINT32, offsetof(PRINTER_INFO_2, starttime) },
-       { "until_time", PY_UINT32, offsetof(PRINTER_INFO_2, untiltime) },
-       { "status", PY_UINT32, offsetof(PRINTER_INFO_2, status) },
-       { "cjobs", PY_UINT32, offsetof(PRINTER_INFO_2, cjobs) },
-       { "average_ppm", PY_UINT32, offsetof(PRINTER_INFO_2, averageppm) },
-       { NULL }
-};     
-
-struct pyconv py_PRINTER_INFO_3[] = {
-       { "flags", PY_UINT32, offsetof(PRINTER_INFO_3, flags) },
-       { NULL }
-};     
-
-struct pyconv py_DEVICEMODE[] = {
-       { "device_name", PY_UNISTR, offsetof(DEVICEMODE, devicename) },
-       { "spec_version", PY_UINT16, offsetof(DEVICEMODE, specversion) },
-       { "driver_version", PY_UINT16, offsetof(DEVICEMODE, driverversion) },
-       { "size", PY_UINT16, offsetof(DEVICEMODE, size) },
-       { "fields", PY_UINT16, offsetof(DEVICEMODE, fields) },
-       { "orientation", PY_UINT16, offsetof(DEVICEMODE, orientation) },
-       { "paper_size", PY_UINT16, offsetof(DEVICEMODE, papersize) },
-       { "paper_width", PY_UINT16, offsetof(DEVICEMODE, paperwidth) },
-       { "paper_length", PY_UINT16, offsetof(DEVICEMODE, paperlength) },
-       { "scale", PY_UINT16, offsetof(DEVICEMODE, scale) },
-       { "copies", PY_UINT16, offsetof(DEVICEMODE, copies) },
-       { "default_source", PY_UINT16, offsetof(DEVICEMODE, defaultsource) },
-       { "print_quality", PY_UINT16, offsetof(DEVICEMODE, printquality) },
-       { "color", PY_UINT16, offsetof(DEVICEMODE, color) },
-       { "duplex", PY_UINT16, offsetof(DEVICEMODE, duplex) },
-       { "y_resolution", PY_UINT16, offsetof(DEVICEMODE, yresolution) },
-       { "tt_option", PY_UINT16, offsetof(DEVICEMODE, ttoption) },
-       { "collate", PY_UINT16, offsetof(DEVICEMODE, collate) },
-       { "form_name", PY_UNISTR, offsetof(DEVICEMODE, formname) },
-       { "log_pixels", PY_UINT16, offsetof(DEVICEMODE, logpixels) },
-       { "bits_per_pel", PY_UINT32, offsetof(DEVICEMODE, bitsperpel) },
-       { "pels_width", PY_UINT32, offsetof(DEVICEMODE, pelswidth) },
-       { "pels_height", PY_UINT32, offsetof(DEVICEMODE, pelsheight) },
-       { "display_flags", PY_UINT32, offsetof(DEVICEMODE, displayflags) },
-       { "display_frequency", PY_UINT32, offsetof(DEVICEMODE, displayfrequency) },
-       { "icm_method", PY_UINT32, offsetof(DEVICEMODE, icmmethod) },
-       { "icm_intent", PY_UINT32, offsetof(DEVICEMODE, icmintent) },
-       { "media_type", PY_UINT32, offsetof(DEVICEMODE, mediatype) },
-       { "dither_type", PY_UINT32, offsetof(DEVICEMODE, dithertype) },
-       { "reserved1", PY_UINT32, offsetof(DEVICEMODE, reserved1) },
-       { "reserved2", PY_UINT32, offsetof(DEVICEMODE, reserved2) },
-       { "panning_width", PY_UINT32, offsetof(DEVICEMODE, panningwidth) },
-       { "panning_height", PY_UINT32, offsetof(DEVICEMODE, panningheight) },
-       { NULL }
-};
-
-/*
- * Convert between DEVICEMODE and Python
- */
-
-BOOL py_from_DEVICEMODE(PyObject **dict, DEVICEMODE *devmode)
-{
-       *dict = from_struct(devmode, py_DEVICEMODE);
-
-       PyDict_SetItemString(*dict, "private",
-                            PyString_FromStringAndSize(
-                                    devmode->dev_private, devmode->driverextra));
-
-       return True;
-}
-
-BOOL py_to_DEVICEMODE(DEVICEMODE *devmode, PyObject *dict)
-{
-       PyObject *obj, *dict_copy = PyDict_Copy(dict);
-       BOOL result = False;
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "private")))
-               goto done;
-
-       if (!PyString_Check(obj))
-               goto done;
-
-       devmode->dev_private = PyString_AsString(obj);
-       devmode->driverextra = PyString_Size(obj);
-
-       PyDict_DelItemString(dict_copy, "private");
-
-       if (!to_struct(devmode, dict_copy, py_DEVICEMODE))
-               goto done;
-
-       result = True;
-
-done:
-       Py_DECREF(dict_copy);
-       return result;
-}
-
-/*
- * Convert between PRINTER_INFO_0 and Python 
- */
-
-BOOL py_from_PRINTER_INFO_0(PyObject **dict, PRINTER_INFO_0 *info)
-{
-       *dict = from_struct(info, py_PRINTER_INFO_0);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(0));
-       return True;
-}
-
-BOOL py_to_PRINTER_INFO_0(PRINTER_INFO_0 *info, PyObject *dict)
-{
-       return False;
-}
-
-/*
- * Convert between PRINTER_INFO_1 and Python 
- */
-
-BOOL py_from_PRINTER_INFO_1(PyObject **dict, PRINTER_INFO_1 *info)
-{
-       *dict = from_struct(info, py_PRINTER_INFO_1);
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(1));
-       return True;
-}
-
-BOOL py_to_PRINTER_INFO_1(PRINTER_INFO_1 *info, PyObject *dict)
-{
-       PyObject *obj, *dict_copy = PyDict_Copy(dict);
-       BOOL result = False;
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "level")) ||
-           !PyInt_Check(obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "level");
-
-       if (!to_struct(info, dict_copy, py_PRINTER_INFO_1))
-               goto done;
-
-       result = True;
-
-done:
-       Py_DECREF(dict_copy);
-       return result;
-}
-
-/*
- * Convert between PRINTER_INFO_2 and Python 
- */
-
-BOOL py_from_PRINTER_INFO_2(PyObject **dict, PRINTER_INFO_2 *info)
-{
-       PyObject *obj;
-
-       *dict = from_struct(info, py_PRINTER_INFO_2);
-
-       /* The security descriptor could be NULL */
-
-       if (info->secdesc) {
-               if (py_from_SECDESC(&obj, info->secdesc))
-                       PyDict_SetItemString(*dict, "security_descriptor", obj);
-       }
-
-       /* Bong!  The devmode could be NULL */
-
-       if (info->devmode)
-               py_from_DEVICEMODE(&obj, info->devmode);
-       else
-               obj = PyDict_New();
-
-       PyDict_SetItemString(*dict, "device_mode", obj);
-
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(2));
-
-       return True;
-}
-
-BOOL py_to_PRINTER_INFO_2(PRINTER_INFO_2 *info, PyObject *dict,
-                         TALLOC_CTX *mem_ctx)
-{
-       PyObject *obj, *dict_copy = PyDict_Copy(dict);
-       BOOL result = False;
-
-       /* Convert security descriptor - may be NULL */
-
-       info->secdesc = NULL;
-
-       if ((obj = PyDict_GetItemString(dict_copy, "security_descriptor"))) {
-
-               if (!PyDict_Check(obj))
-                       goto done;
-
-               if (!py_to_SECDESC(&info->secdesc, obj, mem_ctx))
-                       goto done;
-
-               PyDict_DelItemString(dict_copy, "security_descriptor");
-       }
-
-       /* Convert device mode */
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "device_mode"))
-           || !PyDict_Check(obj))
-               goto done;
-
-       info->devmode = _talloc(mem_ctx, sizeof(DEVICEMODE));
-
-       if (!py_to_DEVICEMODE(info->devmode, obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "device_mode");
-
-       /* Check info level */
-
-       if (!(obj = PyDict_GetItemString(dict_copy, "level")) ||
-           !PyInt_Check(obj))
-               goto done;
-
-       PyDict_DelItemString(dict_copy, "level");
-
-       /* Convert remaining elements of dictionary */
-
-       if (!to_struct(info, dict_copy, py_PRINTER_INFO_2))
-               goto done;
-
-       result = True;
-
-done:
-       Py_DECREF(dict_copy);
-       return result;
-}
-
-/*
- * Convert between PRINTER_INFO_1 and Python 
- */
-
-BOOL py_from_PRINTER_INFO_3(PyObject **dict, PRINTER_INFO_3 *info)
-{
-       PyObject *obj;  
-
-       *dict = from_struct(info, py_PRINTER_INFO_3);
-
-       if (py_from_SECDESC(&obj, info->secdesc))
-               PyDict_SetItemString(*dict, "security_descriptor", obj);
-
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(3));
-
-       return True;
-}
-
-BOOL py_to_PRINTER_INFO_3(PRINTER_INFO_3 *info, PyObject *dict,
-                         TALLOC_CTX *mem_ctx)
-{
-       PyObject *obj;
-
-       if (!to_struct(info, dict, py_PRINTER_INFO_3))
-               return False;
-
-       if (!(obj = PyDict_GetItemString(dict, "security_descriptor")))
-               return False;
-
-       if (!py_to_SECDESC(&info->secdesc, obj, mem_ctx))
-               return False;
-
-       return True;
-}
diff --git a/source3/python/py_srvsvc.c b/source3/python/py_srvsvc.c
deleted file mode 100644 (file)
index 94f4271..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2003
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_srvsvc.h"
-
-/* Exceptions this module can raise */
-
-PyObject *srvsvc_error, *srvsvc_werror;
-
-static struct const_vals {
-       char *name;
-       uint32 value;
-} module_const_vals[] = {
-       { "SV_TYPE_WORKSTATION", SV_TYPE_WORKSTATION },
-       { "SV_TYPE_SERVER", SV_TYPE_SERVER },
-       { "SV_TYPE_SQLSERVER", SV_TYPE_SQLSERVER },
-       { "SV_TYPE_DOMAIN_CTRL", SV_TYPE_DOMAIN_CTRL },
-       { "SV_TYPE_DOMAIN_BAKCTRL", SV_TYPE_DOMAIN_BAKCTRL },
-       { "SV_TYPE_TIME_SOURCE", SV_TYPE_TIME_SOURCE },
-       { "SV_TYPE_AFP", SV_TYPE_AFP },
-       { "SV_TYPE_NOVELL", SV_TYPE_NOVELL },
-       { "SV_TYPE_DOMAIN_MEMBER", SV_TYPE_DOMAIN_MEMBER },
-       { "SV_TYPE_PRINTQ_SERVER", SV_TYPE_PRINTQ_SERVER },
-       { "SV_TYPE_DIALIN_SERVER", SV_TYPE_DIALIN_SERVER },
-       { "SV_TYPE_SERVER_UNIX", SV_TYPE_SERVER_UNIX },
-       { "SV_TYPE_NT", SV_TYPE_NT },
-       { "SV_TYPE_WFW", SV_TYPE_WFW },
-       { "SV_TYPE_SERVER_MFPN", SV_TYPE_SERVER_MFPN },
-       { "SV_TYPE_SERVER_NT", SV_TYPE_SERVER_NT },
-       { "SV_TYPE_POTENTIAL_BROWSER", SV_TYPE_POTENTIAL_BROWSER },
-       { "SV_TYPE_BACKUP_BROWSER", SV_TYPE_BACKUP_BROWSER },
-       { "SV_TYPE_MASTER_BROWSER", SV_TYPE_MASTER_BROWSER },
-       { "SV_TYPE_DOMAIN_MASTER", SV_TYPE_DOMAIN_MASTER },
-       { "SV_TYPE_SERVER_OSF", SV_TYPE_SERVER_OSF },
-       { "SV_TYPE_SERVER_VMS", SV_TYPE_SERVER_VMS },
-       { "SV_TYPE_WIN95_PLUS", SV_TYPE_WIN95_PLUS },
-       { "SV_TYPE_DFS_SERVER", SV_TYPE_DFS_SERVER },
-       { "SV_TYPE_ALTERNATE_XPORT", SV_TYPE_ALTERNATE_XPORT },
-       { "SV_TYPE_LOCAL_LIST_ONLY", SV_TYPE_LOCAL_LIST_ONLY },
-       { "SV_TYPE_DOMAIN_ENUM", SV_TYPE_DOMAIN_ENUM },
-       { NULL },
-};
-
-static void const_init(PyObject *dict)
-{
-       struct const_vals *tmp;
-       PyObject *obj;
-
-       for (tmp = module_const_vals; tmp->name; tmp++) {
-               obj = PyInt_FromLong(tmp->value);
-               PyDict_SetItemString(dict, tmp->name, obj);
-               Py_DECREF(obj);
-       }
-}
-
-/* NetServerGetInfo */
-
-PyObject *srvsvc_netservergetinfo(PyObject *self, PyObject *args,
-                                 PyObject *kw)
-{
-       static char *kwlist[] = { "server", "level", "creds", NULL };
-       char *unc_name, *server, *errstr;
-       PyObject *creds = NULL, *result = NULL;
-       struct cli_state *cli;
-       TALLOC_CTX *mem_ctx = NULL;
-       uint32 level;
-       SRV_INFO_CTR ctr;
-       WERROR status;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "si|O", kwlist, &unc_name, &level, &creds))
-               return NULL;
-
-       if (unc_name[0] != '\\' || unc_name[1] != '\\') {
-               PyErr_SetString(PyExc_ValueError, "UNC name required");
-               return NULL;
-       }
-
-       server = SMB_STRDUP(unc_name + 2);
-
-       if (strchr(server, '\\')) {
-               char *c = strchr(server, '\\');
-               *c = 0;
-       }
-
-       if (creds && creds != Py_None && !PyDict_Check(creds)) {
-               PyErr_SetString(PyExc_TypeError, 
-                               "credentials must be dictionary or None");
-               return NULL;
-       }
-
-       if (!(cli = open_pipe_creds(server, creds, PI_SRVSVC, &errstr))) {
-               PyErr_SetString(srvsvc_error, errstr);
-               free(errstr);
-               goto done;
-       }
-
-       if (!(mem_ctx = talloc_init("srvsvc_netservergetinfo"))) {
-               PyErr_SetString(srvsvc_error, 
-                               "unable to init talloc context\n");
-               goto done;
-       }
-
-       ZERO_STRUCT(ctr);
-
-       status = rpccli_srvsvc_net_srv_get_info(cli->pipe_list, mem_ctx, level, &ctr);
-
-       if (!NT_STATUS_IS_OK(status)) {
-               PyErr_SetObject(srvsvc_error, py_werror_tuple(status));
-               goto done;
-       }
-
-       if (level != ctr.switch_value) {
-               PyErr_SetString(srvsvc_error, "container level value wrong");
-               goto done;
-       }
-
-       switch(level) {
-       case 101:
-               py_from_SRV_INFO_101(&result, &ctr.srv.sv101);
-               break;
-       }
-
-       Py_INCREF(result);
-
-done:
-       if (mem_ctx)
-               talloc_destroy(mem_ctx);
-
-       return result;
-}
-
-/*
- * Module initialisation 
- */
-
-static PyMethodDef srvsvc_methods[] = {
-       { "netservergetinfo", (PyCFunction)srvsvc_netservergetinfo,
-         METH_VARARGS | METH_KEYWORDS,
-         "Retrieve information about a particular server." },
-
-       { "setup_logging", (PyCFunction)py_setup_logging, 
-         METH_VARARGS | METH_KEYWORDS, 
-         "Set up debug logging.\n"
-"\n"
-"Initialises Samba's debug logging system.  One argument is expected which\n"
-"is a boolean specifying whether debugging is interactive and sent to stdout\n"
-"or logged to a file.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> srvsvc.setup_logging(interactive = 1)" },
-
-       { "get_debuglevel", (PyCFunction)get_debuglevel, 
-         METH_VARARGS, 
-         "Set the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> srvsvc.get_debuglevel()\n"
-"0" },
-
-       { "set_debuglevel", (PyCFunction)set_debuglevel, 
-         METH_VARARGS, 
-         "Get the current debug level.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> srvsvc.set_debuglevel(10)" },
-
-       { NULL }
-};
-
-void initsrvsvc(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-       module = Py_InitModule("srvsvc", srvsvc_methods);
-       dict = PyModule_GetDict(module);
-
-       /* Exceptions we can raise */
-
-       srvsvc_error = PyErr_NewException("srvsvc.error", NULL, NULL);
-       PyDict_SetItemString(dict, "error", srvsvc_error);
-
-       srvsvc_werror = PyErr_NewException("srvsvc.werror", NULL, NULL);
-       PyDict_SetItemString(dict, "werror", srvsvc_werror);
-
-       /* Initialise constants */
-
-       const_init(dict);
-
-       /* Do samba initialisation */
-
-       py_samba_init();
-}
diff --git a/source3/python/py_srvsvc.h b/source3/python/py_srvsvc.h
deleted file mode 100644 (file)
index a3215fa..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2003
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_SRVSVC_H
-#define _PY_SRVSVC_H
-
-#include "python/py_common.h"
-
-/* The following definitions come from python/py_srvsv.c */
-
-BOOL py_from_SRV_INFO_101(PyObject **dict, SRV_INFO_101 *info);
-
-#endif /* _PY_SRVSVC_H */
diff --git a/source3/python/py_srvsvc_conv.c b/source3/python/py_srvsvc_conv.c
deleted file mode 100644 (file)
index 8de851d..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2003
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_srvsvc.h"
-#include "python/py_conv.h"
-
-static struct pyconv py_SRV_INFO_101[] = {
-       { "platform_id", PY_UINT32, offsetof(SRV_INFO_101, platform_id) },
-       { "major_version", PY_UINT32, offsetof(SRV_INFO_101, ver_major) },
-       { "minor_version", PY_UINT32, offsetof(SRV_INFO_101, ver_minor) },
-       { "server_type", PY_UINT32, offsetof(SRV_INFO_101, srv_type) },
-       { "name", PY_UNISTR2, offsetof(SRV_INFO_101, uni_name) },
-       { "comment", PY_UNISTR2, offsetof(SRV_INFO_101, uni_comment) },
-       { NULL }
-};     
-
-BOOL py_from_SRV_INFO_101(PyObject **dict, SRV_INFO_101 *info)
-{
-       *dict = from_struct(info, py_SRV_INFO_101);
-
-       PyDict_SetItemString(*dict, "level", PyInt_FromLong(101));
-
-       return True;
-}
diff --git a/source3/python/py_tdb.c b/source3/python/py_tdb.c
deleted file mode 100644 (file)
index d72720f..0000000
+++ /dev/null
@@ -1,652 +0,0 @@
-/* 
-   Python wrappers for TDB module
-
-   Copyright (C) Tim Potter, 2002-2003
-   
-     ** NOTE! The following LGPL license applies to the tdb python
-     ** scripting library. This does NOT imply that all of Samba is 
-     ** released under the LGPL
-   
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
-
-   This library 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
-   Lesser General Public License for more details.
-   
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-
-/* This symbol is used in both includes.h and Python.h which causes an
-   annoying compiler warning. */
-
-#ifdef HAVE_FSTAT
-#undef HAVE_FSTAT
-#endif
-
-#include "Python.h"
-
-/* Tdb exception */
-
-PyObject *py_tdb_error;
-
-/* tdb handle object */
-
-typedef struct {
-       PyObject_HEAD
-       TDB_CONTEXT *tdb;
-} tdb_hnd_object;
-
-PyTypeObject tdb_hnd_type;
-     
-PyObject *new_tdb_hnd_object(TDB_CONTEXT *tdb)
-{
-       tdb_hnd_object *obj;
-
-       obj = PyObject_New(tdb_hnd_object, &tdb_hnd_type);
-       obj->tdb = tdb;
-
-       return (PyObject *)obj;
-}
-
-PyObject *py_tdb_close(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj;
-
-       if (!PyArg_ParseTuple(args, "O!", &tdb_hnd_type, &obj))
-               return NULL;
-
-       if (tdb_close(obj->tdb) == -1) {
-               obj->tdb = NULL;
-               PyErr_SetString(py_tdb_error, strerror(errno));
-               return NULL;
-       }
-
-       obj->tdb = NULL;
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-PyObject *py_tdb_open(PyObject *self, PyObject *args, PyObject *kw)
-{
-       static char *kwlist[] = { "name", "hash_size", "tdb_flags",
-                                 "open_flags", "mode", NULL };
-       char *name;
-       int hash_size = 0, flags = TDB_DEFAULT, open_flags = -1, open_mode = 0600;      
-       TDB_CONTEXT *tdb;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|iiii", kwlist, &name, &hash_size, &flags,
-                   &open_flags, &open_mode))
-               return NULL;
-
-       /* Default open_flags to read/write */
-
-       if (open_flags == -1) {
-               if (access(name, W_OK) == -1)
-                       open_flags = O_RDONLY;
-               else
-                       open_flags = O_RDWR;
-       }
-
-       if (!(tdb = tdb_open(name, hash_size, flags, open_flags, open_mode))) {
-               PyErr_SetString(py_tdb_error, strerror(errno));
-               return NULL;
-       }
-
-       return new_tdb_hnd_object(tdb);
-}
-
-/*
- * Allow a tdb to act as a python mapping (dictionary)
- */
-
-static int tdb_traverse_count(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA value,
-                             void *state)
-{
-       /* Do nothing - tdb_traverse will return the number of records
-           traversed. */
-
-       return 0;
-}
-
-static int tdb_hnd_length(tdb_hnd_object *obj)
-{
-       int result;
-
-       result = tdb_traverse(obj->tdb, tdb_traverse_count, NULL);
-
-       return result;
-}
-
-static PyObject *tdb_hnd_subscript(tdb_hnd_object *obj, PyObject *key)
-{
-       TDB_DATA drec, krec;
-       PyObject *result;
-
-       if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize))
-               return NULL;
-
-       drec = tdb_fetch(obj->tdb, krec);
-
-       if (!drec.dptr) {
-               PyErr_SetString(PyExc_KeyError,
-                               PyString_AsString(key));
-               return NULL;
-       }
-
-       result = PyString_FromStringAndSize(drec.dptr, drec.dsize);
-       free(drec.dptr);
-
-       return result;
-}
-       
-static int tdb_ass_subscript(tdb_hnd_object *obj, PyObject *key, PyObject *value)
-{
-       TDB_DATA krec, drec;
-
-        if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize)) {
-               PyErr_SetString(PyExc_TypeError,
-                               "tdb mappings have string indices only");
-               return -1;
-       }
-
-        if (!obj->tdb) {
-               PyErr_SetString(
-                       py_tdb_error, "tdb object has been closed"); 
-               return -1; 
-        }
-
-       if (!value) {
-
-               /* Delete value */
-
-               if (tdb_delete(obj->tdb, krec) == -1) {
-                       PyErr_SetString(PyExc_KeyError,
-                                       PyString_AsString(value));
-                       return -1;
-               }
-
-       } else {
-
-               /* Set value */
-
-               if (!PyArg_Parse(value, "s#", &drec.dptr, &drec.dsize)) {
-                       PyErr_SetString(PyExc_TypeError,
-                                   "tdb mappings have string elements only");
-                       return -1;
-               }
-
-               errno = 0;
-
-               if (tdb_store(obj->tdb, krec, drec, 0) < 0 ) {
-                       if (errno != 0)
-                               PyErr_SetFromErrno(py_tdb_error);
-                       else
-                               PyErr_SetString(
-                                       py_tdb_error, 
-                                       (char *)tdb_errorstr(obj->tdb));
-
-                       return -1;
-               }
-       }
-
-       return 0;
-} 
-
-static PyMappingMethods tdb_mapping = {
-       (inquiry) tdb_hnd_length,
-       (binaryfunc) tdb_hnd_subscript,
-       (objobjargproc) tdb_ass_subscript
-};
-
-/*
- * Utility methods
- */
-
-/* Return non-zero if a given key exists in the tdb */
-
-PyObject *py_tdb_hnd_has_key(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       TDB_DATA key;
-
-       if (!PyArg_ParseTuple(args, "s#", &key.dptr, &key.dsize))
-               return NULL;
-
-        if (!obj->tdb) {
-               PyErr_SetString(
-                       py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       return PyInt_FromLong(tdb_exists(obj->tdb, key));
-}
-
-/* Return a list of keys in the tdb */
-
-static int tdb_traverse_keys(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA value,
-                            void *state)
-{
-       PyObject *key_list = (PyObject *)state;
-
-       PyList_Append(key_list, 
-                     PyString_FromStringAndSize(key.dptr, key.dsize));
-
-       return 0;
-}
-
-PyObject *py_tdb_hnd_keys(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       PyObject *key_list = PyList_New(0);
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       if (tdb_traverse(obj->tdb, tdb_traverse_keys, key_list) == -1) {
-               PyErr_SetString(py_tdb_error, "error traversing tdb");
-               Py_DECREF(key_list);
-               return NULL;
-       }
-
-       return key_list;        
-}
-
-PyObject *py_tdb_hnd_first_key(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       TDB_DATA key;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       key = tdb_firstkey(obj->tdb);
-
-       return Py_BuildValue("s#", key.dptr, key.dsize);
-}
-
-PyObject *py_tdb_hnd_next_key(PyObject *self, PyObject *py_oldkey)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       TDB_DATA key, oldkey;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       if (!PyArg_Parse(py_oldkey, "s#", &oldkey.dptr, &oldkey.dsize))
-               return NULL;
-
-       key = tdb_nextkey(obj->tdb, oldkey);
-
-       return Py_BuildValue("s#", key.dptr, key.dsize);
-}
-
-/*
- * Locking routines
- */
-
-PyObject *py_tdb_hnd_lock_all(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       int result;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       result = tdb_lockall(obj->tdb);
-
-       return PyInt_FromLong(result != -1);
-}
-
-PyObject *py_tdb_hnd_unlock_all(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       tdb_unlockall(obj->tdb);
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* Return an array of keys from a python object which must be a string or a
-   list of strings. */
-
-static BOOL make_lock_list(PyObject *py_keys, TDB_DATA **keys, int *num_keys)
-{
-       /* Are we a list or a string? */
-
-       if (!PyList_Check(py_keys) && !PyString_Check(py_keys)) {
-               PyErr_SetString(PyExc_TypeError, "arg must be list of string");
-               return False;
-       }
-
-       if (PyList_Check(py_keys)) {
-               int i;
-
-               /* Turn python list into array of keys */
-               
-               *num_keys = PyList_Size(py_keys);
-               *keys = (TDB_DATA *)SMB_XMALLOC_ARRAY(TDB_DATA, (*num_keys));
-               
-               for (i = 0; i < *num_keys; i++) {
-                       PyObject *key = PyList_GetItem(py_keys, i);
-                       
-                       if (!PyString_Check(key)) {
-                               PyErr_SetString(
-                                       PyExc_TypeError,
-                                       "list elements must be strings");
-                               return False;
-                       }
-
-                       PyArg_Parse(key, "s#", &(*keys)[i].dptr, 
-                                   &(*keys)[i].dsize);
-               }
-
-       } else {
-
-               /* Turn python string into a single key */
-
-               *keys = (TDB_DATA *)SMB_XMALLOC_P(TDB_DATA);
-               *num_keys = 1;
-               PyArg_Parse(py_keys, "s#", &(*keys)->dptr, &(*keys)->dsize);
-       }
-
-       return True;
-}
-
-/*
- * tdb traversal
- */
-
-struct traverse_info {
-       PyObject *callback;
-       PyObject *state;
-};
-
-static int tdb_traverse_traverse(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA value,
-                                void *state)
-{
-       struct traverse_info *info = state;
-       PyObject *arglist, *py_result;
-       int result;
-
-       arglist = Py_BuildValue("(s#s#O)", key.dptr, key.dsize, value.dptr,
-                               value.dsize, info->state);
-
-       py_result = PyEval_CallObject(info->callback, arglist);
-
-       Py_DECREF(arglist);
-       
-       if (!PyInt_Check(py_result)) {
-               result = 1;     /* Hmm - non-integer object returned by callback */
-               goto done;
-       }
-
-       result = PyInt_AsLong(py_result);
-
-done:
-       Py_DECREF(py_result);
-       return result;
-}
-
-PyObject *py_tdb_hnd_traverse(PyObject *self, PyObject *args, PyObject *kw)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       static char *kwlist[] = { "traverse_fn", "state", NULL };
-       PyObject *state = Py_None, *callback;
-       struct traverse_info info;
-       int result;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O|O", kwlist, &callback, &state))
-               return NULL;
-
-       if (!PyCallable_Check(callback)) {
-               PyErr_SetString(PyExc_TypeError, "parameter must be callable");
-               return NULL;
-        }
-
-       Py_INCREF(callback);
-       Py_INCREF(state);
-
-       info.callback = callback;
-       info.state = state;
-
-       result = tdb_traverse(obj->tdb, tdb_traverse_traverse, &info);
-
-       Py_DECREF(callback);
-       Py_DECREF(state);
-
-       return PyInt_FromLong(result);
-}
-
-PyObject *py_tdb_hnd_chainlock(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       TDB_DATA key;
-       int result;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       if (!PyArg_ParseTuple(args, "s#", &key.dptr, &key.dsize))
-               return NULL;
-
-       result = tdb_chainlock(obj->tdb, key);
-
-       return PyInt_FromLong(result != -1);
-}
-
-PyObject *py_tdb_hnd_chainunlock(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       TDB_DATA key;
-       int result;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       if (!PyArg_ParseTuple(args, "s#", &key.dptr, &key.dsize))
-               return NULL;
-
-       result = tdb_chainunlock(obj->tdb, key);
-
-       return PyInt_FromLong(result != -1);
-}
-
-PyObject *py_tdb_hnd_lock_bystring(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       int result, timeout = 30;
-       char *s;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       if (!PyArg_ParseTuple(args, "s|i", &s, &timeout))
-               return NULL;
-
-       result = tdb_lock_bystring_with_timeout(obj->tdb, s, timeout);
-
-       return PyInt_FromLong(result != -1);
-}
-
-PyObject *py_tdb_hnd_unlock_bystring(PyObject *self, PyObject *args)
-{
-       tdb_hnd_object *obj = (tdb_hnd_object *)self;
-       char *s;
-
-        if (!obj->tdb) {
-               PyErr_SetString(py_tdb_error, "tdb object has been closed"); 
-               return NULL;
-        }      
-
-       if (!PyArg_ParseTuple(args, "s", &s))
-               return NULL;
-
-       tdb_unlock_bystring(obj->tdb, s);
-
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-/* 
- * Method dispatch table for this module
- */
-
-static PyMethodDef tdb_methods[] = {
-       { "open", (PyCFunction)py_tdb_open, METH_VARARGS | METH_KEYWORDS },
-       { "close", (PyCFunction)py_tdb_close, METH_VARARGS },
-       { NULL }
-};
-
-/* 
- * Methods on a tdb object
- */
-
-static PyMethodDef tdb_hnd_methods[] = {
-       { "keys", (PyCFunction)py_tdb_hnd_keys, METH_VARARGS },
-       { "has_key", (PyCFunction)py_tdb_hnd_has_key, METH_VARARGS },
-       { "first_key", (PyCFunction)py_tdb_hnd_first_key, METH_VARARGS },
-       { "next_key", (PyCFunction)py_tdb_hnd_next_key, METH_VARARGS },
-       { "lock_all", (PyCFunction)py_tdb_hnd_lock_all, METH_VARARGS },
-       { "unlock_all", (PyCFunction)py_tdb_hnd_unlock_all, METH_VARARGS },
-       { "traverse", (PyCFunction)py_tdb_hnd_traverse, METH_VARARGS | METH_KEYWORDS },
-       { "chainlock", (PyCFunction)py_tdb_hnd_chainlock, METH_VARARGS | METH_KEYWORDS },
-       { "chainunlock", (PyCFunction)py_tdb_hnd_chainunlock, METH_VARARGS | METH_KEYWORDS },
-       { "lock_bystring", (PyCFunction)py_tdb_hnd_lock_bystring, METH_VARARGS | METH_KEYWORDS },
-       { "unlock_bystring", (PyCFunction)py_tdb_hnd_unlock_bystring, METH_VARARGS | METH_KEYWORDS },
-       { NULL }
-};
-
-/* Deallocate a tdb handle object */
-
-static void tdb_hnd_dealloc(PyObject* self)
-{
-        tdb_hnd_object *hnd = (tdb_hnd_object *)self;
-
-       if (hnd->tdb) {
-               tdb_close(hnd->tdb);
-               hnd->tdb = NULL;
-       }
-}
-
-/* Return tdb handle attributes */
-
-static PyObject *tdb_hnd_getattr(PyObject *self, char *attrname)
-{
-       return Py_FindMethod(tdb_hnd_methods, self, attrname);
-}
-
-static char tdb_hnd_type_doc[] = 
-"Python wrapper for tdb.";
-
-PyTypeObject tdb_hnd_type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
-       "tdb",
-       sizeof(tdb_hnd_object),
-       0,
-       tdb_hnd_dealloc,        /* tp_dealloc*/
-       0,                      /* tp_print*/
-       tdb_hnd_getattr,        /* tp_getattr*/
-       0,                      /* tp_setattr*/
-       0,                      /* tp_compare*/
-       0,                      /* tp_repr*/
-       0,                      /* tp_as_number*/
-       0,                      /* tp_as_sequence*/
-       &tdb_mapping,           /* tp_as_mapping*/
-       0,                      /* tp_hash */
-       0,                      /* tp_call */
-       0,                      /* tp_str */
-       0,                      /* tp_getattro */
-       0,                      /* tp_setattro */
-       0,                      /* tp_as_buffer*/
-       Py_TPFLAGS_DEFAULT,     /* tp_flags */
-       tdb_hnd_type_doc,       /* tp_doc */
-};
-
-/* Constants */
-
-static struct const_vals {
-       char *name;
-       uint32 value;
-} module_const_vals[] = {
-
-        /* Flags for tdb_open() */
-
-       { "TDB_DEFAULT", TDB_DEFAULT },
-       { "TDB_CLEAR_IF_FIRST", TDB_CLEAR_IF_FIRST },
-       { "TDB_INTERNAL", TDB_INTERNAL },
-       { "TDB_NOLOCK", TDB_NOLOCK },
-       { "TDB_NOMMAP", TDB_NOMMAP },
-       { "TDB_CONVERT", TDB_CONVERT },
-       { "TDB_BIGENDIAN", TDB_BIGENDIAN },
-       
-       { NULL },
-};
-
-static void const_init(PyObject *dict)
-{
-       struct const_vals *tmp;
-       PyObject *obj;
-
-       for (tmp = module_const_vals; tmp->name; tmp++) {
-               obj = PyInt_FromLong(tmp->value);
-               PyDict_SetItemString(dict, tmp->name, obj);
-               Py_DECREF(obj);
-       }
-}
-
-/* Module initialisation */
-
-void inittdb(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-       module = Py_InitModule("tdb", tdb_methods);
-       dict = PyModule_GetDict(module);
-
-       py_tdb_error = PyErr_NewException("tdb.error", NULL, NULL);
-       PyDict_SetItemString(dict, "error", py_tdb_error);
-
-       /* Initialise policy handle object */
-
-       tdb_hnd_type.ob_type = &PyType_Type;
-
-       PyDict_SetItemString(dict, "tdb.hnd", 
-                            (PyObject *)&tdb_hnd_type);
-
-       /* Initialise constants */
-
-       const_init(dict);
-}
diff --git a/source3/python/py_tdb.h b/source3/python/py_tdb.h
deleted file mode 100644 (file)
index 9bca9e0..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-     ** NOTE! The following LGPL license applies to the tdb python
-     ** scripting library. This does NOT imply that all of Samba is 
-     ** released under the LGPL
-   
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
-
-   This library 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
-   Lesser General Public License for more details.
-   
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_TDB_H
-#define _PY_TDB_H
-
-#include "python/py_common.h"
-
-#endif /* _PY_TDB_H */
diff --git a/source3/python/py_tdbpack.c b/source3/python/py_tdbpack.c
deleted file mode 100644 (file)
index e504f30..0000000
+++ /dev/null
@@ -1,721 +0,0 @@
-/* -*- c-file-style: "python"; indent-tabs-mode: nil; -*-
-        
-   Python wrapper for Samba tdb pack/unpack functions
-   Copyright (C) Martin Pool 2002, 2003
-
-
-   NOTE PYTHON STYLE GUIDE
-   http://www.python.org/peps/pep-0007.html
-   
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "Python.h"
-
-/* This symbol is used in both config.h and Python.h which causes an
-   annoying compiler warning. */
-
-#ifdef HAVE_FSTAT
-#undef HAVE_FSTAT
-#endif
-
-/* This module is supposed to be standalone, however for portability
-   it would be good to use the FUNCTION_MACRO preprocessor define. */
-
-#include "include/config.h"
-
-#ifdef HAVE_FUNCTION_MACRO
-#define FUNCTION_MACRO  (__FUNCTION__)
-#else
-#define FUNCTION_MACRO  (__FILE__)
-#endif
-
-static PyObject * pytdbpack_number(char ch, PyObject *val_iter, PyObject *packed_list);
-static PyObject * pytdbpack_str(char ch,
-                               PyObject *val_iter, PyObject *packed_list,
-                               const char *encoding);
-static PyObject * pytdbpack_buffer(PyObject *val_iter, PyObject *packed_list);
-
-static PyObject *pytdbunpack_item(char, char **pbuf, int *plen, PyObject *);
-
-static PyObject *pytdbpack_data(const char *format_str,
-                                    PyObject *val_seq,
-                                    PyObject *val_list);
-
-static PyObject *
-pytdbunpack_string(char **pbuf, int *plen, const char *encoding);
-
-static void pack_le_uint32(unsigned long val_long, unsigned char *pbuf);
-
-
-static PyObject *pytdbpack_bad_type(char ch,
-                                   const char *expected,
-                                   PyObject *val_obj);
-
-static const char * pytdbpack_docstring =
-"Convert between Python values and Samba binary encodings.\n"
-"\n"
-"This module is conceptually similar to the standard 'struct' module, but it\n"
-"uses both a different binary format and a different description string.\n"
-"\n"
-"Samba's encoding is based on that used inside DCE-RPC and SMB: a\n"
-"little-endian, unpadded, non-self-describing binary format.  It is intended\n"
-"that these functions be as similar as possible to the routines in Samba's\n"
-"tdb/tdbutil module, with appropriate adjustments for Python datatypes.\n"
-"\n"
-"Python strings are used to specify the format of data to be packed or\n"
-"unpacked.\n"
-"\n"
-"String encodings are implied by the database format: they may be either DOS\n"
-"codepage (currently hardcoded to 850), or Unix codepage (currently hardcoded\n"
-"to be the same as the default Python encoding).\n"
-"\n"
-"tdbpack format strings:\n"
-"\n"
-"    'f': NUL-terminated string in codepage iso8859-1\n"
-"   \n"
-"    'P': same as 'f'\n"
-"\n"
-"    'F': NUL-terminated string in iso-8859-1\n"
-"\n"
-"    'd':  4 byte little-endian unsigned number\n"
-"\n"
-"    'w':  2 byte little-endian unsigned number\n"
-"\n"
-"    'P': \"Pointer\" value -- in the subset of DCERPC used by Samba, this is\n"
-"          really just an \"exists\" or \"does not exist\" flag.  The boolean\n"
-"          value of the Python object is used.\n"
-"    \n"
-"    'B': 4-byte LE length, followed by that many bytes of binary data.\n"
-"         Corresponds to a Python integer giving the length, followed by a byte\n"
-"         string of the appropriate length.\n"
-"\n"
-"    '$': Special flag indicating that the preceding format code should be\n"
-"         repeated while data remains.  This is only supported for unpacking.\n"
-"\n"
-"    Every code corresponds to a single Python object, except 'B' which\n"
-"    corresponds to two values (length and contents), and '$', which produces\n"
-"    however many make sense.\n";
-
-static char const pytdbpack_doc[] = 
-"pack(format, values) -> buffer\n"
-"Pack Python objects into Samba binary format according to format string.\n"
-"\n"
-"arguments:\n"
-"    format -- string of tdbpack format characters\n"
-"    values -- sequence of value objects corresponding 1:1 to format characters\n"
-"\n"
-"returns:\n"
-"    buffer -- string containing packed data\n"
-"\n"
-"raises:\n"
-"    IndexError -- if there are too few values for the format\n"
-"    ValueError -- if any of the format characters is illegal\n"
-"    TypeError  -- if the format is not a string, or values is not a sequence,\n"
-"        or any of the values is of the wrong type for the corresponding\n"
-"        format character\n"
-"\n"
-"notes:\n"
-"    For historical reasons, it is not an error to pass more values than are consumed\n"
-"    by the format.\n";
-
-
-static char const pytdbunpack_doc[] =
-"unpack(format, buffer) -> (values, rest)\n"
-"Unpack Samba binary data according to format string.\n"
-"\n"
-"arguments:\n"
-"    format -- string of tdbpack characters\n"
-"    buffer -- string of packed binary data\n"
-"\n"
-"returns:\n"
-"    2-tuple of:\n"
-"        values -- sequence of values corresponding 1:1 to format characters\n"
-"        rest -- string containing data that was not decoded, or '' if the\n"
-"            whole string was consumed\n"
-"\n"
-"raises:\n"
-"    IndexError -- if there is insufficient data in the buffer for the\n"
-"        format (or if the data is corrupt and contains a variable-length\n"
-"        field extending past the end)\n"
-"    ValueError -- if any of the format characters is illegal\n"
-"\n"
-"notes:\n"
-"    Because unconsumed data is returned, you can feed it back in to the\n"
-"    unpacker to extract further fields.  Alternatively, if you wish to modify\n"
-"    some fields near the start of the data, you may be able to save time by\n"
-"    only unpacking and repacking the necessary part.\n";
-
-
-const char *pytdb_dos_encoding = "cp850";
-
-/* NULL, meaning that the Samba default encoding *must* be the same as the
-   Python default encoding. */
-const char *pytdb_unix_encoding = NULL;
-
-
-/*
-  * Pack objects to bytes.
-  *
-  * All objects are first individually encoded onto a list, and then the list
-  * of strings is concatenated.  This is faster than concatenating strings,
-  * and reasonably simple to code.
-  */
-static PyObject *
-pytdbpack(PyObject *self,
-              PyObject *args)
-{
-       char *format_str;
-       PyObject *val_seq, *val_iter = NULL,
-               *packed_list = NULL, *packed_str = NULL,
-               *empty_str = NULL;
-
-       /* TODO: Test passing wrong types or too many arguments */
-       if (!PyArg_ParseTuple(args, "sO", &format_str, &val_seq))
-               return NULL;
-
-       if (!(val_iter = PyObject_GetIter(val_seq)))
-               goto out;
-
-       /* Create list to hold strings until we're done, then join them all. */
-       if (!(packed_list = PyList_New(0)))
-               goto out;
-
-       if (!pytdbpack_data(format_str, val_iter, packed_list))
-               goto out;
-
-       /* this function is not officially documented but it works */
-       if (!(empty_str = PyString_InternFromString("")))
-               goto out;
-       
-       packed_str = _PyString_Join(empty_str, packed_list);
-
-  out:
-       Py_XDECREF(empty_str);
-       Py_XDECREF(val_iter);
-       Py_XDECREF(packed_list);
-
-       return packed_str;
-}
-
-
-/*
-  Pack data according to FORMAT_STR from the elements of VAL_SEQ into
-  PACKED_BUF.
-
-  The string has already been checked out, so we know that VAL_SEQ is large
-  enough to hold the packed data, and that there are enough value items.
-  (However, their types may not have been thoroughly checked yet.)
-
-  In addition, val_seq is a Python Fast sequence.
-
-  Returns NULL for error (with exception set), or None.
-*/
-PyObject *
-pytdbpack_data(const char *format_str,
-                   PyObject *val_iter,
-                   PyObject *packed_list)
-{
-       int format_i, val_i = 0;
-
-       for (format_i = 0, val_i = 0; format_str[format_i]; format_i++) {
-               char ch = format_str[format_i];
-
-               switch (ch) {
-                       /* dispatch to the appropriate packer for this type,
-                          which should pull things off the iterator, and
-                          append them to the packed_list */
-               case 'w':
-               case 'd':
-               case 'p':
-                       if (!(packed_list = pytdbpack_number(ch, val_iter, packed_list)))
-                               return NULL;
-                       break;
-
-               case 'f':
-               case 'P':
-                       if (!(packed_list = pytdbpack_str(ch, val_iter, packed_list, pytdb_unix_encoding)))
-                               return NULL;
-                       break;
-
-               case 'B':
-                       if (!(packed_list = pytdbpack_buffer(val_iter, packed_list)))
-                               return NULL;
-                       break;
-
-               default:
-                       PyErr_Format(PyExc_ValueError,
-                                    "%s: format character '%c' is not supported",
-                                    FUNCTION_MACRO, ch);
-                       return NULL;
-               }
-       }
-
-       return packed_list;
-}
-
-
-static PyObject *
-pytdbpack_number(char ch, PyObject *val_iter, PyObject *packed_list)
-{
-       unsigned long val_long;
-       PyObject *val_obj = NULL, *long_obj = NULL, *result_obj = NULL;
-       PyObject *new_list = NULL;
-       unsigned char pack_buf[4];
-
-       if (!(val_obj = PyIter_Next(val_iter)))
-               goto out;
-
-       if (!(long_obj = PyNumber_Long(val_obj))) {
-               pytdbpack_bad_type(ch, "Number", val_obj);
-               goto out;
-       }
-
-       val_long = PyLong_AsUnsignedLong(long_obj);
-       pack_le_uint32(val_long, pack_buf);
-
-       /* pack as 32-bit; if just packing a 'w' 16-bit word then only take
-          the first two bytes. */
-       
-       if (!(result_obj = PyString_FromStringAndSize(pack_buf, ch == 'w' ? 2 : 4)))
-               goto out;
-
-       if (PyList_Append(packed_list, result_obj) != -1)
-               new_list = packed_list;
-
-  out:
-       Py_XDECREF(val_obj);
-       Py_XDECREF(long_obj);
-       Py_XDECREF(result_obj);
-
-       return new_list;
-}
-
-
-/*
- * Take one string from the iterator val_iter, convert it to 8-bit, and return
- * it.
- *
- * If the input is neither a string nor Unicode, an exception is raised.
- *
- * If the input is Unicode, then it is converted to the appropriate encoding.
- *
- * If the input is a String, and encoding is not null, then it is converted to
- * Unicode using the default decoding method, and then converted to the
- * encoding.  If the encoding is NULL, then the string is written out as-is --
- * this is used when the default Python encoding is the same as the Samba
- * encoding.
- *
- * I hope this approach avoids being too fragile w.r.t. being passed either
- * Unicode or String objects.
- */
-static PyObject *
-pytdbpack_str(char ch,
-             PyObject *val_iter, PyObject *packed_list, const char *encoding)
-{
-       PyObject *val_obj = NULL;
-       PyObject *unicode_obj = NULL;
-       PyObject *coded_str = NULL;
-       PyObject *nul_str = NULL;
-       PyObject *new_list = NULL;
-
-       if (!(val_obj = PyIter_Next(val_iter)))
-               goto out;
-
-       if (PyUnicode_Check(val_obj)) {
-               if (!(coded_str = PyUnicode_AsEncodedString(val_obj, encoding, NULL)))
-                       goto out;
-       }
-       else if (PyString_Check(val_obj) && !encoding) {
-               /* For efficiency, we assume that the Python interpreter has
-                  the same default string encoding as Samba's native string
-                  encoding.  On the PSA, both are always 8859-1. */
-               coded_str = val_obj;
-               Py_INCREF(coded_str);
-       }
-       else if (PyString_Check(val_obj)) {
-               /* String, but needs to be converted */
-               if (!(unicode_obj = PyString_AsDecodedObject(val_obj, NULL, NULL)))
-                       goto out;
-               if (!(coded_str = PyUnicode_AsEncodedString(unicode_obj, encoding, NULL)))
-                       goto out;
-       }
-       else {
-               pytdbpack_bad_type(ch, "String or Unicode", val_obj);
-               goto out;
-       }
-
-       if (!nul_str)
-               /* this is constant and often-used; hold it forever */
-               if (!(nul_str = PyString_FromStringAndSize("", 1)))
-                       goto out;
-
-       if ((PyList_Append(packed_list, coded_str) != -1)
-           && (PyList_Append(packed_list, nul_str) != -1))
-               new_list = packed_list;
-
-  out:
-       Py_XDECREF(val_obj);
-       Py_XDECREF(unicode_obj);
-       Py_XDECREF(coded_str);
-
-       return new_list;
-}
-
-
-/*
- * Pack (LENGTH, BUFFER) pair onto the list.
- *
- * The buffer must already be a String, not Unicode, because it contains 8-bit
- * untranslated data.  In some cases it will actually be UTF_16_LE data.
- */
-static PyObject *
-pytdbpack_buffer(PyObject *val_iter, PyObject *packed_list)
-{
-       PyObject *val_obj;
-       PyObject *new_list = NULL;
-       
-       /* pull off integer and stick onto list */
-       if (!(packed_list = pytdbpack_number('d', val_iter, packed_list)))
-               return NULL;
-
-       /* this assumes that the string is the right length; the old code did
-          the same. */
-       if (!(val_obj = PyIter_Next(val_iter)))
-               return NULL;
-
-       if (!PyString_Check(val_obj)) {
-               pytdbpack_bad_type('B', "String", val_obj);
-               goto out;
-       }
-       
-       if (PyList_Append(packed_list, val_obj) != -1)
-               new_list = packed_list;
-
-  out:
-       Py_XDECREF(val_obj);
-       return new_list;
-}
-
-
-static PyObject *pytdbpack_bad_type(char ch,
-                                   const char *expected,
-                                   PyObject *val_obj)
-{
-       PyObject *r = PyObject_Repr(val_obj);
-       if (!r)
-               return NULL;
-       PyErr_Format(PyExc_TypeError,
-                    "tdbpack: format '%c' requires %s, not %s",
-                    ch, expected, PyString_AS_STRING(r));
-       Py_DECREF(r);
-       return val_obj;
-}
-
-
-/*
-  XXX: glib and Samba have quicker macro for doing the endianness conversions,
-  but I don't know of one in plain libc, and it's probably not a big deal.  I
-  realize this is kind of dumb because we'll almost always be on x86, but
-  being safe is important.
-*/
-static void pack_le_uint32(unsigned long val_long, unsigned char *pbuf)
-{
-       pbuf[0] =         val_long & 0xff;
-       pbuf[1] = (val_long >> 8)  & 0xff;
-       pbuf[2] = (val_long >> 16) & 0xff;
-       pbuf[3] = (val_long >> 24) & 0xff;
-}
-
-
-#if 0  /* not used */
-static void pack_bytes(long len, const char *from,
-                      unsigned char **pbuf)
-{
-       memcpy(*pbuf, from, len);
-       (*pbuf) += len;
-}
-#endif
-
-
-static PyObject *
-pytdbunpack(PyObject *self,
-                PyObject *args)
-{
-       char *format_str, *packed_str, *ppacked;
-       PyObject *val_list = NULL, *ret_tuple = NULL;
-       PyObject *rest_string = NULL;
-       int format_len, packed_len;
-       char last_format = '#'; /* invalid */
-       int i;
-       
-       /* get arguments */
-       if (!PyArg_ParseTuple(args, "ss#", &format_str, &packed_str, &packed_len))
-               return NULL;
-
-       format_len = strlen(format_str);
-       
-       /* Allocate list to hold results.  Initially empty, and we append
-          results as we go along. */
-       val_list = PyList_New(0);
-       if (!val_list)
-               goto failed;
-       ret_tuple = PyTuple_New(2);
-       if (!ret_tuple)
-               goto failed;
-       
-       /* For every object, unpack.  */
-       for (ppacked = packed_str, i = 0; i < format_len && format_str[i] != '$'; i++) {
-               last_format = format_str[i];
-               /* packed_len is reduced in place */
-               if (!pytdbunpack_item(format_str[i], &ppacked, &packed_len, val_list))
-                       goto failed;
-       }
-
-       /* If the last character was '$', keep going until out of space */
-       if (format_str[i] == '$') {
-               if (i == 0) {
-                       PyErr_Format(PyExc_ValueError,
-                                    "%s: '$' may not be first character in format",
-                                    FUNCTION_MACRO);
-                       return NULL;
-               } 
-               while (packed_len > 0)
-                       if (!pytdbunpack_item(last_format, &ppacked, &packed_len, val_list))
-                               goto failed;
-       }
-       
-       /* save leftovers for next time */
-       rest_string = PyString_FromStringAndSize(ppacked, packed_len);
-       if (!rest_string)
-               goto failed;
-
-       /* return (values, rest) tuple; give up references to them */
-       PyTuple_SET_ITEM(ret_tuple, 0, val_list);
-       val_list = NULL;
-       PyTuple_SET_ITEM(ret_tuple, 1, rest_string);
-       val_list = NULL;
-       return ret_tuple;
-
-  failed:
-       /* handle failure: deallocate anything.  XDECREF forms handle NULL
-          pointers for objects that haven't been allocated yet. */
-       Py_XDECREF(val_list);
-       Py_XDECREF(ret_tuple);
-       Py_XDECREF(rest_string);
-       return NULL;
-}
-
-
-static void
-pytdbunpack_err_too_short(void)
-{
-       PyErr_Format(PyExc_IndexError,
-                    "%s: data too short for unpack format", FUNCTION_MACRO);
-}
-
-
-static PyObject *
-pytdbunpack_uint32(char **pbuf, int *plen)
-{
-       unsigned long v;
-       unsigned char *b;
-       
-       if (*plen < 4) {
-               pytdbunpack_err_too_short();
-               return NULL;
-       }
-
-       b = *pbuf;
-       v = b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24;
-       
-       (*pbuf) += 4;
-       (*plen) -= 4;
-
-       return PyLong_FromUnsignedLong(v);
-}
-
-
-static PyObject *pytdbunpack_int16(char **pbuf, int *plen)
-{
-       long v;
-       unsigned char *b;
-       
-       if (*plen < 2) {
-               pytdbunpack_err_too_short();
-               return NULL;
-       }
-
-       b = *pbuf;
-       v = b[0] | b[1]<<8;
-       
-       (*pbuf) += 2;
-       (*plen) -= 2;
-
-       return PyInt_FromLong(v);
-}
-
-
-static PyObject *
-pytdbunpack_string(char **pbuf, int *plen, const char *encoding)
-{
-       int len;
-       char *nul_ptr, *start;
-
-       start = *pbuf;
-       
-       nul_ptr = memchr(start, '\0', *plen);
-       if (!nul_ptr) {
-               pytdbunpack_err_too_short();
-               return NULL;
-       }
-
-       len = nul_ptr - start;
-
-       *pbuf += len + 1;       /* skip \0 */
-       *plen -= len + 1;
-
-       return PyString_Decode(start, len, encoding, NULL);
-}
-
-
-static PyObject *
-pytdbunpack_buffer(char **pbuf, int *plen, PyObject *val_list)
-{
-       /* first get 32-bit len */
-       long slen;
-       unsigned char *b;
-       unsigned char *start;
-       PyObject *str_obj = NULL, *len_obj = NULL;
-       
-       if (*plen < 4) {
-               pytdbunpack_err_too_short();
-               return NULL;
-       }
-       
-       b = *pbuf;
-       slen = b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24;
-
-       if (slen < 0) { /* surely you jest */
-               PyErr_Format(PyExc_ValueError,
-                            "%s: buffer seems to have negative length", FUNCTION_MACRO);
-               return NULL;
-       }
-
-       (*pbuf) += 4;
-       (*plen) -= 4;
-       start = *pbuf;
-
-       if (*plen < slen) {
-               PyErr_Format(PyExc_IndexError,
-                            "%s: not enough data to unpack buffer: "
-                            "need %d bytes, have %d", FUNCTION_MACRO,
-                            (int) slen, *plen);
-               return NULL;
-       }
-
-       (*pbuf) += slen;
-       (*plen) -= slen;
-
-       if (!(len_obj = PyInt_FromLong(slen)))
-               goto failed;
-
-       if (PyList_Append(val_list, len_obj) == -1)
-               goto failed;
-       
-       if (!(str_obj = PyString_FromStringAndSize(start, slen)))
-               goto failed;
-       
-       if (PyList_Append(val_list, str_obj) == -1)
-               goto failed;
-       
-       Py_DECREF(len_obj);
-       Py_DECREF(str_obj);
-       
-       return val_list;
-
-  failed:
-       Py_XDECREF(len_obj);    /* handles NULL */
-       Py_XDECREF(str_obj);
-       return NULL;
-}
-
-
-/* Unpack a single field from packed data, according to format character CH.
-   Remaining data is at *PBUF, of *PLEN.
-
-   *PBUF is advanced, and *PLEN reduced to reflect the amount of data that has
-   been consumed.
-
-   Returns a reference to None, or NULL for failure.
-*/
-static PyObject *pytdbunpack_item(char ch,
-                                 char **pbuf,
-                                 int *plen,
-                                 PyObject *val_list)
-{
-       PyObject *unpacked;
-       
-       if (ch == 'w') {        /* 16-bit int */
-               unpacked = pytdbunpack_int16(pbuf, plen);
-       }
-       else if (ch == 'd' || ch == 'p') { /* 32-bit int */
-               /* pointers can just come through as integers */
-               unpacked = pytdbunpack_uint32(pbuf, plen);
-       }
-       else if (ch == 'f' || ch == 'P') { /* nul-term string  */
-               unpacked = pytdbunpack_string(pbuf, plen, pytdb_unix_encoding);
-       }
-       else if (ch == 'B') { /* length, buffer */
-               return pytdbunpack_buffer(pbuf, plen, val_list);
-       }
-       else {
-               PyErr_Format(PyExc_ValueError,
-                            "%s: format character '%c' is not supported", 
-                             FUNCTION_MACRO, ch);
-               
-               return NULL;
-       }
-
-       /* otherwise OK */
-       if (!unpacked)
-               return NULL;
-
-       if (PyList_Append(val_list, unpacked) == -1)
-               val_list = NULL;
-
-       /* PyList_Append takes a new reference to the inserted object.
-          Therefore, we no longer need the original reference. */
-       Py_DECREF(unpacked);
-       
-       return val_list;
-}
-
-
-
-
-
-
-static PyMethodDef pytdbpack_methods[] = {
-       { "pack", pytdbpack, METH_VARARGS, (char *) pytdbpack_doc },
-       { "unpack", pytdbunpack, METH_VARARGS, (char *) pytdbunpack_doc },
-};
-
-DL_EXPORT(void)
-inittdbpack(void)
-{
-       Py_InitModule3("tdbpack", pytdbpack_methods,
-                      (char *) pytdbpack_docstring);
-}
diff --git a/source3/python/py_winbind.c b/source3/python/py_winbind.c
deleted file mode 100644 (file)
index 7d3a9cd..0000000
+++ /dev/null
@@ -1,799 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-
-   Python wrapper for winbind client functions.
-
-   Copyright (C) Tim Potter      2002-2003
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "py_winbind.h"
-
-/* 
- * Exceptions raised by this module 
- */
-
-PyObject *winbind_error;       /* A winbind call returned WINBINDD_ERROR */
-
-/* Prototypes from common.h */
-
-NSS_STATUS winbindd_request_response(int req_type, 
-                           struct winbindd_request *request,
-                           struct winbindd_response *response);
-
-/*
- * Name <-> SID conversion
- */
-
-/* Convert a name to a sid */
-
-static PyObject *py_name_to_sid(PyObject *self, PyObject *args)
-
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       PyObject *result;
-       char *name, *p;
-       const char *sep;
-
-       if (!PyArg_ParseTuple(args, "s", &name))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       sep = lp_winbind_separator();
-
-       if ((p = strchr(name, sep[0]))) {
-               *p = 0;
-               fstrcpy(request.data.name.dom_name, name);
-               fstrcpy(request.data.name.name, p + 1);
-       } else {
-               fstrcpy(request.data.name.dom_name, lp_workgroup());
-               fstrcpy(request.data.name.name, name);
-       }
-
-       if (winbindd_request_response(WINBINDD_LOOKUPNAME, &request, &response)  
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;
-       }
-
-       result = PyString_FromString(response.data.sid.sid);
-
-       return result;
-}
-
-/* Convert a sid to a name */
-
-static PyObject *py_sid_to_name(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       PyObject *result;
-       char *sid, *name;
-
-       if (!PyArg_ParseTuple(args, "s", &sid))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       fstrcpy(request.data.sid, sid);
-
-       if (winbindd_request_response(WINBINDD_LOOKUPSID, &request, &response)  
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;
-       }
-
-       asprintf(&name, "%s%s%s", response.data.name.dom_name,
-                lp_winbind_separator(), response.data.name.name);
-
-       result = PyString_FromString(name);
-
-       free(name);
-
-       return result;
-}
-
-/*
- * Enumerate users/groups
- */
-
-/* Enumerate domain users */
-
-static PyObject *py_enum_domain_users(PyObject *self, PyObject *args)
-{
-       struct winbindd_response response;
-       PyObject *result;
-
-       if (!PyArg_ParseTuple(args, ""))
-               return NULL;
-
-       ZERO_STRUCT(response);
-
-       if (winbindd_request_response(WINBINDD_LIST_USERS, NULL, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-
-       result = PyList_New(0);
-
-       if (response.extra_data.data) {
-               const char *extra_data = response.extra_data.data;
-               fstring name;
-
-               while (next_token(&extra_data, name, ",", sizeof(fstring)))
-                       PyList_Append(result, PyString_FromString(name));
-       }
-
-       return result;
-}
-
-/* Enumerate domain groups */
-
-static PyObject *py_enum_domain_groups(PyObject *self, PyObject *args)
-{
-       struct winbindd_response response;
-       PyObject *result = NULL;
-
-       if (!PyArg_ParseTuple(args, ""))
-               return NULL;
-
-       ZERO_STRUCT(response);
-
-       if (winbindd_request_response(WINBINDD_LIST_GROUPS, NULL, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-
-       result = PyList_New(0);
-
-       if (response.extra_data.data) {
-               const char *extra_data = response.extra_data.data;
-               fstring name;
-
-               while (next_token(&extra_data, name, ",", sizeof(fstring)))
-                       PyList_Append(result, PyString_FromString(name));
-       }
-
-       return result;
-}
-
-/*
- * Miscellaneous domain related
- */
-
-/* Enumerate domain groups */
-
-static PyObject *py_enum_trust_dom(PyObject *self, PyObject *args)
-{
-       struct winbindd_response response;
-       PyObject *result = NULL;
-
-       if (!PyArg_ParseTuple(args, ""))
-               return NULL;
-
-       ZERO_STRUCT(response);
-
-       if (winbindd_request_response(WINBINDD_LIST_TRUSTDOM, NULL, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-
-       result = PyList_New(0);
-
-       if (response.extra_data.data) {
-               const char *extra_data = response.extra_data.data;
-               fstring name;
-
-               while (next_token(&extra_data, name, ",", sizeof(fstring)))
-                       PyList_Append(result, PyString_FromString(name));
-       }
-
-       return result;
-}
-
-/* Check machine account password */
-
-static PyObject *py_check_secret(PyObject *self, PyObject *args)
-{
-       struct winbindd_response response;
-
-       if (!PyArg_ParseTuple(args, ""))
-               return NULL;
-
-       ZERO_STRUCT(response);
-
-       if (winbindd_request_response(WINBINDD_CHECK_MACHACC, NULL, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-
-       return PyInt_FromLong(response.data.num_entries);
-}
-
-/*
- * Return a dictionary consisting of all the winbind related smb.conf
- * parameters.  This is stored in the module object.
- */
-
-static PyObject *py_config_dict(void)
-{
-       PyObject *result;
-       uid_t ulow, uhi;
-       gid_t glow, ghi;
-       
-       if (!(result = PyDict_New()))
-               return NULL;
-
-       /* Various string parameters */
-
-       PyDict_SetItemString(result, "workgroup", 
-                            PyString_FromString(lp_workgroup()));
-
-       PyDict_SetItemString(result, "separator", 
-                            PyString_FromString(lp_winbind_separator()));
-
-       PyDict_SetItemString(result, "template_homedir", 
-                            PyString_FromString(lp_template_homedir()));
-
-       PyDict_SetItemString(result, "template_shell", 
-                            PyString_FromString(lp_template_shell()));
-
-       /* idmap uid/gid range */
-
-       if (lp_idmap_uid(&ulow, &uhi)) {
-               PyDict_SetItemString(result, "uid_low", PyInt_FromLong(ulow));
-               PyDict_SetItemString(result, "uid_high", PyInt_FromLong(uhi));
-       }
-
-       if (lp_idmap_gid(&glow, &ghi)) {
-               PyDict_SetItemString(result, "gid_low", PyInt_FromLong(glow));
-               PyDict_SetItemString(result, "gid_high", PyInt_FromLong(ghi));
-       }
-
-       return result;
-}
-
-/*
- * ID mapping
- */
-
-/* Convert a uid to a SID */
-
-static PyObject *py_uid_to_sid(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       int id;
-
-       if (!PyArg_ParseTuple(args, "i", &id))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       request.data.uid = id;
-
-       if (winbindd_request_response(WINBINDD_UID_TO_SID, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-
-       return PyString_FromString(response.data.sid.sid);
-}
-
-/* Convert a gid to a SID */
-
-static PyObject *py_gid_to_sid(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       int id;
-
-       if (!PyArg_ParseTuple(args, "i", &id))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       request.data.gid = id;
-
-       if (winbindd_request_response(WINBINDD_GID_TO_SID, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-
-       return PyString_FromString(response.data.sid.sid);
-}
-
-/* Convert a sid to a uid */
-
-static PyObject *py_sid_to_uid(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       char *sid;
-
-       if (!PyArg_ParseTuple(args, "s", &sid))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       fstrcpy(request.data.sid, sid);
-
-       if (winbindd_request_response(WINBINDD_SID_TO_UID, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-
-       return PyInt_FromLong(response.data.uid);
-}
-
-/* Convert a sid to a gid */
-
-static PyObject *py_sid_to_gid(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       char *sid;
-
-       if (!PyArg_ParseTuple(args, "s", &sid))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       fstrcpy(request.data.sid, sid);
-
-       if (winbindd_request_response(WINBINDD_SID_TO_GID, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-       
-       return PyInt_FromLong(response.data.gid);
-}
-
-/*
- * PAM authentication functions
- */
-
-/* Plaintext authentication */
-
-static PyObject *py_auth_plaintext(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       char *username, *password;
-
-       if (!PyArg_ParseTuple(args, "ss", &username, &password))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       fstrcpy(request.data.auth.user, username);
-       fstrcpy(request.data.auth.pass, password);
-
-       if (winbindd_request_response(WINBINDD_PAM_AUTH, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-       
-       return PyInt_FromLong(response.data.auth.nt_status);
-}
-
-/* Challenge/response authentication */
-
-static PyObject *py_auth_crap(PyObject *self, PyObject *args, PyObject *kw)
-{
-       static char *kwlist[] = 
-               {"username", "password", "use_lm_hash", "use_nt_hash", NULL };
-       struct winbindd_request request;
-       struct winbindd_response response;
-       char *username, *password;
-       int use_lm_hash = 1, use_nt_hash = 1;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "ss|ii", kwlist, &username, &password, 
-                   &use_lm_hash, &use_nt_hash))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       if (push_utf8_fstring(request.data.auth_crap.user, username) == -1) {
-               PyErr_SetString(winbind_error, "unable to create utf8 string");
-               return NULL;
-       }
-
-       generate_random_buffer(request.data.auth_crap.chal, 8);
-        
-       if (use_lm_hash) {
-               SMBencrypt((uchar *)password, request.data.auth_crap.chal, 
-                          (uchar *)request.data.auth_crap.lm_resp);
-               request.data.auth_crap.lm_resp_len = 24;
-       }
-
-       if (use_nt_hash) {
-               SMBNTencrypt((uchar *)password, request.data.auth_crap.chal,
-                            (uchar *)request.data.auth_crap.nt_resp);
-               request.data.auth_crap.nt_resp_len = 24;
-       }
-
-       if (winbindd_request_response(WINBINDD_PAM_AUTH_CRAP, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-       
-       return PyInt_FromLong(response.data.auth.nt_status);
-}
-
-#if 0                          /* Include when auth_smbd merged to HEAD */
-
-/* Challenge/response authentication, with secret */
-
-static PyObject *py_auth_smbd(PyObject *self, PyObject *args, PyObject *kw)
-{
-       static char *kwlist[] = 
-               {"username", "password", "use_lm_hash", "use_nt_hash", NULL };
-       struct winbindd_request request;
-       struct winbindd_response response;
-       char *username, *password;
-       int use_lm_hash = 1, use_nt_hash = 1;
-
-       if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "ss|ii", kwlist, &username, &password, 
-                   &use_lm_hash, &use_nt_hash))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       if (push_utf8_fstring(request.data.auth_crap.user, username) == -1) {
-               PyErr_SetString("unable to create utf8 string");
-               return NULL;
-       }
-
-       generate_random_buffer(request.data.smbd_auth_crap.chal, 8);
-        
-       if (use_lm_hash) {
-               SMBencrypt((uchar *)password, 
-                          request.data.smbd_auth_crap.chal, 
-                          (uchar *)request.data.smbd_auth_crap.lm_resp);
-               request.data.smbd_auth_crap.lm_resp_len = 24;
-       }
-
-       if (use_nt_hash) {
-               SMBNTencrypt((uchar *)password, 
-                            request.data.smbd_auth_crap.chal,
-                            (uchar *)request.data.smbd_auth_crap.nt_resp);
-               request.data.smbd_auth_crap.nt_resp_len = 24;
-       }
-
-       if (!secrets_fetch_trust_account_password(
-                   lp_workgroup(), request.data.smbd_auth_crap.proof, NULL)) {
-               PyErr_SetString(
-                       winbind_error, "unable to fetch domain secret");
-               return NULL;
-       }
-
-
-
-       if (winbindd_request_response(WINBINDD_SMBD_AUTH_CRAP, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-       
-       return PyInt_FromLong(response.data.auth.nt_status);
-}
-
-#endif /* 0 */
-
-/* Get user info from name */
-
-static PyObject *py_getpwnam(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       char *username;
-       PyObject *result;
-
-       if (!PyArg_ParseTuple(args, "s", &username))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       fstrcpy(request.data.username, username);
-
-       if (winbindd_request_response(WINBINDD_GETPWNAM, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-       
-       if (!py_from_winbind_passwd(&result, &response)) {
-               result = Py_None;
-               Py_INCREF(result);
-       }
-
-       return result;
-}
-
-/* Get user info from uid */
-
-static PyObject *py_getpwuid(PyObject *self, PyObject *args)
-{
-       struct winbindd_request request;
-       struct winbindd_response response;
-       uid_t uid;
-       PyObject *result;
-
-       if (!PyArg_ParseTuple(args, "i", &uid))
-               return NULL;
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       request.data.uid = uid;
-
-       if (winbindd_request_response(WINBINDD_GETPWUID, &request, &response) 
-           != NSS_STATUS_SUCCESS) {
-               PyErr_SetString(winbind_error, "lookup failed");
-               return NULL;            
-       }
-       
-       if (!py_from_winbind_passwd(&result, &response)) {
-               result = Py_None;
-               Py_INCREF(result);
-       }
-
-       return result;
-}
-
-/*
- * Method dispatch table
- */
-
-static PyMethodDef winbind_methods[] = {
-
-       { "getpwnam", (PyCFunction)py_getpwnam, METH_VARARGS, "getpwnam(3)" },
-       { "getpwuid", (PyCFunction)py_getpwuid, METH_VARARGS, "getpwuid(3)" },
-
-       /* Name <-> SID conversion */
-
-       { "name_to_sid", (PyCFunction)py_name_to_sid, METH_VARARGS,
-         "name_to_sid(s) -> string\n"
-"\n"
-"Return the SID for a name.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.name_to_sid('FOO/Administrator')\n"
-"'S-1-5-21-406022937-1377575209-526660263-500' " },
-
-       { "sid_to_name", (PyCFunction)py_sid_to_name, METH_VARARGS,
-         "sid_to_name(s) -> string\n"
-"\n"
-"Return the name for a SID.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> import winbind\n"
-">>> winbind.sid_to_name('S-1-5-21-406022937-1377575209-526660263-500')\n"
-"'FOO/Administrator' " },
-
-       /* Enumerate users/groups */
-
-       { "enum_domain_users", (PyCFunction)py_enum_domain_users, METH_VARARGS,
-         "enum_domain_users() -> list of strings\n"
-"\n"
-"Return a list of domain users.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.enum_domain_users()\n"
-"['FOO/Administrator', 'FOO/anna', 'FOO/Anne Elk', 'FOO/build', \n"
-"'FOO/foo', 'FOO/foo2', 'FOO/foo3', 'FOO/Guest', 'FOO/user1', \n"
-"'FOO/whoops-ptang'] " },
-
-       { "enum_domain_groups", (PyCFunction)py_enum_domain_groups, 
-         METH_VARARGS,
-         "enum_domain_groups() -> list of strings\n"
-"\n"
-"Return a list of domain groups.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.enum_domain_groups()\n"
-"['FOO/cows', 'FOO/Domain Admins', 'FOO/Domain Guests', \n"
-"'FOO/Domain Users'] " },
-
-       /* ID mapping */
-
-       { "uid_to_sid", (PyCFunction)py_uid_to_sid, METH_VARARGS,
-         "uid_to_sid(int) -> string\n"
-"\n"
-"Return the SID for a UNIX uid.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.uid_to_sid(10000)   \n"
-"'S-1-5-21-406022937-1377575209-526660263-500' " },
-
-       { "gid_to_sid", (PyCFunction)py_gid_to_sid, METH_VARARGS,
-         "gid_to_sid(int) -> string\n"
-"\n"
-"Return the UNIX gid for a SID.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.gid_to_sid(10001)\n"
-"'S-1-5-21-406022937-1377575209-526660263-512' " },
-
-       { "sid_to_uid", (PyCFunction)py_sid_to_uid, METH_VARARGS,
-         "sid_to_uid(string) -> int\n"
-"\n"
-"Return the UNIX uid for a SID.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.sid_to_uid('S-1-5-21-406022937-1377575209-526660263-500')\n"
-"10000 " },
-
-       { "sid_to_gid", (PyCFunction)py_sid_to_gid, METH_VARARGS,
-         "sid_to_gid(string) -> int\n"
-"\n"
-"Return the UNIX gid corresponding to a SID.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.sid_to_gid('S-1-5-21-406022937-1377575209-526660263-512')\n"
-"10001 " },
-
-       /* Miscellaneous */
-
-       { "check_secret", (PyCFunction)py_check_secret, METH_VARARGS,
-         "check_secret() -> int\n"
-"\n"
-"Check the machine trust account password.  The NT status is returned\n"
-"with zero indicating success. " },
-
-       { "enum_trust_dom", (PyCFunction)py_enum_trust_dom, METH_VARARGS,
-         "enum_trust_dom() -> list of strings\n"
-"\n"
-"Return a list of trusted domains.  The domain the server is a member \n"
-"of is not included.\n"
-"\n"
-"Example:\n"
-"\n"
-">>> winbind.enum_trust_dom()\n"
-"['NPSD-TEST2', 'SP2NDOM'] " },
-
-       /* PAM authorisation functions */
-
-       { "auth_plaintext", (PyCFunction)py_auth_plaintext, METH_VARARGS,
-         "auth_plaintext(s, s) -> int\n"
-"\n"
-"Authenticate a username and password using plaintext authentication.\n"
-"The NT status code is returned with zero indicating success." },
-
-       { "auth_crap", (PyCFunction)py_auth_crap, METH_VARARGS | METH_KEYWORDS,
-         "auth_crap(s, s) -> int\n"
-"\n"
-"Authenticate a username and password using the challenge/response\n"
-"protocol.  The NT status code is returned with zero indicating\n"
-"success." },
-
-#if 0                          /* Include when smbd_auth merged to HEAD */
-
-       { "auth_smbd", (PyCFunction)py_auth_crap, METH_VARARGS,
-         "auth_smbd(s, s) -> int\n"
-"\n"
-"Authenticate a username and password using the challenge/response\n"
-"protocol but using the domain secret to prove we are root.  The NT \n"
-"status code is returned with zero indicating success." },
-
-#endif
-
-       { NULL }
-};
-
-static struct const_vals {
-       char *name;
-       uint32 value;
-       char *docstring;
-} module_const_vals[] = {
-
-       /* Well known RIDs */
-       
-       { "DOMAIN_USER_RID_ADMIN", DOMAIN_USER_RID_ADMIN, 
-         "Well-known RID for Administrator user" },
-
-       { "DOMAIN_USER_RID_GUEST", DOMAIN_USER_RID_GUEST,
-         "Well-known RID for Guest user" },
-
-       { "DOMAIN_GROUP_RID_ADMINS", DOMAIN_GROUP_RID_ADMINS,
-         "Well-known RID for Domain Admins group" },
-
-       { "DOMAIN_GROUP_RID_USERS", DOMAIN_GROUP_RID_USERS,
-         "Well-known RID for Domain Users group" },
-
-       { "DOMAIN_GROUP_RID_GUESTS", DOMAIN_GROUP_RID_GUESTS,
-         "Well-known RID for Domain Guests group" }, 
-       
-       { NULL }
-};
-
-static void const_init(PyObject *dict)
-{
-       struct const_vals *tmp;
-       PyObject *obj;
-
-       for (tmp = module_const_vals; tmp->name; tmp++) {
-               obj = PyInt_FromLong(tmp->value);
-               PyDict_SetItemString(dict, tmp->name, obj);
-               Py_DECREF(obj);
-       }
-}
-
-/*
- * Module initialisation 
- */
-
-static char winbind_module__doc__[] =
-"A python extension to winbind client functions.";
-
-void initwinbind(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-        module = Py_InitModule3("winbind", winbind_methods,
-                               winbind_module__doc__);
-
-       dict = PyModule_GetDict(module);
-
-       winbind_error = PyErr_NewException("winbind.error", NULL, NULL);
-       PyDict_SetItemString(dict, "error", winbind_error);
-
-       /* Do samba initialisation */
-
-       py_samba_init();
-
-       /* Initialise constants */
-
-       const_init(dict);
-
-       /* Insert configuration dictionary */
-
-       PyDict_SetItemString(dict, "config", py_config_dict());
-}
diff --git a/source3/python/py_winbind.h b/source3/python/py_winbind.h
deleted file mode 100644 (file)
index b865d5b..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_WINBIND_H
-#define _PY_WINBIND_H
-
-#include "python/py_common.h"
-
-/* The following definitions are from py_winbind_conv.c */
-
-BOOL py_from_winbind_passwd(PyObject **dict, struct winbindd_response *response);
-
-#endif /* _PY_WINBIND_H */
diff --git a/source3/python/py_winbind_conv.c b/source3/python/py_winbind_conv.c
deleted file mode 100644 (file)
index d70922d..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_common.h"
-#include "python/py_conv.h"
-
-/* Convert a struct passwd to a dictionary */
-
-static struct pyconv py_passwd[] = {
-       { "pw_name", PY_STRING, offsetof(struct winbindd_response, data.pw.pw_name) },
-       { "pw_passwd", PY_STRING, offsetof(struct winbindd_response, data.pw.pw_passwd) },
-       { "pw_uid", PY_UID, offsetof(struct winbindd_response, data.pw.pw_uid) },
-       { "pw_guid", PY_GID, offsetof(struct winbindd_response, data.pw.pw_gid) },
-       { "pw_gecos", PY_STRING, offsetof(struct winbindd_response, data.pw.pw_gecos) },
-       { "pw_dir", PY_STRING, offsetof(struct winbindd_response, data.pw.pw_dir) },
-       { "pw_shell", PY_STRING, offsetof(struct winbindd_response, data.pw.pw_shell) },
-       { NULL} 
-};
-
-BOOL py_from_winbind_passwd(PyObject **dict, struct winbindd_response *response)
-{
-       *dict = from_struct(response, py_passwd);
-       return True;
-}
diff --git a/source3/python/py_winreg.c b/source3/python/py_winreg.c
deleted file mode 100644 (file)
index 61536e4..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "python/py_winreg.h"
-
-static struct const_vals {
-       char *name;
-       uint32 value;
-} module_const_vals[] = {
-       
-       /* Registry value types */
-
-       { "REG_NONE", REG_NONE },
-       { "REG_SZ", REG_SZ },
-       { "REG_EXPAND_SZ", REG_EXPAND_SZ },
-       { "REG_BINARY", REG_BINARY },
-       { "REG_DWORD", REG_DWORD },
-       { "REG_DWORD_LE", REG_DWORD_LE },
-       { "REG_DWORD_BE", REG_DWORD_BE },
-       { "REG_LINK", REG_LINK },
-       { "REG_MULTI_SZ", REG_MULTI_SZ },
-       { "REG_RESOURCE_LIST", REG_RESOURCE_LIST },
-       { "REG_FULL_RESOURCE_DESCRIPTOR", REG_FULL_RESOURCE_DESCRIPTOR },
-       { "REG_RESOURCE_REQUIREMENTS_LIST", REG_RESOURCE_REQUIREMENTS_LIST },
-
-       { NULL },
-};
-
-static void const_init(PyObject *dict)
-{
-       struct const_vals *tmp;
-       PyObject *obj;
-
-       for (tmp = module_const_vals; tmp->name; tmp++) {
-               obj = PyInt_FromLong(tmp->value);
-               PyDict_SetItemString(dict, tmp->name, obj);
-               Py_DECREF(obj);
-       }
-}
-
-/*
- * Module initialisation 
- */
-
-static PyMethodDef winreg_methods[] = {
-       { NULL }
-};
-
-void initwinreg(void)
-{
-       PyObject *module, *dict;
-
-       /* Initialise module */
-
-       module = Py_InitModule("winreg", winreg_methods);
-       dict = PyModule_GetDict(module);
-
-       /* Initialise constants */
-
-       const_init(dict);
-
-       /* Do samba initialisation */
-
-       py_samba_init();
-}
diff --git a/source3/python/py_winreg.h b/source3/python/py_winreg.h
deleted file mode 100644 (file)
index b41a51e..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* 
-   Python wrappers for DCERPC/SMB client routines.
-
-   Copyright (C) Tim Potter, 2002
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PY_WINREG_H
-#define _PY_WINREG_H
-
-#include "python/py_common.h"
-
-#endif /* _PY_WINREG_H */
diff --git a/source3/python/samba/__init__.py b/source3/python/samba/__init__.py
deleted file mode 100644 (file)
index c818ca3..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-"""samba
-
-Various Python modules for interfacing to Samba.
-
-Try using help() to examine their documentation.
-"""
-
diff --git a/source3/python/samba/printerdata.py b/source3/python/samba/printerdata.py
deleted file mode 100644 (file)
index 6c40cc4..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/env python
-
-#
-# A python module that maps printerdata to a dictionary.  We define
-# two classes.  The printerdata class maps to Get/Set/Enum/DeletePrinterData
-# and the printerdata_ex class maps to Get/Set/Enum/DeletePrinterDataEx
-#
-
-#
-# TODO:
-#
-#   - Implement __delitem__
-#
-
-from samba import spoolss
-
-class printerdata:
-    def __init__(self, host, creds = {}, access = 0x02000000):
-       # For read access, use MAXIMUM_ALLOWED_ACCESS = 0x02000000
-       # For write access, use PRINTER_ACCESS_ADMINISTER = 0x00000004
-        self.hnd = spoolss.openprinter(host, creds = creds, access = access)
-
-    def keys(self):
-        return self.hnd.enumprinterdata().keys()
-
-    def __getitem__(self, key):
-        return self.hnd.getprinterdata(key)['data']
-
-    def __setitem__(self, key, value):
-        # Store as REG_BINARY for now
-        self.hnd.setprinterdata({"key": "", "value": key, "type": 3,
-                                 "data": value})
-        
-class printerdata_ex:
-    def __init__(self, host, creds = {}, access = 0x02000000):
-       # For read access, use MAXIMUM_ALLOWED_ACCESS = 0x02000000
-       # For write access, use PRINTER_ACCESS_ADMINISTER = 0x00000004
-        self.host = host
-        self.top_level_keys = ["PrinterDriverData", "DsSpooler", "DsDriver",
-                               "DsUser"]
-       self.creds = creds
-       self.access = access
-
-    def keys(self):
-        return self.top_level_keys
-
-    def has_key(self, key):
-        for k in self.top_level_keys:
-            if k == key:
-                return 1
-        return 0
-
-    class printerdata_ex_subkey:
-        def __init__(self, host, key, creds, access):
-            self.hnd = spoolss.openprinter(host, creds, access)
-            self.key = key
-
-        def keys(self):
-            return self.hnd.enumprinterdataex(self.key).keys()
-
-        def __getitem__(self, key):
-            return self.hnd.getprinterdataex(self.key, key)['data']
-
-    def __getitem__(self, key):
-        return self.printerdata_ex_subkey(
-            self.host, key, self.creds, self.access)
diff --git a/source3/python/setup.py b/source3/python/setup.py
deleted file mode 100755 (executable)
index 21717de..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-# -*- mode: python -*-
-#
-# Unix SMB/CIFS implementation.
-# Module packaging setup for Samba python extensions
-#
-# Copyright (C) Tim Potter, 2002-2003
-# Copyright (C) Martin Pool, 2002
-#
-# 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 3 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, see <http://www.gnu.org/licenses/>.
-#
-
-from distutils.core import setup
-from distutils.extension import Extension
-
-import sys, string, os
-
-# The Makefile passes in environment variable $PYTHON_OBJ as being the
-# list of Samba objects.  This kind of goes against the distutils.cmd
-# method of adding setup commands and will also confuse people who are
-# familiar with the python Distutils module.
-
-samba_objs = os.environ.get("PYTHON_OBJS", "")
-
-samba_cflags = os.environ.get("PYTHON_CFLAGS", "")
-
-samba_srcdir = os.environ.get("SRCDIR", "")
-
-compiler = os.environ.get("CC", "")
-
-# These variables are filled in by configure
-
-samba_libs = os.environ.get("LIBS", "")
-
-obj_list = string.split(samba_objs)
-
-# Unfortunately the samba_libs variable contains both shared libraries
-# and linker flags.  The python distutils doesn't like this so we have
-# to split $samba_libs into a flags component and a library component.
-
-libraries = []
-library_dirs = []
-
-next_is_path = 0
-next_is_flag = 0
-
-for lib in string.split(samba_libs):
-    if next_is_path != 0:
-        library_dirs.append(lib);
-        next_is_path = 0;
-    elif next_is_flag != 0:
-        next_is_flag = 0;
-    elif lib == "-Wl,-rpath":
-        next_is_path = 1;
-    elif lib[0:2] == ("-l"):
-        libraries.append(lib[2:])
-    elif lib[0:8] == ("-pthread"):
-        pass # Skip linker flags
-    elif lib[0:4] == ("-pie"):
-        pass # Skip linker flags
-    elif lib[0:2] == "-L":
-        library_dirs.append(lib[2:])
-    elif lib[0:2] in ("-W","-s"):
-        pass # Skip linker flags
-    elif lib[0:2] == "-z":
-        next_is_flag = 1 # Skip linker flags
-    else:
-        print "Unknown entry '%s' in $LIBS variable passed to setup.py" % lib
-        sys.exit(1)
-
-flags_list = string.split(samba_cflags)
-
-# Invoke distutils.setup
-
-setup(
-
-    # Overview information
-    
-    name = "Samba Python Extensions",
-    version = "0.1",
-    author = "Tim Potter",
-    author_email = "tpot@samba.org",
-    license = "GPL",
-
-    # Get the "samba" directory of Python source.  At the moment this
-    # just contains the __init__ file that makes it work as a
-    # subpackage.  This is needed even though everything else is an
-    # extension module.
-    package_dir = {"samba": os.path.join(samba_srcdir, "python", "samba")},
-    packages = ["samba"],
-    
-    # Module list
-    ext_package = "samba", 
-    ext_modules = [
-
-    # SPOOLSS pipe module
-
-    Extension(name = "spoolss",
-              sources = [samba_srcdir + "python/py_spoolss.c",
-                         samba_srcdir + "python/py_common.c",
-                         samba_srcdir + "python/py_conv.c",
-                         samba_srcdir + "python/py_ntsec.c",
-                         samba_srcdir + "python/py_spoolss_common.c",
-                         samba_srcdir + "python/py_spoolss_forms.c",
-                         samba_srcdir + "python/py_spoolss_forms_conv.c",
-                         samba_srcdir + "python/py_spoolss_drivers.c",
-                         samba_srcdir + "python/py_spoolss_drivers_conv.c",
-                         samba_srcdir + "python/py_spoolss_printers.c",
-                         samba_srcdir + "python/py_spoolss_printers_conv.c",
-                         samba_srcdir + "python/py_spoolss_printerdata.c",
-                         samba_srcdir + "python/py_spoolss_ports.c",
-                         samba_srcdir + "python/py_spoolss_ports_conv.c",
-                         samba_srcdir + "python/py_spoolss_jobs.c",
-                         samba_srcdir + "python/py_spoolss_jobs_conv.c",
-                         ],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # LSA pipe module
-
-    Extension(name = "lsa",
-              sources = [samba_srcdir + "python/py_lsa.c",
-                         samba_srcdir + "python/py_common.c",
-                         samba_srcdir + "python/py_ntsec.c"],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # SAMR pipe module
-
-    Extension(name = "samr",
-              sources = [samba_srcdir + "python/py_samr.c",
-                         samba_srcdir + "python/py_conv.c",
-                         samba_srcdir + "python/py_samr_conv.c",
-                         samba_srcdir + "python/py_common.c"],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # winbind client module
-
-    Extension(name = "winbind",
-              sources = [samba_srcdir + "python/py_winbind.c",
-                         samba_srcdir + "python/py_winbind_conv.c",
-                         samba_srcdir + "python/py_conv.c",
-                         samba_srcdir + "python/py_common.c"],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # WINREG pipe module
-
-    Extension(name = "winreg",
-              sources = [samba_srcdir + "python/py_winreg.c",
-                         samba_srcdir + "python/py_common.c"],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # SRVSVC pipe module
-
-    Extension(name = "srvsvc",
-              sources = [samba_srcdir + "python/py_srvsvc.c",
-                         samba_srcdir + "python/py_conv.c",
-                         samba_srcdir + "python/py_srvsvc_conv.c",
-                         samba_srcdir + "python/py_common.c"],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # tdb module
-
-    Extension(name = "tdb",
-              sources = [samba_srcdir + "python/py_tdb.c"],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # libsmb module
-
-    Extension(name = "smb",
-              sources = [samba_srcdir + "python/py_smb.c",
-                         samba_srcdir + "python/py_common.c",
-                         samba_srcdir + "python/py_ntsec.c"],
-              libraries = libraries,
-              library_dirs = ["/usr/kerberos/lib"] + library_dirs,
-              extra_compile_args = flags_list,
-              extra_objects = obj_list),
-
-    # tdbpack/unpack extensions.  Does not actually link to any Samba
-    # code, although it implements a compatible data format.
-    
-    Extension(name = "tdbpack",
-              sources = [os.path.join(samba_srcdir, "python", "py_tdbpack.c")],
-              extra_compile_args = ["-I."])
-    ],
-)
index ec325e6afb5df2c34aa4d8ff8625e85a92fec4b1..be85e49476a8c8a4318d0181ddb84e989638a615 100644 (file)
@@ -139,7 +139,7 @@ static NTSTATUS rpccli_lsa_lookup_sids_noalloc(struct rpc_pipe_client *cli,
                                               const DOM_SID *sids,
                                               char **domains,
                                               char **names,
-                                              enum lsa_SidType *types)
+                                              uint32 *types)
 {
        prs_struct qbuf, rbuf;
        LSA_Q_LOOKUP_SIDS q;
@@ -213,7 +213,7 @@ static NTSTATUS rpccli_lsa_lookup_sids_noalloc(struct rpc_pipe_client *cli,
 
                        (names)[i] = talloc_strdup(mem_ctx, name);
                        (domains)[i] = talloc_strdup(mem_ctx, dom_name);
-                       (types)[i] = (enum lsa_SidType)r.names.name[i].sid_name_use;
+                       (types)[i] = r.names.name[i].sid_name_use;
 
                        if (((names)[i] == NULL) || ((domains)[i] == NULL)) {
                                DEBUG(0, ("cli_lsa_lookup_sids_noalloc(): out of memory\n"));
@@ -252,7 +252,7 @@ NTSTATUS rpccli_lsa_lookup_sids(struct rpc_pipe_client *cli,
                                const DOM_SID *sids,
                                char ***domains,
                                char ***names,
-                               enum lsa_SidType **types)
+                               uint32 **types)
 {
        NTSTATUS result = NT_STATUS_OK;
        int sids_left = 0;
@@ -260,7 +260,7 @@ NTSTATUS rpccli_lsa_lookup_sids(struct rpc_pipe_client *cli,
        const DOM_SID *hunk_sids = sids;
        char **hunk_domains = NULL;
        char **hunk_names = NULL;
-       enum lsa_SidType *hunk_types = NULL;
+       uint32 *hunk_types = NULL;
 
        if (num_sids) {
                if (!((*domains) = TALLOC_ARRAY(mem_ctx, char *, num_sids))) {
@@ -359,7 +359,7 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
                                 const char ***dom_names,
                                 int level,
                                 DOM_SID **sids,
-                                enum lsa_SidType **types)
+                                uint32 **types)
 {
        prs_struct qbuf, rbuf;
        LSA_Q_LOOKUP_NAMES q;
@@ -407,7 +407,7 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
                        goto done;
                }
 
-               if (!((*types = TALLOC_ARRAY(mem_ctx, enum lsa_SidType, num_names)))) {
+               if (!((*types = TALLOC_ARRAY(mem_ctx, uint32, num_names)))) {
                        DEBUG(0, ("cli_lsa_lookup_sids(): out of memory\n"));
                        result = NT_STATUS_NO_MEMORY;
                        goto done;
@@ -450,7 +450,7 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
                        sid_append_rid(sid, dom_rid);
                }
 
-               (*types)[i] = (enum lsa_SidType)t_rids[i].type;
+               (*types)[i] = t_rids[i].type;
 
                if (dom_names == NULL) {
                        continue;
@@ -1375,43 +1375,43 @@ done:
 BOOL fetch_domain_sid( char *domain, char *remote_machine, DOM_SID *psid)
 {
        extern pstring global_myname;
-       struct cli_state *cli;
+       struct cli_state cli;
        NTSTATUS result;
        POLICY_HND lsa_pol;
        BOOL ret = False;
 
        ZERO_STRUCT(cli);
-       if((cli = cli_initialise()) == NULL) {
+       if(cli_initialise(&cli) == False) {
                DEBUG(0,("fetch_domain_sid: unable to initialize client connection.\n"));
                return False;
        }
 
-       if(!resolve_name( remote_machine, &cli->dest_ip, 0x20)) {
+       if(!resolve_name( remote_machine, &cli.dest_ip, 0x20)) {
                DEBUG(0,("fetch_domain_sid: Can't resolve address for %s\n", remote_machine));
                goto done;
        }
 
-       if (!cli_connect(cli, remote_machine, &cli->dest_ip)) {
+       if (!cli_connect(&cli, remote_machine, &cli.dest_ip)) {
                DEBUG(0,("fetch_domain_sid: unable to connect to SMB server on \
-machine %s. Error was : %s.\n", remote_machine, cli_errstr(cli) ));
+machine %s. Error was : %s.\n", remote_machine, cli_errstr(&cli) ));
                goto done;
        }
 
-       if (!attempt_netbios_session_request(cli, global_myname, remote_machine, &cli->dest_ip)) {
+       if (!attempt_netbios_session_request(&cli, global_myname, remote_machine, &cli.dest_ip)) {
                DEBUG(0,("fetch_domain_sid: machine %s rejected the NetBIOS session request.\n",
                        remote_machine));
                goto done;
        }
 
-       cli->protocol = PROTOCOL_NT1;
+       cli.protocol = PROTOCOL_NT1;
 
-       if (!cli_negprot(cli)) {
+       if (!cli_negprot(&cli)) {
                DEBUG(0,("fetch_domain_sid: machine %s rejected the negotiate protocol. \
-Error was : %s.\n", remote_machine, cli_errstr(cli) ));
+Error was : %s.\n", remote_machine, cli_errstr(&cli) ));
                goto done;
        }
 
-       if (cli->protocol != PROTOCOL_NT1) {
+       if (cli.protocol != PROTOCOL_NT1) {
                DEBUG(0,("fetch_domain_sid: machine %s didn't negotiate NT protocol.\n",
                        remote_machine));
                goto done;
@@ -1421,39 +1421,39 @@ Error was : %s.\n", remote_machine, cli_errstr(cli) ));
         * Do an anonymous session setup.
         */
 
-       if (!cli_session_setup(cli, "", "", 0, "", 0, "")) {
+       if (!cli_session_setup(&cli, "", "", 0, "", 0, "")) {
                DEBUG(0,("fetch_domain_sid: machine %s rejected the session setup. \
-Error was : %s.\n", remote_machine, cli_errstr(cli) ));
+Error was : %s.\n", remote_machine, cli_errstr(&cli) ));
                goto done;
        }
 
-       if (!(cli->sec_mode & NEGOTIATE_SECURITY_USER_LEVEL)) {
+       if (!(cli.sec_mode & NEGOTIATE_SECURITY_USER_LEVEL)) {
                DEBUG(0,("fetch_domain_sid: machine %s isn't in user level security mode\n",
                        remote_machine));
                goto done;
        }
 
-       if (!cli_send_tconX(cli, "IPC$", "IPC", "", 1)) {
+       if (!cli_send_tconX(&cli, "IPC$", "IPC", "", 1)) {
                DEBUG(0,("fetch_domain_sid: machine %s rejected the tconX on the IPC$ share. \
-Error was : %s.\n", remote_machine, cli_errstr(cli) ));
+Error was : %s.\n", remote_machine, cli_errstr(&cli) ));
                goto done;
        }
 
        /* Fetch domain sid */
 
-       if (!cli_nt_session_open(cli, PI_LSARPC)) {
+       if (!cli_nt_session_open(&cli, PI_LSARPC)) {
                DEBUG(0, ("fetch_domain_sid: Error connecting to SAM pipe\n"));
                goto done;
        }
 
-       result = cli_lsa_open_policy(cli, cli->mem_ctx, True, SEC_RIGHTS_QUERY_VALUE, &lsa_pol);
+       result = cli_lsa_open_policy(&cli, cli.mem_ctx, True, SEC_RIGHTS_QUERY_VALUE, &lsa_pol);
        if (!NT_STATUS_IS_OK(result)) {
                DEBUG(0, ("fetch_domain_sid: Error opening lsa policy handle. %s\n",
                        nt_errstr(result) ));
                goto done;
        }
 
-       result = cli_lsa_query_info_policy(cli, cli->mem_ctx, &lsa_pol, 5, domain, psid);
+       result = cli_lsa_query_info_policy(&cli, cli.mem_ctx, &lsa_pol, 5, domain, psid);
        if (!NT_STATUS_IS_OK(result)) {
                DEBUG(0, ("fetch_domain_sid: Error querying lsa policy handle. %s\n",
                        nt_errstr(result) ));
@@ -1464,7 +1464,7 @@ Error was : %s.\n", remote_machine, cli_errstr(cli) ));
 
   done:
 
-       cli_shutdown(cli);
+       cli_shutdown(&cli);
        return ret;
 }
 
index b1b6623bcdad23c810562807f90f80d44fb25d57..8eaf20aa1ec395dd92018b453990953276e7aec9 100644 (file)
@@ -51,6 +51,9 @@ NTSTATUS rpccli_samr_connect(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
        if (NT_STATUS_IS_OK(result = r.status)) {
                *connect_pol = r.connect_pol;
+#ifdef __INSURE__
+               connect_pol->marker = malloc(1);
+#endif
        }
 
        return result;
@@ -84,6 +87,9 @@ NTSTATUS rpccli_samr_connect4(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
        if (NT_STATUS_IS_OK(result = r.status)) {
                *connect_pol = r.connect_pol;
+#ifdef __INSURE__
+               connect_pol->marker = malloc(1);
+#endif
        }
 
        return result;
@@ -118,6 +124,9 @@ NTSTATUS rpccli_samr_close(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
        /* Return output parameters */
 
        if (NT_STATUS_IS_OK(result = r.status)) {
+#ifdef __INSURE__
+               SAFE_FREE(connect_pol->marker);
+#endif
                *connect_pol = r.pol;
        }
 
@@ -156,6 +165,9 @@ NTSTATUS rpccli_samr_open_domain(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ct
 
        if (NT_STATUS_IS_OK(result = r.status)) {
                *domain_pol = r.domain_pol;
+#ifdef __INSURE__
+               domain_pol->marker = malloc(1);
+#endif
        }
 
        return result;
@@ -191,6 +203,9 @@ NTSTATUS rpccli_samr_open_user(struct rpc_pipe_client *cli,
 
        if (NT_STATUS_IS_OK(result = r.status)) {
                *user_pol = r.user_pol;
+#ifdef __INSURE__
+               user_pol->marker = malloc(1);
+#endif
        }
 
        return result;
@@ -228,6 +243,9 @@ NTSTATUS rpccli_samr_open_group(struct rpc_pipe_client *cli,
 
        if (NT_STATUS_IS_OK(result = r.status)) {
                *group_pol = r.pol;
+#ifdef __INSURE__
+               group_pol->marker = malloc(1);
+#endif
        }
 
        return result;
@@ -921,6 +939,9 @@ NTSTATUS rpccli_samr_open_alias(struct rpc_pipe_client *cli,
 
        if (NT_STATUS_IS_OK(result = r.status)) {
                *alias_pol = r.pol;
+#ifdef __INSURE__
+               alias_pol->marker = malloc(1);
+#endif
        }
 
        return result;
@@ -1196,6 +1217,11 @@ NTSTATUS rpccli_samr_chgpasswd_user(struct rpc_pipe_client *cli,
                                    const char *newpassword, 
                                    const char *oldpassword )
 {
+       prs_struct qbuf, rbuf;
+       SAMR_Q_CHGPASSWD_USER q;
+       SAMR_R_CHGPASSWD_USER r;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
        uchar new_nt_password[516];
        uchar new_lm_password[516];
        uchar old_nt_hash[16];
@@ -1206,8 +1232,13 @@ NTSTATUS rpccli_samr_chgpasswd_user(struct rpc_pipe_client *cli,
        uchar new_nt_hash[16];
        uchar new_lanman_hash[16];
 
+       char *srv_name_slash = talloc_asprintf(mem_ctx, "\\\\%s", cli->cli->desthost);
+
        DEBUG(10,("rpccli_samr_chgpasswd_user\n"));
 
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
        /* Calculate the MD4 hash (NT compatible) of the password */
        E_md4hash(oldpassword, old_nt_hash);
        E_md4hash(newpassword, new_nt_hash);
@@ -1234,35 +1265,50 @@ NTSTATUS rpccli_samr_chgpasswd_user(struct rpc_pipe_client *cli,
        SamOEMhash( new_nt_password, old_nt_hash, 516);
        E_old_pw_hash( new_nt_hash, old_nt_hash, old_nt_hash_enc);
 
-       return rpccli_samr_chng_pswd_auth_crap(cli, mem_ctx, username,
-                                              data_blob_const(new_nt_password,sizeof(new_nt_password)),
-                                              data_blob_const(old_nt_hash_enc,sizeof(old_nt_hash_enc)),
-                                              data_blob_const(new_lm_password,sizeof(new_lm_password)),
-                                              data_blob_const(old_lanman_hash_enc,sizeof(old_lanman_hash_enc)));
+       /* Marshall data and send request */
+
+       init_samr_q_chgpasswd_user(&q, srv_name_slash, username, 
+                                  new_nt_password, 
+                                  old_nt_hash_enc, 
+                                  new_lm_password,
+                                  old_lanman_hash_enc);
+
+       CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_CHGPASSWD_USER,
+               q, r,
+               qbuf, rbuf,
+               samr_io_q_chgpasswd_user,
+               samr_io_r_chgpasswd_user,
+               NT_STATUS_UNSUCCESSFUL); 
+
+       /* Return output parameters */
+
+       if (!NT_STATUS_IS_OK(result = r.status)) {
+               goto done;
+       }
+
+ done:
+
+       return result;
 }
 
-/* User change passwd with auth crap */
+/* User change password given blobs */
 
 NTSTATUS rpccli_samr_chng_pswd_auth_crap(struct rpc_pipe_client *cli,
-                                        TALLOC_CTX *mem_ctx, 
-                                        const char *username, 
-                                        DATA_BLOB new_nt_password,
-                                        DATA_BLOB old_nt_hash_enc,
-                                        DATA_BLOB new_lm_password,
-                                        DATA_BLOB old_lm_hash_enc)
+                                   TALLOC_CTX *mem_ctx, 
+                                   const char *username, 
+                                   DATA_BLOB new_nt_password,
+                                   DATA_BLOB old_nt_hash_enc,
+                                   DATA_BLOB new_lm_password,
+                                   DATA_BLOB old_lm_hash_enc)
 {
        prs_struct qbuf, rbuf;
        SAMR_Q_CHGPASSWD_USER q;
        SAMR_R_CHGPASSWD_USER r;
-       char *srv_name_slash;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 
-       if (!(srv_name_slash = talloc_asprintf(mem_ctx, "\\\\%s",
-                                              cli->cli->desthost))) {
-               return NT_STATUS_NO_MEMORY;
-       }
+       char *srv_name_slash = talloc_asprintf(mem_ctx, "\\\\%s", cli->cli->desthost);
 
-       DEBUG(5,("rpccli_samr_chng_pswd_auth_crap on server: %s\n",
-                srv_name_slash));
+       DEBUG(10,("rpccli_samr_chng_pswd_auth_crap\n"));
 
        ZERO_STRUCT(q);
        ZERO_STRUCT(r);
@@ -1272,19 +1318,28 @@ NTSTATUS rpccli_samr_chng_pswd_auth_crap(struct rpc_pipe_client *cli,
        init_samr_q_chgpasswd_user(&q, srv_name_slash, username, 
                                   new_nt_password.data, 
                                   old_nt_hash_enc.data, 
-                                  new_lm_password.data, 
+                                  new_lm_password.data,
                                   old_lm_hash_enc.data);
 
        CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_CHGPASSWD_USER,
-                  q, r,
-                  qbuf, rbuf,
-                  samr_io_q_chgpasswd_user,
-                  samr_io_r_chgpasswd_user,
-                  NT_STATUS_UNSUCCESSFUL);
+               q, r,
+               qbuf, rbuf,
+               samr_io_q_chgpasswd_user,
+               samr_io_r_chgpasswd_user,
+               NT_STATUS_UNSUCCESSFUL); 
 
-       return r.status;
+       /* Return output parameters */
+
+       if (!NT_STATUS_IS_OK(result = r.status)) {
+               goto done;
+       }
+
+ done:
+
+       return result;
 }
 
+
 /* change password 3 */
 
 NTSTATUS rpccli_samr_chgpasswd3(struct rpc_pipe_client *cli,
@@ -1433,59 +1488,7 @@ NTSTATUS rpccli_samr_query_dispinfo(struct rpc_pipe_client *cli,
 
        /* Return output parameters */
 
-       result = r.status;
-
-       if (!NT_STATUS_IS_OK(result) &&
-           NT_STATUS_V(result) != NT_STATUS_V(STATUS_MORE_ENTRIES)) {
-               goto done;
-       }
-
-       *num_entries = r.num_entries;
-       *start_idx += r.num_entries;  /* No next_idx in this structure! */
-
- done:
-       return result;
-}
-
-
-/* Query display info2 */
-
-NTSTATUS rpccli_samr_query_dispinfo2(struct rpc_pipe_client *cli,
-                                    TALLOC_CTX *mem_ctx, 
-                                    POLICY_HND *domain_pol, uint32 *start_idx,
-                                    uint16 switch_value, uint32 *num_entries,
-                                    uint32 max_entries, uint32 max_size,
-                                    SAM_DISPINFO_CTR *ctr)
-{
-       prs_struct qbuf, rbuf;
-       SAMR_Q_QUERY_DISPINFO q;
-       SAMR_R_QUERY_DISPINFO r;
-       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-
-       DEBUG(10,("cli_samr_query_dispinfo2 for start_idx = %u\n", *start_idx));
-
-       ZERO_STRUCT(q);
-       ZERO_STRUCT(r);
-
-       *num_entries = 0;
-
-       /* Marshall data and send request */
-
-       init_samr_q_query_dispinfo(&q, domain_pol, switch_value,
-                                  *start_idx, max_entries, max_size);
-
-       r.ctr = ctr;
-
-       CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_QUERY_DISPINFO2,
-               q, r,
-               qbuf, rbuf,
-               samr_io_q_query_dispinfo,
-               samr_io_r_query_dispinfo,
-               NT_STATUS_UNSUCCESSFUL); 
-
-       /* Return output parameters */
-
-       result = r.status;
+        result = r.status;
 
        if (!NT_STATUS_IS_OK(result) &&
            NT_STATUS_V(result) != NT_STATUS_V(STATUS_MORE_ENTRIES)) {
@@ -1499,142 +1502,6 @@ NTSTATUS rpccli_samr_query_dispinfo2(struct rpc_pipe_client *cli,
        return result;
 }
 
-/* Query display info */
-
-NTSTATUS rpccli_samr_query_dispinfo3(struct rpc_pipe_client *cli,
-                                    TALLOC_CTX *mem_ctx, 
-                                    POLICY_HND *domain_pol, uint32 *start_idx,
-                                    uint16 switch_value, uint32 *num_entries,
-                                    uint32 max_entries, uint32 max_size,
-                                    SAM_DISPINFO_CTR *ctr)
-{
-       prs_struct qbuf, rbuf;
-       SAMR_Q_QUERY_DISPINFO q;
-       SAMR_R_QUERY_DISPINFO r;
-       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-
-       DEBUG(10,("cli_samr_query_dispinfo3 for start_idx = %u\n", *start_idx));
-
-       ZERO_STRUCT(q);
-       ZERO_STRUCT(r);
-
-       *num_entries = 0;
-
-       /* Marshall data and send request */
-
-       init_samr_q_query_dispinfo(&q, domain_pol, switch_value,
-                                  *start_idx, max_entries, max_size);
-
-       r.ctr = ctr;
-
-       CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_QUERY_DISPINFO3,
-               q, r,
-               qbuf, rbuf,
-               samr_io_q_query_dispinfo,
-               samr_io_r_query_dispinfo,
-               NT_STATUS_UNSUCCESSFUL); 
-
-       /* Return output parameters */
-
-       result = r.status;
-
-       if (!NT_STATUS_IS_OK(result) &&
-           NT_STATUS_V(result) != NT_STATUS_V(STATUS_MORE_ENTRIES)) {
-               goto done;
-       }
-
-       *num_entries = r.num_entries;
-       *start_idx += r.num_entries;  /* No next_idx in this structure! */
-
- done:
-       return result;
-}
-
-/* Query display info index */
-
-NTSTATUS rpccli_samr_get_dispenum_index(struct rpc_pipe_client *cli,
-                                       TALLOC_CTX *mem_ctx, 
-                                       POLICY_HND *domain_pol,
-                                       uint16 switch_value,
-                                       const char *name,
-                                       uint32 *idx)
-{
-       prs_struct qbuf, rbuf;
-       SAMR_Q_GET_DISPENUM_INDEX q;
-       SAMR_R_GET_DISPENUM_INDEX r;
-       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-
-       DEBUG(10,("cli_samr_get_dispenum_index for name = %s\n", name));
-
-       ZERO_STRUCT(q);
-       ZERO_STRUCT(r);
-
-       /* Marshall data and send request */
-
-       init_samr_q_get_dispenum_index(&q, domain_pol, switch_value, name);
-
-       CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_GET_DISPENUM_INDEX,
-               q, r,
-               qbuf, rbuf,
-               samr_io_q_get_dispenum_index,
-               samr_io_r_get_dispenum_index,
-               NT_STATUS_UNSUCCESSFUL); 
-
-       /* Return output parameters */
-
-       *idx = 0;
-
-       result = r.status;
-
-       if (!NT_STATUS_IS_ERR(result)) {
-               *idx = r.idx;
-       }
-
-       return result;
-}
-
-NTSTATUS rpccli_samr_get_dispenum_index2(struct rpc_pipe_client *cli,
-                                        TALLOC_CTX *mem_ctx, 
-                                        POLICY_HND *domain_pol,
-                                        uint16 switch_value,
-                                        const char *name,
-                                        uint32 *idx)
-{
-       prs_struct qbuf, rbuf;
-       SAMR_Q_GET_DISPENUM_INDEX q;
-       SAMR_R_GET_DISPENUM_INDEX r;
-       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-
-       DEBUG(10,("cli_samr_get_dispenum_index2 for name = %s\n", name));
-
-       ZERO_STRUCT(q);
-       ZERO_STRUCT(r);
-
-       /* Marshall data and send request */
-
-       init_samr_q_get_dispenum_index(&q, domain_pol, switch_value, name);
-
-       CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_GET_DISPENUM_INDEX2,
-               q, r,
-               qbuf, rbuf,
-               samr_io_q_get_dispenum_index,
-               samr_io_r_get_dispenum_index,
-               NT_STATUS_UNSUCCESSFUL); 
-
-       /* Return output parameters */
-
-       *idx = 0;
-
-       result = r.status;
-
-       if (!NT_STATUS_IS_ERR(result)) {
-               *idx = r.idx;
-       }
-
-       return result;
-}
-
-
 /* Lookup rids.  Note that NT4 seems to crash if more than ~1000 rids are
    looked up in one packet. */
 
diff --git a/source3/rpc_client/cli_srvsvc.c b/source3/rpc_client/cli_srvsvc.c
new file mode 100644 (file)
index 0000000..50a6810
--- /dev/null
@@ -0,0 +1,585 @@
+/* 
+   Unix SMB/CIFS implementation.
+   NT Domain Authentication SMB / MSRPC client
+   Copyright (C) Andrew Tridgell 1994-2000
+   Copyright (C) Tim Potter 2001
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
+   Copyright (C) Jeremy Allison  2005.
+   Copyright (C) Gerald (Jerry) Carter        2006.
+
+
+   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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+
+WERROR rpccli_srvsvc_net_srv_get_info(struct rpc_pipe_client *cli, 
+                                  TALLOC_CTX *mem_ctx,
+                                  uint32 switch_value, SRV_INFO_CTR *ctr)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_SRV_GET_INFO q;
+       SRV_R_NET_SRV_GET_INFO r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise input parameters */
+
+       slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server);
+
+       init_srv_q_net_srv_get_info(&q, server, switch_value);
+       r.ctr = ctr;
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SRV_GET_INFO,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_srv_get_info,
+               srv_io_r_net_srv_get_info,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+       return result;
+}
+
+WERROR rpccli_srvsvc_net_share_enum(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
+                                uint32 info_level, SRV_SHARE_INFO_CTR *ctr,
+                                int preferred_len, ENUM_HND *hnd)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_SHARE_ENUM q;
+       SRV_R_NET_SHARE_ENUM r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server;
+       int i;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise input parameters */
+
+       slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server);
+
+       init_srv_q_net_share_enum(&q, server, info_level, preferred_len, hnd);
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_ENUM_ALL,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_share_enum,
+               srv_io_r_net_share_enum,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+
+       if (!W_ERROR_IS_OK(result))
+               goto done;
+
+       /* Oh yuck yuck yuck - we have to copy all the info out of the
+          SRV_SHARE_INFO_CTR in the SRV_R_NET_SHARE_ENUM as when we do a
+          prs_mem_free() it will all be invalidated.  The various share
+          info structures suck badly too.  This really is gross. */
+
+       ZERO_STRUCTP(ctr);
+
+       if (!r.ctr.num_entries)
+               goto done;
+
+       ctr->info_level = info_level;
+       ctr->num_entries = r.ctr.num_entries;
+
+       switch(info_level) {
+       case 1:
+               ctr->share.info1 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_1, ctr->num_entries);
+               if (ctr->share.info1 == NULL) {
+                       return WERR_NOMEM;
+               }
+               
+               memset(ctr->share.info1, 0, sizeof(SRV_SHARE_INFO_1));
+
+               for (i = 0; i < ctr->num_entries; i++) {
+                       SRV_SHARE_INFO_1 *info1 = &ctr->share.info1[i];
+                       char *s;
+                       
+                       /* Copy pointer crap */
+
+                       memcpy(&info1->info_1, &r.ctr.share.info1[i].info_1, 
+                              sizeof(SH_INFO_1));
+
+                       /* Duplicate strings */
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info1[i].info_1_str.uni_netname);
+                       if (s)
+                               init_unistr2(&info1->info_1_str.uni_netname, s, UNI_STR_TERMINATE);
+               
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info1[i].info_1_str.uni_remark);
+                       if (s)
+                               init_unistr2(&info1->info_1_str.uni_remark, s, UNI_STR_TERMINATE);
+
+               }               
+
+               break;
+       case 2:
+               ctr->share.info2 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_2, ctr->num_entries);
+               if (ctr->share.info2 == NULL) {
+                       return WERR_NOMEM;
+               }
+               
+               memset(ctr->share.info2, 0, sizeof(SRV_SHARE_INFO_2));
+
+               for (i = 0; i < ctr->num_entries; i++) {
+                       SRV_SHARE_INFO_2 *info2 = &ctr->share.info2[i];
+                       char *s;
+                       
+                       /* Copy pointer crap */
+
+                       memcpy(&info2->info_2, &r.ctr.share.info2[i].info_2, 
+                              sizeof(SH_INFO_2));
+
+                       /* Duplicate strings */
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_netname);
+                       if (s)
+                               init_unistr2(&info2->info_2_str.uni_netname, s, UNI_STR_TERMINATE);
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_remark);
+                       if (s)
+                               init_unistr2(&info2->info_2_str.uni_remark, s, UNI_STR_TERMINATE);
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_path);
+                       if (s)
+                               init_unistr2(&info2->info_2_str.uni_path, s, UNI_STR_TERMINATE);
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_passwd);
+                       if (s)
+                               init_unistr2(&info2->info_2_str.uni_passwd, s, UNI_STR_TERMINATE);
+               }
+               break;
+       /* adding info-level 502 here */
+       case 502:
+               ctr->share.info502 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_502, ctr->num_entries);
+
+               if (ctr->share.info502 == NULL) {
+                       return WERR_NOMEM;
+               }
+               
+               memset(ctr->share.info502, 0, sizeof(SRV_SHARE_INFO_502));
+
+               for (i = 0; i < ctr->num_entries; i++) {
+                       SRV_SHARE_INFO_502 *info502 = &ctr->share.info502[i];
+                       char *s;
+                       
+                       /* Copy pointer crap */
+                       memcpy(&info502->info_502, &r.ctr.share.info502[i].info_502, 
+                              sizeof(SH_INFO_502));
+
+                       /* Duplicate strings */
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_netname);
+                       if (s)
+                               init_unistr2(&info502->info_502_str.uni_netname, s, UNI_STR_TERMINATE);
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_remark);
+                       if (s)
+                               init_unistr2(&info502->info_502_str.uni_remark, s, UNI_STR_TERMINATE);
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_path);
+                       if (s)
+                               init_unistr2(&info502->info_502_str.uni_path, s, UNI_STR_TERMINATE);
+
+                       s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_passwd);
+                       if (s)
+                               init_unistr2(&info502->info_502_str.uni_passwd, s, UNI_STR_TERMINATE);
+               
+                       info502->info_502_str.sd = dup_sec_desc(mem_ctx, r.ctr.share.info502[i].info_502_str.sd);
+               }
+               break;
+       }
+
+  done:
+
+       return result;
+}
+
+WERROR rpccli_srvsvc_net_share_get_info(struct rpc_pipe_client *cli,
+                                    TALLOC_CTX *mem_ctx,
+                                    const char *sharename,
+                                    uint32 info_level,
+                                    SRV_SHARE_INFO *info)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_SHARE_GET_INFO q;
+       SRV_R_NET_SHARE_GET_INFO r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise input parameters */
+
+       slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server);
+
+       init_srv_q_net_share_get_info(&q, server, sharename, info_level);
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_GET_INFO,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_share_get_info,
+               srv_io_r_net_share_get_info,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+
+       if (!W_ERROR_IS_OK(result))
+               goto done;
+
+       ZERO_STRUCTP(info);
+
+       info->switch_value = info_level;
+
+       switch(info_level) {
+       case 1:
+       {
+               SRV_SHARE_INFO_1 *info1 = &info->share.info1;
+               SH_INFO_1_STR *info1_str = &info1->info_1_str;
+               
+               char *s;
+
+               info->share.info1 = r.info.share.info1;
+
+               /* Duplicate strings */
+
+               s = unistr2_tdup(mem_ctx, &info1_str->uni_netname);
+               if (s)
+                       init_unistr2(&info1_str->uni_netname,
+                                    s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info1_str->uni_remark);
+               if (s)
+                       init_unistr2(&info1_str->uni_remark,
+                                    s, UNI_STR_TERMINATE);
+
+               break;
+       }
+       case 2:
+       {
+               SRV_SHARE_INFO_2 *info2 = &info->share.info2;
+               SH_INFO_2_STR *info2_str = &info2->info_2_str;
+               
+               char *s;
+
+               info->share.info2 = r.info.share.info2;
+
+               /* Duplicate strings */
+
+               s = unistr2_tdup(mem_ctx, &info2_str->uni_netname);
+               if (s)
+                       init_unistr2(&info2_str->uni_netname,
+                                    s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info2_str->uni_remark);
+               if (s)
+                       init_unistr2(&info2_str->uni_remark,
+                                    s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info2_str->uni_path);
+               if (s)
+                       init_unistr2(&info2_str->uni_path,
+                                    s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info2_str->uni_passwd);
+               if (s)
+                       init_unistr2(&info2_str->uni_passwd,
+                                    s, UNI_STR_TERMINATE);
+
+
+               break;
+       }
+       case 502:
+       {
+               SRV_SHARE_INFO_502 *info502 = &info->share.info502;
+               SH_INFO_502_STR *info502_str = &info502->info_502_str;
+               
+               char *s;
+
+               info->share.info502 = r.info.share.info502;
+
+               /* Duplicate strings */
+
+               s = unistr2_tdup(mem_ctx, &info502_str->uni_netname);
+               if (s)
+                       init_unistr2(&info502_str->uni_netname,
+                                    s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info502_str->uni_remark);
+               if (s)
+                       init_unistr2(&info502_str->uni_remark,
+                                    s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info502_str->uni_path);
+               if (s)
+                       init_unistr2(&info502_str->uni_path,
+                                    s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info502_str->uni_passwd);
+               if (s)
+                       init_unistr2(&info502_str->uni_passwd,
+                                    s, UNI_STR_TERMINATE);
+
+               info502_str->sd = dup_sec_desc(mem_ctx, info502_str->sd);
+               break;
+       }
+       default:
+               DEBUG(0,("unimplemented info-level: %d\n", info_level));
+               break;
+       }
+
+  done:
+
+       return result;
+}
+
+WERROR rpccli_srvsvc_net_share_set_info(struct rpc_pipe_client *cli,
+                                    TALLOC_CTX *mem_ctx,
+                                    const char *sharename,
+                                    uint32 info_level,
+                                    SRV_SHARE_INFO *info)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_SHARE_SET_INFO q;
+       SRV_R_NET_SHARE_SET_INFO r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise input parameters */
+
+       slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server);
+
+       init_srv_q_net_share_set_info(&q, server, sharename, info_level, info);
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_SET_INFO,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_share_set_info,
+               srv_io_r_net_share_set_info,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+       return result;
+}
+
+WERROR rpccli_srvsvc_net_share_del(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
+                               const char *sharename)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_SHARE_DEL q;
+       SRV_R_NET_SHARE_DEL r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise input parameters */
+
+       slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server);
+
+       init_srv_q_net_share_del(&q, server, sharename);
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_DEL,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_share_del,
+               srv_io_r_net_share_del,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+       return result;
+}
+
+WERROR rpccli_srvsvc_net_share_add(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
+                               const char *netname, uint32 type, 
+                               const char *remark, uint32 perms, 
+                               uint32 max_uses, uint32 num_uses, 
+                               const char *path, const char *passwd,
+                               int level, SEC_DESC *sd)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_SHARE_ADD q;
+       SRV_R_NET_SHARE_ADD r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server);
+
+       init_srv_q_net_share_add(&q,server, netname, type, remark,
+                                perms, max_uses, num_uses, path, passwd, 
+                                level, sd);
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_ADD,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_share_add,
+               srv_io_r_net_share_add,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+       return result;  
+}
+
+WERROR rpccli_srvsvc_net_remote_tod(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
+                                char *server, TIME_OF_DAY_INFO *tod)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_REMOTE_TOD q;
+       SRV_R_NET_REMOTE_TOD r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server_slash;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise input parameters */
+
+       slprintf(server_slash, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server_slash);
+
+       init_srv_q_net_remote_tod(&q, server_slash);
+       r.tod = tod;
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_REMOTE_TOD,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_remote_tod,
+               srv_io_r_net_remote_tod,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+       return result;  
+}
+
+WERROR rpccli_srvsvc_net_file_enum(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
+                               uint32 file_level, const char *user_name,
+                               SRV_FILE_INFO_CTR *ctr, int preferred_len,
+                               ENUM_HND *hnd)
+{
+       prs_struct qbuf, rbuf;
+       SRV_Q_NET_FILE_ENUM q;
+       SRV_R_NET_FILE_ENUM r;
+       WERROR result = W_ERROR(ERRgeneral);
+       fstring server;
+       int i;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise input parameters */
+
+       slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
+       strupper_m(server);
+
+       init_srv_q_net_file_enum(&q, server, NULL, user_name, 
+                                file_level, ctr, preferred_len, hnd);
+
+       /* Marshall data and send request */
+
+       CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_FILE_ENUM,
+               q, r,
+               qbuf, rbuf,
+               srv_io_q_net_file_enum,
+               srv_io_r_net_file_enum,
+               WERR_GENERAL_FAILURE);
+
+       result = r.status;
+
+       if (!W_ERROR_IS_OK(result))
+               goto done;
+
+       /* copy the data over to the ctr */
+
+       ZERO_STRUCTP(ctr);
+
+       ctr->level = file_level;
+
+       ctr->num_entries = ctr->num_entries2 = r.ctr.num_entries;
+       
+       switch(file_level) {
+       case 3:
+               if (ctr->num_entries) {
+                       if ( (ctr->file.info3 = TALLOC_ARRAY(mem_ctx, FILE_INFO_3, ctr->num_entries)) == NULL ) {
+                               return WERR_NOMEM;
+                       }
+
+                       memset(ctr->file.info3, 0, sizeof(FILE_INFO_3) * ctr->num_entries);
+               } else {
+                       ctr->file.info3 = NULL;
+               }
+
+               for (i = 0; i < r.ctr.num_entries; i++) {
+                       FILE_INFO_3 *info3 = &ctr->file.info3[i];
+                       char *s;
+                       
+                       /* Copy pointer crap */
+
+                       memcpy(info3, &r.ctr.file.info3[i], sizeof(FILE_INFO_3));
+
+                       /* Duplicate strings */
+
+                       if ( (s = unistr2_tdup(mem_ctx, r.ctr.file.info3[i].path)) != NULL ) {
+                               info3->path = TALLOC_P( mem_ctx, UNISTR2 );
+                               init_unistr2(info3->path, s, UNI_STR_TERMINATE);
+                       }
+               
+                       if ( (s = unistr2_tdup(mem_ctx, r.ctr.file.info3[i].user)) != NULL ) {
+                               info3->user = TALLOC_P( mem_ctx, UNISTR2 );
+                               init_unistr2(info3->user, s, UNI_STR_TERMINATE);
+                       }
+
+               }               
+
+               break;
+       }
+
+  done:
+       return result;
+}
+
index 625ef5fb41ff6e63dd255201ab547be561b5cb30..15d7d80c039dedf68c3faaacb69a23eec110622d 100644 (file)
@@ -2139,50 +2139,6 @@ BOOL lsa_io_r_lookup_names4(const char *desc, LSA_R_LOOKUP_NAMES4 *out, prs_stru
        return True;
 }
 
-/*******************************************************************
- Inits an LSA_Q_CLOSE structure.
-********************************************************************/
-
-void init_lsa_q_close(LSA_Q_CLOSE *in, POLICY_HND *hnd)
-{
-       DEBUG(5, ("init_lsa_q_close\n"));
-
-       memcpy(&in->pol, hnd, sizeof(in->pol));
-}
-
-/*******************************************************************
- Reads or writes an LSA_Q_CLOSE structure.
-********************************************************************/
-
-BOOL lsa_io_q_close(const char *desc, LSA_Q_CLOSE *in, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "lsa_io_q_close");
-       depth++;
-
-       if(!smb_io_pol_hnd("", &in->pol, ps, depth))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- Reads or writes an LSA_R_CLOSE structure.
-********************************************************************/
-
-BOOL lsa_io_r_close(const char *desc,  LSA_R_CLOSE *out, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "lsa_io_r_close");
-       depth++;
-
-       if(!smb_io_pol_hnd("", &out->pol, ps, depth))
-               return False;
-
-       if(!prs_ntstatus("status", ps, depth, &out->status))
-               return False;
-
-       return True;
-}
-
 /*******************************************************************
  Reads or writes an LSA_Q_OPEN_SECRET structure.
 ********************************************************************/
index 54d8ae4785310a7d629c48a3c93a1b89a68edf8b..7321e362b89f30642cec648c46c75ec77bee8ee7 100644 (file)
@@ -61,7 +61,7 @@ BOOL smb_io_time(const char *desc, NTTIME *nttime, prs_struct *ps, int depth)
 
        if(!prs_align(ps))
                return False;
-
+       
        if (MARSHALLING(ps)) {
                low = *nttime & 0xFFFFFFFF;
                high = *nttime >> 32;
@@ -88,6 +88,53 @@ BOOL smb_io_nttime(const char *desc, prs_struct *ps, int depth, NTTIME *nttime)
        return smb_io_time( desc, nttime, ps, depth );
 }
 
+/*******************************************************************
+ Gets an enumeration handle from an ENUM_HND structure.
+********************************************************************/
+
+uint32 get_enum_hnd(ENUM_HND *enh)
+{
+       return (enh && enh->ptr_hnd != 0) ? enh->handle : 0;
+}
+
+/*******************************************************************
+ Inits an ENUM_HND structure.
+********************************************************************/
+
+void init_enum_hnd(ENUM_HND *enh, uint32 hnd)
+{
+       DEBUG(5,("smb_io_enum_hnd\n"));
+
+       enh->ptr_hnd = (hnd != 0) ? 1 : 0;
+       enh->handle = hnd;
+}
+
+/*******************************************************************
+ Reads or writes an ENUM_HND structure.
+********************************************************************/
+
+BOOL smb_io_enum_hnd(const char *desc, ENUM_HND *hnd, prs_struct *ps, int depth)
+{
+       if (hnd == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "smb_io_enum_hnd");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       
+       if(!prs_uint32("ptr_hnd", ps, depth, &hnd->ptr_hnd)) /* pointer */
+               return False;
+
+       if (hnd->ptr_hnd != 0) {
+               if(!prs_uint32("handle ", ps, depth, &hnd->handle )) /* enum handle */
+                       return False;
+       }
+
+       return True;
+}
+
 /*******************************************************************
  Reads or writes a DOM_SID structure.
 ********************************************************************/
index c3603fe2344b1e5cab4df63f83426fddbaab1341..b22b1faa3fba6ca4a6dec3c9978662af74870c2a 100644 (file)
@@ -1500,7 +1500,7 @@ int tdb_prs_fetch(TDB_CONTEXT *tdb, TDB_DATA kbuf, prs_struct *ps, TALLOC_CTX *m
        prs_give_memory(ps, (char *)dbuf.dptr, dbuf.dsize, True);
 
        return 0;
-} 
+}
 
 /*******************************************************************
  hash a stream.
@@ -1766,9 +1766,9 @@ BOOL schannel_decode(struct schannel_auth_struct *a, enum pipe_auth_level auth_l
                   checksum after the decode, below
                */
                DEBUG(2, ("schannel_decode: FAILED: packet sequence number:\n"));
-               dump_data(2, (const uint8 *)verf->seq_num, sizeof(verf->seq_num));
+               dump_data(2, verf->seq_num, sizeof(verf->seq_num));
                DEBUG(2, ("should be:\n"));
-               dump_data(2, (const uint8 *)seq_num, sizeof(seq_num));
+               dump_data(2, seq_num, sizeof(seq_num));
 
                return False;
        }
@@ -1776,9 +1776,9 @@ BOOL schannel_decode(struct schannel_auth_struct *a, enum pipe_auth_level auth_l
        if (memcmp(verf->sig, schannel_sig, sizeof(verf->sig))) {
                /* Validate that the other end sent the expected header */
                DEBUG(2, ("schannel_decode: FAILED: packet header:\n"));
-               dump_data(2, (const uint8 *)verf->sig, sizeof(verf->sig));
+               dump_data(2, verf->sig, sizeof(verf->sig));
                DEBUG(2, ("should be:\n"));
-               dump_data(2, (const uint8 *)schannel_sig, sizeof(schannel_sig));
+               dump_data(2, schannel_sig, sizeof(schannel_sig));
                return False;
        }
 
index 6b2a9f4d388b532797dc739d924708494a6d34ac..d1f7ad3e851403532915dd64448e90bfa6ad83f0 100644 (file)
@@ -190,16 +190,6 @@ interface/version dce/rpc pipe identification
        }, 0x00                             \
 }
 
-#define SYNT_UNIXINFO_V0                    \
-{                                           \
-       {                                   \
-               0x9c54e310, 0xa955, 0x4885, \
-               { 0xbd, 0x31 },             \
-                { 0x78, 0x78,               \
-                  0x71, 0x47, 0xdf, 0xa6 }  \
-       }, 0x00                             \
-}
-
 #define SYNT_NTSVCS_V1                      \
 {                                           \
        {                                   \
@@ -210,16 +200,6 @@ interface/version dce/rpc pipe identification
        }, 0x01                             \
 }
 
-#define SYNT_EPMAPPER_V3                                       \
-{                                                                                      \
-       {                                                                               \
-               0xe1af8308, 0x5d1f,0x11c9, \
-               { 0x91,0xa4},                                           \
-                        {0x08,0x00,                            \
-                             0x2b,0x14,0xa0,0xfa}      \
-       }, 0x03 \
-}
-
 /*
  * IMPORTANT!!  If you update this structure, make sure to
  * update the index #defines in smb.h.
@@ -241,9 +221,7 @@ const struct pipe_id_info pipe_names [] =
        { PIPE_SHUTDOWN, SYNT_SHUTDOWN_V1      , PIPE_SHUTDOWN , TRANS_SYNT_V2 },
        { PIPE_SVCCTL  , SYNT_SVCCTL_V2        , PIPE_NTSVCS   , TRANS_SYNT_V2 },
        { PIPE_EVENTLOG, SYNT_EVENTLOG_V0      , PIPE_EVENTLOG , TRANS_SYNT_V2 },
-       { PIPE_UNIXINFO, SYNT_UNIXINFO_V0      , PIPE_UNIXINFO , TRANS_SYNT_V2 },
        { PIPE_NTSVCS  , SYNT_NTSVCS_V1        , PIPE_NTSVCS   , TRANS_SYNT_V2 },
-       { PIPE_EPMAPPER, SYNT_EPMAPPER_V3          , PIPE_EPMAPPER , TRANS_SYNT_V2 },
        { NULL         , SYNT_NONE_V0          , NULL          , SYNT_NONE_V0  }
 };
 
index ddbe0a6255f38924a09c2331b3505dcbf350b3d5..407aae66e373076d0f3b6a5c126f434d04276c4f 100644 (file)
@@ -556,7 +556,7 @@ void init_unk_info2(SAM_UNK_INFO_2 * u_2,
 
        u_2->seq_num = seq_num;
 
-
+       
        u_2->unknown_4 = 0x00000001;
        u_2->server_role = server_role;
        u_2->unknown_6 = 0x00000001;
@@ -2171,76 +2171,6 @@ BOOL samr_io_r_query_dispinfo(const char *desc, SAMR_R_QUERY_DISPINFO * r_u,
        return True;
 }
 
-/*******************************************************************
-inits a SAMR_Q_GET_DISPENUM_INDEX structure.
-********************************************************************/
-
-void init_samr_q_get_dispenum_index(SAMR_Q_GET_DISPENUM_INDEX * q_e, POLICY_HND *pol,
-                                   uint16 switch_level, const char *name)
-{
-       DEBUG(5, ("init_samr_q_get_dispenum_index\n"));
-
-       q_e->domain_pol = *pol;
-
-       q_e->switch_level = switch_level;
-
-       init_lsa_string(&q_e->name, name);
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-
-BOOL samr_io_q_get_dispenum_index(const char *desc, SAMR_Q_GET_DISPENUM_INDEX * q_e,
-                                 prs_struct *ps, int depth)
-{
-       if (q_e == NULL)
-               return False;
-
-       prs_debug(ps, depth, desc, "samr_io_q_get_dispenum_index");
-       depth++;
-
-       if(!prs_align(ps))
-               return False;
-
-       if(!smb_io_pol_hnd("domain_pol", &q_e->domain_pol, ps, depth))
-               return False;
-
-       if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
-               return False;
-
-       if (!smb_io_lsa_string("name", &q_e->name, ps, depth))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-
-BOOL samr_io_r_get_dispenum_index(const char *desc, SAMR_R_GET_DISPENUM_INDEX * r_u,
-                                 prs_struct *ps, int depth)
-{
-       if (r_u == NULL)
-               return False;
-
-       prs_debug(ps, depth, desc, "samr_io_r_get_dispenum_index");
-       depth++;
-
-       if(!prs_align(ps))
-               return False;
-
-       if(!prs_uint32("idx", ps, depth, &r_u->idx))
-               return False;
-       
-       if(!prs_ntstatus("status", ps, depth, &r_u->status))
-               return False;
-
-       return True;
-}
-
-
 /*******************************************************************
 inits a SAMR_Q_OPEN_GROUP structure.
 ********************************************************************/
@@ -7840,7 +7770,7 @@ BOOL samr_io_r_chgpasswd_user3(const char *desc, SAMR_R_CHGPASSWD_USER3 *r_u,
        if ( NT_STATUS_EQUAL( NT_STATUS_NOT_SUPPORTED, NT_STATUS(r_u->ptr_info)) ) {
                r_u->status = NT_STATUS_NOT_SUPPORTED;
                return True;
-       }       
+       }
 
        if (r_u->ptr_info && r_u->info != NULL) {
                /* SAM_UNK_INFO_1 */
diff --git a/source3/rpc_parse/parse_srv.c b/source3/rpc_parse/parse_srv.c
new file mode 100644 (file)
index 0000000..a1437c7
--- /dev/null
@@ -0,0 +1,3503 @@
+/* 
+ *  Unix SMB/CIFS implementation.
+ *  RPC Pipe client / server routines
+ *  Copyright (C) Andrew Tridgell              1992-1997,
+ *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
+ *  Copyright (C) Paul Ashton                       1997,
+ *  Copyright (C) Jeremy Allison                   1999,
+ *  Copyright (C) Nigel Williams                   2001,
+ *  Copyright (C) Jim McDonough (jmcd@us.ibm.com)   2002.
+ *  Copyright (C) Gerald (Jerry) Carter             2006.
+ *  
+ *  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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_RPC_PARSE
+
+/*******************************************************************
+ Inits a SH_INFO_0_STR structure
+********************************************************************/
+
+void init_srv_share_info0_str(SH_INFO_0_STR *sh0, const char *net_name)
+{
+       DEBUG(5,("init_srv_share_info0_str\n"));
+
+       init_unistr2(&sh0->uni_netname, net_name, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info0_str(const char *desc, SH_INFO_0_STR *sh0, prs_struct *ps, int depth)
+{
+       if (sh0 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info0_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       if(sh0->ptrs->ptr_netname)
+               if(!smb_io_unistr2("", &sh0->uni_netname, True, ps, depth))
+                       return False;
+
+       return True;
+}
+
+/*******************************************************************
+ makes a SH_INFO_0 structure
+********************************************************************/
+
+void init_srv_share_info0(SH_INFO_0 *sh0, const char *net_name)
+{
+       DEBUG(5,("init_srv_share_info0: %s\n", net_name));
+
+       sh0->ptr_netname = (net_name != NULL) ? 1 : 0;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info0(const char *desc, SH_INFO_0 *sh0, prs_struct *ps, int depth)
+{
+       if (sh0 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info0");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_netname", ps, depth, &sh0->ptr_netname))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SH_INFO_1_STR structure
+********************************************************************/
+
+void init_srv_share_info1_str(SH_INFO_1_STR *sh1, const char *net_name, const char *remark)
+{
+       DEBUG(5,("init_srv_share_info1_str\n"));
+
+       init_unistr2(&sh1->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh1->uni_remark, remark, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1_str(const char *desc, SH_INFO_1_STR *sh1, prs_struct *ps, int depth)
+{
+       if (sh1 == NULL)
+               return False;
+       
+       prs_debug(ps, depth, desc, "srv_io_share_info1_str");
+       depth++;
+       
+       if(!prs_align(ps))
+               return False;
+
+       if(sh1->ptrs->ptr_netname)
+               if(!smb_io_unistr2("", &sh1->uni_netname, True, ps, depth))
+                       return False;
+       
+       if(!prs_align(ps))
+               return False;
+       
+       if(sh1->ptrs->ptr_remark)
+               if(!smb_io_unistr2("", &sh1->uni_remark, True, ps, depth))
+                       return False;
+       
+       return True;
+}
+
+/*******************************************************************
+ makes a SH_INFO_1 structure
+********************************************************************/
+
+void init_srv_share_info1(SH_INFO_1 *sh1, const char *net_name, uint32 type, const char *remark)
+{
+       DEBUG(5,("init_srv_share_info1: %s %8x %s\n", net_name, type, remark));
+       
+       sh1->ptr_netname = (net_name != NULL) ? 1 : 0;
+       sh1->type        = type;
+       sh1->ptr_remark  = (remark != NULL) ? 1 : 0;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1(const char *desc, SH_INFO_1 *sh1, prs_struct *ps, int depth)
+{
+       if (sh1 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_netname", ps, depth, &sh1->ptr_netname))
+               return False;
+       if(!prs_uint32("type       ", ps, depth, &sh1->type))
+               return False;
+       if(!prs_uint32("ptr_remark ", ps, depth, &sh1->ptr_remark))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SH_INFO_2_STR structure
+********************************************************************/
+
+void init_srv_share_info2_str(SH_INFO_2_STR *sh2,
+                               const char *net_name, const char *remark,
+                               const char *path, const char *passwd)
+{
+       DEBUG(5,("init_srv_share_info2_str\n"));
+
+       init_unistr2(&sh2->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh2->uni_remark, remark, UNI_STR_TERMINATE);
+       init_unistr2(&sh2->uni_path, path, UNI_STR_TERMINATE);
+       init_unistr2(&sh2->uni_passwd, passwd, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info2_str(const char *desc, SH_INFO_2 *sh, SH_INFO_2_STR *sh2, prs_struct *ps, int depth)
+{
+       if (sh2 == NULL)
+               return False;
+
+       if (UNMARSHALLING(ps))
+               ZERO_STRUCTP(sh2);
+
+       prs_debug(ps, depth, desc, "srv_io_share_info2_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if (sh->ptr_netname)
+               if(!smb_io_unistr2("", &sh2->uni_netname, True, ps, depth))
+                       return False;
+
+       if (sh->ptr_remark)
+               if(!smb_io_unistr2("", &sh2->uni_remark, True, ps, depth))
+                       return False;
+
+       if (sh->ptr_netname)
+               if(!smb_io_unistr2("", &sh2->uni_path, True, ps, depth))
+                       return False;
+
+       if (sh->ptr_passwd)
+               if(!smb_io_unistr2("", &sh2->uni_passwd, True, ps, depth))
+                       return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SH_INFO_2 structure
+********************************************************************/
+
+void init_srv_share_info2(SH_INFO_2 *sh2,
+                               const char *net_name, uint32 type, const char *remark,
+                               uint32 perms, uint32 max_uses, uint32 num_uses,
+                               const char *path, const char *passwd)
+{
+       DEBUG(5,("init_srv_share_info2: %s %8x %s\n", net_name, type, remark));
+
+       sh2->ptr_netname = (net_name != NULL) ? 1 : 0;
+       sh2->type        = type;
+       sh2->ptr_remark  = (remark != NULL) ? 1 : 0;
+       sh2->perms       = perms;
+       sh2->max_uses    = max_uses;
+       sh2->num_uses    = num_uses;
+       sh2->ptr_path    = (path != NULL) ? 1 : 0;
+       sh2->ptr_passwd  = (passwd != NULL) ? 1 : 0;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info2(const char *desc, SH_INFO_2 *sh2, prs_struct *ps, int depth)
+{
+       if (sh2 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info2");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_netname", ps, depth, &sh2->ptr_netname))
+               return False;
+       if(!prs_uint32("type       ", ps, depth, &sh2->type))
+               return False;
+       if(!prs_uint32("ptr_remark ", ps, depth, &sh2->ptr_remark))
+               return False;
+       if(!prs_uint32("perms      ", ps, depth, &sh2->perms))
+               return False;
+       if(!prs_uint32("max_uses   ", ps, depth, &sh2->max_uses))
+               return False;
+       if(!prs_uint32("num_uses   ", ps, depth, &sh2->num_uses))
+               return False;
+       if(!prs_uint32("ptr_path   ", ps, depth, &sh2->ptr_path))
+               return False;
+       if(!prs_uint32("ptr_passwd ", ps, depth, &sh2->ptr_passwd))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SH_INFO_501_STR structure
+********************************************************************/
+
+void init_srv_share_info501_str(SH_INFO_501_STR *sh501,
+                               const char *net_name, const char *remark)
+{
+       DEBUG(5,("init_srv_share_info501_str\n"));
+
+       init_unistr2(&sh501->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh501->uni_remark, remark, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Inits a SH_INFO_2 structure
+*******************************************************************/
+
+void init_srv_share_info501(SH_INFO_501 *sh501, const char *net_name, uint32 type, const char *remark, uint32 csc_policy)
+{
+       DEBUG(5,("init_srv_share_info501: %s %8x %s %08x\n", net_name, type,
+               remark, csc_policy));
+
+       ZERO_STRUCTP(sh501);
+
+       sh501->ptr_netname = (net_name != NULL) ? 1 : 0;
+       sh501->type = type;
+       sh501->ptr_remark = (remark != NULL) ? 1 : 0;
+       sh501->csc_policy = csc_policy;
+}
+
+/*******************************************************************
+ Reads of writes a structure.
+*******************************************************************/
+
+static BOOL srv_io_share_info501(const char *desc, SH_INFO_501 *sh501, prs_struct *ps, int depth)
+{
+       if (sh501 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info501");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("ptr_netname", ps, depth, &sh501->ptr_netname))
+               return False;
+       if (!prs_uint32("type     ", ps, depth, &sh501->type))
+               return False;
+       if (!prs_uint32("ptr_remark ", ps, depth, &sh501->ptr_remark))
+               return False;
+       if (!prs_uint32("csc_policy ", ps, depth, &sh501->csc_policy))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info501_str(const char *desc, SH_INFO_501_STR *sh501, prs_struct *ps, int depth)
+{
+       if (sh501 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info501_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       if(!smb_io_unistr2("", &sh501->uni_netname, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+       if(!smb_io_unistr2("", &sh501->uni_remark, True, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SH_INFO_502 structure
+********************************************************************/
+
+void init_srv_share_info502(SH_INFO_502 *sh502,
+                               const char *net_name, uint32 type, const char *remark,
+                               uint32 perms, uint32 max_uses, uint32 num_uses,
+                               const char *path, const char *passwd, SEC_DESC *psd, size_t sd_size)
+{
+       DEBUG(5,("init_srv_share_info502: %s %8x %s\n", net_name, type, remark));
+
+       ZERO_STRUCTP(sh502);
+
+       sh502->ptr_netname = (net_name != NULL) ? 1 : 0;
+       sh502->type        = type;
+       sh502->ptr_remark  = (remark != NULL) ? 1 : 0;
+       sh502->perms       = perms;
+       sh502->max_uses    = max_uses;
+       sh502->num_uses    = num_uses;
+       sh502->ptr_path    = (path != NULL) ? 1 : 0;
+       sh502->ptr_passwd  = (passwd != NULL) ? 1 : 0;
+       sh502->reserved    = 0;  /* actual size within rpc */
+       sh502->sd_size     = (uint32)sd_size;
+       sh502->ptr_sd      = (psd != NULL) ? 1 : 0;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info502(const char *desc, SH_INFO_502 *sh502, prs_struct *ps, int depth)
+{
+       if (sh502 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info502");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_netname", ps, depth, &sh502->ptr_netname))
+               return False;
+       if(!prs_uint32("type       ", ps, depth, &sh502->type))
+               return False;
+       if(!prs_uint32("ptr_remark ", ps, depth, &sh502->ptr_remark))
+               return False;
+       if(!prs_uint32("perms      ", ps, depth, &sh502->perms))
+               return False;
+       if(!prs_uint32("max_uses   ", ps, depth, &sh502->max_uses))
+               return False;
+       if(!prs_uint32("num_uses   ", ps, depth, &sh502->num_uses))
+               return False;
+       if(!prs_uint32("ptr_path   ", ps, depth, &sh502->ptr_path))
+               return False;
+       if(!prs_uint32("ptr_passwd ", ps, depth, &sh502->ptr_passwd))
+               return False;
+       if(!prs_uint32_pre("reserved   ", ps, depth, &sh502->reserved, &sh502->reserved_offset))
+               return False;
+       if(!prs_uint32("ptr_sd     ", ps, depth, &sh502->ptr_sd))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SH_INFO_502_STR structure
+********************************************************************/
+
+void init_srv_share_info502_str(SH_INFO_502_STR *sh502str,
+                               const char *net_name, const char *remark,
+                               const char *path, const char *passwd, SEC_DESC *psd, size_t sd_size)
+{
+       DEBUG(5,("init_srv_share_info502_str\n"));
+
+       init_unistr2(&sh502str->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh502str->uni_remark, remark, UNI_STR_TERMINATE);
+       init_unistr2(&sh502str->uni_path, path, UNI_STR_TERMINATE);
+       init_unistr2(&sh502str->uni_passwd, passwd, UNI_STR_TERMINATE);
+       sh502str->sd = psd;
+       sh502str->reserved = 0;
+       sh502str->sd_size = sd_size;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info502_str(const char *desc, SH_INFO_502_STR *sh502, prs_struct *ps, int depth)
+{
+       if (sh502 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info502_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(sh502->ptrs->ptr_netname) {
+               if(!smb_io_unistr2("", &sh502->uni_netname, True, ps, depth))
+                       return False;
+       }
+
+       if(!prs_align(ps))
+               return False;
+
+       if(sh502->ptrs->ptr_remark) {
+               if(!smb_io_unistr2("", &sh502->uni_remark, True, ps, depth))
+                       return False;
+       }
+
+       if(!prs_align(ps))
+               return False;
+
+       if(sh502->ptrs->ptr_path) {
+               if(!smb_io_unistr2("", &sh502->uni_path, True, ps, depth))
+                       return False;
+       }
+
+       if(!prs_align(ps))
+               return False;
+
+       if(sh502->ptrs->ptr_passwd) {
+               if(!smb_io_unistr2("", &sh502->uni_passwd, True, ps, depth))
+                       return False;
+       }
+
+       if(!prs_align(ps))
+               return False;
+
+       if(sh502->ptrs->ptr_sd) {
+               uint32 old_offset;
+               uint32 reserved_offset;
+
+               if(!prs_uint32_pre("reserved ", ps, depth, &sh502->reserved, &reserved_offset))
+                       return False;
+         
+               old_offset = prs_offset(ps);
+         
+               if (!sec_io_desc(desc, &sh502->sd, ps, depth))
+                       return False;
+
+               if(UNMARSHALLING(ps)) {
+
+                       sh502->ptrs->sd_size = sh502->sd_size = sec_desc_size(sh502->sd);
+
+                       prs_set_offset(ps, old_offset + sh502->reserved);
+               }
+
+               prs_align(ps);
+
+               if(MARSHALLING(ps)) {
+
+                       sh502->ptrs->reserved = sh502->reserved = prs_offset(ps) - old_offset;
+               }
+           
+               if(!prs_uint32_post("reserved ", ps, depth, 
+                                   &sh502->reserved, reserved_offset, sh502->reserved))
+                       return False;
+               if(!prs_uint32_post("reserved ", ps, depth, 
+                                   &sh502->ptrs->reserved, sh502->ptrs->reserved_offset, sh502->ptrs->reserved))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SH_INFO_1004_STR structure
+********************************************************************/
+
+void init_srv_share_info1004_str(SH_INFO_1004_STR *sh1004, const char *remark)
+{
+       DEBUG(5,("init_srv_share_info1004_str\n"));
+
+       init_unistr2(&sh1004->uni_remark, remark, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1004_str(const char *desc, SH_INFO_1004_STR *sh1004, prs_struct *ps, int depth)
+{
+       if (sh1004 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1004_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       if(sh1004->ptrs->ptr_remark)
+               if(!smb_io_unistr2("", &sh1004->uni_remark, True, ps, depth))
+                       return False;
+
+       return True;
+}
+
+/*******************************************************************
+ makes a SH_INFO_1004 structure
+********************************************************************/
+
+void init_srv_share_info1004(SH_INFO_1004 *sh1004, const char *remark)
+{
+       DEBUG(5,("init_srv_share_info1004: %s\n", remark));
+
+       sh1004->ptr_remark = (remark != NULL) ? 1 : 0;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1004(const char *desc, SH_INFO_1004 *sh1004, prs_struct *ps, int depth)
+{
+       if (sh1004 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1004");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_remark", ps, depth, &sh1004->ptr_remark))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1005(const char* desc, SRV_SHARE_INFO_1005* sh1005, prs_struct* ps, int depth)
+{
+       if(sh1005 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1005");
+               depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("share_info_flags", ps, depth, 
+                      &sh1005->share_info_flags))
+               return False;
+
+       return True;
+}   
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1006(const char* desc, SRV_SHARE_INFO_1006* sh1006, prs_struct* ps, int depth)
+{
+       if(sh1006 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1006");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("max uses     ", ps, depth, &sh1006->max_uses))
+               return False;
+
+       return True;
+}   
+
+/*******************************************************************
+ Inits a SH_INFO_1007_STR structure
+********************************************************************/
+
+void init_srv_share_info1007_str(SH_INFO_1007_STR *sh1007, const char *alternate_directory_name)
+{
+       DEBUG(5,("init_srv_share_info1007_str\n"));
+
+       init_unistr2(&sh1007->uni_AlternateDirectoryName, alternate_directory_name, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1007_str(const char *desc, SH_INFO_1007_STR *sh1007, prs_struct *ps, int depth)
+{
+       if (sh1007 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1007_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       if(sh1007->ptrs->ptr_AlternateDirectoryName)
+               if(!smb_io_unistr2("", &sh1007->uni_AlternateDirectoryName, True, ps, depth))
+                       return False;
+
+       return True;
+}
+
+/*******************************************************************
+ makes a SH_INFO_1007 structure
+********************************************************************/
+
+void init_srv_share_info1007(SH_INFO_1007 *sh1007, uint32 flags, const char *alternate_directory_name)
+{
+       DEBUG(5,("init_srv_share_info1007: %s\n", alternate_directory_name));
+
+       sh1007->flags                      = flags;
+       sh1007->ptr_AlternateDirectoryName = (alternate_directory_name != NULL) ? 1 : 0;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1007(const char *desc, SH_INFO_1007 *sh1007, prs_struct *ps, int depth)
+{
+       if (sh1007 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1007");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("flags      ", ps, depth, &sh1007->flags))
+               return False;
+       if(!prs_uint32("ptr_Alter..", ps, depth, &sh1007->ptr_AlternateDirectoryName))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_share_info1501(const char* desc, SRV_SHARE_INFO_1501* sh1501,
+                                 prs_struct* ps, int depth)
+{
+       if(sh1501 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_share_info1501");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if (!sec_io_desc_buf(desc, &sh1501->sdb, ps, depth))
+               return False;
+
+       return True;
+}   
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_share_ctr(const char *desc, SRV_SHARE_INFO_CTR *ctr, prs_struct *ps, int depth)
+{
+       if (ctr == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_share_ctr");
+       depth++;
+
+       if (UNMARSHALLING(ps)) {
+               memset(ctr, '\0', sizeof(SRV_SHARE_INFO_CTR));
+       }
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("info_level", ps, depth, &ctr->info_level))
+               return False;
+
+       if(!prs_uint32("switch_value", ps, depth, &ctr->switch_value))
+               return False;
+       if(!prs_uint32("ptr_share_info", ps, depth, &ctr->ptr_share_info))
+               return False;
+
+       if (ctr->ptr_share_info == 0)
+               return True;
+
+       if(!prs_uint32("num_entries", ps, depth, &ctr->num_entries))
+               return False;
+       if(!prs_uint32("ptr_entries", ps, depth, &ctr->ptr_entries))
+               return False;
+
+       if (ctr->ptr_entries == 0) {
+               if (ctr->num_entries == 0)
+                       return True;
+               else
+                       return False;
+       }
+
+       if(!prs_uint32("num_entries2", ps, depth, &ctr->num_entries2))
+               return False;
+
+       if (ctr->num_entries2 != ctr->num_entries)
+               return False;
+
+       switch (ctr->switch_value) {
+
+       case 0:
+       {
+               SRV_SHARE_INFO_0 *info0 = ctr->share.info0;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info0 = PRS_ALLOC_MEM(ps, SRV_SHARE_INFO_0, num_entries)))
+                               return False;
+                       ctr->share.info0 = info0;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info0("", &info0[i].info_0, ps, depth))
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       info0[i].info_0_str.ptrs = &info0[i].info_0;
+                       if(!srv_io_share_info0_str("", &info0[i].info_0_str, ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 1:
+       {
+               SRV_SHARE_INFO_1 *info1 = ctr->share.info1;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info1 = PRS_ALLOC_MEM(ps, SRV_SHARE_INFO_1, num_entries)))
+                               return False;
+                       ctr->share.info1 = info1;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info1("", &info1[i].info_1, ps, depth))
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       info1[i].info_1_str.ptrs = &info1[i].info_1;
+                       if(!srv_io_share_info1_str("", &info1[i].info_1_str, ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 2:
+       {
+               SRV_SHARE_INFO_2 *info2 = ctr->share.info2;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info2 = PRS_ALLOC_MEM(ps,SRV_SHARE_INFO_2,num_entries)))
+                               return False;
+                       ctr->share.info2 = info2;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info2("", &info2[i].info_2, ps, depth))
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info2_str("", &info2[i].info_2, &info2[i].info_2_str, ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 501:
+       {
+               SRV_SHARE_INFO_501 *info501 = ctr->share.info501;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info501 = PRS_ALLOC_MEM(ps, SRV_SHARE_INFO_501, num_entries)))
+                               return False;
+                       ctr->share.info501 = info501;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if (!srv_io_share_info501("", &info501[i].info_501, ps, depth))
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if (!srv_io_share_info501_str("", &info501[i].info_501_str, ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 502:
+       {
+               SRV_SHARE_INFO_502 *info502 = ctr->share.info502;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info502 = PRS_ALLOC_MEM(ps,SRV_SHARE_INFO_502,num_entries)))
+                               return False;
+                       ctr->share.info502 = info502;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info502("", &info502[i].info_502, ps, depth))
+                               return False;
+       }
+               
+               for (i = 0; i < num_entries; i++) {
+                       info502[i].info_502_str.ptrs = &info502[i].info_502;
+                       if(!srv_io_share_info502_str("", &info502[i].info_502_str, ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 1004:
+       {
+               SRV_SHARE_INFO_1004 *info1004 = ctr->share.info1004;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info1004 = PRS_ALLOC_MEM(ps,SRV_SHARE_INFO_1004,num_entries)))
+                               return False;
+                       ctr->share.info1004 = info1004;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info1004("", &info1004[i].info_1004, ps, depth))
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       info1004[i].info_1004_str.ptrs = &info1004[i].info_1004;
+                       if(!srv_io_share_info1004_str("", &info1004[i].info_1004_str, ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 1005:
+       {
+               SRV_SHARE_INFO_1005 *info1005 = ctr->share.info1005;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info1005 = PRS_ALLOC_MEM(ps,SRV_SHARE_INFO_1005,num_entries)))
+                               return False;
+                       ctr->share.info1005 = info1005;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info1005("", &info1005[i], ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 1006:
+       {
+               SRV_SHARE_INFO_1006 *info1006 = ctr->share.info1006;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info1006 = PRS_ALLOC_MEM(ps,SRV_SHARE_INFO_1006,num_entries)))
+                               return False;
+                       ctr->share.info1006 = info1006;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info1006("", &info1006[i], ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 1007:
+       {
+               SRV_SHARE_INFO_1007 *info1007 = ctr->share.info1007;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info1007 = PRS_ALLOC_MEM(ps,SRV_SHARE_INFO_1007,num_entries)))
+                               return False;
+                       ctr->share.info1007 = info1007;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info1007("", &info1007[i].info_1007, ps, depth))
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       info1007[i].info_1007_str.ptrs = &info1007[i].info_1007;
+                       if(!srv_io_share_info1007_str("", &info1007[i].info_1007_str, ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       case 1501:
+       {
+               SRV_SHARE_INFO_1501 *info1501 = ctr->share.info1501;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info1501 = PRS_ALLOC_MEM(ps,SRV_SHARE_INFO_1501,num_entries)))
+                               return False;
+                       ctr->share.info1501 = info1501;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_share_info1501("", &info1501[i], ps, depth))
+                               return False;
+               }
+
+               break;
+       }
+
+       default:
+               DEBUG(5,("%s no share info at switch_value %d\n",
+                        tab_depth(depth), ctr->switch_value));
+               break;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SRV_Q_NET_SHARE_ENUM structure.
+********************************************************************/
+
+void init_srv_q_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n, 
+                               const char *srv_name, uint32 info_level,
+                               uint32 preferred_len, ENUM_HND *hnd)
+{
+
+       DEBUG(5,("init_q_net_share_enum\n"));
+
+       init_buf_unistr2(&q_n->uni_srv_name, &q_n->ptr_srv_name, srv_name);
+
+       q_n->ctr.info_level = q_n->ctr.switch_value = info_level;
+       q_n->ctr.ptr_share_info = 1;
+       q_n->ctr.num_entries  = 0;
+       q_n->ctr.ptr_entries  = 0;
+       q_n->ctr.num_entries2 = 0;
+       q_n->preferred_len = preferred_len;
+
+       memcpy(&q_n->enum_hnd, hnd, sizeof(*hnd));
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_share_enum(const char *desc, SRV_Q_NET_SHARE_ENUM *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_share_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!srv_io_srv_share_ctr("share_ctr", &q_n->ctr, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("preferred_len", ps, depth, &q_n->preferred_len))
+               return False;
+
+       if(!smb_io_enum_hnd("enum_hnd", &q_n->enum_hnd, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_share_enum(const char *desc, SRV_R_NET_SHARE_ENUM *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_share_enum");
+       depth++;
+
+       if(!srv_io_srv_share_ctr("share_ctr", &r_n->ctr, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("total_entries", ps, depth, &r_n->total_entries))
+               return False;
+
+       if(!smb_io_enum_hnd("enum_hnd", &r_n->enum_hnd, ps, depth))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ initialises a structure.
+********************************************************************/
+
+BOOL init_srv_q_net_share_get_info(SRV_Q_NET_SHARE_GET_INFO *q_n, const char *srv_name, const char *share_name, uint32 info_level)
+{
+
+       uint32 ptr_share_name;
+
+       DEBUG(5,("init_srv_q_net_share_get_info\n"));
+
+       init_buf_unistr2(&q_n->uni_srv_name,   &q_n->ptr_srv_name, srv_name);
+       init_buf_unistr2(&q_n->uni_share_name, &ptr_share_name,    share_name);
+
+       q_n->info_level = info_level;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_share_get_info(const char *desc, SRV_Q_NET_SHARE_GET_INFO *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_share_get_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_share_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("info_level", ps, depth, &q_n->info_level))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_share_info(const char *desc, prs_struct *ps, int depth, SRV_SHARE_INFO *r_n)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_share_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("switch_value ", ps, depth, &r_n->switch_value ))
+               return False;
+
+       if(!prs_uint32("ptr_share_ctr", ps, depth, &r_n->ptr_share_ctr))
+               return False;
+
+       if (r_n->ptr_share_ctr != 0) {
+               switch (r_n->switch_value) {
+               case 0:
+                       if(!srv_io_share_info0("", &r_n->share.info0.info_0, ps, depth))
+                               return False;
+
+                       /* allow access to pointers in the str part. */
+                       r_n->share.info0.info_0_str.ptrs = &r_n->share.info0.info_0;
+
+                       if(!srv_io_share_info0_str("", &r_n->share.info0.info_0_str, ps, depth))
+                               return False;
+
+                       break;
+               case 1:
+                       if(!srv_io_share_info1("", &r_n->share.info1.info_1, ps, depth))
+                               return False;
+
+                       /* allow access to pointers in the str part. */
+                       r_n->share.info1.info_1_str.ptrs = &r_n->share.info1.info_1;
+
+                       if(!srv_io_share_info1_str("", &r_n->share.info1.info_1_str, ps, depth))
+                               return False;
+
+                       break;
+               case 2:
+                       if(!srv_io_share_info2("", &r_n->share.info2.info_2, ps, depth))
+                               return False;
+
+                       if(!srv_io_share_info2_str("", &r_n->share.info2.info_2, &r_n->share.info2.info_2_str, ps, depth))
+                               return False;
+
+                       break;
+               case 501:
+                       if (!srv_io_share_info501("", &r_n->share.info501.info_501, ps, depth))
+                               return False;
+                       if (!srv_io_share_info501_str("", &r_n->share.info501.info_501_str, ps, depth))
+                               return False;
+                       break;
+
+               case 502:
+                       if(!srv_io_share_info502("", &r_n->share.info502.info_502, ps, depth))
+                               return False;
+
+                       /* allow access to pointers in the str part. */
+                       r_n->share.info502.info_502_str.ptrs = &r_n->share.info502.info_502;
+
+                       if(!srv_io_share_info502_str("", &r_n->share.info502.info_502_str, ps, depth))
+                               return False;
+                       break;
+               case 1004:
+                       if(!srv_io_share_info1004("", &r_n->share.info1004.info_1004, ps, depth))
+                               return False;
+
+                       /* allow access to pointers in the str part. */
+                       r_n->share.info1004.info_1004_str.ptrs = &r_n->share.info1004.info_1004;
+
+                       if(!srv_io_share_info1004_str("", &r_n->share.info1004.info_1004_str, ps, depth))
+                               return False;
+                       break;
+               case 1005:
+                       if(!srv_io_share_info1005("", &r_n->share.info1005, ps, depth))
+                               return False;           
+                       break;
+               case 1006:
+                       if(!srv_io_share_info1006("", &r_n->share.info1006, ps, depth))
+                               return False;           
+                       break;
+               case 1007:
+                       if(!srv_io_share_info1007("", &r_n->share.info1007.info_1007, ps, depth))
+                               return False;
+
+                       /* allow access to pointers in the str part. */
+                       r_n->share.info1007.info_1007_str.ptrs = &r_n->share.info1007.info_1007;
+
+                       if(!srv_io_share_info1007_str("", &r_n->share.info1007.info_1007_str, ps, depth))
+                               return False;
+                       break;
+               case 1501:
+                       if (!srv_io_share_info1501("", &r_n->share.info1501, ps, depth))
+                               return False;
+               default:
+                       DEBUG(5,("%s no share info at switch_value %d\n",
+                                tab_depth(depth), r_n->switch_value));
+                       break;
+               }
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_share_get_info(const char *desc, SRV_R_NET_SHARE_GET_INFO *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_share_get_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!srv_io_srv_share_info("info  ", ps, depth, &r_n->info))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ intialises a structure.
+********************************************************************/
+
+BOOL init_srv_q_net_share_set_info(SRV_Q_NET_SHARE_SET_INFO *q_n, 
+                                  const char *srv_name, 
+                                  const char *share_name, 
+                                  uint32 info_level, 
+                                  const SRV_SHARE_INFO *info) 
+{
+
+       uint32 ptr_share_name;
+
+       DEBUG(5,("init_srv_q_net_share_set_info\n"));
+
+       init_buf_unistr2(&q_n->uni_srv_name,   &q_n->ptr_srv_name, srv_name);
+       init_buf_unistr2(&q_n->uni_share_name, &ptr_share_name,    share_name);
+
+       q_n->info_level = info_level;
+  
+       q_n->info = *info;
+
+       q_n->ptr_parm_error = 1;
+       q_n->parm_error     = 0;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_share_set_info(const char *desc, SRV_Q_NET_SHARE_SET_INFO *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_share_set_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_share_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("info_level", ps, depth, &q_n->info_level))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!srv_io_srv_share_info("info  ", ps, depth, &q_n->info))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+       if(!prs_uint32("ptr_parm_error", ps, depth, &q_n->ptr_parm_error))
+               return False;
+       if(q_n->ptr_parm_error!=0) {
+               if(!prs_uint32("parm_error", ps, depth, &q_n->parm_error))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_share_set_info(const char *desc, SRV_R_NET_SHARE_SET_INFO *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_share_set_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_parm_error  ", ps, depth, &r_n->ptr_parm_error))
+               return False;
+
+       if(r_n->ptr_parm_error) {
+
+               if(!prs_uint32("parm_error  ", ps, depth, &r_n->parm_error))
+                       return False;
+       }
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}      
+
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_share_add(const char *desc, SRV_Q_NET_SHARE_ADD *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_share_add");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("info_level", ps, depth, &q_n->info_level))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!srv_io_srv_share_info("info  ", ps, depth, &q_n->info))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_err_index", ps, depth, &q_n->ptr_err_index))
+               return False;
+       if (q_n->ptr_err_index)
+               if (!prs_uint32("err_index", ps, depth, &q_n->err_index))
+                       return False;
+
+       return True;
+}
+
+void init_srv_q_net_share_add(SRV_Q_NET_SHARE_ADD *q, const char *srvname,
+                             const char *netname, uint32 type, const char *remark, 
+                             uint32 perms, uint32 max_uses, uint32 num_uses,
+                             const char *path, const char *passwd, 
+                             int level, SEC_DESC *sd)
+{
+       switch(level) {
+       case 502: {
+               size_t sd_size = sec_desc_size(sd);
+               q->ptr_srv_name = 1;
+               init_unistr2(&q->uni_srv_name, srvname, UNI_STR_TERMINATE);
+               q->info.switch_value = q->info_level = level;
+               q->info.ptr_share_ctr = 1;
+               init_srv_share_info502(&q->info.share.info502.info_502, netname, type,
+                                    remark, perms, max_uses, num_uses, path, passwd, sd, sd_size);
+               init_srv_share_info502_str(&q->info.share.info502.info_502_str, netname,
+                                        remark, path, passwd, sd, sd_size);
+               q->ptr_err_index = 1;
+               q->err_index = 0;
+               }
+               break;
+       case 2:
+       default:
+               q->ptr_srv_name = 1;
+               init_unistr2(&q->uni_srv_name, srvname, UNI_STR_TERMINATE);
+               q->info.switch_value = q->info_level = level;
+               q->info.ptr_share_ctr = 1;
+               init_srv_share_info2(&q->info.share.info2.info_2, netname, type,
+                                    remark, perms, max_uses, num_uses, path, passwd);
+               init_srv_share_info2_str(&q->info.share.info2.info_2_str, netname,
+                                        remark, path, passwd);
+               q->ptr_err_index = 1;
+               q->err_index = 0;
+               break;
+       }
+}
+
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_share_add(const char *desc, SRV_R_NET_SHARE_ADD *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_share_add");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_parm_error", ps, depth, &r_n->ptr_parm_error))
+               return False;
+
+       if(r_n->ptr_parm_error) {
+         
+               if(!prs_uint32("parm_error", ps, depth, &r_n->parm_error))
+                       return False;
+       }
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}      
+
+/*******************************************************************
+ initialises a structure.
+********************************************************************/
+
+void init_srv_q_net_share_del(SRV_Q_NET_SHARE_DEL *del, const char *srvname,
+                             const char *sharename)
+{
+       del->ptr_srv_name = 1;
+       init_unistr2(&del->uni_srv_name, srvname, UNI_STR_TERMINATE);
+       init_unistr2(&del->uni_share_name, sharename, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_share_del(const char *desc, SRV_Q_NET_SHARE_DEL *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_share_del");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_share_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+       if(!prs_uint32("reserved", ps, depth, &q_n->reserved))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_share_del(const char *desc, SRV_R_NET_SHARE_DEL *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_share_del");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &q_n->status))
+               return False;
+
+       return True;
+}      
+
+/*******************************************************************
+ Inits a SESS_INFO_0_STR structure
+********************************************************************/
+
+void init_srv_sess_info0( SESS_INFO_0 *ss0, const char *name )
+{
+       ZERO_STRUCTP( ss0 );
+
+       if ( name ) {
+               if ( (ss0->sharename = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL ) {
+                       DEBUG(0,("init_srv_sess_info0: talloc failed!\n"));
+                       return;
+               }
+               init_unistr2( ss0->sharename, name, UNI_STR_TERMINATE );
+       }
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_sess_info_0(const char *desc, SRV_SESS_INFO_0 *ss0, prs_struct *ps, int depth)
+{
+       if (ss0 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_sess_info_0");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("num_entries_read", ps, depth, &ss0->num_entries_read))
+               return False;
+       if(!prs_uint32("ptr_sess_info", ps, depth, &ss0->ptr_sess_info))
+               return False;
+
+       if (ss0->ptr_sess_info != 0) {
+               uint32 i;
+               uint32 num_entries = ss0->num_entries_read;
+
+               if (num_entries > MAX_SESS_ENTRIES) {
+                       num_entries = MAX_SESS_ENTRIES; /* report this! */
+               }
+
+               if(!prs_uint32("num_entries_read2", ps, depth, &ss0->num_entries_read2))
+                       return False;
+
+               SMB_ASSERT_ARRAY(ss0->info_0, num_entries);
+
+               /* first the pointers */
+               for (i = 0; i < num_entries; i++) {
+                       if ( !prs_io_unistr2_p("", ps, depth, &ss0->info_0[i].sharename ) )
+                               return False;
+               }
+
+               /* now the strings */
+               for (i = 0; i < num_entries; i++) {
+                       if ( !prs_io_unistr2("sharename", ps, depth, ss0->info_0[i].sharename ))
+                               return False;
+               }
+
+               if(!prs_align(ps))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SESS_INFO_1 structure
+********************************************************************/
+
+void init_srv_sess_info1( SESS_INFO_1 *ss1, const char *name, const char *user,
+                          uint32 num_opens, uint32 open_time, uint32 idle_time,
+                          uint32 user_flags)
+{
+       DEBUG(5,("init_srv_sess_info1: %s\n", name));
+
+       ZERO_STRUCTP( ss1 );
+
+       if ( name ) {
+               if ( (ss1->sharename = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL ) {
+                       DEBUG(0,("init_srv_sess_info0: talloc failed!\n"));
+                       return;
+               }
+               init_unistr2( ss1->sharename, name, UNI_STR_TERMINATE );
+       }
+
+       if ( user ) {
+               if ( (ss1->username = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL ) {
+                       DEBUG(0,("init_srv_sess_info0: talloc failed!\n"));
+                       return;
+               }
+               init_unistr2( ss1->username, user, UNI_STR_TERMINATE );
+       }
+
+       ss1->num_opens  = num_opens;
+       ss1->open_time  = open_time;
+       ss1->idle_time  = idle_time;
+       ss1->user_flags = user_flags;
+}
+
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_sess_info_1(const char *desc, SRV_SESS_INFO_1 *ss1, prs_struct *ps, int depth)
+{
+       if (ss1 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_sess_info_1");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("num_entries_read", ps, depth, &ss1->num_entries_read))
+               return False;
+       if(!prs_uint32("ptr_sess_info", ps, depth, &ss1->ptr_sess_info))
+               return False;
+
+       if (ss1->ptr_sess_info != 0) {
+               uint32 i;
+               uint32 num_entries = ss1->num_entries_read;
+
+               if (num_entries > MAX_SESS_ENTRIES) {
+                       num_entries = MAX_SESS_ENTRIES; /* report this! */
+               }
+
+               if(!prs_uint32("num_entries_read2", ps, depth, &ss1->num_entries_read2))
+                       return False;
+
+               SMB_ASSERT_ARRAY(ss1->info_1, num_entries);
+
+               /* first the pointers and flags */
+
+               for (i = 0; i < num_entries; i++) {
+
+                       if ( !prs_io_unistr2_p("", ps, depth, &ss1->info_1[i].sharename ))
+                               return False;
+                       if ( !prs_io_unistr2_p("", ps, depth, &ss1->info_1[i].username ))
+                               return False;
+
+                       if(!prs_uint32("num_opens ", ps, depth, &ss1->info_1[i].num_opens))
+                               return False;
+                       if(!prs_uint32("open_time ", ps, depth, &ss1->info_1[i].open_time))
+                               return False;
+                       if(!prs_uint32("idle_time ", ps, depth, &ss1->info_1[i].idle_time))
+                               return False;
+                       if(!prs_uint32("user_flags", ps, depth, &ss1->info_1[i].user_flags))
+                               return False;
+               }
+
+               /* now the strings */
+
+               for (i = 0; i < num_entries; i++) {
+                       if ( !prs_io_unistr2("", ps, depth, ss1->info_1[i].sharename ))
+                               return False;
+                       if ( !prs_io_unistr2("", ps, depth, ss1->info_1[i].username ))
+                               return False;
+               }
+
+               if(!prs_align(ps))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_sess_ctr(const char *desc, SRV_SESS_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
+{
+       SRV_SESS_INFO_CTR *ctr = *pp_ctr;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_sess_ctr");
+       depth++;
+
+       if(UNMARSHALLING(ps)) {
+               ctr = *pp_ctr = PRS_ALLOC_MEM(ps, SRV_SESS_INFO_CTR, 1);
+               if (ctr == NULL)
+                       return False;
+       }
+
+       if (ctr == NULL)
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("switch_value", ps, depth, &ctr->switch_value))
+               return False;
+       if(!prs_uint32("ptr_sess_ctr", ps, depth, &ctr->ptr_sess_ctr))
+               return False;
+
+       if (ctr->ptr_sess_ctr != 0) {
+               switch (ctr->switch_value) {
+               case 0:
+                       if(!srv_io_srv_sess_info_0("", &ctr->sess.info0, ps, depth))
+                               return False;
+                       break;
+               case 1:
+                       if(!srv_io_srv_sess_info_1("", &ctr->sess.info1, ps, depth))
+                               return False;
+                       break;
+               default:
+                       DEBUG(5,("%s no session info at switch_value %d\n",
+                                tab_depth(depth), ctr->switch_value));
+                       break;
+               }
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_sess_enum(const char *desc, SRV_Q_NET_SESS_ENUM *q_u, prs_struct *ps, int depth)
+{
+       if (q_u == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_sess_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_pointer("servername", ps, depth, (void*)&q_u->servername,
+                       sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_pointer("qualifier", ps, depth, (void*)&q_u->qualifier,
+                       sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_pointer("username", ps, depth, (void*)&q_u->username,
+                       sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("sess_level", ps, depth, &q_u->sess_level))
+               return False;
+       
+       if (q_u->sess_level != (uint32)-1) {
+               if(!srv_io_srv_sess_ctr("sess_ctr", &q_u->ctr, ps, depth))
+                       return False;
+       }
+
+       if(!prs_uint32("preferred_len", ps, depth, &q_u->preferred_len))
+               return False;
+
+       if(!smb_io_enum_hnd("enum_hnd", &q_u->enum_hnd, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_sess_enum(const char *desc, SRV_R_NET_SESS_ENUM *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_sess_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("sess_level", ps, depth, &r_n->sess_level))
+               return False;
+
+       if (r_n->sess_level != (uint32)-1) {
+               if(!srv_io_srv_sess_ctr("sess_ctr", &r_n->ctr, ps, depth))
+                       return False;
+       }
+
+       if(!prs_uint32("total_entries", ps, depth, &r_n->total_entries))
+               return False;
+       if(!smb_io_enum_hnd("enum_hnd", &r_n->enum_hnd, ps, depth))
+               return False;
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SRV_Q_NET_SESS_DEL structure.
+********************************************************************/
+
+void init_srv_q_net_sess_del(SRV_Q_NET_SESS_DEL *q_n, const char *srv_name,
+                             const char *cli_name, const char *user_name)
+{
+       DEBUG(5,("init_q_net_sess_enum\n"));
+
+       init_buf_unistr2(&q_n->uni_srv_name, &q_n->ptr_srv_name, srv_name);
+       init_buf_unistr2(&q_n->uni_cli_name, &q_n->ptr_cli_name, cli_name);
+       init_buf_unistr2(&q_n->uni_user_name, &q_n->ptr_user_name, user_name);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_sess_del(const char *desc, SRV_Q_NET_SESS_DEL *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_sess_del");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_cli_name", ps, depth, &q_n->ptr_cli_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_cli_name, q_n->ptr_cli_name, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+       if(!prs_uint32("ptr_user_name", ps, depth, &q_n->ptr_user_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_user_name, q_n->ptr_user_name, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_sess_del(const char *desc, SRV_R_NET_SESS_DEL *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_sess_del");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a CONN_INFO_0 structure
+********************************************************************/
+
+void init_srv_conn_info0(CONN_INFO_0 *ss0, uint32 id)
+{
+       DEBUG(5,("init_srv_conn_info0\n"));
+
+       ss0->id = id;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_conn_info0(const char *desc, CONN_INFO_0 *ss0, prs_struct *ps, int depth)
+{
+       if (ss0 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_conn_info0");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("id", ps, depth, &ss0->id))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_conn_info_0(const char *desc, SRV_CONN_INFO_0 *ss0, prs_struct *ps, int depth)
+{
+       if (ss0 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_conn_info_0");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("num_entries_read", ps, depth, &ss0->num_entries_read))
+               return False;
+       if(!prs_uint32("ptr_conn_info", ps, depth, &ss0->ptr_conn_info))
+               return False;
+
+       if (ss0->ptr_conn_info != 0) {
+               int i;
+               int num_entries = ss0->num_entries_read;
+
+               if (num_entries > MAX_CONN_ENTRIES) {
+                       num_entries = MAX_CONN_ENTRIES; /* report this! */
+               }
+
+               if(!prs_uint32("num_entries_read2", ps, depth, &ss0->num_entries_read2))
+                       return False;
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_conn_info0("", &ss0->info_0[i], ps, depth))
+                               return False;
+               }
+
+               if(!prs_align(ps))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a CONN_INFO_1_STR structure
+********************************************************************/
+
+void init_srv_conn_info1_str(CONN_INFO_1_STR *ss1, const char *usr_name, const char *net_name)
+{
+       DEBUG(5,("init_srv_conn_info1_str\n"));
+
+       init_unistr2(&ss1->uni_usr_name, usr_name, UNI_STR_TERMINATE);
+       init_unistr2(&ss1->uni_net_name, net_name, UNI_STR_TERMINATE);
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_conn_info1_str(const char *desc, CONN_INFO_1_STR *ss1, prs_struct *ps, int depth)
+{
+       if (ss1 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_conn_info1_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_unistr2("", &ss1->uni_usr_name, True, ps, depth))
+               return False;
+       if(!smb_io_unistr2("", &ss1->uni_net_name, True, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a CONN_INFO_1 structure
+********************************************************************/
+
+void init_srv_conn_info1(CONN_INFO_1 *ss1, 
+                               uint32 id, uint32 type,
+                               uint32 num_opens, uint32 num_users, uint32 open_time,
+                               const char *usr_name, const char *net_name)
+{
+       DEBUG(5,("init_srv_conn_info1: %s %s\n", usr_name, net_name));
+
+       ss1->id        = id       ;
+       ss1->type      = type     ;
+       ss1->num_opens = num_opens ;
+       ss1->num_users = num_users;
+       ss1->open_time = open_time;
+
+       ss1->ptr_usr_name = (usr_name != NULL) ? 1 : 0;
+       ss1->ptr_net_name = (net_name != NULL) ? 1 : 0;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_conn_info1(const char *desc, CONN_INFO_1 *ss1, prs_struct *ps, int depth)
+{
+       if (ss1 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_conn_info1");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("id          ", ps, depth, &ss1->id))
+               return False;
+       if(!prs_uint32("type        ", ps, depth, &ss1->type))
+               return False;
+       if(!prs_uint32("num_opens   ", ps, depth, &ss1->num_opens))
+               return False;
+       if(!prs_uint32("num_users   ", ps, depth, &ss1->num_users))
+               return False;
+       if(!prs_uint32("open_time   ", ps, depth, &ss1->open_time))
+               return False;
+
+       if(!prs_uint32("ptr_usr_name", ps, depth, &ss1->ptr_usr_name))
+               return False;
+       if(!prs_uint32("ptr_net_name", ps, depth, &ss1->ptr_net_name))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_conn_info_1(const char *desc, SRV_CONN_INFO_1 *ss1, prs_struct *ps, int depth)
+{
+       if (ss1 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_conn_info_1");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("num_entries_read", ps, depth, &ss1->num_entries_read))
+               return False;
+       if(!prs_uint32("ptr_conn_info", ps, depth, &ss1->ptr_conn_info))
+               return False;
+
+       if (ss1->ptr_conn_info != 0) {
+               int i;
+               int num_entries = ss1->num_entries_read;
+
+               if (num_entries > MAX_CONN_ENTRIES) {
+                       num_entries = MAX_CONN_ENTRIES; /* report this! */
+               }
+
+               if(!prs_uint32("num_entries_read2", ps, depth, &ss1->num_entries_read2))
+                       return False;
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_conn_info1("", &ss1->info_1[i], ps, depth))
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_conn_info1_str("", &ss1->info_1_str[i], ps, depth))
+                               return False;
+               }
+
+               if(!prs_align(ps))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_conn_ctr(const char *desc, SRV_CONN_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
+{
+       SRV_CONN_INFO_CTR *ctr = *pp_ctr;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_conn_ctr");
+       depth++;
+
+       if (UNMARSHALLING(ps)) {
+               ctr = *pp_ctr = PRS_ALLOC_MEM(ps, SRV_CONN_INFO_CTR, 1);
+               if (ctr == NULL)
+                       return False;
+       }
+               
+       if (ctr == NULL)
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("switch_value", ps, depth, &ctr->switch_value))
+               return False;
+       if(!prs_uint32("ptr_conn_ctr", ps, depth, &ctr->ptr_conn_ctr))
+               return False;
+
+       if (ctr->ptr_conn_ctr != 0) {
+               switch (ctr->switch_value) {
+               case 0:
+                       if(!srv_io_srv_conn_info_0("", &ctr->conn.info0, ps, depth))
+                               return False;
+                       break;
+               case 1:
+                       if(!srv_io_srv_conn_info_1("", &ctr->conn.info1, ps, depth))
+                               return False;
+                       break;
+               default:
+                       DEBUG(5,("%s no connection info at switch_value %d\n",
+                                tab_depth(depth), ctr->switch_value));
+                       break;
+               }
+       }
+
+       return True;
+}
+
+/*******************************************************************
+  Reads or writes a structure.
+********************************************************************/
+
+void init_srv_q_net_conn_enum(SRV_Q_NET_CONN_ENUM *q_n, 
+                               const char *srv_name, const char *qual_name,
+                               uint32 conn_level, SRV_CONN_INFO_CTR *ctr,
+                               uint32 preferred_len,
+                               ENUM_HND *hnd)
+{
+       DEBUG(5,("init_q_net_conn_enum\n"));
+
+       q_n->ctr = ctr;
+
+       init_buf_unistr2(&q_n->uni_srv_name, &q_n->ptr_srv_name, srv_name );
+       init_buf_unistr2(&q_n->uni_qual_name, &q_n->ptr_qual_name, qual_name);
+
+       q_n->conn_level    = conn_level;
+       q_n->preferred_len = preferred_len;
+
+       memcpy(&q_n->enum_hnd, hnd, sizeof(*hnd));
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_conn_enum(const char *desc, SRV_Q_NET_CONN_ENUM *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_conn_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name ", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, q_n->ptr_srv_name, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_qual_name", ps, depth, &q_n->ptr_qual_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_qual_name, q_n->ptr_qual_name, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("conn_level", ps, depth, &q_n->conn_level))
+               return False;
+       
+       if (q_n->conn_level != (uint32)-1) {
+               if(!srv_io_srv_conn_ctr("conn_ctr", &q_n->ctr, ps, depth))
+                       return False;
+       }
+
+       if(!prs_uint32("preferred_len", ps, depth, &q_n->preferred_len))
+               return False;
+
+       if(!smb_io_enum_hnd("enum_hnd", &q_n->enum_hnd, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_conn_enum(const char *desc,  SRV_R_NET_CONN_ENUM *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_conn_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("conn_level", ps, depth, &r_n->conn_level))
+               return False;
+
+       if (r_n->conn_level != (uint32)-1) {
+               if(!srv_io_srv_conn_ctr("conn_ctr", &r_n->ctr, ps, depth))
+                       return False;
+       }
+
+       if(!prs_uint32("total_entries", ps, depth, &r_n->total_entries))
+               return False;
+       if(!smb_io_enum_hnd("enum_hnd", &r_n->enum_hnd, ps, depth))
+               return False;
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_file_info3_str(const char *desc, FILE_INFO_3 *sh1, prs_struct *ps, int depth)
+{
+       if (sh1 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_file_info3_str");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if ( sh1->path ) {
+               if(!smb_io_unistr2("", sh1->path, True, ps, depth))
+                       return False;
+       }
+
+       if ( sh1->user ) {
+               if(!smb_io_unistr2("", sh1->user, True, ps, depth))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a FILE_INFO_3 structure
+********************************************************************/
+
+void init_srv_file_info3( FILE_INFO_3 *fl3, uint32 id, uint32 perms, uint32 num_locks,
+                          const char *user_name, const char *path_name )
+{
+       fl3->id        = id;    
+       fl3->perms     = perms;
+       fl3->num_locks = num_locks;
+
+        if ( path_name ) {
+                if ( (fl3->path = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL )
+                        return;
+                init_unistr2(fl3->path, path_name, UNI_STR_TERMINATE);
+        }
+
+        if ( user_name ) {
+                if ( (fl3->user = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL )
+                        return;
+                init_unistr2(fl3->user, user_name, UNI_STR_TERMINATE);
+        }
+
+       return;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_file_info3(const char *desc, FILE_INFO_3 *fl3, prs_struct *ps, int depth)
+{
+       uint32 uni_p;
+
+       if (fl3 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_file_info3");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("id           ", ps, depth, &fl3->id))
+               return False;
+       if(!prs_uint32("perms        ", ps, depth, &fl3->perms))
+               return False;
+       if(!prs_uint32("num_locks    ", ps, depth, &fl3->num_locks))
+               return False;
+
+       uni_p = fl3->path ? 1 : 0;
+       if(!prs_uint32("ptr", ps, depth, &uni_p))
+               return False;
+       if (UNMARSHALLING(ps)) {
+               if ( (fl3->path = PRS_ALLOC_MEM( ps, UNISTR2, 1)) == NULL ) {
+                       return False;
+               }
+       }
+
+       uni_p = fl3->user ? 1 : 0;
+       if(!prs_uint32("ptr", ps, depth, &uni_p))
+               return False;
+       if (UNMARSHALLING(ps)) {
+               if ( (fl3->user = PRS_ALLOC_MEM( ps, UNISTR2, 1)) == NULL ) {
+                       return False;
+               }
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+static BOOL srv_io_srv_file_ctr(const char *desc, SRV_FILE_INFO_CTR *ctr, prs_struct *ps, int depth)
+{
+       if (ctr == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_srv_file_ctr");
+       depth++;
+
+       if (UNMARSHALLING(ps)) {
+               ZERO_STRUCTP(ctr);
+       }
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("level", ps, depth, &ctr->level))
+               return False;
+
+       if(!prs_uint32("ptr_file_info", ps, depth, &ctr->ptr_file_info))
+               return False;
+       if(!prs_uint32("num_entries", ps, depth, &ctr->num_entries))
+               return False;
+       if(!prs_uint32("ptr_entries", ps, depth, &ctr->ptr_entries))
+               return False;
+
+       if (ctr->ptr_entries == 0)
+               return True;
+
+       if(!prs_uint32("num_entries2", ps, depth, &ctr->num_entries2))
+               return False;
+
+       switch (ctr->level) {
+       case 3: {
+               FILE_INFO_3 *info3 = ctr->file.info3;
+               int num_entries = ctr->num_entries;
+               int i;
+
+               if (UNMARSHALLING(ps) && num_entries) {
+                       if (!(info3 = PRS_ALLOC_MEM(ps, FILE_INFO_3, num_entries)))
+                               return False;
+                       ctr->file.info3 = info3;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_file_info3("", &ctr->file.info3[i], ps, depth)) 
+                               return False;
+               }
+
+               for (i = 0; i < num_entries; i++) {
+                       if(!srv_io_file_info3_str("", &ctr->file.info3[i], ps, depth))
+                               return False;
+               }
+               break;
+       }
+       default:
+               DEBUG(5,("%s no file info at switch_value %d\n", tab_depth(depth), ctr->level));
+               break;
+       }
+                       
+       return True;
+}
+
+/*******************************************************************
+ Inits a SRV_Q_NET_FILE_ENUM structure.
+********************************************************************/
+
+void init_srv_q_net_file_enum(SRV_Q_NET_FILE_ENUM *q_n, 
+                             const char *srv_name, const char *qual_name, 
+                             const char *user_name,
+                             uint32 file_level, SRV_FILE_INFO_CTR *ctr,
+                             uint32 preferred_len,
+                             ENUM_HND *hnd)
+{
+       uint32 ptr;
+
+       if ( srv_name ) {
+               if ( (q_n->servername = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL )
+                       return;
+               init_buf_unistr2(q_n->servername, &ptr, srv_name);
+       }
+
+       if ( qual_name ) {
+               if ( (q_n->qualifier = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL )
+                       return;
+               init_buf_unistr2(q_n->qualifier,  &ptr, qual_name);
+       }
+
+       if ( user_name ) {
+               if ( (q_n->username = TALLOC_P( talloc_tos(), UNISTR2 )) == NULL )
+                       return;
+               init_buf_unistr2(q_n->username,   &ptr, user_name);
+       }
+
+       q_n->level = q_n->ctr.level = file_level;
+
+       q_n->preferred_len = preferred_len;
+       q_n->ctr.ptr_file_info = 1;
+       q_n->ctr.num_entries = 0;
+       q_n->ctr.num_entries2 = 0;
+
+       memcpy(&q_n->enum_hnd, hnd, sizeof(*hnd));
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_file_enum(const char *desc, SRV_Q_NET_FILE_ENUM *q_u, prs_struct *ps, int depth)
+{
+       if (q_u == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_file_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_pointer("servername", ps, depth, (void*)&q_u->servername,
+                       sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2))
+               return False;
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_pointer("qualifier", ps, depth, (void*)&q_u->qualifier,
+                       sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2))
+               return False;
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_pointer("username", ps, depth, (void*)&q_u->username,
+                       sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2))
+               return False;
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("level", ps, depth, &q_u->level))
+               return False;
+
+       if (q_u->level != (uint32)-1) {
+               if(!srv_io_srv_file_ctr("file_ctr", &q_u->ctr, ps, depth))
+                       return False;
+       }
+
+       if(!prs_uint32("preferred_len", ps, depth, &q_u->preferred_len))
+               return False;
+
+       if(!smb_io_enum_hnd("enum_hnd", &q_u->enum_hnd, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_file_enum(const char *desc, SRV_R_NET_FILE_ENUM *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_file_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("level", ps, depth, &r_n->level))
+               return False;
+
+       if (r_n->level != 0) {
+               if(!srv_io_srv_file_ctr("file_ctr", &r_n->ctr, ps, depth))
+                       return False;
+       }
+
+       if(!prs_uint32("total_entries", ps, depth, &r_n->total_entries))
+               return False;
+       if(!smb_io_enum_hnd("enum_hnd", &r_n->enum_hnd, ps, depth))
+               return False;
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SRV_INFO_100 structure.
+ ********************************************************************/
+
+void init_srv_info_100(SRV_INFO_100 *sv100, uint32 platform_id, const char *name)
+{
+       DEBUG(5,("init_srv_info_100\n"));
+
+       sv100->platform_id  = platform_id;
+       init_buf_unistr2(&sv100->uni_name, &sv100->ptr_name, name);
+}
+
+/*******************************************************************
+ Reads or writes a SRV_INFO_101 structure.
+ ********************************************************************/
+
+static BOOL srv_io_info_100(const char *desc, SRV_INFO_100 *sv100, prs_struct *ps, int depth)
+{
+       if (sv100 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_info_100");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("platform_id ", ps, depth, &sv100->platform_id))
+               return False;
+       if(!prs_uint32("ptr_name    ", ps, depth, &sv100->ptr_name))
+               return False;
+
+       if(!smb_io_unistr2("uni_name    ", &sv100->uni_name, True, ps, depth))
+               return False;
+
+       return True;
+}
+
+
+/*******************************************************************
+ Inits a SRV_INFO_101 structure.
+ ********************************************************************/
+
+void init_srv_info_101(SRV_INFO_101 *sv101, uint32 platform_id, const char *name,
+                               uint32 ver_major, uint32 ver_minor,
+                               uint32 srv_type, const char *comment)
+{
+       DEBUG(5,("init_srv_info_101\n"));
+
+       sv101->platform_id  = platform_id;
+       init_buf_unistr2(&sv101->uni_name, &sv101->ptr_name, name);
+       sv101->ver_major    = ver_major;
+       sv101->ver_minor    = ver_minor;
+       sv101->srv_type     = srv_type;
+       init_buf_unistr2(&sv101->uni_comment, &sv101->ptr_comment, comment);
+}
+
+/*******************************************************************
+ Reads or writes a SRV_INFO_101 structure.
+ ********************************************************************/
+
+static BOOL srv_io_info_101(const char *desc, SRV_INFO_101 *sv101, prs_struct *ps, int depth)
+{
+       if (sv101 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_info_101");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("platform_id ", ps, depth, &sv101->platform_id))
+               return False;
+       if(!prs_uint32("ptr_name    ", ps, depth, &sv101->ptr_name))
+               return False;
+       if(!prs_uint32("ver_major   ", ps, depth, &sv101->ver_major))
+               return False;
+       if(!prs_uint32("ver_minor   ", ps, depth, &sv101->ver_minor))
+               return False;
+       if(!prs_uint32("srv_type    ", ps, depth, &sv101->srv_type))
+               return False;
+       if(!prs_uint32("ptr_comment ", ps, depth, &sv101->ptr_comment))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_unistr2("uni_name    ", &sv101->uni_name, True, ps, depth))
+               return False;
+       if(!smb_io_unistr2("uni_comment ", &sv101->uni_comment, True, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SRV_INFO_102 structure.
+ ********************************************************************/
+
+void init_srv_info_102(SRV_INFO_102 *sv102, uint32 platform_id, const char *name,
+                               const char *comment, uint32 ver_major, uint32 ver_minor,
+                               uint32 srv_type, uint32 users, uint32 disc, uint32 hidden,
+                               uint32 announce, uint32 ann_delta, uint32 licenses,
+                               const char *usr_path)
+{
+       DEBUG(5,("init_srv_info_102\n"));
+
+       sv102->platform_id  = platform_id;
+       init_buf_unistr2(&sv102->uni_name, &sv102->ptr_name, name);
+       sv102->ver_major    = ver_major;
+       sv102->ver_minor    = ver_minor;
+       sv102->srv_type     = srv_type;
+       init_buf_unistr2(&sv102->uni_comment, &sv102->ptr_comment, comment);
+
+       /* same as 101 up to here */
+
+       sv102->users        = users;
+       sv102->disc         = disc;
+       sv102->hidden       = hidden;
+       sv102->announce     = announce;
+       sv102->ann_delta    = ann_delta;
+       sv102->licenses     = licenses;
+       init_buf_unistr2(&sv102->uni_usr_path, &sv102->ptr_usr_path, usr_path);
+}
+
+
+/*******************************************************************
+ Reads or writes a SRV_INFO_102 structure.
+ ********************************************************************/
+
+static BOOL srv_io_info_102(const char *desc, SRV_INFO_102 *sv102, prs_struct *ps, int depth)
+{
+       if (sv102 == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_info102");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("platform_id ", ps, depth, &sv102->platform_id))
+               return False;
+       if(!prs_uint32("ptr_name    ", ps, depth, &sv102->ptr_name))
+               return False;
+       if(!prs_uint32("ver_major   ", ps, depth, &sv102->ver_major))
+               return False;
+       if(!prs_uint32("ver_minor   ", ps, depth, &sv102->ver_minor))
+               return False;
+       if(!prs_uint32("srv_type    ", ps, depth, &sv102->srv_type))
+               return False;
+       if(!prs_uint32("ptr_comment ", ps, depth, &sv102->ptr_comment))
+               return False;
+
+       /* same as 101 up to here */
+
+       if(!prs_uint32("users       ", ps, depth, &sv102->users))
+               return False;
+       if(!prs_uint32("disc        ", ps, depth, &sv102->disc))
+               return False;
+       if(!prs_uint32("hidden      ", ps, depth, &sv102->hidden))
+               return False;
+       if(!prs_uint32("announce    ", ps, depth, &sv102->announce))
+               return False;
+       if(!prs_uint32("ann_delta   ", ps, depth, &sv102->ann_delta))
+               return False;
+       if(!prs_uint32("licenses    ", ps, depth, &sv102->licenses))
+               return False;
+       if(!prs_uint32("ptr_usr_path", ps, depth, &sv102->ptr_usr_path))
+               return False;
+
+       if(!smb_io_unistr2("uni_name    ", &sv102->uni_name, True, ps, depth))
+               return False;
+       if(!prs_align(ps))
+               return False;
+       if(!smb_io_unistr2("uni_comment ", &sv102->uni_comment, True, ps, depth))
+               return False;
+       if(!prs_align(ps))
+               return False;
+       if(!smb_io_unistr2("uni_usr_path", &sv102->uni_usr_path, True, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a SRV_INFO_102 structure.
+ ********************************************************************/
+
+static BOOL srv_io_info_ctr(const char *desc, SRV_INFO_CTR *ctr, prs_struct *ps, int depth)
+{
+       if (ctr == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_info_ctr");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("switch_value", ps, depth, &ctr->switch_value))
+               return False;
+       if(!prs_uint32("ptr_srv_ctr ", ps, depth, &ctr->ptr_srv_ctr))
+               return False;
+
+       if (ctr->ptr_srv_ctr != 0 && ctr->switch_value != 0 && ctr != NULL) {
+               switch (ctr->switch_value) {
+               case 100:
+                       if(!srv_io_info_100("sv100", &ctr->srv.sv100, ps, depth))
+                               return False;
+                       break;
+               case 101:
+                       if(!srv_io_info_101("sv101", &ctr->srv.sv101, ps, depth))
+                               return False;
+                       break;
+               case 102:
+                       if(!srv_io_info_102("sv102", &ctr->srv.sv102, ps, depth))
+                               return False;
+                       break;
+               default:
+                       DEBUG(5,("%s no server info at switch_value %d\n",
+                                        tab_depth(depth), ctr->switch_value));
+                       break;
+               }
+               if(!prs_align(ps))
+                       return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SRV_Q_NET_SRV_GET_INFO structure.
+ ********************************************************************/
+
+void init_srv_q_net_srv_get_info(SRV_Q_NET_SRV_GET_INFO *srv,
+                               const char *server_name, uint32 switch_value)
+{
+       DEBUG(5,("init_srv_q_net_srv_get_info\n"));
+
+       init_buf_unistr2(&srv->uni_srv_name, &srv->ptr_srv_name, server_name);
+
+       srv->switch_value = switch_value;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_srv_get_info(const char *desc, SRV_Q_NET_SRV_GET_INFO *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_srv_get_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name  ", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("switch_value  ", ps, depth, &q_n->switch_value))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a SRV_R_NET_SRV_GET_INFO structure.
+ ********************************************************************/
+
+void init_srv_r_net_srv_get_info(SRV_R_NET_SRV_GET_INFO *srv,
+                               uint32 switch_value, SRV_INFO_CTR *ctr, WERROR status)
+{
+       DEBUG(5,("init_srv_r_net_srv_get_info\n"));
+
+       srv->ctr = ctr;
+
+       if (W_ERROR_IS_OK(status)) {
+               srv->ctr->switch_value = switch_value;
+               srv->ctr->ptr_srv_ctr  = 1;
+       } else {
+               srv->ctr->switch_value = 0;
+               srv->ctr->ptr_srv_ctr  = 0;
+       }
+
+       srv->status = status;
+}
+
+/*******************************************************************
+ Inits a SRV_R_NET_SRV_SET_INFO structure.
+ ********************************************************************/
+
+void init_srv_r_net_srv_set_info(SRV_R_NET_SRV_SET_INFO *srv,
+                                uint32 switch_value, WERROR status)
+{
+       DEBUG(5,("init_srv_r_net_srv_set_info\n"));
+
+       srv->switch_value = switch_value;
+       srv->status = status;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_srv_set_info(const char *desc, SRV_Q_NET_SRV_SET_INFO *q_n, 
+                              prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "srv_io_q_net_srv_set_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name  ", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("switch_value  ", ps, depth, &q_n->switch_value))
+               return False;
+
+       if (UNMARSHALLING(ps)) {
+               q_n->ctr = PRS_ALLOC_MEM(ps, SRV_INFO_CTR, 1);
+
+               if (!q_n->ctr)
+                       return False;
+       }
+
+       if(!srv_io_info_ctr("ctr", q_n->ctr, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_r_net_srv_get_info(const char *desc, SRV_R_NET_SRV_GET_INFO *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_srv_get_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!srv_io_info_ctr("ctr", r_n->ctr, ps, depth))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_r_net_srv_set_info(const char *desc, SRV_R_NET_SRV_SET_INFO *r_n, 
+                              prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "srv_io_r_net_srv_set_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("switch value ", ps, depth, &r_n->switch_value))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_q_net_remote_tod(const char *desc, SRV_Q_NET_REMOTE_TOD *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_remote_tod");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name  ", ps, depth, &q_n->ptr_srv_name))
+               return False;
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a TIME_OF_DAY_INFO structure.
+ ********************************************************************/
+
+static BOOL srv_io_time_of_day_info(const char *desc, TIME_OF_DAY_INFO *tod, prs_struct *ps, int depth)
+{
+       if (tod == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_time_of_day_info");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       
+       if(!prs_uint32("elapsedt   ", ps, depth, &tod->elapsedt))
+               return False;
+       if(!prs_uint32("msecs      ", ps, depth, &tod->msecs))
+               return False;
+       if(!prs_uint32("hours      ", ps, depth, &tod->hours))
+               return False;
+       if(!prs_uint32("mins       ", ps, depth, &tod->mins))
+               return False;
+       if(!prs_uint32("secs       ", ps, depth, &tod->secs))
+               return False;
+       if(!prs_uint32("hunds      ", ps, depth, &tod->hunds))
+               return False;
+       if(!prs_uint32("timezone   ", ps, depth, &tod->zone))
+               return False;
+       if(!prs_uint32("tintervals ", ps, depth, &tod->tintervals))
+               return False;
+       if(!prs_uint32("day        ", ps, depth, &tod->day))
+               return False;
+       if(!prs_uint32("month      ", ps, depth, &tod->month))
+               return False;
+       if(!prs_uint32("year       ", ps, depth, &tod->year))
+               return False;
+       if(!prs_uint32("weekday    ", ps, depth, &tod->weekday))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a TIME_OF_DAY_INFO structure.
+ ********************************************************************/
+
+void init_time_of_day_info(TIME_OF_DAY_INFO *tod, uint32 elapsedt, uint32 msecs,
+                           uint32 hours, uint32 mins, uint32 secs, uint32 hunds,
+                          uint32 zone, uint32 tintervals, uint32 day,
+                          uint32 month, uint32 year, uint32 weekday)
+{
+       DEBUG(5,("init_time_of_day_info\n"));
+
+       tod->elapsedt   = elapsedt;
+       tod->msecs      = msecs;
+       tod->hours      = hours;
+       tod->mins       = mins;
+       tod->secs       = secs;
+       tod->hunds      = hunds;
+       tod->zone       = zone;
+       tod->tintervals = tintervals;
+       tod->day        = day;
+       tod->month      = month;
+       tod->year       = year;
+       tod->weekday    = weekday;
+}
+
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_r_net_remote_tod(const char *desc, SRV_R_NET_REMOTE_TOD *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_remote_tod");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       
+       if(!prs_uint32("ptr_srv_tod ", ps, depth, &r_n->ptr_srv_tod))
+               return False;
+
+       if(!srv_io_time_of_day_info("tod", r_n->tod, ps, depth))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ initialises a structure.
+ ********************************************************************/
+
+BOOL init_srv_q_net_disk_enum(SRV_Q_NET_DISK_ENUM *q_n,
+                             const char *srv_name,
+                             uint32 preferred_len,
+                             ENUM_HND *enum_hnd
+       ) 
+{
+  
+
+       DEBUG(5,("init_srv_q_net_srv_disk_enum\n"));
+
+       init_buf_unistr2(&q_n->uni_srv_name, &q_n->ptr_srv_name, srv_name);
+
+       q_n->disk_enum_ctr.level = 0;
+       q_n->disk_enum_ctr.disk_info_ptr   = 0;
+  
+       q_n->preferred_len = preferred_len;
+       memcpy(&q_n->enum_hnd, enum_hnd, sizeof(*enum_hnd));
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_q_net_disk_enum(const char *desc, SRV_Q_NET_DISK_ENUM *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_disk_enum");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("level", ps, depth, &q_n->disk_enum_ctr.level))
+               return False;
+
+       if(!prs_uint32("entries_read", ps, depth, &q_n->disk_enum_ctr.entries_read))
+               return False;
+
+       if(!prs_uint32("buffer", ps, depth, &q_n->disk_enum_ctr.disk_info_ptr))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("preferred_len", ps, depth, &q_n->preferred_len))
+               return False;
+       if(!smb_io_enum_hnd("enum_hnd", &q_n->enum_hnd, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_r_net_disk_enum(const char *desc, SRV_R_NET_DISK_ENUM *r_n, prs_struct *ps, int depth)
+{
+
+       unsigned int i;
+       uint32 entries_read, entries_read2, entries_read3;
+
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_disk_enum");
+       depth++;
+
+       entries_read = entries_read2 = entries_read3 = r_n->disk_enum_ctr.entries_read;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("entries_read", ps, depth, &entries_read))
+               return False;
+       if(!prs_uint32("ptr_disk_info", ps, depth, &r_n->disk_enum_ctr.disk_info_ptr))
+               return False;
+
+       /*this may be max, unknown, actual?*/
+
+       if(!prs_uint32("max_elements", ps, depth, &entries_read2))
+               return False;
+       if(!prs_uint32("unknown", ps, depth, &r_n->disk_enum_ctr.unknown))
+               return False;
+       if(!prs_uint32("actual_elements", ps, depth, &entries_read3))
+               return False;
+
+       r_n->disk_enum_ctr.entries_read = entries_read3;
+
+       if(UNMARSHALLING(ps) && entries_read3) {
+
+               DISK_INFO *dinfo;
+
+               if(!(dinfo = PRS_ALLOC_MEM(ps, DISK_INFO, entries_read3)))
+                       return False;
+               r_n->disk_enum_ctr.disk_info = dinfo;
+       }
+
+       for(i=0; i < entries_read3; i++) {
+
+               if(!prs_uint32("unknown", ps, depth, &r_n->disk_enum_ctr.disk_info[i].unknown))
+                       return False;
+   
+               if(!smb_io_unistr3("disk_name", &r_n->disk_enum_ctr.disk_info[i].disk_name, ps, depth))
+                       return False;
+
+               if(!prs_align(ps))
+                       return False;
+       }
+
+       if(!prs_uint32("total_entries", ps, depth, &r_n->total_entries))
+               return False;
+
+       if(!smb_io_enum_hnd("enum_hnd", &r_n->enum_hnd, ps, depth))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_q_net_name_validate(const char *desc, SRV_Q_NET_NAME_VALIDATE *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_name_validate");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_pointer("servername", ps, depth, (void*)&q_n->servername,
+                       sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->sharename, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("type", ps, depth, &q_n->type))
+               return False;
+
+       if(!prs_uint32("flags", ps, depth, &q_n->flags))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_r_net_name_validate(const char *desc, SRV_R_NET_NAME_VALIDATE *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_name_validate");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_file_query_secdesc(const char *desc, SRV_Q_NET_FILE_QUERY_SECDESC *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_file_query_secdesc");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_qual_name", ps, depth, &q_n->ptr_qual_name))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_qual_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_file_name, True, ps, depth))
+               return False;
+
+       if(!prs_uint32("unknown1", ps, depth, &q_n->unknown1))
+               return False;
+
+       if(!prs_uint32("unknown2", ps, depth, &q_n->unknown2))
+               return False;
+
+       if(!prs_uint32("unknown3", ps, depth, &q_n->unknown3))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_file_query_secdesc(const char *desc, SRV_R_NET_FILE_QUERY_SECDESC *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_file_query_secdesc");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_response", ps, depth, &r_n->ptr_response))
+               return False;
+
+       if(!prs_uint32("size_response", ps, depth, &r_n->size_response))
+               return False;
+
+       if(!prs_uint32("ptr_secdesc", ps, depth, &r_n->ptr_secdesc))
+               return False;
+
+       if(!prs_uint32("size_secdesc", ps, depth, &r_n->size_secdesc))
+               return False;
+
+       if(!sec_io_desc("sec_desc", &r_n->sec_desc, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_file_set_secdesc(const char *desc, SRV_Q_NET_FILE_SET_SECDESC *q_n, prs_struct *ps, int depth)
+{
+       if (q_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_q_net_file_set_secdesc");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("ptr_qual_name", ps, depth, &q_n->ptr_qual_name))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_qual_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_unistr2("", &q_n->uni_file_name, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("sec_info", ps, depth, &q_n->sec_info))
+               return False;
+
+       if(!prs_uint32("size_set", ps, depth, &q_n->size_set))
+               return False;
+
+       if(!prs_uint32("ptr_secdesc", ps, depth, &q_n->ptr_secdesc))
+               return False;
+
+       if(!prs_uint32("size_secdesc", ps, depth, &q_n->size_secdesc))
+               return False;
+
+       if(!sec_io_desc("sec_desc", &q_n->sec_desc, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_file_set_secdesc(const char *desc, SRV_R_NET_FILE_SET_SECDESC *r_n, prs_struct *ps, int depth)
+{
+       if (r_n == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "srv_io_r_net_file_set_secdesc");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_n->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Inits a structure
+********************************************************************/
+
+void init_srv_q_net_remote_tod(SRV_Q_NET_REMOTE_TOD *q_u, const char *server)
+{
+       q_u->ptr_srv_name = 1;
+       init_unistr2(&q_u->uni_srv_name, server, UNI_STR_TERMINATE);
+}
+
index 58c59aa50645c933cdb32db318532fb2bdb996c0..1179a162b0711febac916c53a78703cc24d3dd86 100644 (file)
@@ -35,7 +35,7 @@ void _echo_AddOne(pipes_struct *p, struct echo_AddOne *r )
 {
        DEBUG(10, ("_echo_AddOne\n"));
 
-       *r->out.out_data = r->in.in_data + 1;
+       *r->out.out_data = r->in.in_data + 1;   
 }
 
 /* Echo back an array of data */
@@ -88,66 +88,38 @@ void _echo_SourceData(pipes_struct *p, struct echo_SourceData *r)
 
 void _echo_TestCall(pipes_struct *p, struct echo_TestCall *r)
 {
-       *r->out.s2 = talloc_strdup(p->mem_ctx, r->in.s1);
+       p->rng_fault_state = True;
+       return;
 }
 
 NTSTATUS _echo_TestCall2(pipes_struct *p, struct echo_TestCall2 *r)
 {
-       switch (r->in.level) {
-       case 1:
-               r->out.info->info1.v = 10;
-               break;
-       case 2:
-               r->out.info->info2.v = 20;
-               break;
-       case 3:
-               r->out.info->info3.v = 30;
-               break;
-       case 4:
-               r->out.info->info4.v = 40;
-               break;
-       case 5:
-               r->out.info->info5.v1 = 50;
-               r->out.info->info5.v2 = 60;
-               break;
-       case 6:
-               r->out.info->info6.v1 = 70;
-               r->out.info->info6.info1.v= 80;
-               break;
-       case 7:
-               r->out.info->info7.v1 = 80;
-               r->out.info->info7.info4.v = 90;
-               break;
-       default:
-               return NT_STATUS_INVALID_LEVEL;
-       }
-
+       p->rng_fault_state = True;
        return NT_STATUS_OK;
 }
 
 uint32 _echo_TestSleep(pipes_struct *p, struct echo_TestSleep *r)
 {
-       sleep(r->in.seconds);
-       return r->in.seconds;
+       p->rng_fault_state = True;
+       return 0;
 }
 
 void _echo_TestEnum(pipes_struct *p, struct echo_TestEnum *r)
 {
+       p->rng_fault_state = True;
+       return;
 }
 
 void _echo_TestSurrounding(pipes_struct *p, struct echo_TestSurrounding *r)
 {
-       r->out.data->x *= 2;
-       r->out.data->surrounding = TALLOC_ZERO_ARRAY(p->mem_ctx, uint16_t, r->in.data->x);
+       p->rng_fault_state = True;
+       return;
 }
 
 uint16 _echo_TestDoublePointer(pipes_struct *p, struct echo_TestDoublePointer *r)
 {
-       if (!*r->in.data) 
-               return 0;
-       if (!**r->in.data)
-               return 0;
-       return ***r->in.data;
+       p->rng_fault_state = True;
+       return 0;
 }
 
 #endif /* DEVELOPER */
diff --git a/source3/rpc_server/srv_epmapper_nt.c b/source3/rpc_server/srv_epmapper_nt.c
deleted file mode 100644 (file)
index 4057690..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/* 
- *  Unix SMB/CIFS implementation.
- *  RPC Pipe client / server routines for the endpoint mapper
- *  Copyright (C) Jelmer Vernooij      2007.
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* This is the implementation of the dfs pipe. */
-
-#include "includes.h"
-
-uint32 _epm_MapAuth(pipes_struct *p, struct epm_MapAuth *r) 
-{
-       /* FIXME */
-       return 0;
-}
-
-uint32 _epm_MgmtDelete(pipes_struct *p, struct epm_MgmtDelete *r)
-{
-       /* FIXME */
-       return 0;
-}
-
-uint32 _epm_InqObject(pipes_struct *p, struct epm_InqObject *r)
-{
-       /* FIXME */
-       return 0;
-}
-
-uint32 _epm_LookupHandleFree(pipes_struct *p, struct epm_LookupHandleFree *r)
-{
-       /* FIXME */
-       return 0;
-}
-
-uint32 _epm_Map(pipes_struct *p, struct epm_Map *r)
-{
-       /* FIXME */
-       return 0;
-}
-
-uint32 _epm_Lookup(pipes_struct *p, struct epm_Lookup *r)
-{
-       /* FIXME */
-       return 0;
-}
-
-uint32 _epm_Delete(pipes_struct *p, struct epm_Delete *r)
-{
-       /* FIXME */
-       return 0;
-}
-
-uint32 _epm_Insert(pipes_struct *p, struct epm_Insert *r)
-{
-       /* FIXME */
-       return 0;
-}
index 4bd6a634d81c18b0984565256d963dffda365076..c513d8489cb2632d2a68ad1e23bae7d13494c4e6 100644 (file)
@@ -996,33 +996,41 @@ NTSTATUS _lsa_lookup_sids2(pipes_struct *p,
 
 /***************************************************************************
  _lsa_lookup_sida3
-
- Before someone actually re-activates this, please present a sniff showing
- this call against some Windows server. I (vl) could not make it work against
- w2k3 at all.
  ***************************************************************************/
 
 NTSTATUS _lsa_lookup_sids3(pipes_struct *p,
                          LSA_Q_LOOKUP_SIDS3 *q_u,
                          LSA_R_LOOKUP_SIDS3 *r_u)
 {
+       int num_sids = q_u->sids.num_entries;
        uint32 mapped_count = 0;
-       DOM_R_REF *ref;
+       DOM_R_REF *ref = NULL;
 
        if ((q_u->level < 1) || (q_u->level > 6)) {
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       r_u->status = NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED;
-
-       ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);
+       /* No policy handle on this call. Restrict to crypto connections. */
+       if (p->auth.auth_type != PIPE_AUTH_TYPE_SCHANNEL) {
+               DEBUG(0,("_lsa_lookup_sids3: client %s not using schannel for netlogon\n",
+                       get_remote_machine_name() ));
+               return NT_STATUS_INVALID_PARAMETER;
+       }
 
-       if (ref == NULL) {
-               /* We would segfault later on in lsa_io_r_lookup_sids3 anyway,
-                * so do a planned exit here. We NEEEED pidl! */
-               smb_panic("talloc failed");
+       if (num_sids >  MAX_LOOKUP_SIDS) {
+               DEBUG(5,("_lsa_lookup_sids3: limit of %d exceeded, requested %d\n",
+                        MAX_LOOKUP_SIDS, num_sids));
+               return NT_STATUS_NONE_MAPPED;
        }
 
+       r_u->status = _lsa_lookup_sids_internal(p,
+                                               q_u->level,
+                                               num_sids, 
+                                               q_u->sids.sid,
+                                               &ref,
+                                               &r_u->names,
+                                               &mapped_count);
+
        init_reply_lookup_sids3(r_u, ref, mapped_count);
        return r_u->status;
 }
@@ -1537,26 +1545,14 @@ NTSTATUS _lsa_enum_accounts(pipes_struct *p, LSA_Q_ENUM_ACCOUNTS *q_u, LSA_R_ENU
 
 NTSTATUS _lsa_unk_get_connuser(pipes_struct *p, LSA_Q_UNK_GET_CONNUSER *q_u, LSA_R_UNK_GET_CONNUSER *r_u)
 {
-       const char *username, *domname;
+       fstring username, domname;
        user_struct *vuser = get_valid_user_struct(p->vuid);
   
        if (vuser == NULL)
                return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
-
-       if (vuser->guest) {
-               /*
-                * I'm 99% sure this is not the right place to do this,
-                * global_sid_Anonymous should probably be put into the token
-                * instead of the guest id -- vl
-                */
-               if (!lookup_sid(p->mem_ctx, &global_sid_Anonymous,
-                               &domname, &username, NULL)) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-       } else {
-               username = vuser->user.smb_name;
-               domname = vuser->user.domain;
-       }
+  
+       fstrcpy(username, vuser->user.smb_name);
+       fstrcpy(domname, vuser->user.domain);
   
        r_u->ptr_user_name = 1;
        init_unistr2(&r_u->uni2_user_name, username, UNI_STR_TERMINATE);
@@ -1592,23 +1588,17 @@ NTSTATUS _lsa_create_account(pipes_struct *p, LSA_Q_CREATEACCOUNT *q_u, LSA_R_CR
         * I don't know if it's the right one. not documented.
         * but guessed with rpcclient.
         */
-       if (!(handle->access & POLICY_GET_PRIVATE_INFORMATION)) {
-               DEBUG(10, ("_lsa_create_account: No POLICY_GET_PRIVATE_INFORMATION access right!\n"));
+       if (!(handle->access & POLICY_GET_PRIVATE_INFORMATION))
                return NT_STATUS_ACCESS_DENIED;
-       }
 
        /* check to see if the pipe_user is a Domain Admin since 
           account_pol.tdb was already opened as root, this is all we have */
           
-       if ( !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) ) {
-               DEBUG(10, ("_lsa_create_account: The use is not a Domain Admin, deny access!\n"));
+       if ( !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
                return NT_STATUS_ACCESS_DENIED;
-       }
                
-       if ( is_privileged_sid( &q_u->sid.sid ) ) {
-               DEBUG(10, ("_lsa_create_account: Policy account already exists!\n"));
+       if ( is_privileged_sid( &q_u->sid.sid ) )
                return NT_STATUS_OBJECT_NAME_COLLISION;
-       }
 
        /* associate the user/group SID with the (unique) handle. */
        
@@ -1623,7 +1613,6 @@ NTSTATUS _lsa_create_account(pipes_struct *p, LSA_Q_CREATEACCOUNT *q_u, LSA_R_CR
        if (!create_policy_hnd(p, &r_u->pol, free_lsa_info, (void *)info))
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 
-       DEBUG(10, ("_lsa_create_account: call privileges code to create an account\n"));
        return privilege_create_account( &info->sid );
 }
 
@@ -1718,7 +1707,7 @@ NTSTATUS _lsa_getsystemaccount(pipes_struct *p, LSA_Q_GETSYSTEMACCOUNT *q_u, LSA
                return NT_STATUS_INVALID_HANDLE;
 
        if (!lookup_sid(p->mem_ctx, &info->sid, NULL, NULL, NULL))
-               return NT_STATUS_OK;
+               return NT_STATUS_ACCESS_DENIED;
 
        /*
          0x01 -> Log on locally
index fefdb529b2cc1647d09a50de8f696d1e2f929916..72ce72fb28d6987d49c100bf15b4d05b6dc4e5c2 100644 (file)
@@ -45,11 +45,6 @@ static void free_pipe_ntlmssp_auth_data(struct pipe_auth_data *auth)
        auth->a_u.auth_ntlmssp_state = NULL;
 }
 
-static DATA_BLOB generic_session_key(void)
-{
-       return data_blob("SystemLibraryDTC", 16);
-}
-
 /*******************************************************************
  Generate the next PDU to be returned from the data in p->rdata. 
  Handle NTLMSSP.
@@ -614,6 +609,16 @@ static BOOL pipe_ntlmssp_verify_final(pipes_struct *p, DATA_BLOB *p_resp_blob)
 
        ZERO_STRUCT(reply);
 
+       memset(p->user_name, '\0', sizeof(p->user_name));
+       memset(p->pipe_user_name, '\0', sizeof(p->pipe_user_name));
+       memset(p->domain, '\0', sizeof(p->domain));
+       memset(p->wks, '\0', sizeof(p->wks));
+
+       /* Set up for non-authenticated user. */
+       TALLOC_FREE(p->pipe_user.nt_user_token);
+       p->pipe_user.ut.ngroups = 0;
+       SAFE_FREE( p->pipe_user.ut.groups);
+
        /* this has to be done as root in order to verify the password */
        become_root();
        status = auth_ntlmssp_update(a, *p_resp_blob, &reply);
@@ -626,12 +631,6 @@ static BOOL pipe_ntlmssp_verify_final(pipes_struct *p, DATA_BLOB *p_resp_blob)
                return False;
        }
 
-       if (a->server_info->ptok == NULL) {
-               DEBUG(1,("Error: Authmodule failed to provide nt_user_token\n"));
-               p->pipe_user.nt_user_token = NULL;
-               return False;
-       }
-
        /* Finally - if the pipe negotiated integrity (sign) or privacy (seal)
           ensure the underlying NTLMSSP flags are also set. If not we should
           refuse the bind. */
@@ -653,9 +652,13 @@ static BOOL pipe_ntlmssp_verify_final(pipes_struct *p, DATA_BLOB *p_resp_blob)
                }
        }
        
+       fstrcpy(p->user_name, a->ntlmssp_state->user);
+       fstrcpy(p->pipe_user_name, a->server_info->unix_name);
+       fstrcpy(p->domain, a->ntlmssp_state->domain);
+       fstrcpy(p->wks, a->ntlmssp_state->workstation);
+
        DEBUG(5,("pipe_ntlmssp_verify_final: OK: user: %s domain: %s workstation: %s\n",
-                a->ntlmssp_state->user, a->ntlmssp_state->domain,
-                a->ntlmssp_state->workstation));
+               p->user_name, p->domain, p->wks));
 
        /*
         * Store the UNIX credential data (uid/gid pair) in the pipe structure.
@@ -665,40 +668,30 @@ static BOOL pipe_ntlmssp_verify_final(pipes_struct *p, DATA_BLOB *p_resp_blob)
        p->pipe_user.ut.gid = a->server_info->gid;
        
        /*
-        * We're an authenticated bind over smb, so the session key needs to
-        * be set to "SystemLibraryDTC". Weird, but this is what Windows
-        * does. See the RPC-SAMBA3SESSIONKEY.
+        * Copy the session key from the ntlmssp state.
         */
 
        data_blob_free(&p->session_key);
-       p->session_key = generic_session_key();
+       p->session_key = data_blob(a->ntlmssp_state->session_key.data, a->ntlmssp_state->session_key.length);
        if (!p->session_key.data) {
                return False;
        }
 
        p->pipe_user.ut.ngroups = a->server_info->n_groups;
        if (p->pipe_user.ut.ngroups) {
-               if (!(p->pipe_user.ut.groups = (gid_t *)
-                     memdup(a->server_info->groups,
-                            sizeof(gid_t) * p->pipe_user.ut.ngroups))) {
-                       DEBUG(0,("pipe_ntlmssp_verify_final: failed to memdup group list to p->pipe_user.groups\n"));
-                       data_blob_free(&p->session_key);
+               if (!(p->pipe_user.ut.groups = (gid_t *)memdup(a->server_info->groups,
+                                               sizeof(gid_t) * p->pipe_user.ut.ngroups))) {
+                       DEBUG(0,("failed to memdup group list to p->pipe_user.groups\n"));
                        return False;
                }
        }
 
-       if (!a->server_info->ptok) {
-               DEBUG(1,("pipe_ntlmssp_verify_final: Error: Authmodule failed to provide nt_user_token\n"));
-               data_blob_free(&p->session_key);
-               SAFE_FREE(p->pipe_user.ut.groups);
-               return False;
-       }
-
-       p->pipe_user.nt_user_token = dup_nt_token(NULL, a->server_info->ptok);
-       if (!p->pipe_user.nt_user_token) {
-               DEBUG(1,("pipe_ntlmssp_verify_final: dup_nt_token failed.\n"));
-               data_blob_free(&p->session_key);
-               SAFE_FREE(p->pipe_user.ut.groups);
+       if (a->server_info->ptok) {
+               p->pipe_user.nt_user_token =
+                       dup_nt_token(NULL, a->server_info->ptok);
+       } else {
+               DEBUG(1,("Error: Authmodule failed to provide nt_user_token\n"));
+               p->pipe_user.nt_user_token = NULL;
                return False;
        }
 
@@ -1358,21 +1351,8 @@ static BOOL pipe_schannel_auth_bind(pipes_struct *p, prs_struct *rpc_in_p,
         * JRA. Should we also copy the schannel session key into the pipe session key p->session_key
         * here ? We do that for NTLMSSP, but the session key is already set up from the vuser
         * struct of the person who opened the pipe. I need to test this further. JRA.
-        *
-        * VL. As we are mapping this to guest set the generic key
-        * "SystemLibraryDTC" key here. It's a bit difficult to test against
-        * W2k3, as it does not allow schannel binds against SAMR and LSA
-        * anymore.
         */
 
-       data_blob_free(&p->session_key);
-       p->session_key = generic_session_key();
-       if (p->session_key.data == NULL) {
-               DEBUG(0, ("pipe_schannel_auth_bind: Could not alloc session"
-                         " key\n"));
-               return False;
-       }
-
        init_rpc_hdr_auth(&auth_info, RPC_SCHANNEL_AUTH_TYPE, pauth_info->auth_level, RPC_HDR_AUTH_LEN, 1);
        if(!smb_io_rpc_hdr_auth("", &auth_info, pout_auth, 0)) {
                DEBUG(0,("pipe_schannel_auth_bind: marshalling of RPC_HDR_AUTH failed.\n"));
@@ -1401,12 +1381,6 @@ static BOOL pipe_schannel_auth_bind(pipes_struct *p, prs_struct *rpc_in_p,
        p->auth.auth_data_free_func = NULL;
        p->auth.auth_type = PIPE_AUTH_TYPE_SCHANNEL;
 
-       if (!set_current_user_guest(&p->pipe_user)) {
-               DEBUG(1, ("pipe_schannel_auth_bind: Could not set guest "
-                         "token\n"));
-               return False;
-       }
-
        p->pipe_bound = True;
 
        return True;
@@ -2171,6 +2145,23 @@ BOOL api_pipe_schannel_process(pipes_struct *p, prs_struct *rpc_in, uint32 *p_ss
        return True;
 }
 
+/****************************************************************************
+ Return a user struct for a pipe user.
+****************************************************************************/
+
+struct current_user *get_current_user(struct current_user *user, pipes_struct *p)
+{
+       if (p->pipe_bound &&
+                       (p->auth.auth_type == PIPE_AUTH_TYPE_NTLMSSP ||
+                       (p->auth.auth_type == PIPE_AUTH_TYPE_SPNEGO_NTLMSSP))) {
+               memcpy(user, &p->pipe_user, sizeof(struct current_user));
+       } else {
+               memcpy(user, &current_user, sizeof(struct current_user));
+       }
+
+       return user;
+}
+
 /****************************************************************************
  Find the set of RPC functions associated with this context_id
 ****************************************************************************/
@@ -2225,7 +2216,9 @@ BOOL api_pipe_request(pipes_struct *p)
        BOOL changed_user = False;
        PIPE_RPC_FNS *pipe_fns;
        
-       if (p->pipe_bound) {
+       if (p->pipe_bound &&
+                       ((p->auth.auth_type == PIPE_AUTH_TYPE_NTLMSSP) ||
+                        (p->auth.auth_type == PIPE_AUTH_TYPE_SPNEGO_NTLMSSP))) {
                if(!become_authenticated_pipe_user(p)) {
                        prs_mem_free(&p->out_data.rdata);
                        return False;
@@ -2364,7 +2357,7 @@ void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns )
                        netlog_get_pipe_fns( &cmds, &n_cmds );
                        break;
                case PI_SRVSVC:
-                       srvsvc_get_pipe_fns( &cmds, &n_cmds );
+                       srvsvc2_get_pipe_fns( &cmds, &n_cmds );
                        break;
                case PI_WKSSVC:
                        wkssvc_get_pipe_fns( &cmds, &n_cmds );
@@ -2381,12 +2374,9 @@ void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns )
                case PI_SVCCTL:
                        svcctl2_get_pipe_fns( &cmds, &n_cmds );
                        break;
-               case PI_EVENTLOG:
+               case PI_EVENTLOG:
                        eventlog2_get_pipe_fns( &cmds, &n_cmds );
                        break;
-               case PI_UNIXINFO:
-                       unixinfo_get_pipe_fns( &cmds, &n_cmds );
-                       break;
                case PI_NTSVCS:
                        ntsvcs_get_pipe_fns( &cmds, &n_cmds );
                        break;
@@ -2395,9 +2385,6 @@ void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns )
                        rpcecho_get_pipe_fns( &cmds, &n_cmds );
                        break;
 #endif
-               case PI_EPMAPPER:
-                       epmapper_get_pipe_fns( &cmds, &n_cmds );
-                       break;
                default:
                        DEBUG(0,("get_pipe_fns: Unknown pipe index! [%d]\n", idx));
        }
index 0dd3ee82a73ed1eb8c1c2059682373702db7baa4..91814979c5b6b37bde57005cc50fb8763d034804 100644 (file)
@@ -350,6 +350,8 @@ static void *make_internal_rpc_pipe_p(const char *pipe_name,
        /* Store the session key and NT_TOKEN */
        if (vuser) {
                p->session_key = data_blob(vuser->session_key.data, vuser->session_key.length);
+               p->pipe_user.nt_user_token = dup_nt_token(
+                       NULL, vuser->nt_user_token);
        }
 
        /*
index d717bb6bb82cf9eb62ead15a50ecf7b96ec855ff..bdc082f647938598d62636929b2c1be0a143c7fe 100644 (file)
@@ -1530,8 +1530,8 @@ static struct api_struct api_samr_cmds [] =
       {"SAMR_QUERY_DOMAIN_INFO" , SAMR_QUERY_DOMAIN_INFO, api_samr_query_domain_info},
       {"SAMR_QUERY_USERGROUPS"  , SAMR_QUERY_USERGROUPS , api_samr_query_usergroups },
       {"SAMR_QUERY_DISPINFO"    , SAMR_QUERY_DISPINFO   , api_samr_query_dispinfo   },
-      {"SAMR_QUERY_DISPINFO2"   , SAMR_QUERY_DISPINFO2  , api_samr_query_dispinfo   },
       {"SAMR_QUERY_DISPINFO3"   , SAMR_QUERY_DISPINFO3  , api_samr_query_dispinfo   },
+      {"SAMR_QUERY_DISPINFO4"   , SAMR_QUERY_DISPINFO4  , api_samr_query_dispinfo   },
       
       {"SAMR_QUERY_ALIASINFO"   , SAMR_QUERY_ALIASINFO  , api_samr_query_aliasinfo  },
       {"SAMR_QUERY_GROUPINFO"   , SAMR_QUERY_GROUPINFO  , api_samr_query_groupinfo  },
index d5795cca253ebf867e2baf02e1dd52d2cab745ec..11827c223bb19320ec3cc485739b2611e0fa7610 100644 (file)
@@ -328,7 +328,7 @@ WERROR delete_printer_hook( NT_USER_TOKEN *token, const char *sharename )
        /* go ahead and re-read the services immediately */
        reload_services( False );
        
-       if ( share_defined( sharename ) )
+       if ( lp_servicenumber( sharename )  < 0 )
                return WERR_ACCESS_DENIED;
                
        return WERR_OK;
@@ -388,13 +388,6 @@ static BOOL get_printer_snum(pipes_struct *p, POLICY_HND *hnd, int *number,
                case SPLHND_PRINTER:            
                        DEBUG(4,("short name:%s\n", Printer->sharename));                       
                        *number = print_queue_snum(Printer->sharename);
-                       if ((*number != -1) && (params != NULL)) {
-                               *params = get_share_params(talloc_tos(),
-                                                          Printer->sharename);
-                               if (*params == NULL) {
-                                       return False;
-                               }
-                       }
                        return (*number != -1);
                case SPLHND_SERVER:
                        return False;
@@ -3953,9 +3946,7 @@ done:
  * fill a printer_info_0 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_0(Printer_entry *print_hnd,
-                                    PRINTER_INFO_0 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_0(Printer_entry *print_hnd, PRINTER_INFO_0 *printer, int snum)
 {
        pstring chaine;
        int count;
@@ -3966,15 +3957,14 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd,
        time_t setuptime;
        print_status_struct status;
        
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
 
-       count = print_queue_length(params->service, &status);
+       count = print_queue_length(snum, &status);
 
        /* check if we already have a counter for this printer */       
        for(session_counter = counter_list; session_counter; session_counter = session_counter->next) {
-               if (session_counter->snum == params->service)
+               if (session_counter->snum == snum)
                        break;
        }
 
@@ -3985,7 +3975,7 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd,
                        return False;
                }
                ZERO_STRUCTP(session_counter);
-               session_counter->snum=params->service;
+               session_counter->snum=snum;
                session_counter->counter=0;
                DLIST_ADD(counter_list, session_counter);
        }
@@ -4061,25 +4051,21 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd,
  * construct_printer_info_1
  * fill a printer_info_1 struct
  ********************************************************************/
-static BOOL construct_printer_info_1(Printer_entry *print_hnd, uint32 flags,
-                                    PRINTER_INFO_1 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_1(Printer_entry *print_hnd, uint32 flags, PRINTER_INFO_1 *printer, int snum)
 {
        pstring chaine;
        pstring chaine2;
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
 
        printer->flags=flags;
 
        if (*ntprinter->info_2->comment == '\0') {
-               init_unistr(&printer->comment, lp_comment(params->service));
+               init_unistr(&printer->comment, lp_comment(snum));
                slprintf(chaine,sizeof(chaine)-1,"%s,%s,%s", ntprinter->info_2->printername,
-                       ntprinter->info_2->drivername,
-                        lp_comment(params->service));
+                       ntprinter->info_2->drivername, lp_comment(snum));
        }
        else {
                init_unistr(&printer->comment, ntprinter->info_2->comment); /* saved comment. */
@@ -4170,7 +4156,7 @@ DEVICEMODE *construct_dev_mode(const char *servicename)
        
        DEBUGADD(8,("getting printer characteristics\n"));
 
-       if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, servicename)))
+       if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, servicename))) 
                return NULL;
 
        if ( !printer->info_2->devmode ) {
@@ -4203,29 +4189,26 @@ done:
  * fill a printer_info_2 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_2(Printer_entry *print_hnd,
-                                    PRINTER_INFO_2 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_2(Printer_entry *print_hnd, PRINTER_INFO_2 *printer, int snum)
 {
        int count;
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
        print_status_struct status;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
                
-       count = print_queue_length(params->service, &status);
+       count = print_queue_length(snum, &status);
 
        init_unistr(&printer->servername, ntprinter->info_2->servername); /* servername*/
        init_unistr(&printer->printername, ntprinter->info_2->printername);                             /* printername*/
-       init_unistr(&printer->sharename, lp_servicename(params->service));                      /* sharename */
+       init_unistr(&printer->sharename, lp_servicename(snum));                 /* sharename */
        init_unistr(&printer->portname, ntprinter->info_2->portname);                   /* port */      
        init_unistr(&printer->drivername, ntprinter->info_2->drivername);       /* drivername */
 
        if (*ntprinter->info_2->comment == '\0')
-               init_unistr(&printer->comment, lp_comment(params->service));                    /* comment */   
+               init_unistr(&printer->comment, lp_comment(snum));                       /* comment */   
        else
                init_unistr(&printer->comment, ntprinter->info_2->comment); /* saved comment. */
 
@@ -4246,7 +4229,7 @@ static BOOL construct_printer_info_2(Printer_entry *print_hnd,
        printer->averageppm = ntprinter->info_2->averageppm;                    /* average pages per minute */
                        
        if ( !(printer->devmode = construct_dev_mode(
-                      lp_const_servicename(params->service))) )
+                      lp_const_servicename(snum))) )
                DEBUG(8, ("Returning NULL Devicemode!\n"));
 
        printer->secdesc = NULL;
@@ -4271,15 +4254,12 @@ static BOOL construct_printer_info_2(Printer_entry *print_hnd,
  * fill a printer_info_3 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_3(Printer_entry *print_hnd,
-                                    PRINTER_INFO_3 **pp_printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_3(Printer_entry *print_hnd, PRINTER_INFO_3 **pp_printer, int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
        PRINTER_INFO_3 *printer = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
 
        *pp_printer = NULL;
@@ -4312,14 +4292,11 @@ static BOOL construct_printer_info_3(Printer_entry *print_hnd,
  * fill a printer_info_4 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_4(Printer_entry *print_hnd,
-                                    PRINTER_INFO_4 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_4(Printer_entry *print_hnd, PRINTER_INFO_4 *printer, int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
                
        init_unistr(&printer->printername, ntprinter->info_2->printername);                             /* printername*/
@@ -4335,14 +4312,11 @@ static BOOL construct_printer_info_4(Printer_entry *print_hnd,
  * fill a printer_info_5 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_5(Printer_entry *print_hnd,
-                                    PRINTER_INFO_5 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_5(Printer_entry *print_hnd, PRINTER_INFO_5 *printer, int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
                
        init_unistr(&printer->printername, ntprinter->info_2->printername);
@@ -4366,17 +4340,17 @@ static BOOL construct_printer_info_5(Printer_entry *print_hnd,
 
 static BOOL construct_printer_info_6(Printer_entry *print_hnd,
                                     PRINTER_INFO_6 *printer,
-                                    const struct share_params *params)
+                                    int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
        int count;
        print_status_struct status;
 
        if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+                                        lp_const_servicename(snum))))
                return False;
 
-       count = print_queue_length(params->service, &status);
+       count = print_queue_length(snum, &status);
 
        printer->status = nt_printq_status(status.status);
                
@@ -4390,14 +4364,12 @@ static BOOL construct_printer_info_6(Printer_entry *print_hnd,
  * fill a printer_info_7 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_7(Printer_entry *print_hnd,
-                                    PRINTER_INFO_7 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_7(Printer_entry *print_hnd, PRINTER_INFO_7 *printer, int snum)
 {
        char *guid_str = NULL;
        struct GUID guid; 
        
-       if (is_printer_published(print_hnd, params->service, &guid)) {
+       if (is_printer_published(print_hnd, snum, &guid)) {
                asprintf(&guid_str, "{%s}", smb_uuid_string_static(guid));
                strupper_m(guid_str);
                init_unistr(&printer->guid, guid_str);
@@ -4416,45 +4388,31 @@ static BOOL construct_printer_info_7(Printer_entry *print_hnd,
 
 static WERROR enum_all_printers_info_1(uint32 flags, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
+       int snum;
        int i;
-       struct share_iterator *shares;
-       struct share_params *printer;
+       int n_services=lp_numservices();
        PRINTER_INFO_1 *printers=NULL;
+       PRINTER_INFO_1 current_prt;
        WERROR result = WERR_OK;
        
        DEBUG(4,("enum_all_printers_info_1\n"));        
 
-       if (!(shares = share_list_all(NULL))) {
-               DEBUG(5, ("Could not list printers\n"));
-               return WERR_ACCESS_DENIED;
-       }
+       for (snum=0; snum<n_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
 
-       while ((printer = next_printer(shares)) != NULL) {
-               PRINTER_INFO_1 current_prt;
-
-               DEBUG(4,("Found a printer in smb.conf: %s\n",
-                        lp_servicename(printer->service)));
-
-               if (!construct_printer_info_1(NULL, flags, &current_prt,
-                                             printer)) {
-                       continue;
-               }
+                       if (construct_printer_info_1(NULL, flags, &current_prt, snum)) {
+                               if((printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_1, *returned +1)) == NULL) {
+                                       DEBUG(2,("enum_all_printers_info_1: failed to enlarge printers buffer!\n"));
+                                       *returned=0;
+                                       return WERR_NOMEM;
+                               }
+                               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n", *returned));             
 
-               if((printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_1,
-                                              *returned +1)) == NULL) {
-                       DEBUG(2,("enum_all_printers_info_1: failed to enlarge "
-                                "printers buffer!\n"));
-                       *returned=0;
-                       TALLOC_FREE(shares);
-                       return WERR_NOMEM;
+                               memcpy(&printers[*returned], &current_prt, sizeof(PRINTER_INFO_1));
+                               (*returned)++;
+                       }
                }
-               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n",
-                        *returned));
-
-               memcpy(&printers[*returned], &current_prt,
-                      sizeof(PRINTER_INFO_1));
-               (*returned)++;
-               TALLOC_FREE(printer);
        }
                
        /* check the required size. */  
@@ -4479,7 +4437,6 @@ out:
        /* clear memory */
 
        SAFE_FREE(printers);
-       TALLOC_FREE(shares);
 
        if ( !W_ERROR_IS_OK(result) )
                *returned = 0;
@@ -4617,45 +4574,33 @@ static WERROR enum_all_printers_info_1_network(fstring name, RPC_BUFFER *buffer,
 
 static WERROR enum_all_printers_info_2(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
+       int snum;
        int i;
-       struct share_iterator *shares;
-       struct share_params *printer;
+       int n_services=lp_numservices();
        PRINTER_INFO_2 *printers=NULL;
+       PRINTER_INFO_2 current_prt;
        WERROR result = WERR_OK;
 
        *returned = 0;
 
-       if (!(shares = share_list_all(NULL))) {
-               DEBUG(5, ("Could not list printers\n"));
-               return WERR_ACCESS_DENIED;
-       }
+       for (snum=0; snum<n_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
+                               
+                       if (construct_printer_info_2(NULL, &current_prt, snum)) {
+                               if ( !(printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_2, *returned +1)) ) {
+                                       DEBUG(2,("enum_all_printers_info_2: failed to enlarge printers buffer!\n"));
+                                       *returned = 0;
+                                       return WERR_NOMEM;
+                               }
 
-       while ((printer = next_printer(shares)) != NULL) {
-               PRINTER_INFO_2 current_prt;
+                               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n", *returned + 1));         
 
-               DEBUG(4,("Found a printer in smb.conf: %s\n",
-                        lp_servicename(printer->service)));
+                               memcpy(&printers[*returned], &current_prt, sizeof(PRINTER_INFO_2));
 
-               if (!construct_printer_info_2(NULL, &current_prt,
-                                             printer)) {
-                       continue;
-               }
-               if ( !(printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_2,
-                                                 *returned +1)) ) {
-                       DEBUG(2,("enum_all_printers_info_2: failed to enlarge "
-                                "printers buffer!\n"));
-                       *returned = 0;
-                       TALLOC_FREE(shares);
-                       return WERR_NOMEM;
+                               (*returned)++;
+                       }
                }
-
-               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n",
-                        *returned + 1));
-
-               memcpy(&printers[*returned], &current_prt,
-                      sizeof(PRINTER_INFO_2));
-               (*returned)++;
-               TALLOC_FREE(printer);
        }
        
        /* check the required size. */  
@@ -4683,7 +4628,6 @@ out:
                free_devmode(printers[i].devmode);
 
        SAFE_FREE(printers);
-       TALLOC_FREE(shares);
 
        if ( !W_ERROR_IS_OK(result) )
                *returned = 0;
@@ -4824,10 +4768,7 @@ WERROR _spoolss_enumprinters( pipes_struct *p, SPOOL_Q_ENUMPRINTERS *q_u, SPOOL_
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_0(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_0(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_0 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4835,7 +4776,7 @@ static WERROR getprinter_level_0(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_0)) == NULL)
                return WERR_NOMEM;
 
-       construct_printer_info_0(print_hnd, printer, params);
+       construct_printer_info_0(print_hnd, printer, snum);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_0(printer);
@@ -4864,10 +4805,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_1(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_1(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_1 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4875,8 +4813,7 @@ static WERROR getprinter_level_1(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_1)) == NULL)
                return WERR_NOMEM;
 
-       construct_printer_info_1(print_hnd, PRINTER_ENUM_ICON8, printer,
-                                params);
+       construct_printer_info_1(print_hnd, PRINTER_ENUM_ICON8, printer, snum);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_1(printer);
@@ -4904,10 +4841,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_2(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_2(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_2 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4915,7 +4849,7 @@ static WERROR getprinter_level_2(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_2))==NULL)
                return WERR_NOMEM;
        
-       construct_printer_info_2(print_hnd, printer, params);
+       construct_printer_info_2(print_hnd, printer, snum);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_2(printer);
@@ -4944,15 +4878,12 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_3(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_3(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_3 *printer=NULL;
        WERROR result = WERR_OK;
 
-       if (!construct_printer_info_3(print_hnd, &printer, params))
+       if (!construct_printer_info_3(print_hnd, &printer, snum))
                return WERR_NOMEM;
        
        /* check the required size. */  
@@ -4981,10 +4912,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_4(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_4(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_4 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4992,7 +4920,7 @@ static WERROR getprinter_level_4(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_4))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_4(print_hnd, printer, params)) {
+       if (!construct_printer_info_4(print_hnd, printer, snum)) {
                SAFE_FREE(printer);
                return WERR_NOMEM;
        }
@@ -5023,10 +4951,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_5(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_5(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_5 *printer=NULL;
        WERROR result = WERR_OK;
@@ -5034,7 +4959,7 @@ static WERROR getprinter_level_5(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_5))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_5(print_hnd, printer, params)) {
+       if (!construct_printer_info_5(print_hnd, printer, snum)) {
                free_printer_info_5(printer);
                return WERR_NOMEM;
        }
@@ -5063,7 +4988,7 @@ out:
 }
 
 static WERROR getprinter_level_6(Printer_entry *print_hnd,
-                                const struct share_params *params,
+                                int snum,
                                 RPC_BUFFER *buffer, uint32 offered,
                                 uint32 *needed)
 {
@@ -5074,7 +4999,7 @@ static WERROR getprinter_level_6(Printer_entry *print_hnd,
                return WERR_NOMEM;
        }
 
-       if (!construct_printer_info_6(print_hnd, printer, params)) {
+       if (!construct_printer_info_6(print_hnd, printer, snum)) {
                free_printer_info_6(printer);
                return WERR_NOMEM;
        }
@@ -5102,10 +5027,7 @@ out:
        return result;  
 }
 
-static WERROR getprinter_level_7(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_7(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_7 *printer=NULL;
        WERROR result = WERR_OK;
@@ -5113,7 +5035,7 @@ static WERROR getprinter_level_7(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_7))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_7(print_hnd, printer, params))
+       if (!construct_printer_info_7(print_hnd, printer, snum))
                return WERR_NOMEM;
        
        /* check the required size. */  
@@ -5151,7 +5073,6 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET
        uint32 offered = q_u->offered;
        uint32 *needed = &r_u->needed;
        Printer_entry *Printer=find_printer_index_by_hnd(p, handle);
-       struct share_params *params;
 
        int snum;
 
@@ -5166,34 +5087,26 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET
 
        *needed=0;
 
-       if (!get_printer_snum(p, handle, &snum, &params))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        switch (level) {
        case 0:
-               return getprinter_level_0(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_0(Printer, snum, buffer, offered, needed);
        case 1:
-               return getprinter_level_1(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_1(Printer, snum, buffer, offered, needed);
        case 2:         
-               return getprinter_level_2(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_2(Printer, snum, buffer, offered, needed);
        case 3:         
-               return getprinter_level_3(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_3(Printer, snum, buffer, offered, needed);
        case 4:         
-               return getprinter_level_4(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_4(Printer, snum, buffer, offered, needed);
        case 5:         
-               return getprinter_level_5(Printer, params, buffer, offered,
-                                         needed);
-       case 6:
-               return getprinter_level_6(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_5(Printer, snum, buffer, offered, needed);
+       case 6:         
+               return getprinter_level_6(Printer, snum, buffer, offered, needed);
        case 7:
-               return getprinter_level_7(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_7(Printer, snum, buffer, offered, needed);
        }
        return WERR_UNKNOWN_LEVEL;
 }      
diff --git a/source3/rpc_server/srv_srvsvc.c b/source3/rpc_server/srv_srvsvc.c
new file mode 100644 (file)
index 0000000..92ed727
--- /dev/null
@@ -0,0 +1,616 @@
+/* 
+ *  Unix SMB/CIFS implementation.
+ *  RPC Pipe client / server routines
+ *  Copyright (C) Andrew Tridgell              1992-1997,
+ *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
+ *  Copyright (C) Paul Ashton                       1997,
+ *  Copyright (C) Jeremy Allison                    2001,
+ *  Copyright (C) Jim McDonough <jmcd@us.ibm.com>   2003.
+ *  Copyright (C) Gera;d (Jerry) Carter             2006.
+ *  
+ *  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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/* This is the interface to the srvsvc pipe. */
+
+#include "includes.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_RPC_SRV
+
+static BOOL proxy_srvsvc_call(pipes_struct *p, uint8 opnum)
+{
+       struct api_struct *fns;
+       int n_fns;
+
+       lsarpc_get_pipe_fns(&fns, &n_fns);
+
+       if (opnum >= n_fns)
+               return False;
+
+       if (fns[opnum].opnum != opnum) {
+               smb_panic("LSA function table not sorted\n");
+       }
+
+       return fns[opnum].fn(p);
+}
+
+/*******************************************************************
+ api_srv_net_srv_get_info
+********************************************************************/
+
+static BOOL api_srv_net_srv_get_info(pipes_struct *p)
+{
+       SRV_Q_NET_SRV_GET_INFO q_u;
+       SRV_R_NET_SRV_GET_INFO r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the net server get info */
+       if (!srv_io_q_net_srv_get_info("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _srv_net_srv_get_info(p, &q_u, &r_u);
+
+       /* store the response in the SMB stream */
+       if (!srv_io_r_net_srv_get_info("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ api_srv_net_srv_get_info
+********************************************************************/
+
+static BOOL api_srv_net_srv_set_info(pipes_struct *p)
+{
+       SRV_Q_NET_SRV_SET_INFO q_u;
+       SRV_R_NET_SRV_SET_INFO r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the net server set info */
+       if (!srv_io_q_net_srv_set_info("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _srv_net_srv_set_info(p, &q_u, &r_u);
+
+       /* store the response in the SMB stream */
+       if (!srv_io_r_net_srv_set_info("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ api_srv_net_file_enum
+********************************************************************/
+
+static BOOL api_srv_net_file_enum(pipes_struct *p)
+{
+       SRV_Q_NET_FILE_ENUM q_u;
+       SRV_R_NET_FILE_ENUM r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the net file enum */
+       if (!srv_io_q_net_file_enum("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _srv_net_file_enum(p, &q_u, &r_u);
+
+       /* store the response in the SMB stream */
+       if(!srv_io_r_net_file_enum("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ api_srv_net_conn_enum
+********************************************************************/
+
+static BOOL api_srv_net_conn_enum(pipes_struct *p)
+{
+       SRV_Q_NET_CONN_ENUM q_u;
+       SRV_R_NET_CONN_ENUM r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the net server get enum */
+       if (!srv_io_q_net_conn_enum("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _srv_net_conn_enum(p, &q_u, &r_u);
+
+       /* store the response in the SMB stream */
+       if (!srv_io_r_net_conn_enum("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Enumerate sessions.
+********************************************************************/
+
+static BOOL api_srv_net_sess_enum(pipes_struct *p)
+{
+       SRV_Q_NET_SESS_ENUM q_u;
+       SRV_R_NET_SESS_ENUM r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the net server get enum */
+       if (!srv_io_q_net_sess_enum("", &q_u, data, 0))
+               return False;
+
+       /* construct reply.  always indicate success */
+       r_u.status = _srv_net_sess_enum(p, &q_u, &r_u);
+
+       /* store the response in the SMB stream */
+       if (!srv_io_r_net_sess_enum("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Delete session.
+********************************************************************/
+
+static BOOL api_srv_net_sess_del(pipes_struct *p)
+{
+       SRV_Q_NET_SESS_DEL q_u;
+       SRV_R_NET_SESS_DEL r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the net server get enum */
+       if (!srv_io_q_net_sess_del("", &q_u, data, 0))
+               return False;
+
+       /* construct reply.  always indicate success */
+       r_u.status = _srv_net_sess_del(p, &q_u, &r_u);
+
+       /* store the response in the SMB stream */
+       if (!srv_io_r_net_sess_del("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to enumerate shares.
+********************************************************************/
+
+static BOOL api_srv_net_share_enum_all(pipes_struct *p)
+{
+       SRV_Q_NET_SHARE_ENUM q_u;
+       SRV_R_NET_SHARE_ENUM r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server get enum. */
+       if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_share_enum_all: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_share_enum_all(p, &q_u, &r_u);
+
+       if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_share_enum_all: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to enumerate shares.
+********************************************************************/
+
+static BOOL api_srv_net_share_enum(pipes_struct *p)
+{
+       SRV_Q_NET_SHARE_ENUM q_u;
+       SRV_R_NET_SHARE_ENUM r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server get enum. */
+       if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_share_enum: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_share_enum(p, &q_u, &r_u);
+
+       if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_share_enum: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to return share information.
+********************************************************************/
+
+static BOOL api_srv_net_share_get_info(pipes_struct *p)
+{
+       SRV_Q_NET_SHARE_GET_INFO q_u;
+       SRV_R_NET_SHARE_GET_INFO r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server get info. */
+       if(!srv_io_q_net_share_get_info("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_share_get_info: Failed to unmarshall SRV_Q_NET_SHARE_GET_INFO.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_share_get_info(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_share_get_info("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_share_get_info: Failed to marshall SRV_R_NET_SHARE_GET_INFO.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to set share information.
+********************************************************************/
+
+static BOOL api_srv_net_share_set_info(pipes_struct *p)
+{
+       SRV_Q_NET_SHARE_SET_INFO q_u;
+       SRV_R_NET_SHARE_SET_INFO r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server set info. */
+       if(!srv_io_q_net_share_set_info("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_share_set_info: Failed to unmarshall SRV_Q_NET_SHARE_SET_INFO.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_share_set_info(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_share_set_info("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_share_set_info: Failed to marshall SRV_R_NET_SHARE_SET_INFO.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to add share information.
+********************************************************************/
+
+static BOOL api_srv_net_share_add(pipes_struct *p)
+{
+       SRV_Q_NET_SHARE_ADD q_u;
+       SRV_R_NET_SHARE_ADD r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server add info. */
+       if(!srv_io_q_net_share_add("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_share_add: Failed to unmarshall SRV_Q_NET_SHARE_ADD.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_share_add(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_share_add("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_share_add: Failed to marshall SRV_R_NET_SHARE_ADD.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to delete share information.
+********************************************************************/
+
+static BOOL api_srv_net_share_del(pipes_struct *p)
+{
+       SRV_Q_NET_SHARE_DEL q_u;
+       SRV_R_NET_SHARE_DEL r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server del info. */
+       if(!srv_io_q_net_share_del("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_share_del: Failed to unmarshall SRV_Q_NET_SHARE_DEL.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_share_del(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_share_del("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_share_del: Failed to marshall SRV_R_NET_SHARE_DEL.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to delete share information.
+********************************************************************/
+
+static BOOL api_srv_net_share_del_sticky(pipes_struct *p)
+{
+       SRV_Q_NET_SHARE_DEL q_u;
+       SRV_R_NET_SHARE_DEL r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server del info. */
+       if(!srv_io_q_net_share_del("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_share_del_sticky: Failed to unmarshall SRV_Q_NET_SHARE_DEL.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_share_del_sticky(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_share_del("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_share_del_sticky: Failed to marshall SRV_R_NET_SHARE_DEL.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ api_srv_net_remote_tod
+********************************************************************/
+
+static BOOL api_srv_net_remote_tod(pipes_struct *p)
+{
+       SRV_Q_NET_REMOTE_TOD q_u;
+       SRV_R_NET_REMOTE_TOD r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the net server get enum */
+       if(!srv_io_q_net_remote_tod("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _srv_net_remote_tod(p, &q_u, &r_u);
+
+       /* store the response in the SMB stream */
+       if(!srv_io_r_net_remote_tod("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ RPC to enumerate disks available on a server e.g. C:, D: ...
+*******************************************************************/
+
+static BOOL api_srv_net_disk_enum(pipes_struct *p) 
+{
+       SRV_Q_NET_DISK_ENUM q_u;
+       SRV_R_NET_DISK_ENUM r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net server disk enum. */
+       if(!srv_io_q_net_disk_enum("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_disk_enum: Failed to unmarshall SRV_Q_NET_DISK_ENUM.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_disk_enum(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_disk_enum("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_disk_enum: Failed to marshall SRV_R_NET_DISK_ENUM.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ NetValidateName (opnum 0x21) 
+*******************************************************************/
+
+static BOOL api_srv_net_name_validate(pipes_struct *p) 
+{
+       SRV_Q_NET_NAME_VALIDATE q_u;
+       SRV_R_NET_NAME_VALIDATE r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+  
+       /* Unmarshall the net server disk enum. */
+       if(!srv_io_q_net_name_validate("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_name_validate: Failed to unmarshall SRV_Q_NET_NAME_VALIDATE.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_name_validate(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_name_validate("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_name_validate: Failed to marshall SRV_R_NET_NAME_VALIDATE.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ NetFileQuerySecdesc (opnum 0x27)
+*******************************************************************/
+
+static BOOL api_srv_net_file_query_secdesc(pipes_struct *p)
+{
+       SRV_Q_NET_FILE_QUERY_SECDESC q_u;
+       SRV_R_NET_FILE_QUERY_SECDESC r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net file get info from Win9x */
+       if(!srv_io_q_net_file_query_secdesc("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_file_query_secdesc: Failed to unmarshall SRV_Q_NET_FILE_QUERY_SECDESC.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_file_query_secdesc(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_file_query_secdesc("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_file_query_secdesc: Failed to marshall SRV_R_NET_FILE_QUERY_SECDESC.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+ NetFileSetSecdesc (opnum 0x28)
+*******************************************************************/
+
+static BOOL api_srv_net_file_set_secdesc(pipes_struct *p)
+{
+       SRV_Q_NET_FILE_SET_SECDESC q_u;
+       SRV_R_NET_FILE_SET_SECDESC r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* Unmarshall the net file set info from Win9x */
+       if(!srv_io_q_net_file_set_secdesc("", &q_u, data, 0)) {
+               DEBUG(0,("api_srv_net_file_set_secdesc: Failed to unmarshall SRV_Q_NET_FILE_SET_SECDESC.\n"));
+               return False;
+       }
+
+       r_u.status = _srv_net_file_set_secdesc(p, &q_u, &r_u);
+
+       if(!srv_io_r_net_file_set_secdesc("", &r_u, rdata, 0)) {
+               DEBUG(0,("api_srv_net_file_set_secdesc: Failed to marshall SRV_R_NET_FILE_SET_SECDESC.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************
+*******************************************************************/
+
+static BOOL api_srv_net_file_close(pipes_struct *p)
+{
+       return proxy_srvsvc_call( p, NDR_SRVSVC_NETFILECLOSE );
+}
+
+/*******************************************************************
+\PIPE\srvsvc commands
+********************************************************************/
+
+static struct api_struct api_srv_cmds[] =
+{
+      { "SRV_NET_CONN_ENUM"         , SRV_NET_CONN_ENUM         , api_srv_net_conn_enum          },
+      { "SRV_NET_SESS_ENUM"         , SRV_NET_SESS_ENUM         , api_srv_net_sess_enum          },
+      { "SRV_NET_SESS_DEL"          , SRV_NET_SESS_DEL          , api_srv_net_sess_del           },
+      { "SRV_NET_SHARE_ENUM_ALL"    , SRV_NET_SHARE_ENUM_ALL    , api_srv_net_share_enum_all     },
+      { "SRV_NET_SHARE_ENUM"        , SRV_NET_SHARE_ENUM        , api_srv_net_share_enum         },
+      { "SRV_NET_SHARE_ADD"         , SRV_NET_SHARE_ADD         , api_srv_net_share_add          },
+      { "SRV_NET_SHARE_DEL"         , SRV_NET_SHARE_DEL         , api_srv_net_share_del          },
+      { "SRV_NET_SHARE_DEL_STICKY"  , SRV_NET_SHARE_DEL_STICKY  , api_srv_net_share_del_sticky   },
+      { "SRV_NET_SHARE_GET_INFO"    , SRV_NET_SHARE_GET_INFO    , api_srv_net_share_get_info     },
+      { "SRV_NET_SHARE_SET_INFO"    , SRV_NET_SHARE_SET_INFO    , api_srv_net_share_set_info     },
+      { "SRV_NET_FILE_ENUM"         , SRV_NET_FILE_ENUM         , api_srv_net_file_enum          },
+      { "SRV_NET_SRV_GET_INFO"      , SRV_NET_SRV_GET_INFO      , api_srv_net_srv_get_info       },
+      { "SRV_NET_SRV_SET_INFO"      , SRV_NET_SRV_SET_INFO      , api_srv_net_srv_set_info       },
+      { "SRV_NET_REMOTE_TOD"        , SRV_NET_REMOTE_TOD        , api_srv_net_remote_tod         },
+      { "SRV_NET_DISK_ENUM"         , SRV_NET_DISK_ENUM         , api_srv_net_disk_enum          },
+      { "SRV_NET_NAME_VALIDATE"     , SRV_NET_NAME_VALIDATE     , api_srv_net_name_validate      },
+      { "SRV_NET_FILE_QUERY_SECDESC", SRV_NET_FILE_QUERY_SECDESC, api_srv_net_file_query_secdesc },
+      { "SRV_NET_FILE_SET_SECDESC"  , SRV_NET_FILE_SET_SECDESC  , api_srv_net_file_set_secdesc   },
+      { "SRV_NET_FILE_CLOSE"        , SRV_NET_FILE_CLOSE        , api_srv_net_file_close         }
+};
+
+void srvsvc2_get_pipe_fns( struct api_struct **fns, int *n_fns )
+{
+       *fns = api_srv_cmds;
+       *n_fns = sizeof(api_srv_cmds) / sizeof(struct api_struct);
+}
+
+
+NTSTATUS rpc_srvsvc2_init(void)
+{
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "srvsvc", "ntsvcs", api_srv_cmds,
+                                   sizeof(api_srv_cmds) / sizeof(struct api_struct));
+}
index 2af4c7900265dd39e472bb430a6843c211b163d3..f23d6dfcb9a5d8fc2fdf9a89e729c113a7f9b7b0 100644 (file)
@@ -5,7 +5,6 @@
  *  Copyright (C) Jeremy Allison               2001.
  *  Copyright (C) Nigel Williams               2001.
  *  Copyright (C) Gerald (Jerry) Carter        2006.
- *  Copyright (C) Jelmer Vernooij                         2006.
  *  
  *  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
 
 #include "includes.h"
 
-#define MAX_SERVER_DISK_ENTRIES 15
-
 extern const struct generic_mapping file_generic_mapping;
-extern userdom_struct current_user_info;
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
@@ -38,8 +34,8 @@ extern userdom_struct current_user_info;
 struct file_enum_count {
        TALLOC_CTX *ctx;
        const char *username;
-       uint32 count;
-       struct srvsvc_NetFileInfo3 *info;
+       int count;
+       FILE_INFO_3 *info;
 };
 
 struct sess_file_count {
@@ -56,7 +52,7 @@ static int pipe_enum_fn( struct db_record *rec, void *p)
 {
        struct pipe_open_rec prec;
        struct file_enum_count *fenum = (struct file_enum_count *)p;
-       struct srvsvc_NetFileInfo3 *f;
+       FILE_INFO_3 *f;
        int i = fenum->count;
        pstring fullpath;
        const char *username;
@@ -79,25 +75,19 @@ static int pipe_enum_fn( struct db_record *rec, void *p)
                
        snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name );
                
-       f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info,
-                                 struct srvsvc_NetFileInfo3, i+1 );
+       f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
        if ( !f ) {
                DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
                return 1;
        }
-
        fenum->info = f;
                
-       fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum);
-       fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA);
-       fenum->info[i].num_locks = 0;
-       fenum->info[i].user = talloc_move(fenum->ctx, &username);
-       if (!(fenum->info[i].path = talloc_strdup(
-                     fenum->ctx, fullpath))) {
-               /* There's not much we can do here. */
-               fenum->info[i].path = "";
-       }
-
+       init_srv_file_info3(
+               &fenum->info[i], 
+               (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
+               (FILE_READ_DATA|FILE_WRITE_DATA), 
+               0, username, fullpath);
+                       
        fenum->count++;
 
        return 0;
@@ -107,15 +97,15 @@ static int pipe_enum_fn( struct db_record *rec, void *p)
 ********************************************************************/
 
 static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username,
-                             struct srvsvc_NetFileInfo3 **info,
-                              uint32 *count, uint32 *resume )
+                             FILE_INFO_3 **info, 
+                              uint32 *count, uint32 resume )
 {
        struct file_enum_count fenum;
-
+       
        fenum.ctx = ctx;
        fenum.username = username;
-       fenum.info = *info;
        fenum.count = *count;
+       fenum.info = *info;
 
        if (connections_traverse(pipe_enum_fn, &fenum) == -1) {
                DEBUG(0,("net_enum_pipes: traverse of connections.tdb "
@@ -136,10 +126,10 @@ static void enum_file_fn( const struct share_mode_entry *e,
                           const char *sharepath, const char *fname,
                          void *private_data )
 {
-       struct file_enum_count *fenum =
-               (struct file_enum_count *)private_data;
+       struct file_enum_count *fenum =
+               (struct file_enum_count *)private_data;
 
-       struct srvsvc_NetFileInfo3 *f;
+       FILE_INFO_3 *f;
        int i = fenum->count;
        files_struct fsp;
        struct byte_range_lock *brl;
@@ -150,7 +140,7 @@ static void enum_file_fn( const struct share_mode_entry *e,
  
        /* If the pid was not found delete the entry from connections.tdb */
 
-       if (!process_exists(e->pid)) {
+       if ( !process_exists(e->pid) ) {
                return;
        }
 
@@ -161,8 +151,7 @@ static void enum_file_fn( const struct share_mode_entry *e,
                return;
        }
                
-       f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info,
-                                 struct srvsvc_NetFileInfo3, i+1 );
+       f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
        if ( !f ) {
                DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
                return;
@@ -174,7 +163,7 @@ static void enum_file_fn( const struct share_mode_entry *e,
        ZERO_STRUCT( fsp );             
        fsp.file_id = e->id;
                
-       if ( (brl = brl_get_locks_readonly(NULL,&fsp)) != NULL ) {
+       if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) {
                num_locks = brl->num_locks;
                TALLOC_FREE( brl );
        }
@@ -189,15 +178,13 @@ static void enum_file_fn( const struct share_mode_entry *e,
        /* mask out create (what ever that is) */
        permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA);
 
-       fenum->info[i].fid = e->share_file_id;
-       fenum->info[i].permissions = permissions;
-       fenum->info[i].num_locks = num_locks;
-       fenum->info[i].user = talloc_move(fenum->ctx, &username);
-       if (!(fenum->info[i].path = talloc_strdup(
-                     fenum->ctx, fullpath))) {
-               /* There's not much we can do here. */
-               fenum->info[i].path = "";
-       }
+       /* now fill in the FILE_INFO_3 struct */
+       init_srv_file_info3( &fenum->info[i], 
+                            e->share_file_id,
+                            permissions,
+                            num_locks,
+                            username,
+                            fullpath );
                        
        fenum->count++;
 }
@@ -206,8 +193,8 @@ static void enum_file_fn( const struct share_mode_entry *e,
 ********************************************************************/
 
 static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username,
-                             struct srvsvc_NetFileInfo3 **info,
-                              uint32 *count, uint32 *resume )
+                             FILE_INFO_3 **info, 
+                              uint32 *count, uint32 resume )
 {
        struct file_enum_count f_enum_cnt;
 
@@ -225,19 +212,19 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username,
 }
 
 /*******************************************************************
- Utility function to get the 'type' of a share from a share definition.
+ Utility function to get the 'type' of a share from an snum.
  ********************************************************************/
-static uint32 get_share_type(const struct share_params *params)
+static uint32 get_share_type(int snum) 
 {
-       char *net_name = lp_servicename(params->service);
+       char *net_name = lp_servicename(snum);
        int len_net_name = strlen(net_name);
        
        /* work out the share type */
        uint32 type = STYPE_DISKTREE;
 
-       if (lp_print_ok(params->service))
+       if (lp_print_ok(snum))
                type = STYPE_PRINTQ;
-       if (strequal(lp_fstype(params->service), "IPC"))
+       if (strequal(lp_fstype(snum), "IPC"))
                type = STYPE_IPC;
        if (net_name[len_net_name-1] == '$')
                type |= STYPE_HIDDEN;
@@ -249,70 +236,65 @@ static uint32 get_share_type(const struct share_params *params)
  Fill in a share info level 0 structure.
  ********************************************************************/
 
-static void init_srv_share_info_0(pipes_struct *p, struct srvsvc_NetShareInfo0 *sh0,
-                                 const struct share_params *params)
+static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum)
 {
-       sh0->name = lp_servicename(params->service);
+       pstring net_name;
+
+       pstrcpy(net_name, lp_servicename(snum));
+
+       init_srv_share_info0(&sh0->info_0, net_name);
+       init_srv_share_info0_str(&sh0->info_0_str, net_name);
 }
 
 /*******************************************************************
  Fill in a share info level 1 structure.
  ********************************************************************/
 
-static void init_srv_share_info_1(pipes_struct *p, struct srvsvc_NetShareInfo1 *sh1,
-                                 const struct share_params *params)
+static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum)
 {
-       connection_struct *conn = p->conn;
+       pstring remark;
 
-       sh1->comment = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
-                                    conn->user, conn->connectpath, conn->gid,
-                                    get_current_username(),
-                                    current_user_info.domain,
-                                    lp_comment(params->service));
+       char *net_name = lp_servicename(snum);
+       pstrcpy(remark, lp_comment(snum));
+       standard_sub_conn(p->conn, remark,sizeof(remark));
 
-       sh1->name = lp_servicename(params->service);
-       sh1->type = get_share_type(params);
+       init_srv_share_info1(&sh1->info_1, net_name, get_share_type(snum), remark);
+       init_srv_share_info1_str(&sh1->info_1_str, net_name, remark);
 }
 
 /*******************************************************************
  Fill in a share info level 2 structure.
  ********************************************************************/
 
-static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 *sh2,
-                                 const struct share_params *params)
+static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum)
 {
-       connection_struct *conn = p->conn;
-       char *remark;
-       char *path;
-       int max_connections = lp_max_connections(params->service);
+       pstring remark;
+       pstring path;
+       pstring passwd;
+       int max_connections = lp_max_connections(snum);
        uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff;
        int count = 0;
-       char *net_name = lp_servicename(params->service);
+       char *net_name = lp_servicename(snum);
        
-       remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
-                                    conn->user, conn->connectpath, conn->gid,
-                                    get_current_username(),
-                                    current_user_info.domain,
-                                    lp_comment(params->service));
-       path = talloc_asprintf(p->mem_ctx, "C:%s",
-                              lp_pathname(params->service));
+       pstrcpy(remark, lp_comment(snum));
+       standard_sub_conn(p->conn, remark,sizeof(remark));
+       pstrcpy(path, "C:");
+       pstrcat(path, lp_pathname(snum));
 
        /*
-        * Change / to \\ so that win2k will see it as a valid path.  This was
-        * added to enable use of browsing in win2k add share dialog.
+        * Change / to \\ so that win2k will see it as a valid path.  This was added to
+        * enable use of browsing in win2k add share dialog.
         */ 
 
        string_replace(path, '/', '\\');
 
+       pstrcpy(passwd, "");
+
        count = count_current_connections( net_name, False  );
-       sh2->name = net_name;
-       sh2->type = get_share_type(params);
-       sh2->comment = remark;
-       sh2->permissions = 0;
-       sh2->max_users = max_uses;
-       sh2->current_users = count;
-       sh2->path = path;
-       sh2->password = "";
+       init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), 
+               remark, 0, max_uses, count, path, passwd);
+
+       init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd);
 }
 
 /*******************************************************************
@@ -344,40 +326,28 @@ static void map_generic_share_sd_bits(SEC_DESC *psd)
  Fill in a share info level 501 structure.
 ********************************************************************/
 
-static void init_srv_share_info_501(pipes_struct *p, struct srvsvc_NetShareInfo501 *sh501,
-                                   const struct share_params *params)
+static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum)
 {
-       connection_struct *conn = p->conn;
-       char *remark;
-       const char *net_name = lp_servicename(params->service);
+       pstring remark;
 
-       remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
-                                    conn->user, conn->connectpath, conn->gid,
-                                    get_current_username(),
-                                    current_user_info.domain,
-                                    lp_comment(params->service));
+       const char *net_name = lp_servicename(snum);
+       pstrcpy(remark, lp_comment(snum));
+       standard_sub_conn(p->conn, remark, sizeof(remark));
 
-
-       sh501->name = net_name;
-       sh501->type = get_share_type(params);
-       sh501->comment = remark;
-       sh501->csc_policy = (lp_csc_policy(params->service) << 4);
+       init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4));
+       init_srv_share_info501_str(&sh501->info_501_str, net_name, remark);
 }
 
 /*******************************************************************
  Fill in a share info level 502 structure.
  ********************************************************************/
 
-static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo502 *sh502,
-                                   const struct share_params *params)
+static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum)
 {
-       int max_connections = lp_max_connections(params->service);
-       uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff;
-       connection_struct *conn = p->conn;
-       int count; 
-       char *net_name;
-       char *remark;
-       char *path;
+       pstring net_name;
+       pstring remark;
+       pstring path;
+       pstring passwd;
        SEC_DESC *sd;
        size_t sd_size;
        TALLOC_CTX *ctx = p->mem_ctx;
@@ -385,112 +355,87 @@ static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo5
 
        ZERO_STRUCTP(sh502);
 
-       net_name = lp_servicename(params->service);
-       count = count_current_connections( net_name, False  );
-
-       remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
-                                    conn->user, conn->connectpath, conn->gid,
-                                    get_current_username(),
-                                    current_user_info.domain,
-                                    lp_comment(params->service));
-
-       path = talloc_asprintf(p->mem_ctx, "C:%s",
-                              lp_pathname(params->service));
+       pstrcpy(net_name, lp_servicename(snum));
+       pstrcpy(remark, lp_comment(snum));
+       standard_sub_conn(p->conn, remark,sizeof(remark));
+       pstrcpy(path, "C:");
+       pstrcat(path, lp_pathname(snum));
 
        /*
-        * Change / to \\ so that win2k will see it as a valid path.  This was
-        * added to enable use of browsing in win2k add share dialog.
+        * Change / to \\ so that win2k will see it as a valid path.  This was added to
+        * enable use of browsing in win2k add share dialog.
         */ 
 
        string_replace(path, '/', '\\');
 
-       sd = get_share_security(ctx, lp_servicename(params->service),
-                               &sd_size);
+       pstrcpy(passwd, "");
+
+       sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
 
-       sh502->name = net_name;
-       sh502->type = get_share_type(params);
-       sh502->comment = remark;
-       sh502->path = path;
-       sh502->password = "";
-       sh502->sd = sd;
-       sh502->permissions = 0;
-       sh502->max_users = max_uses;
-       sh502->current_users = count;
-       sh502->unknown = 1;
+       init_srv_share_info502(&sh502->info_502, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size);
+       init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size);
 }
 
 /***************************************************************************
  Fill in a share info level 1004 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1004(pipes_struct *p,
-                                    struct srvsvc_NetShareInfo1004* sh1004,
-                                    const struct share_params *params)
+static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum)
 {
-       connection_struct *conn = p->conn;
-       char *remark;
+        pstring remark;
 
-       remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
-                                    conn->user, conn->connectpath, conn->gid,
-                                    get_current_username(),
-                                    current_user_info.domain,
-                                    lp_comment(params->service));
+       pstrcpy(remark, lp_comment(snum));
+       standard_sub_conn(p->conn, remark, sizeof(remark));
 
        ZERO_STRUCTP(sh1004);
-
-       sh1004->comment = remark;
+  
+       init_srv_share_info1004(&sh1004->info_1004, remark);
+       init_srv_share_info1004_str(&sh1004->info_1004_str, remark);
 }
 
 /***************************************************************************
  Fill in a share info level 1005 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1005(pipes_struct *p,
-                                    struct srvsvc_NetShareInfo1005* sh1005,
-                                    const struct share_params *params)
+static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum)
 {
-       sh1005->dfs_flags = 0;
+       sh1005->share_info_flags = 0;
 
-       if(lp_host_msdfs() && lp_msdfs_root(params->service))
-               sh1005->dfs_flags |= 
+       if(lp_host_msdfs() && lp_msdfs_root(snum))
+               sh1005->share_info_flags |= 
                        SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
-       sh1005->dfs_flags |= 
-               lp_csc_policy(params->service) << SHARE_1005_CSC_POLICY_SHIFT;
+       sh1005->share_info_flags |= 
+               lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
 }
 /***************************************************************************
  Fill in a share info level 1006 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1006(pipes_struct *p,
-                                    struct srvsvc_NetShareInfo1006* sh1006,
-                                    const struct share_params *params)
+static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum)
 {
-       sh1006->max_users = -1;
+       sh1006->max_uses = -1;
 }
 
 /***************************************************************************
  Fill in a share info level 1007 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1007(pipes_struct *p,
-                                    struct srvsvc_NetShareInfo1007* sh1007,
-                                    const struct share_params *params)
+static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum)
 {
+        pstring alternate_directory_name = "";
        uint32 flags = 0;
 
        ZERO_STRUCTP(sh1007);
   
-       sh1007->flags = flags;
-       sh1007->alternate_directory_name = "";
+       init_srv_share_info1007(&sh1007->info_1007, flags, alternate_directory_name);
+       init_srv_share_info1007_str(&sh1007->info_1007_str, alternate_directory_name);
 }
 
 /*******************************************************************
  Fill in a share info level 1501 structure.
  ********************************************************************/
 
-static void init_srv_share_info_1501(pipes_struct *p,
-                                    struct sec_desc_buf *sh1501,
-                                    const struct share_params *params)
+static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum)
 {
        SEC_DESC *sd;
        size_t sd_size;
@@ -498,282 +443,350 @@ static void init_srv_share_info_1501(pipes_struct *p,
 
        ZERO_STRUCTP(sh1501);
 
-       sd = get_share_security(ctx, lp_servicename(params->service),
-                               &sd_size);
+       sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
 
-       sh1501->sd = sd;
+       sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
 }
 
 /*******************************************************************
  True if it ends in '$'.
  ********************************************************************/
 
-static BOOL is_hidden_share(const struct share_params *params)
+static BOOL is_hidden_share(int snum)
 {
-       const char *net_name = lp_servicename(params->service);
+       const char *net_name = lp_servicename(snum);
 
-       return (net_name[strlen(net_name) - 1] == '$');
+       return (net_name[strlen(net_name) - 1] == '$') ? True : False;
 }
 
 /*******************************************************************
  Fill in a share info structure.
  ********************************************************************/
 
-static WERROR init_srv_share_info_ctr(pipes_struct *p,
-                                     union srvsvc_NetShareCtr *ctr,
-                                     uint32 info_level, uint32 *resume_hnd,
-                                     uint32 *total_entries, BOOL all_shares)
+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 = 0;
+       int snum;
        TALLOC_CTX *ctx = p->mem_ctx;
-       struct share_iterator *shares;
-       struct share_params *share;
-       WERROR result = WERR_NOMEM;
 
        DEBUG(5,("init_srv_share_info_ctr\n"));
 
-       ZERO_STRUCTP(ctr);
+       ZERO_STRUCTPN(ctr);
 
-       if (resume_hnd) {
-               *resume_hnd = 0;
-       }
+       ctr->info_level = ctr->switch_value = info_level;
+       *resume_hnd = 0;
 
        /* Ensure all the usershares are loaded. */
        become_root();
-       load_usershare_shares();
+       num_services = load_usershare_shares();
        load_registry_shares();
        unbecome_root();
 
-       *total_entries = 0;
-
-       if (!(shares = share_list_all(ctx))) {
-               DEBUG(5, ("Could not list shares\n"));
-               return WERR_ACCESS_DENIED;
+       /* Count the number of entries. */
+       for (snum = 0; snum < num_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) )
+                       num_entries++;
        }
 
+       *total_entries = num_entries;
+       ctr->num_entries2 = ctr->num_entries = num_entries;
+       ctr->ptr_share_info = ctr->ptr_entries = 1;
+
+       if (!num_entries)
+               return True;
+
        switch (info_level) {
        case 0:
-               if (!(ctr->ctr0 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr0))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries);
+               int i = 0;
+
+               if (!info0) {
+                       return False;
                }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_0(p, &info0[i++], snum);
+                       }
+               }
+
+               ctr->share.info0 = info0;
                break;
+
+       }
+
        case 1:
-               if (!(ctr->ctr1 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr1))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries);
+               int i = 0;
+
+               if (!info1) {
+                       return False;
+               }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_1(p, &info1[i++], snum);
+                       }
                }
+
+               ctr->share.info1 = info1;
                break;
+       }
+
        case 2:
-               if (!(ctr->ctr2 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr2))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries);
+               int i = 0;
+
+               if (!info2) {
+                       return False;
                }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_2(p, &info2[i++], snum);
+                       }
+               }
+
+               ctr->share.info2 = info2;
                break;
+       }
+
        case 501:
-               if (!(ctr->ctr501 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr501))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries);
+               int i = 0;
+       
+               if (!info501) {
+                       return False;
+               }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_501(p, &info501[i++], snum);
+                       }
                }
+       
+               ctr->share.info501 = info501;
                break;
+       }
+
        case 502:
-               if (!(ctr->ctr502 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr502))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries);
+               int i = 0;
+
+               if (!info502) {
+                       return False;
                }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_502(p, &info502[i++], snum);
+                       }
+               }
+
+               ctr->share.info502 = info502;
                break;
+       }
+
+       /* here for completeness but not currently used with enum (1004 - 1501)*/
+       
        case 1004:
-               if (!(ctr->ctr1004 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr1004))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries);
+               int i = 0;
+
+               if (!info1004) {
+                       return False;
+               }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_1004(p, &info1004[i++], snum);
+                       }
                }
+
+               ctr->share.info1004 = info1004;
                break;
+       }
+
        case 1005:
-               if (!(ctr->ctr1005 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr1005))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries);
+               int i = 0;
+
+               if (!info1005) {
+                       return False;
                }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_1005(p, &info1005[i++], snum);
+                       }
+               }
+
+               ctr->share.info1005 = info1005;
                break;
+       }
+
        case 1006:
-               if (!(ctr->ctr1006 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr1006))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries);
+               int i = 0;
+
+               if (!info1006) {
+                       return False;
                }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_1006(p, &info1006[i++], snum);
+                       }
+               }
+
+               ctr->share.info1006 = info1006;
                break;
+       }
+
        case 1007:
-               if (!(ctr->ctr1007 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr1007))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries);
+               int i = 0;
+
+               if (!info1007) {
+                       return False;
+               }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_1007(p, &info1007[i++], snum);
+                       }
                }
+
+               ctr->share.info1007 = info1007;
                break;
+       }
+
        case 1501:
-               if (!(ctr->ctr1501 = TALLOC_ZERO_P(
-                             p->mem_ctx, struct srvsvc_NetShareCtr1501))) {
-                       goto done;
+       {
+               SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries);
+               int i = 0;
+
+               if (!info1501) {
+                       return False;
                }
+
+               for (snum = *resume_hnd; snum < num_services; snum++) {
+                       if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
+                               init_srv_share_info_1501(p, &info1501[i++], snum);
+                       }
+               }
+
+               ctr->share.info1501 = info1501;
                break;
+       }
        default:
-               DEBUG(5,("init_srv_share_info_ctr: unsupported switch "
-                        "value %d\n", info_level));
-               return WERR_UNKNOWN_LEVEL;
+               DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level));
+               return False;
        }
 
-       while ((share = next_share(shares)) != NULL) {
-               if (!lp_browseable(share->service)) {
-                       continue;
-               }
-               if (!all_shares && is_hidden_share(share)) {
-                       continue;
-               }
+       return True;
+}
 
+/*******************************************************************
+ Inits a SRV_R_NET_SHARE_ENUM structure.
+********************************************************************/
+
+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(p, &r_n->ctr, info_level,
+                                   &resume_hnd, &r_n->total_entries, all)) {
+               r_n->status = WERR_OK;
+       } else {
+               r_n->status = WERR_UNKNOWN_LEVEL;
+       }
+
+       init_enum_hnd(&r_n->enum_hnd, resume_hnd);
+}
+
+/*******************************************************************
+ Inits a SRV_R_NET_SHARE_GET_INFO structure.
+********************************************************************/
+
+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)
+{
+       WERROR status = WERR_OK;
+       int snum;
+
+       DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
+
+       r_n->info.switch_value = info_level;
+
+       snum = find_service(share_name);
+
+       if (snum >= 0) {
                switch (info_level) {
                case 0:
-               {
-                       struct srvsvc_NetShareInfo0 i;
-                       init_srv_share_info_0(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo0, i,
-                                    &ctr->ctr0->array, &ctr->ctr0->count);
-                       if (ctr->ctr0->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr0->count;
+                       init_srv_share_info_0(p, &r_n->info.share.info0, snum);
                        break;
-               }
-
                case 1:
-               {
-                       struct srvsvc_NetShareInfo1 i;
-                       init_srv_share_info_1(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1, i,
-                                    &ctr->ctr1->array, &ctr->ctr1->count);
-                       if (ctr->ctr1->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr1->count;
+                       init_srv_share_info_1(p, &r_n->info.share.info1, snum);
                        break;
-               }
-
                case 2:
-               {
-                       struct srvsvc_NetShareInfo2 i;
-                       init_srv_share_info_2(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo2, i,
-                                    &ctr->ctr2->array, &ctr->ctr2->count);
-                       if (ctr->ctr2->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr2->count;
+                       init_srv_share_info_2(p, &r_n->info.share.info2, snum);
                        break;
-               }
-
                case 501:
-               {
-                       struct srvsvc_NetShareInfo501 i;
-                       init_srv_share_info_501(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo501, i,
-                                    &ctr->ctr501->array, &ctr->ctr501->count);
-                       if (ctr->ctr501->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr501->count;
+                       init_srv_share_info_501(p, &r_n->info.share.info501, snum);
                        break;
-               }
-
                case 502:
-               {
-                       struct srvsvc_NetShareInfo502 i;
-                       init_srv_share_info_502(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo502, i,
-                                    &ctr->ctr502->array, &ctr->ctr502->count);
-                       if (ctr->ctr502->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr502->count;
+                       init_srv_share_info_502(p, &r_n->info.share.info502, snum);
                        break;
-               }
 
-               /* here for completeness but not currently used with enum
-                * (1004 - 1501)*/
-       
+                       /* here for completeness */
                case 1004:
-               {
-                       struct srvsvc_NetShareInfo1004 i;
-                       init_srv_share_info_1004(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1004, i,
-                                    &ctr->ctr1004->array, &ctr->ctr1004->count);
-                       if (ctr->ctr1004->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr1004->count;
+                       init_srv_share_info_1004(p, &r_n->info.share.info1004, snum);
                        break;
-               }
-
                case 1005:
-               {
-                       struct srvsvc_NetShareInfo1005 i;
-                       init_srv_share_info_1005(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1005, i,
-                                    &ctr->ctr1005->array, &ctr->ctr1005->count);
-                       if (ctr->ctr1005->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr1005->count;
+                       init_srv_share_info_1005(p, &r_n->info.share.info1005, snum);
                        break;
-               }
 
+                       /* here for completeness 1006 - 1501 */
                case 1006:
-               {
-                       struct srvsvc_NetShareInfo1006 i;
-                       init_srv_share_info_1006(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1006, i,
-                                    &ctr->ctr1006->array, &ctr->ctr1006->count);
-                       if (ctr->ctr1006->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr1006->count;
+                       init_srv_share_info_1006(p, &r_n->info.share.info1006, snum);
                        break;
-               }
-
                case 1007:
-               {
-                       struct srvsvc_NetShareInfo1007 i;
-                       init_srv_share_info_1007(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1007, i,
-                                    &ctr->ctr1007->array, &ctr->ctr1007->count);
-                       if (ctr->ctr1007->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr1007->count;
+                       init_srv_share_info_1007(p, &r_n->info.share.info1007, snum);
                        break;
-               }
-
                case 1501:
-               {
-                       struct sec_desc_buf i;
-                       init_srv_share_info_1501(p, &i, share);
-                       ADD_TO_ARRAY(ctx, struct sec_desc_buf, i,
-                                    &ctr->ctr1501->array, &ctr->ctr1501->count);
-                       if (ctr->ctr1501->array == NULL) {
-                               return WERR_NOMEM;
-                       }
-                       *total_entries = ctr->ctr1501->count;
+                       init_srv_share_info_1501(p, &r_n->info.share.info1501, snum);
+                       break;
+               default:
+                       DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level));
+                       status = WERR_UNKNOWN_LEVEL;
                        break;
                }
-               }
-
-               TALLOC_FREE(share);
+       } else {
+               status = WERR_INVALID_NAME;
        }
 
-       result = WERR_OK;
- done:
-       TALLOC_FREE(shares);
-       return result;
+       r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0;
+       r_n->status = status;
 }
 
 /*******************************************************************
  fill in a sess info level 0 structure.
  ********************************************************************/
 
-static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0, uint32 *snum, uint32 *stot)
+static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot)
 {
        struct sessionid *session_list;
        uint32 num_entries = 0;
@@ -788,34 +801,37 @@ static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0
 
        DEBUG(5,("init_srv_sess_0_ss0\n"));
 
-       ss0->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo0, *stot);
-
        if (snum) {
-               for (; (*snum) < (*stot); (*snum)++) {
-                       ss0->array[num_entries].client = session_list[(*snum)].remote_machine;
+               for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
+                       init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine);
                        num_entries++;
                }
 
-               ss0->count = num_entries;
+               ss0->num_entries_read  = num_entries;
+               ss0->ptr_sess_info     = num_entries > 0 ? 1 : 0;
+               ss0->num_entries_read2 = num_entries;
                
                if ((*snum) >= (*stot)) {
                        (*snum) = 0;
                }
 
        } else {
-               ss0->array = NULL;
-               ss0->count = 0;
+               ss0->num_entries_read = 0;
+               ss0->ptr_sess_info = 0;
+               ss0->num_entries_read2 = 0;
        }
 }
 
 /*******************************************************************
 ********************************************************************/
 
+/* global needed to make use of the share_mode_forall() callback */
+static struct sess_file_count s_file_cnt;
+
 static void sess_file_fn( const struct share_mode_entry *e, 
-                          const char *sharepath, const char *fname,
-                         void *private_data )
+                          const char *sharepath, const char *fname, void *state )
 {
-       struct sess_file_count *sess = (struct sess_file_count *)private_data;
+       struct sess_file_count *sess = &s_file_cnt;
  
        if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) {
                sess->count++;
@@ -829,13 +845,11 @@ static void sess_file_fn( const struct share_mode_entry *e,
 
 static int net_count_files( uid_t uid, struct server_id pid )
 {
-       struct sess_file_count s_file_cnt;
-
        s_file_cnt.count = 0;
        s_file_cnt.uid = uid;
        s_file_cnt.pid = pid;
        
-       share_mode_forall( sess_file_fn, (void *)&s_file_cnt );
+       share_mode_forall( sess_file_fn, NULL );
        
        return s_file_cnt.count;
 }
@@ -844,15 +858,16 @@ static int net_count_files( uid_t uid, struct server_id pid )
  fill in a sess info level 1 structure.
  ********************************************************************/
 
-static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1, uint32 *snum, uint32 *stot)
+static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot)
 {
        struct sessionid *session_list;
        uint32 num_entries = 0;
        time_t now = time(NULL);
 
        if ( !snum ) {
-               ss1->count = 0;
-               ss1->array = NULL;
+               ss1->num_entries_read = 0;
+               ss1->ptr_sess_info = 0;
+               ss1->num_entries_read2 = 0;
                
                (*stot) = 0;
 
@@ -860,16 +875,14 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1
        }
        
        if (ss1 == NULL) {
-               if (snum != NULL)
-                       (*snum) = 0;
+               (*snum) = 0;
                return;
        }
 
        (*stot) = list_sessions(p->mem_ctx, &session_list);
-
-       ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot);
        
-       for (; (*snum) < (*stot); (*snum)++) {
+
+       for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
                uint32 num_files;
                uint32 connect_time;
                struct passwd *pw = sys_getpwnam(session_list[*snum].username);
@@ -885,54 +898,52 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1
                num_files = net_count_files(pw->pw_uid, session_list[*snum].pid);
                guest = strequal( session_list[*snum].username, lp_guestaccount() );
                                        
-               if (!(ss1->array[num_entries].client = talloc_strdup(
-                             ss1->array, session_list[*snum].remote_machine))) {
-                       ss1->array[num_entries].client = "";
-               }
-               if (!(ss1->array[num_entries].user = talloc_strdup(
-                             ss1->array, session_list[*snum].username))) {
-                       ss1->array[num_entries].user = "";
-               }
-               ss1->array[num_entries].num_open = num_files;
-               ss1->array[num_entries].time = connect_time;
-               ss1->array[num_entries].idle_time = 0;
-               ss1->array[num_entries].user_flags = guest;
-
+               init_srv_sess_info1( &ss1->info_1[num_entries], 
+                                    session_list[*snum].remote_machine,
+                                    session_list[*snum].username, 
+                                    num_files,
+                                    connect_time,
+                                    0, 
+                                    guest);
                num_entries++;
        }
 
-       ss1->count = num_entries;
+       ss1->num_entries_read  = num_entries;
+       ss1->ptr_sess_info     = num_entries > 0 ? 1 : 0;
+       ss1->num_entries_read2 = num_entries;
        
        if ((*snum) >= (*stot)) {
                (*snum) = 0;
        }
+
 }
 
 /*******************************************************************
  makes a SRV_R_NET_SESS_ENUM structure.
 ********************************************************************/
 
-static WERROR init_srv_sess_info_ctr(pipes_struct *p, union srvsvc_NetSessCtr *ctr,
+static WERROR init_srv_sess_info_ctr(pipes_struct *p, SRV_SESS_INFO_CTR *ctr,
                                int switch_value, uint32 *resume_hnd, uint32 *total_entries)
 {
        WERROR status = WERR_OK;
        DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
 
+       ctr->switch_value = switch_value;
+
        switch (switch_value) {
        case 0:
-               ctr->ctr0 = talloc(p->mem_ctx, struct srvsvc_NetSessCtr0);
-               init_srv_sess_info_0(p, ctr->ctr0, resume_hnd, total_entries);
+               init_srv_sess_info_0(p, &(ctr->sess.info0), resume_hnd, total_entries);
+               ctr->ptr_sess_ctr = 1;
                break;
        case 1:
-               ctr->ctr1 = talloc(p->mem_ctx, struct srvsvc_NetSessCtr1);
-               init_srv_sess_info_1(p, ctr->ctr1, resume_hnd, total_entries);
+               init_srv_sess_info_1(p, &(ctr->sess.info1), resume_hnd, total_entries);
+               ctr->ptr_sess_ctr = 1;
                break;
        default:
                DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));
-               if (resume_hnd != NULL)
-                       (*resume_hnd) = 0;
+               (*resume_hnd) = 0;
                (*total_entries) = 0;
-               ctr->ctr0 = NULL;
+               ctr->ptr_sess_ctr = 0;
                status = WERR_UNKNOWN_LEVEL;
                break;
        }
@@ -940,43 +951,66 @@ static WERROR init_srv_sess_info_ctr(pipes_struct *p, union srvsvc_NetSessCtr *c
        return status;
 }
 
+/*******************************************************************
+ makes a SRV_R_NET_SESS_ENUM structure.
+********************************************************************/
+
+static void init_srv_r_net_sess_enum(pipes_struct *p, SRV_R_NET_SESS_ENUM *r_n,
+                               uint32 resume_hnd, int sess_level, int switch_value)  
+{
+       DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));
+
+       r_n->sess_level  = sess_level;
+
+       if (sess_level == -1)
+               r_n->status = WERR_UNKNOWN_LEVEL;
+       else
+               r_n->status = init_srv_sess_info_ctr(p, r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
+
+       if (!W_ERROR_IS_OK(r_n->status))
+               resume_hnd = 0;
+
+       init_enum_hnd(&r_n->enum_hnd, resume_hnd);
+}
+
 /*******************************************************************
  fill in a conn info level 0 structure.
  ********************************************************************/
 
-static void init_srv_conn_info_0(pipes_struct *p, struct srvsvc_NetConnCtr0 *ss0, uint32 *snum, uint32 *stot)
+static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot)
 {
        uint32 num_entries = 0;
        (*stot) = 1;
 
        if (ss0 == NULL) {
-               if (snum != NULL)
-                       (*snum) = 0;
+               (*snum) = 0;
                return;
        }
 
        DEBUG(5,("init_srv_conn_0_ss0\n"));
 
        if (snum) {
-               ss0->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetConnInfo0, *stot);
-               for (; (*snum) < (*stot); (*snum)++) {
+               for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
 
-                       ss0->array[num_entries].conn_id = (*stot);
+                       init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));
 
                        /* move on to creating next connection */
                        /* move on to creating next conn */
                        num_entries++;
                }
 
-               ss0->count = num_entries;
+               ss0->num_entries_read  = num_entries;
+               ss0->ptr_conn_info     = num_entries > 0 ? 1 : 0;
+               ss0->num_entries_read2 = num_entries;
                
                if ((*snum) >= (*stot)) {
                        (*snum) = 0;
                }
 
        } else {
-               ss0->array = NULL;
-               ss0->count = 0;
+               ss0->num_entries_read = 0;
+               ss0->ptr_conn_info = 0;
+               ss0->num_entries_read2 = 0;
 
                (*stot) = 0;
        }
@@ -986,44 +1020,55 @@ static void init_srv_conn_info_0(pipes_struct *p, struct srvsvc_NetConnCtr0 *ss0
  fill in a conn info level 1 structure.
  ********************************************************************/
 
-static void init_srv_conn_info_1(pipes_struct *p, struct srvsvc_NetConnCtr1 *ss1, uint32 *snum, uint32 *stot)
+static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,
+                               uint32 id, uint32 type,
+                               uint32 num_opens, uint32 num_users, uint32 open_time,
+                               const char *usr_name, const char *net_name)
+{
+       init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);
+       init_srv_conn_info1_str(str1, usr_name, net_name);
+}
+
+/*******************************************************************
+ fill in a conn info level 1 structure.
+ ********************************************************************/
+
+static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot)
 {
        uint32 num_entries = 0;
        (*stot) = 1;
 
        if (ss1 == NULL) {
-               if (snum != NULL)
-                       (*snum) = 0;
+               (*snum) = 0;
                return;
        }
 
        DEBUG(5,("init_srv_conn_1_ss1\n"));
 
        if (snum) {
-               ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetConnInfo1, *stot);
-               for (; (*snum) < (*stot); (*snum)++) {
-                       ss1->array[num_entries].conn_id = (*stot);
-                       ss1->array[num_entries].conn_type = 0x3;
-                       ss1->array[num_entries].num_open = 1;
-                       ss1->array[num_entries].num_users = 1;
-                       ss1->array[num_entries].conn_time = 3;
-                       ss1->array[num_entries].user = "dummy_user";
-                       ss1->array[num_entries].share = "IPC$";
+               for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
+                       init_srv_conn_1_info(&ss1->info_1[num_entries],
+                                                                &ss1->info_1_str[num_entries],
+                                            (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");
 
                        /* move on to creating next connection */
                        /* move on to creating next conn */
                        num_entries++;
                }
 
-               ss1->count = num_entries;
+               ss1->num_entries_read  = num_entries;
+               ss1->ptr_conn_info     = num_entries > 0 ? 1 : 0;
+               ss1->num_entries_read2 = num_entries;
+               
 
                if ((*snum) >= (*stot)) {
                        (*snum) = 0;
                }
 
        } else {
-               ss1->count = 0;
-               ss1->array = NULL;
+               ss1->num_entries_read = 0;
+               ss1->ptr_conn_info = 0;
+               ss1->num_entries_read2 = 0;
                
                (*stot) = 0;
        }
@@ -1033,24 +1078,28 @@ static void init_srv_conn_info_1(pipes_struct *p, struct srvsvc_NetConnCtr1 *ss1
  makes a SRV_R_NET_CONN_ENUM structure.
 ********************************************************************/
 
-static WERROR init_srv_conn_info_ctr(pipes_struct *p, union srvsvc_NetConnCtr *ctr,
+static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
                                int switch_value, uint32 *resume_hnd, uint32 *total_entries)
 {
        WERROR status = WERR_OK;
        DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
 
+       ctr->switch_value = switch_value;
+
        switch (switch_value) {
        case 0:
-               init_srv_conn_info_0(p, ctr->ctr0, resume_hnd, total_entries);
+               init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);
+               ctr->ptr_conn_ctr = 1;
                break;
        case 1:
-               init_srv_conn_info_1(p, ctr->ctr1, resume_hnd, total_entries);
+               init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);
+               ctr->ptr_conn_ctr = 1;
                break;
        default:
                DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));
-               ctr->ctr0 = NULL;
-               (*resume_hnd) = 0;
+               (*resume_hnd = 0);
                (*total_entries) = 0;
+               ctr->ptr_conn_ctr = 0;
                status = WERR_UNKNOWN_LEVEL;
                break;
        }
@@ -1058,46 +1107,84 @@ static WERROR init_srv_conn_info_ctr(pipes_struct *p, union srvsvc_NetConnCtr *c
        return status;
 }
 
+/*******************************************************************
+ makes a SRV_R_NET_CONN_ENUM structure.
+********************************************************************/
+
+static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
+                               uint32 resume_hnd, int conn_level, int switch_value)  
+{
+       DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));
+
+       r_n->conn_level  = conn_level;
+       if (conn_level == -1)
+               r_n->status = WERR_UNKNOWN_LEVEL;
+       else
+               r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
+
+       if (!W_ERROR_IS_OK(r_n->status))
+               resume_hnd = 0;
+
+       init_enum_hnd(&r_n->enum_hnd, resume_hnd);
+}
+
 /*******************************************************************
  makes a SRV_R_NET_FILE_ENUM structure.
 ********************************************************************/
 
-static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr,
-                             uint32 *resume_hnd, const char *username,
-                             uint32 *num_entries )
+static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r,
+                              uint32 resume_hnd )
 {
-       WERROR status;
+       TALLOC_CTX *ctx = talloc_tos();
+       SRV_FILE_INFO_CTR *ctr = &r->ctr;
 
        /* TODO -- Windows enumerates 
           (b) active pipes
           (c) open directories and files */
 
-       ctr->ctr3 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetFileCtr3);
-       
-       status = net_enum_files(p->mem_ctx, username, &ctr->ctr3->array,
-                               num_entries, resume_hnd );
-       if ( !W_ERROR_IS_OK(status))
-               return status;
+       r->status = net_enum_files( ctx, username, &ctr->file.info3,
+                                   &ctr->num_entries, resume_hnd );
+       if ( !W_ERROR_IS_OK(r->status))
+               goto done;
                
-       status = net_enum_pipes(p->mem_ctx, username, &ctr->ctr3->array,
-                               num_entries, resume_hnd );
-       if ( !W_ERROR_IS_OK(status))
-               return status;
-
-       ctr->ctr3->count = *num_entries;
+       r->status = net_enum_pipes( ctx, username, &ctr->file.info3,
+                                   &ctr->num_entries, resume_hnd );
+       if ( !W_ERROR_IS_OK(r->status))
+               goto done;
        
-       return WERR_OK;
+       r->level = ctr->level = 3;
+       r->total_entries = ctr->num_entries;
+       /* ctr->num_entries = r->total_entries - resume_hnd; */
+       ctr->num_entries2 = ctr->num_entries;
+       ctr->ptr_file_info = 1;
+
+       r->status = WERR_OK;
+
+done:
+       if ( ctr->num_entries > 0 ) 
+               ctr->ptr_entries = 1;
+
+       init_enum_hnd(&r->enum_hnd, 0);
+
+       return r->status;
 }
 
 /*******************************************************************
 *******************************************************************/
 
-WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r)
+WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
 {
-       switch ( *r->in.level ) {
-       case 3:
-               return net_file_enum_3(p, r->in.ctr, r->in.resume_handle,
-                                      r->in.user, r->out.totalentries );
+       switch ( q_u->level ) {
+       case 3: {
+               char *username;
+               if (!(username = rpcstr_pull_unistr2_talloc(
+                             p->mem_ctx, q_u->username))) {
+                       return WERR_NOMEM;
+               }
+
+               return net_file_enum_3(username, r_u,
+                                      get_enum_hnd(&q_u->enum_hnd));
+       }
        default:
                return WERR_UNKNOWN_LEVEL;
        }
@@ -1109,11 +1196,15 @@ WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r)
 net server get info
 ********************************************************************/
 
-WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r)
+WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u)
 {
        WERROR status = WERR_OK;
+       SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR);
 
-       ZERO_STRUCTP(r->out.info);
+       if (!ctr)
+               return WERR_NOMEM;
+
+       ZERO_STRUCTP(ctr);
 
        DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
 
@@ -1122,108 +1213,133 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r)
                return WERR_ACCESS_DENIED;
        }
 
-       switch (r->in.level) {
+       switch (q_u->switch_value) {
 
                /* Technically level 102 should only be available to
                   Administrators but there isn't anything super-secret
                   here, as most of it is made up. */
 
        case 102:
-               r->out.info->info102 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo102);
-
-               r->out.info->info102->platform_id = 500;
-               r->out.info->info102->version_major = lp_major_announce_version();
-               r->out.info->info102->version_minor = lp_minor_announce_version();
-               r->out.info->info102->server_name = global_myname(); 
-               r->out.info->info102->server_type = lp_default_server_announce();
-               r->out.info->info102->userpath = "C:\\";
-               r->out.info->info102->licenses = 10000;
-               r->out.info->info102->anndelta = 3000;
-               r->out.info->info102->disc = 0xf;
-               r->out.info->info102->users = 0xffffffff;
-               r->out.info->info102->hidden = 0;
-               r->out.info->info102->announce = 240;
-               r->out.info->info102->comment = lp_serverstring();
+               init_srv_info_102(&ctr->srv.sv102,
+                                 500, global_myname(), 
+                                 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),
+                                 lp_major_announce_version(), lp_minor_announce_version(),
+                                 lp_default_server_announce(),
+                                 0xffffffff, /* users */
+                                 0xf, /* disc */
+                                 0, /* hidden */
+                                 240, /* announce */
+                                 3000, /* announce delta */
+                                 100000, /* licenses */
+                                 "c:\\"); /* user path */
                break;
        case 101:
-               r->out.info->info101 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo101);
-                       r->out.info->info101->platform_id = 500;
-                       r->out.info->info101->server_name = global_myname();
-                       r->out.info->info101->version_major = lp_major_announce_version();
-                       r->out.info->info101->version_minor = lp_minor_announce_version();
-                       r->out.info->info101->server_type = lp_default_server_announce();
-                       r->out.info->info101->comment = lp_serverstring();
+               init_srv_info_101(&ctr->srv.sv101,
+                                 500, global_myname(),
+                                 lp_major_announce_version(), lp_minor_announce_version(),
+                                 lp_default_server_announce(),
+                                 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
                break;
        case 100:
-               r->out.info->info100 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo100);
-               r->out.info->info100->platform_id = 500;
-               r->out.info->info100->server_name = global_myname();
+               init_srv_info_100(&ctr->srv.sv100, 500, global_myname());
                break;
        default:
-               return WERR_UNKNOWN_LEVEL;
+               status = WERR_UNKNOWN_LEVEL;
                break;
        }
 
+       /* set up the net server get info structure */
+       init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status);
+
        DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
 
-       return status;
+       return r_u->status;
 }
 
 /*******************************************************************
 net server set info
 ********************************************************************/
 
-WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r)
+WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u)
 {
+       WERROR status = WERR_OK;
+
+       DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
+
        /* Set up the net server set info structure. */
-       if (r->out.parm_error) {
-               *r->out.parm_error = 0;
-       }
-       return WERR_OK;
+
+       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 conn enum
 ********************************************************************/
 
-WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r)
+WERROR _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__));
 
-       ZERO_STRUCTP(r->out.ctr);
+       r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);
+       if (!r_u->ctr)
+               return WERR_NOMEM;
+
+       ZERO_STRUCTP(r_u->ctr);
 
        /* set up the */
-       return init_srv_conn_info_ctr(p, r->out.ctr, *r->in.level, r->in.resume_handle, r->out.totalentries);
+       init_srv_r_net_conn_enum(r_u,
+                               get_enum_hnd(&q_u->enum_hnd),
+                               q_u->conn_level,
+                               q_u->ctr->switch_value);
+
+       DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
+
+       return r_u->status;
 }
 
 /*******************************************************************
 net sess enum
 ********************************************************************/
 
-WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r)
+WERROR _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__));
 
-       ZERO_STRUCTP(r->out.ctr);
+       r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);
+       if (!r_u->ctr)
+               return WERR_NOMEM;
+
+       ZERO_STRUCTP(r_u->ctr);
 
        /* set up the */
-       return init_srv_sess_info_ctr(p, r->out.ctr,
-                               *r->in.level, 
-                               r->in.resume_handle,
-                               r->out.totalentries);
+       init_srv_r_net_sess_enum(p, r_u,
+                               get_enum_hnd(&q_u->enum_hnd),
+                               q_u->sess_level,
+                               q_u->ctr->switch_value);
+
+       DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
+
+       return r_u->status;
 }
 
 /*******************************************************************
 net sess del
 ********************************************************************/
 
-WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r)
+WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u)
 {
        struct sessionid *session_list;
+       struct current_user user;
        int num_sessions, snum;
-       WERROR status;
+       fstring username;
+       fstring machine;
+       BOOL not_root = False;
 
-       char *machine = talloc_strdup(p->mem_ctx, r->in.server_unc);
+       rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);
+       rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);
 
        /* strip leading backslashes if any */
        while (machine[0] == '\\') {
@@ -1234,11 +1350,13 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r)
 
        DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
 
-       status = WERR_ACCESS_DENIED;
+       r_u->status = WERR_ACCESS_DENIED;
+
+       get_current_user(&user, p);
 
        /* fail out now if you are not root or not a domain admin */
 
-       if ((p->pipe_user.ut.uid != sec_initial_uid()) && 
+       if ((user.ut.uid != sec_initial_uid()) && 
                ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) {
 
                goto done;
@@ -1246,30 +1364,41 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r)
 
        for (snum = 0; snum < num_sessions; snum++) {
 
-               if ((strequal(session_list[snum].username, r->in.user) || r->in.user[0] == '\0' ) &&
-                    strequal(session_list[snum].remote_machine, machine)) {
+               if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
+                   strequal(session_list[snum].remote_machine, machine)) {
+
                        NTSTATUS ntstat;
+               
+                       if (user.ut.uid != sec_initial_uid()) {
+                               not_root = True;
+                               become_root();
+                       }
 
                        ntstat = messaging_send(smbd_messaging_context(),
                                                session_list[snum].pid,
                                                MSG_SHUTDOWN, &data_blob_null);
-               
+                       
                        if (NT_STATUS_IS_OK(ntstat))
-                               status = WERR_OK;
+                               r_u->status = WERR_OK;
+
+                       if (not_root) 
+                               unbecome_root();
                }
        }
 
        DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
 
+
 done:
-       return status;
+
+       return r_u->status;
 }
 
 /*******************************************************************
  Net share enum all.
 ********************************************************************/
 
-WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r)
+WERROR _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__));
 
@@ -1279,15 +1408,20 @@ WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r
        }
 
        /* Create the list of shares for the response. */
-       return init_srv_share_info_ctr(p, r->out.ctr, *r->in.level,
-                                             r->in.resume_handle, r->out.totalentries, True);
+       init_srv_r_net_share_enum(p, r_u,
+                               q_u->ctr.info_level,
+                               get_enum_hnd(&q_u->enum_hnd), True);
+
+       DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
+
+       return r_u->status;
 }
 
 /*******************************************************************
  Net share enum.
 ********************************************************************/
 
-WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r)
+WERROR _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__));
 
@@ -1297,80 +1431,32 @@ WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r)
        }
 
        /* Create the list of shares for the response. */
-       return init_srv_share_info_ctr(p, r->out.ctr, *r->in.level,
-                                             r->in.resume_handle, r->out.totalentries, False);
+       init_srv_r_net_share_enum(p, r_u,
+                                 q_u->ctr.info_level,
+                                 get_enum_hnd(&q_u->enum_hnd), False);
+
+       DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
+
+       return r_u->status;
 }
 
 /*******************************************************************
  Net share get info.
 ********************************************************************/
 
-WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r)
+WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u)
 {
-       const struct share_params *params;
+       fstring share_name;
 
-       params = get_share_params(p->mem_ctx, r->in.share_name);
+       DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
 
-       if (params != NULL) {
-               switch (r->in.level) {
-               case 0:
-                       r->out.info->info0 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo0);
-                       init_srv_share_info_0(p, r->out.info->info0, params);
-                       break;
-               case 1:
-                       r->out.info->info1 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1);
-                       init_srv_share_info_1(p, r->out.info->info1, params);
-                       break;
-               case 2:
-                       r->out.info->info2 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo2);
-                       init_srv_share_info_2(p, r->out.info->info2, params);
-                       break;
-               case 501:
-                       r->out.info->info501 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo501);
-                       init_srv_share_info_501(p, r->out.info->info501, params);
-                       break;
-               case 502:
-                       r->out.info->info502 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo502);
-                       init_srv_share_info_502(p, r->out.info->info502, params);
-                       break;
+       /* 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, r_u, share_name, q_u->info_level);
 
-                       /* here for completeness */
-               case 1004:
-                       r->out.info->info1004 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1004);
-                       init_srv_share_info_1004(p, r->out.info->info1004, params);
-                       break;
-               case 1005:
-                       r->out.info->info1005 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1005);
-                       init_srv_share_info_1005(p, r->out.info->info1005, params);
-                       break;
+       DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
 
-                       /* here for completeness 1006 - 1501 */
-               case 1006:
-                       r->out.info->info1006 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1006);
-                       init_srv_share_info_1006(p, r->out.info->info1006,
-                                                params);
-                       break;
-               case 1007:
-                       r->out.info->info1007 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1007);
-                       init_srv_share_info_1007(p, r->out.info->info1007,
-                                                params);
-                       break;
-               case 1501:
-                       r->out.info->info1501 = talloc(p->mem_ctx, struct sec_desc_buf);
-                       init_srv_share_info_1501(p, r->out.info->info1501,
-                                                params);
-                       break;
-               default:
-                       DEBUG(5,("init_srv_net_share_get_info: unsupported "
-                                "switch value %d\n", r->in.level));
-                       return WERR_UNKNOWN_LEVEL;
-                       break;
-               }
-       } else {
-               return WERR_INVALID_NAME;
-       }
-
-       return WERR_OK;
+       return r_u->status;
 }
 
 /*******************************************************************
@@ -1378,314 +1464,59 @@ WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r
 ********************************************************************/
 
 char *valid_share_pathname(char *dos_pathname)
-{
-       char *ptr;
-
-       /* Convert any '\' paths to '/' */
-       unix_format(dos_pathname);
-       unix_clean_name(dos_pathname);
-
-       /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
-       ptr = dos_pathname;
-       if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
-               ptr += 2;
-
-       /* Only absolute paths allowed. */
-       if (*ptr != '/')
-               return NULL;
-
-       return ptr;
-}
-
-static void setval_helper(struct registry_key *key, const char *name,
-                         const char *value, WERROR *err)
-{
-       struct registry_value val;
-
-       if (!W_ERROR_IS_OK(*err)) {
-               return;
-       }
-
-       ZERO_STRUCT(val);
-       val.type = REG_SZ;
-       val.v.sz.str = CONST_DISCARD(char *, value);
-       val.v.sz.len = strlen(value)+1;
-
-       *err = reg_setvalue(key, name, &val);
-}
-
-static WERROR add_share(const char *share_name, const char *path,
-                       const char *comment, uint32 max_connections,
-                       const struct nt_user_token *token,
-                       BOOL is_disk_op)
-{
-       if (lp_add_share_cmd() && *lp_add_share_cmd()) {
-               char *command;
-               int ret;
-
-               if (asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
-                            lp_add_share_cmd(), dyn_CONFIGFILE, share_name,
-                            path, comment, max_connections) == -1) {
-                       return WERR_NOMEM;
-               }
-
-               DEBUG(10,("add_share: Running [%s]\n", command ));
-
-               /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
-       
-               if ( is_disk_op )
-                       become_root();
-
-               if ( (ret = smbrun(command, NULL)) == 0 ) {
-                       /* Tell everyone we updated smb.conf. */
-                       message_send_all(smbd_messaging_context(),
-                                        MSG_SMB_CONF_UPDATED,
-                                        NULL, 0, NULL);
-               }
-
-               if ( is_disk_op )
-                       unbecome_root();
-               
-               /********* END SeDiskOperatorPrivilege BLOCK *********/
-
-               DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n",
-                        command, ret ));
-
-               /*
-                * No fallback to registry shares, the user did define a add
-                * share command, so fail here.
-                */
-
-               SAFE_FREE(command);
-               return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED;
-       }
-
-       if (lp_registry_shares()) {
-               char *keyname;
-               struct registry_key *key;
-               enum winreg_CreateAction action;
-               WERROR err;
-               TALLOC_CTX *mem_ctx;
-
-               if (!(keyname = talloc_asprintf(NULL, "%s\\%s", KEY_SMBCONF,
-                                               share_name))) {
-                       return WERR_NOMEM;
-               }
-
-               mem_ctx = (TALLOC_CTX *)keyname;
-
-               err = reg_create_path(mem_ctx, keyname, REG_KEY_WRITE,
-                                     is_disk_op ? get_root_nt_token():token,
-                                     &action, &key);
-
-               if (action != REG_CREATED_NEW_KEY) {
-                       err = WERR_ALREADY_EXISTS;
-               }
-
-               if (!W_ERROR_IS_OK(err)) {
-                       TALLOC_FREE(mem_ctx);
-                       return err;
-               }
-
-               setval_helper(key, "path", path, &err);
-               if ((comment != NULL) && (comment[0] != '\0')) {
-                       setval_helper(key, "comment", comment, &err);
-               }
-               if (max_connections != 0) {
-                       char tmp[16];
-                       snprintf(tmp, sizeof(tmp), "%d", max_connections);
-                       setval_helper(key, "max connections", tmp, &err);
-               }
-
-               if (!W_ERROR_IS_OK(err)) {
-                       /*
-                        * Hmmmm. We'd need transactions on the registry to
-                        * get this right....
-                        */
-                       reg_delete_path(is_disk_op ? get_root_nt_token():token,
-                                       keyname);
-               }
-               TALLOC_FREE(mem_ctx);
-               return err;
-       }
-
-       return WERR_ACCESS_DENIED;
-}
-
-static WERROR delete_share(const char *sharename, 
-                          const struct nt_user_token *token,
-                          BOOL is_disk_op)
-{
-       if (lp_delete_share_cmd() && *lp_delete_share_cmd()) {
-               char *command;
-               int ret;
-
-               if (asprintf(&command, "%s \"%s\" \"%s\"",
-                            lp_delete_share_cmd(), dyn_CONFIGFILE,
-                            sharename)) {
-                       return WERR_NOMEM;
-               }
-
-               DEBUG(10,("delete_share: Running [%s]\n", command ));
-
-               /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
-       
-               if ( is_disk_op )
-                       become_root();
-
-               if ( (ret = smbrun(command, NULL)) == 0 ) {
-                       /* Tell everyone we updated smb.conf. */
-                       message_send_all(smbd_messaging_context(),
-                                        MSG_SMB_CONF_UPDATED,
-                                        NULL, 0, NULL);
-               }
-
-               if ( is_disk_op )
-                       unbecome_root();
-
-               /********* END SeDiskOperatorPrivilege BLOCK *********/
-
-               SAFE_FREE(command);
-
-               DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n",
-                        command, ret ));
-               return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED;
-       }
-
-       if (lp_registry_shares()) {
-               char *keyname;
-               WERROR err;
-
-               if (asprintf(&keyname, "%s\\%s", KEY_SMBCONF,
-                            sharename) == -1) {
-                       return WERR_NOMEM;
-               }
-
-               err = reg_delete_path(is_disk_op ? get_root_nt_token():token,
-                                     keyname);
-               SAFE_FREE(keyname);
-               return err;
-       }
-
-       return WERR_ACCESS_DENIED;
-}
-
-static WERROR change_share(const char *share_name, const char *path,
-                          const char *comment, uint32 max_connections,
-                          const struct nt_user_token *token,
-                          BOOL is_disk_op)
-{
-       if (lp_change_share_cmd() && *lp_change_share_cmd()) {
-               char *command;
-               int ret;
-
-               if (asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
-                            lp_change_share_cmd(), dyn_CONFIGFILE, share_name,
-                            path, comment, max_connections) == -1) {
-                       return WERR_NOMEM;
-               }
-
-               DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command));
-                               
-               /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
-       
-               if ( is_disk_op )
-                       become_root();
-                       
-               if ( (ret = smbrun(command, NULL)) == 0 ) {
-                       /* Tell everyone we updated smb.conf. */
-                       message_send_all(smbd_messaging_context(),
-                                        MSG_SMB_CONF_UPDATED,
-                                        NULL, 0, NULL);
-               }
-               
-               if ( is_disk_op )
-                       unbecome_root();
-                       
-               /********* END SeDiskOperatorPrivilege BLOCK *********/
-
-               DEBUG(3,("_srv_net_share_set_info: Running [%s] returned "
-                        "(%d)\n", command, ret ));
-
-               SAFE_FREE(command);
-
-               return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED;
-       }
-
-       if (lp_registry_shares()) {
-               char *keyname;
-               struct registry_key *key;
-               WERROR err;
-               TALLOC_CTX *mem_ctx;
-
-               if (!(keyname = talloc_asprintf(NULL, "%s\\%s", KEY_SMBCONF,
-                                               share_name))) {
-                       return WERR_NOMEM;
-               }
-
-               mem_ctx = (TALLOC_CTX *)keyname;
-
-               err = reg_open_path(mem_ctx, keyname, REG_KEY_WRITE,
-                                   is_disk_op ? get_root_nt_token():token,
-                                   &key);
-               if (!W_ERROR_IS_OK(err)) {
-                       TALLOC_FREE(mem_ctx);
-                       return err;
-               }
-
-               setval_helper(key, "path", path, &err);
+{
+       char *ptr;
 
-               reg_deletevalue(key, "comment");
-               if ((comment != NULL) && (comment[0] != '\0')) {
-                       setval_helper(key, "comment", comment, &err);
-               }
+       /* Convert any '\' paths to '/' */
+       unix_format(dos_pathname);
+       unix_clean_name(dos_pathname);
 
-               reg_deletevalue(key, "max connections");
-               if (max_connections != 0) {
-                       char tmp[16];
-                       snprintf(tmp, sizeof(tmp), "%d", max_connections);
-                       setval_helper(key, "max connections", tmp, &err);
-               }
+       /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
+       ptr = dos_pathname;
+       if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
+               ptr += 2;
 
-               TALLOC_FREE(mem_ctx);
-               return err;
-       }               
+       /* Only absolute paths allowed. */
+       if (*ptr != '/')
+               return NULL;
 
-       return WERR_ACCESS_DENIED;
+       return ptr;
 }
 
 /*******************************************************************
  Net share set info. Modify share details.
 ********************************************************************/
 
-WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r)
+WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u)
 {
-       pstring comment;
+       struct current_user user;
+       pstring command;
+       fstring share_name;
+       fstring comment;
        pstring pathname;
        int type;
        int snum;
+       int ret;
        char *path;
        SEC_DESC *psd = NULL;
        SE_PRIV se_diskop = SE_DISK_OPERATOR;
        BOOL is_disk_op = False;
        int max_connections = 0;
-       fstring tmp_share_name;
 
        DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
 
-       if (r->out.parm_error) {
-               *r->out.parm_error = 0;
-       }
+       unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
 
-       if ( strequal(r->in.share_name,"IPC$") 
-               || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") )
-               || strequal(r->in.share_name,"global") )
+       r_u->parm_error = 0;
+
+       if ( strequal(share_name,"IPC$") 
+               || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
+               || strequal(share_name,"global") )
        {
                return WERR_ACCESS_DENIED;
        }
 
-       fstrcpy(tmp_share_name, r->in.share_name);
-       snum = find_service(tmp_share_name);
+       snum = find_service(share_name);
 
        /* Does this share exist ? */
        if (snum < 0)
@@ -1695,39 +1526,47 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r
        if (lp_print_ok(snum))
                return WERR_ACCESS_DENIED;
 
-       is_disk_op = user_has_privileges( p->pipe_user.nt_user_token,
-                                         &se_diskop );
+       get_current_user(&user,p);
+
+       is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
        
        /* fail out now if you are not root and not a disk op */
        
-       if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
+       if ( user.ut.uid != sec_initial_uid() && !is_disk_op )
                return WERR_ACCESS_DENIED;
 
-       switch (r->in.level) {
+       switch (q_u->info_level) {
        case 1:
                pstrcpy(pathname, lp_pathname(snum));
-               pstrcpy(comment, r->in.info.info1->comment);
-               type = r->in.info.info1->type;
+               unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
+               type = q_u->info.share.info2.info_2.type;
                psd = NULL;
                break;
        case 2:
-               pstrcpy(comment, r->in.info.info2->comment);
-               pstrcpy(pathname, r->in.info.info2->path);
-               type = r->in.info.info2->type;
-               max_connections = (r->in.info.info2->max_users == 0xffffffff) ?
-                       0 : r->in.info.info2->max_users;
+               unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
+               unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname));
+               type = q_u->info.share.info2.info_2.type;
+               max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
                psd = NULL;
                break;
+#if 0
+               /* not supported on set but here for completeness */
+       case 501:
+               unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment));
+               type = q_u->info.share.info501.info_501.type;
+               psd = NULL;
+               break;
+#endif
        case 502:
-               pstrcpy(comment, r->in.info.info502->comment);
-               pstrcpy(pathname, r->in.info.info502->path);
-               type = r->in.info.info502->type;
-               psd = r->in.info.info502->sd;
+               unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment));
+               unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname));
+               type = q_u->info.share.info502.info_502.type;
+               psd = q_u->info.share.info502.info_502_str.sd;
                map_generic_share_sd_bits(psd);
                break;
        case 1004:
                pstrcpy(pathname, lp_pathname(snum));
-               pstrcpy(comment, r->in.info.info1004->comment);
+               unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment));
                type = STYPE_DISKTREE;
                break;
        case 1005:
@@ -1735,14 +1574,12 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r
                   user, so we must compare it to see if it's what is set in
                   smb.conf, so that we can contine other ops like setting
                   ACLs on a share */
-               if (((r->in.info.info1005->dfs_flags &
+               if (((q_u->info.share.info1005.share_info_flags &
                      SHARE_1005_CSC_POLICY_MASK) >>
                     SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
                        return WERR_OK;
                else {
-                       DEBUG(3, ("_srv_net_share_set_info: client is trying "
-                                 "to change csc policy from the network; "
-                                 "must be done with smb.conf\n"));
+                       DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
                        return WERR_ACCESS_DENIED;
                }
        case 1006:
@@ -1750,14 +1587,13 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r
                return WERR_ACCESS_DENIED;
        case 1501:
                pstrcpy(pathname, lp_pathname(snum));
-               pstrcpy(comment, lp_comment(snum));
-               psd = r->in.info.info1501->sd;
+               fstrcpy(comment, lp_comment(snum));
+               psd = q_u->info.share.info1501.sdb->sd;
                map_generic_share_sd_bits(psd);
                type = STYPE_DISKTREE;
                break;
        default:
-               DEBUG(5,("_srv_net_share_set_info: unsupported switch value "
-                        "%d\n", r->in.level));
+               DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level));
                return WERR_UNKNOWN_LEVEL;
        }
 
@@ -1769,29 +1605,52 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r
        if (!(path = valid_share_pathname( pathname )))
                return WERR_OBJECT_PATH_INVALID;
 
-       /* Ensure share name, pathname and comment don't contain '"'
-        * characters. */
-       string_replace(tmp_share_name, '"', ' ');
+       /* Ensure share name, pathname and comment don't contain '"' characters. */
+       string_replace(share_name, '"', ' ');
        string_replace(path, '"', ' ');
        string_replace(comment, '"', ' ');
 
        DEBUG(10,("_srv_net_share_set_info: change share command = %s\n",
-                 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
+               lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
 
        /* Only call modify function if something changed. */
        
-       if (strcmp(path, lp_pathname(snum))
-           || strcmp(comment, lp_comment(snum)) 
-           || (lp_max_connections(snum) != max_connections) ) {
-               WERROR err;
+       if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) 
+               || (lp_max_connections(snum) != max_connections) ) 
+       {
+               if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
+                       DEBUG(10,("_srv_net_share_set_info: No change share command\n"));
+                       return WERR_ACCESS_DENIED;
+               }
 
-               err = change_share(tmp_share_name, path, comment,
-                                  max_connections, p->pipe_user.nt_user_token,
-                                  is_disk_op);
+               slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
+                               lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); 
 
-               if (!W_ERROR_IS_OK(err)) {
-                       return err;
+               DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
+                               
+               /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
+       
+               if ( is_disk_op )
+                       become_root();
+                       
+               if ( (ret = smbrun(command, NULL)) == 0 ) {
+                       /* Tell everyone we updated smb.conf. */
+                       message_send_all(smbd_messaging_context(),
+                                        MSG_SMB_CONF_UPDATED, NULL, 0,
+                                        NULL);
                }
+               
+               if ( is_disk_op )
+                       unbecome_root();
+                       
+               /********* END SeDiskOperatorPrivilege BLOCK *********/
+
+               DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));              
+       
+               if ( ret != 0 )
+                       return WERR_ACCESS_DENIED;
+       } else {
+               DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
        }
 
        /* Replace SD if changed. */
@@ -1799,15 +1658,12 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r
                SEC_DESC *old_sd;
                size_t sd_size;
 
-               old_sd = get_share_security(p->mem_ctx, lp_servicename(snum),
-                                           &sd_size);
+               old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), &sd_size);
 
                if (old_sd && !sec_desc_equal(old_sd, psd)) {
-                       if (!set_share_security(r->in.share_name, psd)) {
-                               DEBUG(0,("_srv_net_share_set_info: Failed to "
-                                        "change security info in share %s.\n",
-                                        r->in.share_name ));
-                       }
+                       if (!set_share_security(share_name, psd))
+                               DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n",
+                                       share_name ));
                }
        }
                        
@@ -1816,38 +1672,44 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r
        return WERR_OK;
 }
 
-
 /*******************************************************************
  Net share add. Call 'add_share_command "sharename" "pathname" 
  "comment" "max connections = "
 ********************************************************************/
 
-WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r)
+WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
 {
-       pstring share_name;
-       pstring comment;
+       struct current_user user;
+       pstring command;
+       fstring share_name;
+       fstring comment;
        pstring pathname;
-       char *path;
        int type;
+       int snum;
+       int ret;
+       char *path;
        SEC_DESC *psd = NULL;
        SE_PRIV se_diskop = SE_DISK_OPERATOR;
        BOOL is_disk_op;
-       uint32 max_connections = 0;
-       WERROR err;
+       int max_connections = 0;
 
        DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
 
-       if (r->out.parm_error) {
-               *r->out.parm_error = 0;
-       }
+       r_u->parm_error = 0;
+
+       get_current_user(&user,p);
 
-       is_disk_op = user_has_privileges( p->pipe_user.nt_user_token,
-                                         &se_diskop );
+       is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
 
-       if (p->pipe_user.ut.uid != sec_initial_uid()  && !is_disk_op ) 
+       if (user.ut.uid != sec_initial_uid()  && !is_disk_op ) 
                return WERR_ACCESS_DENIED;
 
-       switch (r->in.level) {
+       if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
+               DEBUG(10,("_srv_net_share_add: No add share command\n"));
+               return WERR_ACCESS_DENIED;
+       }
+       
+       switch (q_u->info_level) {
        case 0:
                /* No path. Not enough info in a level 0 to do anything. */
                return WERR_ACCESS_DENIED;
@@ -1855,27 +1717,25 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r)
                /* Not enough info in a level 1 to do anything. */
                return WERR_ACCESS_DENIED;
        case 2:
-               pstrcpy(share_name, r->in.info.info2->name);
-               pstrcpy(comment, r->in.info.info2->comment);
-               pstrcpy(pathname, r->in.info.info2->path);
-               max_connections = (r->in.info.info2->max_users == 0xffffffff) ?
-                       0 : r->in.info.info2->max_users;
-               type = r->in.info.info2->type;
+               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));
+               unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
+               max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
+               type = q_u->info.share.info2.info_2.type;
                break;
        case 501:
                /* No path. Not enough info in a level 501 to do anything. */
                return WERR_ACCESS_DENIED;
        case 502:
-               pstrcpy(share_name, r->in.info.info502->name);
-               pstrcpy(comment, r->in.info.info502->comment);
-               pstrcpy(pathname, r->in.info.info502->path);
-               type = r->in.info.info502->type;
-               psd = r->in.info.info502->sd;
+               unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name));
+               unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name));
+               unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name));
+               type = q_u->info.share.info502.info_502.type;
+               psd = q_u->info.share.info502.info_502_str.sd;
                map_generic_share_sd_bits(psd);
                break;
 
-               /* none of the following contain share names.  NetShareAdd
-                * does not have a separate parameter for the share name */ 
+               /* none of the following contain share names.  NetShareAdd does not have a separate parameter for the share name */ 
 
        case 1004:
        case 1005:
@@ -1886,30 +1746,28 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r)
                /* DFS only level. */
                return WERR_ACCESS_DENIED;
        default:
-               DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n",
-                        r->in.level));
+               DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
                return WERR_UNKNOWN_LEVEL;
        }
 
        /* check for invalid share names */
 
-       if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS,
-                                sizeof(share_name) ) ) {
-               DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n",
-                        share_name));
+       if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) {
+               DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name));
                return WERR_INVALID_NAME;
        }
 
        if ( strequal(share_name,"IPC$") || strequal(share_name,"global")
-            || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) )
+               || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) )
        {
                return WERR_ACCESS_DENIED;
        }
 
-       if (get_share_params(p->mem_ctx, share_name) != NULL) {
-               /* Share already exists. */
+       snum = find_service(share_name);
+
+       /* Share already exists. */
+       if (snum >= 0)
                return WERR_ALREADY_EXISTS;
-       }
 
        /* We can only add disk shares. */
        if (type != STYPE_DISKTREE)
@@ -1919,24 +1777,45 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r)
        if (!(path = valid_share_pathname( pathname )))
                return WERR_OBJECT_PATH_INVALID;
 
-       /* Ensure share name, pathname and comment don't contain '"'
-        * characters. */
-
+       /* Ensure share name, pathname and comment don't contain '"' characters. */
        string_replace(share_name, '"', ' ');
        string_replace(path, '"', ' ');
        string_replace(comment, '"', ' ');
 
-       err = add_share(share_name, path, comment, max_connections,
-                       p->pipe_user.nt_user_token, is_disk_op);
+       slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
+                       lp_add_share_cmd(), 
+                       dyn_CONFIGFILE, 
+                       share_name, 
+                       path, 
+                       comment, 
+                       max_connections);
+                       
+       DEBUG(10,("_srv_net_share_add: Running [%s]\n", command ));
+       
+       /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
+       
+       if ( is_disk_op )
+               become_root();
 
-       if (!W_ERROR_IS_OK(err)) {
-               return err;
+       if ( (ret = smbrun(command, NULL)) == 0 ) {
+               /* Tell everyone we updated smb.conf. */
+               message_send_all(smbd_messaging_context(),
+                                MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
        }
 
+       if ( is_disk_op )
+               unbecome_root();
+               
+       /********* END SeDiskOperatorPrivilege BLOCK *********/
+
+       DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret ));
+
+       if ( ret != 0 )
+               return WERR_ACCESS_DENIED;
+
        if (psd) {
                if (!set_share_security(share_name, psd)) {
-                       DEBUG(0,("_srv_net_share_add: Failed to add security "
-                                "info to share %s.\n", share_name ));
+                       DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name ));
                }
        }
 
@@ -1956,43 +1835,76 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r)
  a parameter.
 ********************************************************************/
 
-WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r)
+WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
 {
-       struct share_params *params;
+       struct current_user user;
+       pstring command;
+       fstring share_name;
+       int ret;
+       int snum;
        SE_PRIV se_diskop = SE_DISK_OPERATOR;
        BOOL is_disk_op;
-       WERROR err;
+       struct share_params *params;    
 
        DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
 
-       if ( strequal(r->in.share_name, "IPC$") 
-            || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") )
-            || strequal(r->in.share_name, "global") )
+       unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
+
+       if ( strequal(share_name,"IPC$") 
+               || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
+               || strequal(share_name,"global") )
        {
                return WERR_ACCESS_DENIED;
        }
 
-       if (!(params = get_share_params(p->mem_ctx, r->in.share_name))) {
-               return WERR_NO_SUCH_SHARE;
-       }
+        if (!(params = get_share_params(p->mem_ctx, share_name))) {            
+                return WERR_NO_SUCH_SHARE;
+        }
+       
+       snum = find_service(share_name);
 
        /* No change to printer shares. */
-       if (lp_print_ok(params->service))
+       if (lp_print_ok(snum))
                return WERR_ACCESS_DENIED;
 
-       is_disk_op = user_has_privileges( p->pipe_user.nt_user_token,
-                                         &se_diskop );
+       get_current_user(&user,p);
+
+       is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
+
+       if (user.ut.uid != sec_initial_uid()  && !is_disk_op ) 
+               return WERR_ACCESS_DENIED;
 
-       if (p->pipe_user.ut.uid != sec_initial_uid()  && !is_disk_op ) 
+       if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
+               DEBUG(10,("_srv_net_share_del: No delete share command\n"));
                return WERR_ACCESS_DENIED;
+       }
+               
+       slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"",
+                       lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum));
+
+       DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
 
-       err = delete_share(lp_servicename(params->service),
-                          p->pipe_user.nt_user_token, is_disk_op);
+       /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
+       
+       if ( is_disk_op )
+               become_root();
 
-       if (!W_ERROR_IS_OK(err)) {
-               return err;
+       if ( (ret = smbrun(command, NULL)) == 0 ) {
+               /* Tell everyone we updated smb.conf. */
+               message_send_all(smbd_messaging_context(),
+                                MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
        }
 
+       if ( is_disk_op )
+               unbecome_root();
+               
+       /********* END SeDiskOperatorPrivilege BLOCK *********/
+
+       DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
+
+       if ( ret != 0 )
+               return WERR_ACCESS_DENIED;
+
        /* Delete the SD in the database. */
        delete_share_security(lp_servicename(params->service));
 
@@ -2001,28 +1913,22 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r)
        return WERR_OK;
 }
 
-WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, struct srvsvc_NetShareDelSticky *r)
+WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
 {
-       struct srvsvc_NetShareDel s;
-
        DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__));
 
-       s.in.server_unc = r->in.server_unc;
-       s.in.share_name = r->in.share_name;
-       s.in.reserved = r->in.reserved;
-
-       return _srvsvc_NetShareDel(p, &s);
+       return _srv_net_share_del(p, q_u, r_u);
 }
 
 /*******************************************************************
 time of day
 ********************************************************************/
 
-WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r)
+WERROR _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;
        time_t unixdate = time(NULL);
-       WERROR status = WERR_OK;
 
        /* We do this call first as if we do it *after* the gmtime call
           it overwrites the pointed-to values. JRA */
@@ -2031,91 +1937,106 @@ WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r)
 
        DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
 
+       if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) )
+               return WERR_NOMEM;
+
+       r_u->tod = tod;
+       r_u->ptr_srv_tod = 0x1;
+       r_u->status = WERR_OK;
+
+       DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
+
        t = gmtime(&unixdate);
 
        /* set up the */
-       r->out.info->elapsed = unixdate;
-       r->out.info->msecs = 0;
-       r->out.info->hours = t->tm_hour;
-       r->out.info->mins = t->tm_min;
-       r->out.info->secs = t->tm_sec;
-       r->out.info->hunds = 0;
-       r->out.info->timezone = zone;
-       r->out.info->tinterval = 10000;
-       r->out.info->day = t->tm_mday;
-       r->out.info->month = t->tm_mon + 1;
-       r->out.info->year = 1900+t->tm_year;
-       r->out.info->weekday = t->tm_wday;
+       init_time_of_day_info(tod,
+                             unixdate,
+                             0,
+                             t->tm_hour,
+                             t->tm_min,
+                             t->tm_sec,
+                             0,
+                             zone,
+                             10000,
+                             t->tm_mday,
+                             t->tm_mon + 1,
+                             1900+t->tm_year,
+                             t->tm_wday);
        
        DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
 
-       return status;
+       return r_u->status;
 }
 
 /***********************************************************************************
  Win9x NT tools get security descriptor.
 ***********************************************************************************/
 
-WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecurity *r)
+WERROR _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;
        DATA_BLOB null_pw;
+       pstring filename_in;
+       char *filename = NULL;
+       pstring qualname;
        files_struct *fsp = NULL;
        SMB_STRUCT_STAT st;
        NTSTATUS nt_status;
+       struct current_user user;
        connection_struct *conn = NULL;
-       BOOL became_user = False; 
-       WERROR status = WERR_OK;
-       char *tmp_file = NULL;
+       BOOL became_user = False;
        TALLOC_CTX *ctx = talloc_tos();
 
        ZERO_STRUCT(st);
 
+       r_u->status = WERR_OK;
+
+       unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
 
        /* Null password is ok - we are already an authenticated user... */
        null_pw = data_blob_null;
 
+       get_current_user(&user, p);
+
        become_root();
-       conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status);
+       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", r->in.share));
-               status = ntstatus_to_werror(nt_status);
+               DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
+               r_u->status = ntstatus_to_werror(nt_status);
                goto error_exit;
        }
 
        if (!become_user(conn, conn->vuid)) {
                DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
-               status = WERR_ACCESS_DENIED;
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
        became_user = True;
 
-       if (!r->in.file) {
-               status = WERR_INVALID_PARAM;
-               goto error_exit;
-       }
-       nt_status = unix_convert(ctx, conn, r->in.file, False, &tmp_file, NULL, &st);
+       unistr2_to_ascii(filename_in, &q_u->uni_file_name, sizeof(filename_in));
+       nt_status = unix_convert(ctx, conn, filename_in, False, &filename, NULL, &st);
        if (!NT_STATUS_IS_OK(nt_status)) {
-               DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", r->in.file));
-               status = WERR_ACCESS_DENIED;
+               DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename));
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
 
-       nt_status = check_name(conn, tmp_file);
+       nt_status = check_name(conn, filename);
        if (!NT_STATUS_IS_OK(nt_status)) {
-               DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", tmp_file));
-               status = WERR_ACCESS_DENIED;
+               DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename));
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
 
-       nt_status = open_file_stat(conn, NULL, tmp_file, &st, &fsp);
-       if (!NT_STATUS_IS_OK(nt_status)) {
+       nt_status = open_file_stat(conn, NULL, filename, &st, &fsp);
+       if ( !NT_STATUS_IS_OK(nt_status)) {
                /* Perhaps it is a directory */
                if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
-                       nt_status = open_directory(conn, NULL, tmp_file, &st,
+                       nt_status = open_directory(conn, NULL, filename, &st,
                                        READ_CONTROL_ACCESS,
                                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                                        FILE_OPEN,
@@ -2124,8 +2045,8 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur
                                        NULL, &fsp);
 
                if (!NT_STATUS_IS_OK(nt_status)) {
-                       DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", tmp_file));
-                       status = WERR_ACCESS_DENIED;
+                       DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename));
+                       r_u->status = ntstatus_to_werror(nt_status);
                        goto error_exit;
                }
        }
@@ -2133,20 +2054,23 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur
        sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd);
 
        if (sd_size == 0) {
-               DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", tmp_file));
-               status = WERR_ACCESS_DENIED;
+               DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
 
-       r->out.sd_buf->sd_size= sd_size;
-       r->out.sd_buf->sd = psd;
+       r_u->ptr_response = 1;
+       r_u->size_response = sd_size;
+       r_u->ptr_secdesc = 1;
+       r_u->size_secdesc = sd_size;
+       r_u->sec_desc = psd;
 
        psd->dacl->revision = (uint16) NT4_ACL_REVISION;
 
        close_file(fsp, NORMAL_CLOSE);
        unbecome_user();
-       close_cnum(conn, p->pipe_user.vuid);
-       return status;
+       close_cnum(conn, user.vuid);
+       return r_u->status;
 
 error_exit:
 
@@ -2158,74 +2082,80 @@ error_exit:
                unbecome_user();
 
        if (conn) 
-               close_cnum(conn, p->pipe_user.vuid);
+               close_cnum(conn, user.vuid);
 
-       return status;
+       return r_u->status;
 }
 
 /***********************************************************************************
  Win9x NT tools set security descriptor.
 ***********************************************************************************/
 
-WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r)
+WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
+                                                                       SRV_R_NET_FILE_SET_SECDESC *r_u)
 {
+       pstring filename_in;
+       char *filename = NULL;
+       pstring qualname;
        DATA_BLOB null_pw;
        files_struct *fsp = NULL;
        SMB_STRUCT_STAT st;
        NTSTATUS nt_status;
+       struct current_user user;
        connection_struct *conn = NULL;
        BOOL became_user = False;
-       WERROR status = WERR_OK;
-       char *tmp_file = NULL;
        TALLOC_CTX *ctx = talloc_tos();
 
        ZERO_STRUCT(st);
 
+       r_u->status = WERR_OK;
+
+       unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
+
        /* Null password is ok - we are already an authenticated user... */
        null_pw = data_blob_null;
 
+       get_current_user(&user, p);
+
        become_root();
-       conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status);
+       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", r->in.share));
-               status = ntstatus_to_werror(nt_status);
+               DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
+               r_u->status = ntstatus_to_werror(nt_status);
                goto error_exit;
        }
 
        if (!become_user(conn, conn->vuid)) {
                DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
-               status = WERR_ACCESS_DENIED;
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
        became_user = True;
 
-       if (!r->in.file) {
-               status = WERR_INVALID_PARAM;
-               goto error_exit;
-       }
-       nt_status = unix_convert(ctx, conn, r->in.file, False, &tmp_file, NULL, &st);
+       unistr2_to_ascii(filename_in, &q_u->uni_file_name, sizeof(filename_in));
+       nt_status = unix_convert(ctx, conn, filename, False, &filename, NULL, &st);
        if (!NT_STATUS_IS_OK(nt_status)) {
-               DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", r->in.file));
-               status = WERR_ACCESS_DENIED;
+               DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename));
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
 
-       nt_status = check_name(conn, tmp_file);
+       nt_status = check_name(conn, filename);
        if (!NT_STATUS_IS_OK(nt_status)) {
-               DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", tmp_file));
-               status = WERR_ACCESS_DENIED;
+               DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename));
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
 
 
-       nt_status = open_file_stat(conn, NULL, tmp_file, &st, &fsp);
+       nt_status = open_file_stat(conn, NULL, filename, &st, &fsp);
 
-       if (!NT_STATUS_IS_OK(nt_status)) {
+       if ( !NT_STATUS_IS_OK(nt_status) ) {
                /* Perhaps it is a directory */
                if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
-                       nt_status = open_directory(conn, NULL, tmp_file, &st,
+                       nt_status = open_directory(conn, NULL, filename, &st,
                                                FILE_READ_ATTRIBUTES,
                                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                                FILE_OPEN,
@@ -2233,25 +2163,25 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur
                                                FILE_ATTRIBUTE_DIRECTORY,
                                                NULL, &fsp);
 
-               if (!NT_STATUS_IS_OK(nt_status)) {
-                       DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", tmp_file));
-                       status = WERR_ACCESS_DENIED;
+               if ( !NT_STATUS_IS_OK(nt_status) ) {
+                       DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename));
+                       r_u->status = ntstatus_to_werror(nt_status);
                        goto error_exit;
                }
        }
 
-       nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, r->in.securityinformation, r->in.sd_buf.sd);
+       nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
 
-       if (!NT_STATUS_IS_OK(nt_status)) {
-               DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", tmp_file));
-               status = WERR_ACCESS_DENIED;
+       if (!NT_STATUS_IS_OK(nt_status) ) {
+               DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));
+               r_u->status = WERR_ACCESS_DENIED;
                goto error_exit;
        }
 
        close_file(fsp, NORMAL_CLOSE);
        unbecome_user();
-       close_cnum(conn, p->pipe_user.vuid);
-       return status;
+       close_cnum(conn, user.vuid);
+       return r_u->status;
 
 error_exit:
 
@@ -2264,10 +2194,10 @@ error_exit:
        }
 
        if (conn) {
-               close_cnum(conn, p->pipe_user.vuid);
+               close_cnum(conn, user.vuid);
        }
 
-       return status;
+       return r_u->status;
 }
 
 /***********************************************************************************
@@ -2316,68 +2246,59 @@ static const char *next_server_disk_enum(uint32 *resume)
        return disk;
 }
 
-WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r)
+WERROR _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;
+       TALLOC_CTX *ctx = p->mem_ctx;
+       uint32 resume=get_enum_hnd(&q_u->enum_hnd);
 
-       WERROR status = WERR_OK;
+       r_u->status=WERR_OK;
 
-       *r->out.totalentries = init_server_disk_enum(r->in.resume_handle);
-       r->out.info->count = 0;
+       r_u->total_entries = init_server_disk_enum(&resume);
 
-       if(!(r->out.info->disks =  TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetDiskInfo0, MAX_SERVER_DISK_ENTRIES))) {
+       r_u->disk_enum_ctr.unknown = 0; 
+
+       if(!(r_u->disk_enum_ctr.disk_info =  TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) {
                return WERR_NOMEM;
        }
 
-       /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/
+       r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0;
+
+       /*allow one DISK_INFO for null terminator*/
 
-       for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(r->in.resume_handle)); i++) {
+       for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
 
-               r->out.info->count++;
-               (*r->out.totalentries)++;
+               r_u->disk_enum_ctr.entries_read++;
 
                /*copy disk name into a unicode string*/
 
-               r->out.info->disks[i].disk = disk_name; 
+               init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name);    
        }
 
        /* add a terminating null string.  Is this there if there is more data to come? */
 
-       r->out.info->count++;
-       (*r->out.totalentries)++;
+       r_u->disk_enum_ctr.entries_read++;
 
-       r->out.info->disks[i].disk = "";
+       init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, "");
 
-       return status;
+       init_enum_hnd(&r_u->enum_hnd, resume);
+
+       return r_u->status;
 }
 
 /********************************************************************
 ********************************************************************/
 
-WERROR _srvsvc_NetNameValidate(pipes_struct *p, struct srvsvc_NetNameValidate *r)
+WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
 {
-       int len;
-
-       if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
-               return WERR_INVALID_PARAM;
-       }
+       fstring sharename;
 
-       switch ( r->in.name_type ) {
+       switch ( q_u->type ) {
        case 0x9:
-               len = strlen_m(r->in.name);
-
-               if ((r->in.flags == 0x0) && (len > 81)) {
-                       DEBUG(5,("_srv_net_name_validate: share name too long (%s > 81 chars)\n", r->in.name));
-                       return WERR_INVALID_NAME;
-               }
-               if ((r->in.flags == 0x80000000) && (len > 13)) {
-                       DEBUG(5,("_srv_net_name_validate: share name too long (%s > 13 chars)\n", r->in.name));
-                       return WERR_INVALID_NAME;
-               }
-
-               if ( ! validate_net_name( r->in.name, INVALID_SHARENAME_CHARS, sizeof(r->in.name) ) ) {
-                       DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", r->in.name));
+               rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0);
+               if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) {
+                       DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename));
                        return WERR_INVALID_NAME;
                }
                break;
@@ -2398,6 +2319,10 @@ WERROR _srvsvc_NetFileClose(pipes_struct *p, struct srvsvc_NetFileClose *r)
        return WERR_ACCESS_DENIED;
 }
 
+
+/********************************************************************
+********************************************************************/
+
 WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, struct srvsvc_NetCharDevEnum *r)
 {
        p->rng_fault_state = True;
@@ -2446,18 +2371,96 @@ WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, struct srvsvc_NetCharDevQPu
        return WERR_NOT_SUPPORTED;
 }
 
+WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
 WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r)
 {
        p->rng_fault_state = True;
        return WERR_NOT_SUPPORTED;
 }
 
+WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, struct srvsvc_NetShareDelSticky *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
 WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r)
 {
        p->rng_fault_state = True;
        return WERR_NOT_SUPPORTED;
 }
 
+WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
 WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, struct srvsvc_NetServerStatisticsGet *r)
 {
        p->rng_fault_state = True;
@@ -2482,6 +2485,12 @@ WERROR _srvsvc_NetTransportDel(pipes_struct *p, struct srvsvc_NetTransportDel *r
        return WERR_NOT_SUPPORTED;
 }
 
+WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
 WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, struct srvsvc_NetSetServiceBits *r)
 {
        p->rng_fault_state = True;
@@ -2506,6 +2515,12 @@ WERROR _srvsvc_NetPathCompare(pipes_struct *p, struct srvsvc_NetPathCompare *r)
        return WERR_NOT_SUPPORTED;
 }
 
+WERROR _srvsvc_NetNameValidate(pipes_struct *p, struct srvsvc_NetNameValidate *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
 WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p, struct srvsvc_NETRPRNAMECANONICALIZE *r)
 {
        p->rng_fault_state = True;
@@ -2518,6 +2533,12 @@ WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, struct srvsvc_NetPRNameCompare
        return WERR_NOT_SUPPORTED;
 }
 
+WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
 WERROR _srvsvc_NetShareDelStart(pipes_struct *p, struct srvsvc_NetShareDelStart *r)
 {
        p->rng_fault_state = True;
@@ -2530,6 +2551,18 @@ WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct srvsvc_NetShareDelCommi
        return WERR_NOT_SUPPORTED;
 }
 
+WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecurity *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
+WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r)
+{
+       p->rng_fault_state = True;
+       return WERR_NOT_SUPPORTED;
+}
+
 WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, struct srvsvc_NetServerTransportAddEx *r)
 {
        p->rng_fault_state = True;
@@ -2560,7 +2593,7 @@ WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDF
        return WERR_NOT_SUPPORTED;
 }
 
-WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *R)
+WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
 {
        p->rng_fault_state = True;
        return WERR_NOT_SUPPORTED;
@@ -2584,26 +2617,27 @@ WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSDELE
        return WERR_NOT_SUPPORTED;
 }
 
-WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p, struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
+WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p, struct srvsvc_NETRDFSMODIFYPREFIX *r)
 {
        p->rng_fault_state = True;
        return WERR_NOT_SUPPORTED;
 }
 
-WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
+WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p, struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
 {
        p->rng_fault_state = True;
        return WERR_NOT_SUPPORTED;
 }
 
-WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p, struct srvsvc_NETRDFSMODIFYPREFIX *r)
+WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
 {
        p->rng_fault_state = True;
        return WERR_NOT_SUPPORTED;
 }
 
-WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p, struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
+WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p, struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
 {
        p->rng_fault_state = True;
        return WERR_NOT_SUPPORTED;
 }
+
index dba209eb07c6f4549af7411c6f33dafa20434878..c868f94f767fe11deedf1849dfbe2e78edd697b9 100644 (file)
@@ -626,7 +626,7 @@ static WERROR fill_svc_config( TALLOC_CTX *ctx, const char *name, SERVICE_CONFIG
           the client from showing the "Start" button (if of course the services
           are not running */
 
-       if ( strequal( name, "NETLOGON" ) && ( !share_defined(name) ) )
+       if ( strequal( name, "NETLOGON" ) && ( lp_servicenumber(name) == -1 ) )
                config->start_type = SVCCTL_DISABLED;
        else if ( strequal( name, "WINS" ) && ( !lp_wins_support() ))
                config->start_type = SVCCTL_DISABLED;
diff --git a/source3/rpc_server/srv_unixinfo_nt.c b/source3/rpc_server/srv_unixinfo_nt.c
deleted file mode 100644 (file)
index e968024..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/* 
- *  Unix SMB/CIFS implementation.
- *  RPC Pipe client / server routines for unixinfo-pipe
- *  Copyright (C) Volker Lendecke 2005
- *  
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* This is the interface to the rpcunixinfo pipe. */
-
-#include "includes.h"
-#include "nterr.h"
-
-
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_RPC_SRV
-
-/* Map a sid to a uid */
-
-NTSTATUS _unixinfo_SidToUid(pipes_struct *p, struct unixinfo_SidToUid *r)
-{
-       uid_t real_uid;
-       NTSTATUS status;
-       *r->out.uid = 0;
-
-       status = sid_to_uid(&r->in.sid, &real_uid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED;
-       if (NT_STATUS_IS_OK(status))
-               *r->out.uid = real_uid;
-
-       return status;
-}
-
-/* Map a uid to a sid */
-
-NTSTATUS _unixinfo_UidToSid(pipes_struct *p, struct unixinfo_UidToSid *r)
-{
-       NTSTATUS status = NT_STATUS_NO_SUCH_USER;
-
-       uid_to_sid(r->out.sid, (uid_t)r->in.uid);
-       status = NT_STATUS_OK;
-
-       return status;
-}
-
-/* Map a sid to a gid */
-
-NTSTATUS _unixinfo_SidToGid(pipes_struct *p, struct unixinfo_SidToGid *r)
-{
-       gid_t real_gid;
-       NTSTATUS status;
-
-       *r->out.gid = 0;
-
-       status = sid_to_gid(&r->in.sid, &real_gid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED;
-       if (NT_STATUS_IS_OK(status))
-               *r->out.gid = real_gid;
-
-       return status;
-}
-
-/* Map a gid to a sid */
-
-NTSTATUS _unixinfo_GidToSid(pipes_struct *p, struct unixinfo_GidToSid *r)
-{
-       NTSTATUS status = NT_STATUS_NO_SUCH_GROUP;
-
-       gid_to_sid(r->out.sid, (gid_t)r->in.gid);
-       status = NT_STATUS_OK;
-
-       return status;
-}
-
-/* Get unix struct passwd information */
-
-NTSTATUS _unixinfo_GetPWUid(pipes_struct *p, struct unixinfo_GetPWUid *r)
-{
-       int i;
-       NTSTATUS status;
-
-       if (*r->in.count > 1023)
-               return NT_STATUS_INVALID_PARAMETER;
-
-       status = NT_STATUS_OK;
-
-       for (i=0; i<*r->in.count; i++) {
-               struct passwd *pw;
-               char *homedir, *shell;
-               ssize_t len1, len2;
-
-               r->out.infos[i].status = NT_STATUS_NO_SUCH_USER;
-               r->out.infos[i].homedir = "";
-               r->out.infos[i].shell = "";
-
-               pw = getpwuid(r->in.uids[i]);
-
-               if (pw == NULL) {
-                       DEBUG(10, ("Did not find uid %lld\n",
-                                  (long long int)r->in.uids[i]));
-                       continue;
-               }
-
-               len1 = push_utf8_talloc(p->mem_ctx, &homedir, pw->pw_dir);
-               len2 = push_utf8_talloc(p->mem_ctx, &shell, pw->pw_shell);
-
-               if ((len1 < 0) || (len2 < 0) || (homedir == NULL) ||
-                   (shell == NULL)) {
-                       DEBUG(3, ("push_utf8_talloc failed\n"));
-                       r->out.infos[i].status = NT_STATUS_NO_MEMORY;
-                       continue;
-               }
-
-               r->out.infos[i].status = NT_STATUS_OK;
-               r->out.infos[i].homedir = homedir;
-               r->out.infos[i].shell = shell;
-       }
-
-       return status;
-}
index 020f4acf4db956181347d373ad09229c3233bd9c..31a8e2bdfd130ba1d4682eb3c0fd30c963baef08 100644 (file)
@@ -993,7 +993,8 @@ static NTSTATUS cmd_lsa_query_trustdominfobysid(struct rpc_pipe_client *cli,
        display_trust_dom_info(info, info_class, cli->pwd.password);
 
  done:
-       rpccli_lsa_Close(cli, mem_ctx, &pol);
+       if (&pol)
+               rpccli_lsa_Close(cli, mem_ctx, &pol);
 
        return result;
 }
@@ -1030,7 +1031,8 @@ static NTSTATUS cmd_lsa_query_trustdominfobyname(struct rpc_pipe_client *cli,
        display_trust_dom_info(info, info_class, cli->pwd.password);
 
  done:
-       rpccli_lsa_Close(cli, mem_ctx, &pol);
+       if (&pol)
+               rpccli_lsa_Close(cli, mem_ctx, &pol);
 
        return result;
 }
@@ -1078,7 +1080,8 @@ static NTSTATUS cmd_lsa_query_trustdominfo(struct rpc_pipe_client *cli,
        display_trust_dom_info(info, info_class, cli->pwd.password);
 
  done:
-       rpccli_lsa_Close(cli, mem_ctx, &pol);
+       if (&pol)
+               rpccli_lsa_Close(cli, mem_ctx, &pol);
 
        return result;
 }
index b4cfb1eb295f68cafbd18c7004e37618852f4de3..3cef720ac577755d990bcdde3531662095f5c797 100644 (file)
@@ -1207,14 +1207,13 @@ static NTSTATUS cmd_samr_delete_alias(struct rpc_pipe_client *cli,
 
 /* Query display info */
 
-static NTSTATUS cmd_samr_query_dispinfo_int(struct rpc_pipe_client *cli, 
-                                           TALLOC_CTX *mem_ctx,
-                                           int argc, const char **argv, 
-                                           int opcode)
+static NTSTATUS cmd_samr_query_dispinfo(struct rpc_pipe_client *cli, 
+                                        TALLOC_CTX *mem_ctx,
+                                        int argc, const char **argv) 
 {
        POLICY_HND connect_pol, domain_pol;
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-       uint32 start_idx=0, max_entries=250, max_size = (uint32) -1, num_entries, i;
+       uint32 start_idx=0, max_entries=250, max_size = 0xffff, num_entries, i;
        uint32 access_mask = MAXIMUM_ALLOWED_ACCESS;
        uint32 info_level = 1;
        SAM_DISPINFO_CTR ctr;
@@ -1250,7 +1249,6 @@ static NTSTATUS cmd_samr_query_dispinfo_int(struct rpc_pipe_client *cli,
        if (argc >= 6)
                 sscanf(argv[5], "%x", &access_mask);
 
-
        /* Get sam policy handle */
 
        result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, 
@@ -1302,31 +1300,11 @@ static NTSTATUS cmd_samr_query_dispinfo_int(struct rpc_pipe_client *cli,
                if (!got_params)
                        get_query_dispinfo_params(
                                loop_count, &max_entries, &max_size);
-
-               switch (opcode) {
-               case SAMR_QUERY_DISPINFO:
-                       result = rpccli_samr_query_dispinfo(cli, mem_ctx, &domain_pol,
-                                                           &start_idx, info_level,
-                                                           &num_entries, max_entries, 
-                                                           max_size, &ctr);
-                       break;
-               case SAMR_QUERY_DISPINFO2:
-                       result = rpccli_samr_query_dispinfo2(cli, mem_ctx, &domain_pol,
-                                                            &start_idx, info_level,
-                                                            &num_entries, max_entries, 
-                                                            max_size, &ctr);
-                       break;
-               case SAMR_QUERY_DISPINFO3:
-                       result = rpccli_samr_query_dispinfo3(cli, mem_ctx, &domain_pol,
-                                                            &start_idx, info_level,
-                                                            &num_entries, max_entries, 
-                                                            max_size, &ctr);
-                       break;
-               default:
-                       printf("unknown opcode: %d\n", opcode);
-                       return NT_STATUS_INVALID_PARAMETER;
-                       break;
-               }
+               
+               result = rpccli_samr_query_dispinfo(cli, mem_ctx, &domain_pol,
+                                                &start_idx, info_level,
+                                                &num_entries, max_entries, 
+                                                max_size, &ctr);
 
                loop_count++;
 
@@ -1363,114 +1341,6 @@ static NTSTATUS cmd_samr_query_dispinfo_int(struct rpc_pipe_client *cli,
        return result;
 }
 
-static NTSTATUS cmd_samr_query_dispinfo(struct rpc_pipe_client *cli, 
-                                       TALLOC_CTX *mem_ctx,
-                                       int argc, const char **argv)
-{
-       return cmd_samr_query_dispinfo_int(cli, mem_ctx, argc, argv, SAMR_QUERY_DISPINFO);
-}
-
-static NTSTATUS cmd_samr_query_dispinfo2(struct rpc_pipe_client *cli, 
-                                        TALLOC_CTX *mem_ctx,
-                                        int argc, const char **argv) 
-{
-       return cmd_samr_query_dispinfo_int(cli, mem_ctx, argc, argv, SAMR_QUERY_DISPINFO2);
-}
-
-static NTSTATUS cmd_samr_query_dispinfo3(struct rpc_pipe_client *cli, 
-                                        TALLOC_CTX *mem_ctx,
-                                        int argc, const char **argv) 
-{
-       return cmd_samr_query_dispinfo_int(cli, mem_ctx, argc, argv, SAMR_QUERY_DISPINFO3);
-}
-
-/* Query display info index */
-
-static NTSTATUS cmd_samr_get_dispenum_index_int(struct rpc_pipe_client *cli, 
-                                               TALLOC_CTX *mem_ctx,
-                                               int argc, const char **argv,
-                                               int opcode)
-{
-       POLICY_HND connect_pol, domain_pol;
-       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-       uint32 access_mask = MAXIMUM_ALLOWED_ACCESS;
-       uint16 info_level = 1;
-       uint32 idx;
-
-       if (argc < 2 || argc > 3) {
-               printf("Usage: %s name [info level]\n", argv[0]);
-               return NT_STATUS_OK;
-       }
-
-       if (argc >= 3) {
-               sscanf(argv[2], "%hd", &info_level);
-       }
-
-       /* Get sam policy handle */
-
-       result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, 
-                                  &connect_pol);
-
-       if (!NT_STATUS_IS_OK(result)) {
-               goto done;
-       }
-
-       /* Get domain policy handle */
-
-       result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol,
-                                        access_mask, 
-                                        &domain_sid, &domain_pol);
-
-       if (!NT_STATUS_IS_OK(result)) {
-               goto done;
-       }
-
-       /* Query display info index */
-
-       switch (opcode) {
-       case SAMR_GET_DISPENUM_INDEX:
-               result = rpccli_samr_get_dispenum_index(cli, mem_ctx, &domain_pol,
-                                                       info_level, argv[1], &idx);
-               break;
-       case SAMR_GET_DISPENUM_INDEX2:
-               result = rpccli_samr_get_dispenum_index2(cli, mem_ctx, &domain_pol,
-                                                       info_level, argv[1], &idx);
-               break;
-       default:
-               printf("unknown opcode\n");
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-       
-       if (NT_STATUS_IS_ERR(result)) {
-               goto done;
-       };
-
-       printf("idx is: %d (0x%08x)\n", idx, idx);
-
-       rpccli_samr_close(cli, mem_ctx, &domain_pol);
-       rpccli_samr_close(cli, mem_ctx, &connect_pol);
- done:
-       return result;
-}
-
-/* Query display info index */
-
-static NTSTATUS cmd_samr_get_dispenum_index(struct rpc_pipe_client *cli, 
-                                           TALLOC_CTX *mem_ctx,
-                                           int argc, const char **argv)
-{
-       return cmd_samr_get_dispenum_index_int(cli, mem_ctx, argc, argv, SAMR_GET_DISPENUM_INDEX);
-}
-
-/* Query display info index2 */
-
-static NTSTATUS cmd_samr_get_dispenum_index2(struct rpc_pipe_client *cli, 
-                                            TALLOC_CTX *mem_ctx,
-                                            int argc, const char **argv)
-{
-       return cmd_samr_get_dispenum_index_int(cli, mem_ctx, argc, argv, SAMR_GET_DISPENUM_INDEX2);
-}
-
 /* Query domain info */
 
 static NTSTATUS cmd_samr_query_dominfo(struct rpc_pipe_client *cli, 
@@ -2402,10 +2272,6 @@ struct cmd_set samr_commands[] = {
        { "queryaliasmem",      RPC_RTYPE_NTSTATUS, cmd_samr_query_aliasmem,    NULL, PI_SAMR, NULL,    "Query alias membership",  "" },
        { "deletealias",        RPC_RTYPE_NTSTATUS, cmd_samr_delete_alias,      NULL, PI_SAMR, NULL,    "Delete an alias",  "" },
        { "querydispinfo",      RPC_RTYPE_NTSTATUS, cmd_samr_query_dispinfo,    NULL, PI_SAMR, NULL,    "Query display info",      "" },
-       { "querydispinfo2",     RPC_RTYPE_NTSTATUS, cmd_samr_query_dispinfo2,   NULL, PI_SAMR, NULL,    "Query display info 2",      "" },
-       { "querydispinfo3",     RPC_RTYPE_NTSTATUS, cmd_samr_query_dispinfo3,   NULL, PI_SAMR, NULL,    "Query display info 3",      "" },
-       { "getdispenumindex",   RPC_RTYPE_NTSTATUS, cmd_samr_get_dispenum_index,        NULL, PI_SAMR, NULL,    "Query display info index",      "" },
-       { "getdispenumindex2",  RPC_RTYPE_NTSTATUS, cmd_samr_get_dispenum_index2,       NULL, PI_SAMR, NULL,    "Query display info index",      "" },
        { "querydominfo",       RPC_RTYPE_NTSTATUS, cmd_samr_query_dominfo,     NULL, PI_SAMR, NULL,    "Query domain info",       "" },
        { "enumdomusers",      RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_users,       NULL, PI_SAMR, NULL,  "Enumerate domain users", "" },
        { "enumdomgroups",      RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_groups,       NULL, PI_SAMR, NULL,        "Enumerate domain groups", "" },
index b1cefb5f21e0801b1576c54f8d98ba991d18689c..572609981dd8641cd91edf16af49bbe8e65eaa8d 100644 (file)
@@ -130,61 +130,74 @@ static char *get_server_type_str(uint32 type)
        return typestr;
 }
 
-static void display_server(const char *sname, uint32 type, const char *comment)
+static void display_server(char *sname, uint32 type, const char *comment)
 {
        printf("\t%-15.15s%-20s %s\n", sname, get_server_type_str(type), 
               comment);
 }
 
-static void display_srv_info_101(struct srvsvc_NetSrvInfo101 *sv101)
+static void display_srv_info_101(SRV_INFO_101 *sv101)
 {
-       display_server(sv101->server_name, sv101->server_type, sv101->comment);
+       fstring name;
+       fstring comment;
+
+       unistr2_to_ascii(name, &sv101->uni_name, sizeof(name));
+       unistr2_to_ascii(comment, &sv101->uni_comment, sizeof(comment));
+
+       display_server(name, sv101->srv_type, comment);
 
        printf("\tplatform_id     :\t%d\n", sv101->platform_id);
-       printf("\tos version      :\t%d.%d\n", sv101->version_major, 
-              sv101->version_minor);
+       printf("\tos version      :\t%d.%d\n", sv101->ver_major, 
+              sv101->ver_minor);
 
-       printf("\tserver type     :\t0x%x\n", sv101->server_type);
+       printf("\tserver type     :\t0x%x\n", sv101->srv_type);
 }
 
-static void display_srv_info_102(struct srvsvc_NetSrvInfo102 *sv102)
+static void display_srv_info_102(SRV_INFO_102 *sv102)
 {
-       display_server(sv102->server_name, sv102->server_type, 
-                                  sv102->comment);
+       fstring name;
+       fstring comment;
+       fstring usr_path;
+       
+       unistr2_to_ascii(name, &sv102->uni_name, sizeof(name));
+       unistr2_to_ascii(comment, &sv102->uni_comment, sizeof(comment));
+       unistr2_to_ascii(usr_path, &sv102->uni_usr_path, sizeof(usr_path));
+
+       display_server(name, sv102->srv_type, comment);
 
        printf("\tplatform_id     :\t%d\n", sv102->platform_id);
-       printf("\tos version      :\t%d.%d\n", sv102->version_major, 
-              sv102->version_minor);
+       printf("\tos version      :\t%d.%d\n", sv102->ver_major, 
+              sv102->ver_minor);
 
        printf("\tusers           :\t%x\n", sv102->users);
        printf("\tdisc, hidden    :\t%x, %x\n", sv102->disc, sv102->hidden);
        printf("\tannounce, delta :\t%d, %d\n", sv102->announce, 
-              sv102->anndelta);
+              sv102->ann_delta);
        printf("\tlicenses        :\t%d\n", sv102->licenses);
-       printf("\tuser path       :\t%s\n", sv102->userpath);
+       printf("\tuser path       :\t%s\n", usr_path);
 }
 
 /* Server query info */
-static NTSTATUS cmd_srvsvc_srv_query_info(struct rpc_pipe_client *cli, 
+static WERROR cmd_srvsvc_srv_query_info(struct rpc_pipe_client *cli, 
                                           TALLOC_CTX *mem_ctx,
                                           int argc, const char **argv)
 {
        uint32 info_level = 101;
-       union srvsvc_NetSrvInfo ctr;
-       NTSTATUS result;
+       SRV_INFO_CTR ctr;
+       WERROR result;
 
        if (argc > 2) {
                printf("Usage: %s [infolevel]\n", argv[0]);
-               return NT_STATUS_OK;
+               return WERR_OK;
        }
 
        if (argc == 2)
                info_level = atoi(argv[1]);
 
-       result = rpccli_srvsvc_NetSrvGetInfo(cli, mem_ctx, NULL, info_level,
+       result = rpccli_srvsvc_net_srv_get_info(cli, mem_ctx, info_level,
                                             &ctr);
 
-       if (!NT_STATUS_IS_OK(result)) {
+       if (!W_ERROR_IS_OK(result)) {
                goto done;
        }
 
@@ -192,10 +205,10 @@ static NTSTATUS cmd_srvsvc_srv_query_info(struct rpc_pipe_client *cli,
 
        switch (info_level) {
        case 101:
-               display_srv_info_101(ctr.info101);
+               display_srv_info_101(&ctr.srv.sv101);
                break;
        case 102:
-               display_srv_info_102(ctr.info102);
+               display_srv_info_102(&ctr.srv.sv102);
                break;
        default:
                printf("unsupported info level %d\n", info_level);
@@ -206,106 +219,96 @@ static NTSTATUS cmd_srvsvc_srv_query_info(struct rpc_pipe_client *cli,
        return result;
 }
 
-static void display_share_info_1(struct srvsvc_NetShareInfo1 *info1)
+static void display_share_info_1(SRV_SHARE_INFO_1 *info1)
 {
-       printf("netname: %s\n", info1->name);
-       printf("\tremark:\t%s\n", info1->comment);
+       fstring netname = "", remark = "";
+
+       rpcstr_pull_unistr2_fstring(netname, &info1->info_1_str.uni_netname);
+       rpcstr_pull_unistr2_fstring(remark, &info1->info_1_str.uni_remark);
+
+       printf("netname: %s\n", netname);
+       printf("\tremark:\t%s\n", remark);
 }
 
-static void display_share_info_2(struct srvsvc_NetShareInfo2 *info2)
+static void display_share_info_2(SRV_SHARE_INFO_2 *info2)
 {
-       printf("netname: %s\n", info2->name);
-       printf("\tremark:\t%s\n", info2->comment);
-       printf("\tpath:\t%s\n", info2->path);
-       printf("\tpassword:\t%s\n", info2->password);
+       fstring netname = "", remark = "", path = "", passwd = "";
+
+       rpcstr_pull_unistr2_fstring(netname, &info2->info_2_str.uni_netname);
+       rpcstr_pull_unistr2_fstring(remark, &info2->info_2_str.uni_remark);
+       rpcstr_pull_unistr2_fstring(path, &info2->info_2_str.uni_path);
+       rpcstr_pull_unistr2_fstring(passwd, &info2->info_2_str.uni_passwd);
+
+       printf("netname: %s\n", netname);
+       printf("\tremark:\t%s\n", remark);
+       printf("\tpath:\t%s\n", path);
+       printf("\tpassword:\t%s\n", passwd);
 }
 
-static void display_share_info_502(struct srvsvc_NetShareInfo502 *info502)
+static void display_share_info_502(SRV_SHARE_INFO_502 *info502)
 {
-       printf("netname: %s\n", info502->name);
-       printf("\tremark:\t%s\n", info502->comment);
-       printf("\tpath:\t%s\n", info502->path);
-       printf("\tpassword:\t%s\n", info502->password);
-
-       printf("\ttype:\t0x%x\n", info502->type);
-       printf("\tperms:\t%d\n", info502->permissions);
-       printf("\tmax_uses:\t%d\n", info502->max_users);
-       printf("\tnum_uses:\t%d\n", info502->current_users);
+       fstring netname = "", remark = "", path = "", passwd = "";
+
+       rpcstr_pull_unistr2_fstring(netname, &info502->info_502_str.uni_netname);
+       rpcstr_pull_unistr2_fstring(remark, &info502->info_502_str.uni_remark);
+       rpcstr_pull_unistr2_fstring(path, &info502->info_502_str.uni_path);
+       rpcstr_pull_unistr2_fstring(passwd, &info502->info_502_str.uni_passwd);
+
+       printf("netname: %s\n", netname);
+       printf("\tremark:\t%s\n", remark);
+       printf("\tpath:\t%s\n", path);
+       printf("\tpassword:\t%s\n", passwd);
+
+       printf("\ttype:\t0x%x\n", info502->info_502.type);
+       printf("\tperms:\t%d\n", info502->info_502.perms);
+       printf("\tmax_uses:\t%d\n", info502->info_502.max_uses);
+       printf("\tnum_uses:\t%d\n", info502->info_502.num_uses);
        
-       if (info502->sd)
-               display_sec_desc(info502->sd);
+       if (info502->info_502_str.sd)
+               display_sec_desc(info502->info_502_str.sd);
 
 }
 
-static NTSTATUS cmd_srvsvc_net_share_enum(struct rpc_pipe_client *cli, 
+static WERROR cmd_srvsvc_net_share_enum(struct rpc_pipe_client *cli, 
                                           TALLOC_CTX *mem_ctx,
                                           int argc, const char **argv)
 {
        uint32 info_level = 2;
-       struct srvsvc_NetShareCtr1 ctr1;
-       struct srvsvc_NetShareCtr2 ctr2;
-       struct srvsvc_NetShareCtr502 ctr502;
-       union srvsvc_NetShareCtr ctr;
-       NTSTATUS result;
-       uint32 hnd;
+       SRV_SHARE_INFO_CTR ctr;
+       WERROR result;
+       ENUM_HND hnd;
        uint32 preferred_len = 0xffffffff, i;
-       uint32 numentries;
-
-       ZERO_STRUCT(ctr);
 
        if (argc > 2) {
                printf("Usage: %s [infolevel]\n", argv[0]);
-               return NT_STATUS_OK;
+               return WERR_OK;
        }
 
        if (argc == 2)
                info_level = atoi(argv[1]);
 
-       hnd = 0;
-
-       switch (info_level) {
-       case 1: {
-               ZERO_STRUCT(ctr1);
-               ctr.ctr1 = &ctr1;
-               }
-               break;
-
-       case 2: {
-               ZERO_STRUCT(ctr2);
-               ctr.ctr2 = &ctr2;
-               }
-               break;
-       case 502: {
-               ZERO_STRUCT(ctr502);
-               ctr.ctr502 = &ctr502;
-               }
-               break;
-
-       default:
-               break;
-       }
+       init_enum_hnd(&hnd, 0);
 
-       result = rpccli_srvsvc_NetShareEnum(
-               cli, mem_ctx, cli->cli->desthost, &info_level, &ctr, preferred_len, &numentries, 
-               &hnd);
+       result = rpccli_srvsvc_net_share_enum(
+               cli, mem_ctx, info_level, &ctr, preferred_len, &hnd);
 
-       if (!NT_STATUS_IS_OK(result) || !numentries)
+       if (!W_ERROR_IS_OK(result) || !ctr.num_entries)
                goto done;
 
        /* Display results */
 
        switch (info_level) {
        case 1:
-               for (i = 0; i < numentries; i++)
-                       display_share_info_1(&ctr.ctr1->array[i]);
+               for (i = 0; i < ctr.num_entries; i++)
+                       display_share_info_1(&ctr.share.info1[i]);
                break;
        case 2:
-               for (i = 0; i < numentries; i++)
-                       display_share_info_2(&ctr.ctr2->array[i]);
+               for (i = 0; i < ctr.num_entries; i++)
+                       display_share_info_2(&ctr.share.info2[i]);
                break;
        case 502:
-               for (i = 0; i < numentries; i++)
-                       display_share_info_502(&ctr.ctr502->array[i]);
+               for (i = 0; i < ctr.num_entries; i++)
+                       display_share_info_502(&ctr.share.info502[i]);
                break;
        default:
                printf("unsupported info level %d\n", info_level);
@@ -316,38 +319,38 @@ static NTSTATUS cmd_srvsvc_net_share_enum(struct rpc_pipe_client *cli,
        return result;
 }
 
-static NTSTATUS cmd_srvsvc_net_share_get_info(struct rpc_pipe_client *cli, 
+static WERROR cmd_srvsvc_net_share_get_info(struct rpc_pipe_client *cli, 
                                            TALLOC_CTX *mem_ctx,
                                            int argc, const char **argv)
 {
        uint32 info_level = 502;
-       union srvsvc_NetShareInfo info;
-       NTSTATUS result;
+       SRV_SHARE_INFO info;
+       WERROR result;
 
        if (argc > 3) {
                printf("Usage: %s [sharename] [infolevel]\n", argv[0]);
-               return NT_STATUS_OK;
+               return WERR_OK;
        }
 
        if (argc == 3)
                info_level = atoi(argv[2]);
 
-       result = rpccli_srvsvc_NetShareGetInfo(cli, mem_ctx, NULL, argv[1], info_level, &info);
+       result = rpccli_srvsvc_net_share_get_info(cli, mem_ctx, argv[1], info_level, &info);
 
-       if (!NT_STATUS_IS_OK(result))
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
        /* Display results */
 
        switch (info_level) {
        case 1:
-               display_share_info_1(info.info1);
+               display_share_info_1(&info.share.info1);
                break;
        case 2:
-               display_share_info_2(info.info2);
+               display_share_info_2(&info.share.info2);
                break;
        case 502:
-               display_share_info_502(info.info502);
+               display_share_info_502(&info.share.info502);
                break;
        default:
                printf("unsupported info level %d\n", info_level);
@@ -358,93 +361,95 @@ static NTSTATUS cmd_srvsvc_net_share_get_info(struct rpc_pipe_client *cli,
        return result;
 }
 
-static NTSTATUS cmd_srvsvc_net_share_set_info(struct rpc_pipe_client *cli, 
+static WERROR cmd_srvsvc_net_share_set_info(struct rpc_pipe_client *cli, 
                                            TALLOC_CTX *mem_ctx,
                                            int argc, const char **argv)
 {
        uint32 info_level = 502;
-       union srvsvc_NetShareInfo info_get;
-       NTSTATUS result;
-       uint32 parm_error = 0;
+       SRV_SHARE_INFO info_get;
+       WERROR result;
 
        if (argc > 3) {
                printf("Usage: %s [sharename] [comment]\n", argv[0]);
-               return NT_STATUS_OK;
+               return WERR_OK;
        }
 
        /* retrieve share info */
-       result = rpccli_srvsvc_NetShareGetInfo(cli, mem_ctx, NULL, argv[1], info_level, &info_get);
-       if (!NT_STATUS_IS_OK(result))
+       result = rpccli_srvsvc_net_share_get_info(cli, mem_ctx, argv[1], info_level, &info_get);
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
+       info_get.switch_value = info_level;
+       info_get.ptr_share_ctr = 1;
+       init_unistr2(&(info_get.share.info502.info_502_str.uni_remark), argv[2], UNI_STR_TERMINATE);
+       
        /* set share info */
-       result = rpccli_srvsvc_NetShareSetInfo(cli, mem_ctx, NULL, argv[1], info_level, info_get, &parm_error);
+       result = rpccli_srvsvc_net_share_set_info(cli, mem_ctx, argv[1], info_level, &info_get);
 
-       if (!NT_STATUS_IS_OK(result))
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
        /* re-retrieve share info and display */
-       result = rpccli_srvsvc_NetShareGetInfo(cli, mem_ctx, NULL, argv[1], info_level, &info_get);
-       if (!NT_STATUS_IS_OK(result))
+       result = rpccli_srvsvc_net_share_get_info(cli, mem_ctx, argv[1], info_level, &info_get);
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
-       display_share_info_502(info_get.info502);
+       display_share_info_502(&info_get.share.info502);
        
  done:
        return result;
 }
 
-static NTSTATUS cmd_srvsvc_net_remote_tod(struct rpc_pipe_client *cli, 
+static WERROR cmd_srvsvc_net_remote_tod(struct rpc_pipe_client *cli, 
                                           TALLOC_CTX *mem_ctx,
                                           int argc, const char **argv)
 {
+       TIME_OF_DAY_INFO tod;
        fstring srv_name_slash;
-       NTSTATUS result;
-       struct srvsvc_NetRemoteTODInfo tod;
+       WERROR result;
 
        if (argc > 1) {
                printf("Usage: %s\n", argv[0]);
-               return NT_STATUS_OK;
+               return WERR_OK;
        }
 
        fstr_sprintf(srv_name_slash, "\\\\%s", cli->cli->desthost);
-       result = rpccli_srvsvc_NetRemoteTOD(
+       result = rpccli_srvsvc_net_remote_tod(
                cli, mem_ctx, srv_name_slash, &tod);
 
-       if (!NT_STATUS_IS_OK(result))
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
  done:
        return result;
 }
 
-static NTSTATUS cmd_srvsvc_net_file_enum(struct rpc_pipe_client *cli, 
+static WERROR cmd_srvsvc_net_file_enum(struct rpc_pipe_client *cli, 
                                         TALLOC_CTX *mem_ctx,
                                         int argc, const char **argv)
 {
        uint32 info_level = 3;
-       union srvsvc_NetFileCtr ctr;
-       NTSTATUS result;
-       uint32 hnd;
+       SRV_FILE_INFO_CTR ctr;
+       WERROR result;
+       ENUM_HND hnd;
        uint32 preferred_len = 0xffff;
-       uint32 numentries;
 
        if (argc > 2) {
                printf("Usage: %s [infolevel]\n", argv[0]);
-               return NT_STATUS_OK;
+               return WERR_OK;
        }
 
        if (argc == 2)
                info_level = atoi(argv[1]);
 
-       hnd = 0;
+       init_enum_hnd(&hnd, 0);
 
        ZERO_STRUCT(ctr);
 
-       result = rpccli_srvsvc_NetFileEnum(
-               cli, mem_ctx, NULL, NULL, NULL, &info_level, &ctr, preferred_len, &numentries, &hnd);
+       result = rpccli_srvsvc_net_file_enum(
+               cli, mem_ctx, info_level, NULL, &ctr, preferred_len, &hnd);
 
-       if (!NT_STATUS_IS_OK(result))
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
  done:
@@ -457,12 +462,12 @@ struct cmd_set srvsvc_commands[] = {
 
        { "SRVSVC" },
 
-       { "srvinfo",     RPC_RTYPE_NTSTATUS, cmd_srvsvc_srv_query_info, NULL, PI_SRVSVC, NULL, "Server query info", "" },
-       { "netshareenum",RPC_RTYPE_NTSTATUS, cmd_srvsvc_net_share_enum, NULL, PI_SRVSVC, NULL, "Enumerate shares", "" },
-       { "netsharegetinfo",RPC_RTYPE_NTSTATUS, cmd_srvsvc_net_share_get_info, NULL, PI_SRVSVC, NULL, "Get Share Info", "" },
-       { "netsharesetinfo",RPC_RTYPE_NTSTATUS, cmd_srvsvc_net_share_set_info, NULL, PI_SRVSVC, NULL, "Set Share Info", "" },
-       { "netfileenum", RPC_RTYPE_NTSTATUS, cmd_srvsvc_net_file_enum, NULL, PI_SRVSVC, NULL, "Enumerate open files", "" },
-       { "netremotetod",RPC_RTYPE_NTSTATUS, cmd_srvsvc_net_remote_tod, NULL, PI_SRVSVC, NULL, "Fetch remote time of day", "" },
+       { "srvinfo",     RPC_RTYPE_WERROR, NULL, cmd_srvsvc_srv_query_info, PI_SRVSVC, NULL, "Server query info", "" },
+       { "netshareenum",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_share_enum, PI_SRVSVC, NULL, "Enumerate shares", "" },
+       { "netsharegetinfo",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_share_get_info, PI_SRVSVC, NULL, "Get Share Info", "" },
+       { "netsharesetinfo",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_share_set_info, PI_SRVSVC, NULL, "Set Share Info", "" },
+       { "netfileenum", RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_file_enum,  PI_SRVSVC, NULL, "Enumerate open files", "" },
+       { "netremotetod",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_remote_tod, PI_SRVSVC, NULL, "Fetch remote time of day", "" },
 
        { NULL }
 };
diff --git a/source3/rpcclient/cmd_unixinfo.c b/source3/rpcclient/cmd_unixinfo.c
deleted file mode 100644 (file)
index e6f1e04..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   RPC pipe client
-
-   Copyright (C) Volker Lendecke 2005
-
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "rpcclient.h"
-
-static NTSTATUS cmd_unixinfo_uid2sid(struct rpc_pipe_client *cli,
-                                    TALLOC_CTX *mem_ctx,
-                                    int argc, const char **argv)
-{
-       uid_t uid;
-       DOM_SID sid;
-       NTSTATUS result;
-
-       if (argc != 2) {
-               printf("Usage: %s uid\n", argv[0]);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       uid = atoi(argv[1]);
-       result = rpccli_unixinfo_UidToSid(cli, mem_ctx, uid, &sid);
-
-       if (!NT_STATUS_IS_OK(result))
-               goto done;
-
-       printf("%s\n", sid_string_static(&sid));
-
-done:
-       return result;
-}
-
-static NTSTATUS cmd_unixinfo_sid2uid(struct rpc_pipe_client *cli,
-                                    TALLOC_CTX *mem_ctx,
-                                    int argc, const char **argv)
-{
-       uint64_t uid;
-       DOM_SID sid;
-       NTSTATUS result;
-
-       if (argc != 2) {
-               printf("Usage: %s sid\n", argv[0]);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       if (!string_to_sid(&sid, argv[1])) {
-               result = NT_STATUS_INVALID_SID;
-               goto done;
-       }
-
-       result = rpccli_unixinfo_SidToUid(cli, mem_ctx, sid, &uid);
-
-       if (!NT_STATUS_IS_OK(result))
-               goto done;
-
-       printf("%llu\n", (unsigned long long)uid);
-
-done:
-       return result;
-}
-
-static NTSTATUS cmd_unixinfo_gid2sid(struct rpc_pipe_client *cli,
-                                    TALLOC_CTX *mem_ctx,
-                                    int argc, const char **argv)
-{
-       gid_t gid;
-       DOM_SID sid;
-       NTSTATUS result;
-
-       if (argc != 2) {
-               printf("Usage: %s gid\n", argv[0]);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       gid = atoi(argv[1]);
-
-       result = rpccli_unixinfo_GidToSid(cli, mem_ctx, gid, &sid);
-
-       if (!NT_STATUS_IS_OK(result))
-               goto done;
-
-       printf("%s\n", sid_string_static(&sid));
-
-done:
-       return result;
-}
-
-static NTSTATUS cmd_unixinfo_sid2gid(struct rpc_pipe_client *cli,
-                                    TALLOC_CTX *mem_ctx,
-                                    int argc, const char **argv)
-{
-       uint64_t gid;
-       DOM_SID sid;
-       NTSTATUS result;
-
-       if (argc != 2) {
-               printf("Usage: %s sid\n", argv[0]);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       if (!string_to_sid(&sid, argv[1])) {
-               result = NT_STATUS_INVALID_SID;
-               goto done;
-       }
-
-       result = rpccli_unixinfo_SidToGid(cli, mem_ctx, sid, &gid);
-
-       if (!NT_STATUS_IS_OK(result))
-               goto done;
-
-       printf("%llu\n", (unsigned long long)gid);
-
-done:
-       return result;
-}
-
-static NTSTATUS cmd_unixinfo_getpwuid(struct rpc_pipe_client *cli,
-                                     TALLOC_CTX *mem_ctx,
-                                     int argc, const char **argv)
-{
-       uint64_t *uids;
-       unsigned int i, num_uids;
-       struct unixinfo_GetPWUidInfo *info;
-       NTSTATUS result;
-
-       if (argc < 2) {
-               printf("Usage: %s uid [uid2 uid3 ...]\n", argv[0]);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       num_uids = argc-1;
-       uids = TALLOC_ARRAY(mem_ctx, uint64_t, num_uids);
-
-       if (uids == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       for (i=0; i<num_uids; i++) {
-               uids[i] = atoi(argv[i+1]);
-       }
-
-       info = TALLOC_ARRAY(mem_ctx, struct unixinfo_GetPWUidInfo, num_uids);
-       if (info == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-
-       result = rpccli_unixinfo_GetPWUid(cli, mem_ctx, &num_uids, uids,
-                                         info);
-
-       if (!NT_STATUS_IS_OK(result)) {
-               return result;
-       }
-
-       for (i=0; i<num_uids; i++) {
-               if (NT_STATUS_IS_OK(info[i].status)) {
-                       printf("%llu:%s:%s\n", (unsigned long long)uids[i],
-                              info[i].homedir, info[i].shell);
-               } else {
-                       printf("%llu:%s\n", (unsigned long long)uids[i],
-                              nt_errstr(info[i].status));
-               }
-       }
-
-       return NT_STATUS_OK;
-}
-
-/* List of commands exported by this module */
-
-struct cmd_set unixinfo_commands[] = {
-
-       { "UNIXINFO" },
-
-       { "uid2sid", RPC_RTYPE_NTSTATUS, cmd_unixinfo_uid2sid, NULL,
-         PI_UNIXINFO, NULL, "Convert a uid to a sid", "" },
-       { "sid2uid", RPC_RTYPE_NTSTATUS, cmd_unixinfo_sid2uid, NULL,
-         PI_UNIXINFO, NULL, "Convert a sid to a uid", "" },
-       { "gid2sid", RPC_RTYPE_NTSTATUS, cmd_unixinfo_gid2sid, NULL,
-         PI_UNIXINFO, NULL, "Convert a gid to a sid", "" },
-       { "sid2gid", RPC_RTYPE_NTSTATUS, cmd_unixinfo_sid2gid, NULL,
-         PI_UNIXINFO, NULL, "Convert a sid to a gid", "" },
-       { "getpwuid", RPC_RTYPE_NTSTATUS, cmd_unixinfo_getpwuid, NULL,
-         PI_UNIXINFO, NULL, "Get passwd info", "" },
-       { NULL }
-};
index b43ce09f469fcfc37b2f2f14b4eaa837ae3e386d..7a7b463b717087abbf15fb72129cbaacc1c1c724 100644 (file)
@@ -492,7 +492,6 @@ static struct cmd_set separator_command[] = {
 
 /* Various pipe commands */
 
-extern struct cmd_set unixinfo_commands[];
 extern struct cmd_set lsarpc_commands[];
 extern struct cmd_set samr_commands[];
 extern struct cmd_set spoolss_commands[];
@@ -506,7 +505,6 @@ extern struct cmd_set test_commands[];
 
 static struct cmd_set *rpcclient_command_list[] = {
        rpcclient_commands,
-       unixinfo_commands,
        lsarpc_commands,
        ds_commands,
        samr_commands,
diff --git a/source3/samba3-knownfail b/source3/samba3-knownfail
deleted file mode 100644 (file)
index 2fe409c..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-BASE-DELETE-deltest16
-BASE-DELETE-deltest18
-BASE-DELETE-deltest19
-BASE-DELETE-deltest20
-NBT-REGISTER.*/refresh_own # Bug in Samba3's WINS server
-RPC-SRVSVC.*/NetShareGetInfo
-RPC-SRVSVC.*/NetTransportEnum
-RPC-SRVSVC.*/NetShareEnumAll
-RPC-SRVSVC.*/NetShareEnum
-RPC-SRVSVC.*/NetCharDevQEnum
-RPC-SRVSVC.*/NetCharDevEnum
-RPC-SRVSVC.*/NetShareGetInfo
-RPC-SAMSYNC
-blackbox.kinit/Test login with kerberos ccache
-blackbox.kinit/kinit with pkinit
-blackbox.kinit/kinit with password
-blackbox.kinit/check time with kerberos ccache
-blackbox.smbclient/domain join
-blackbox.smbclient/Test login with --machine-pass without kerberos
-blackbox.smbclient/Test login with --machine-pass and kerberos
-RAW-SEARCH.*/one file search
-RAW-SEARCH.*/ea list
-RAW-SEARCH.*/many files
-BASE-DELAYWRITE.*/finfo update on close
-blackbox.smbclient/List directory with LANMAN. # Samba 3 disables LANMAN authentication by default now
-dc:WINBIND-STRUCT/CHECK_MACHACC
-dc:WINBIND-STRUCT/GETDCNAME
-dc:WINBIND-STRUCT/DSGETDCNAME
-dc:WINBIND-STRUCT/LIST_USERS
-dc:WINBIND-STRUCT/LIST_GROUPS
-dc:WINBIND-STRUCT/SETPWENT
-dc:WINBIND-STRUCT/GETPWENT
-dc:WINBIND-STRUCT/LOOKUP_NAME_SID
diff --git a/source3/samba3-skip b/source3/samba3-skip
deleted file mode 100644 (file)
index 7160e5d..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-.*ncalrpc.*                    # transport not supported by samba 3
-.*ncacn_ip_tcp.*               # transport not supported by samba 3
-.*LDAP.*                               # Samba 3 doesn't have it's own LDAP server (yet)
-.*ldap.*                               # Samba 3 doesn't have it's own LDAP server (yet)
-^base.js$                              # Samba 3 doesn't need to selftest Samba4 code
-^ldb.js$                               # Samba 3 doesn't need to selftest Samba4 code
-^samr.js$                              # Uses ncalrpc, which isn't available for Samba 3
-^winreg$                               # Uses ncalrpc, which isn't available for Samba 3
-^echo.js$                              # Uses ncalrpc, which isn't available for Samba 3
-NBT-WINSREPLICATION.*  # No WINS replication yet
-NBT-DGRAM.*
-NBT-WINS.*
-.*smb2.*                               # No SMB2 server yet
-SMB2.*                                 # No SMB2 server yet
-.*RPC-EVENTLOG.*               # No eventlog available for eventlog
-.*bigendian.*                  # Samba 3 doesn't support bigendian stuff
-parse samba3                   # Relies on relative paths to the samba4 source tree
-RPC-MGMT                               # No MGMT interface in Samba 3
-RPC-SCANNER                    # No MGMT interface in Samba 3 (required for scanner)
-RPC-SAMR                               # Doesn't work against Samba 3 yet and isn't split up into subtests
-RPC-SECRETS                            # Doesn't work against Samba 3 yet
-RPC-SAMSYNC                            # Doesn't work against Samba 3 yet
-RPC-EPMAPPER                   # No epmapper interface in Samba 3
-RPC-LSA                                        # Doesn't work against Samba 3 yet
-RPC-WKSSVC                             # Doesn't work against Samba 3 yet
-RPC-WINREG                             # Doesn't work against Samba 3 yet
-RPC-HANDLES                            # Doesn't work against Samba 3 yet
-RPC-ATSVC                              # No atsvc interface on Samba 3 yet
-RPC-OXIDRESOLVE                        # No oxidresolve on Samba 3 yet
-RPC-REMACT                             # No remact on Samba 3 yet
-RPC-DFS                                        # Doesn't work against Samba 3 yet
-RPC-ECHO                               # Sinkone fails against samba3 for some reason and causes a disconnect
-^LOCAL-.*                              # No point running the LOCAL Samba 4 tests
-.*BASE-BENCH-HOLDCON.* # Very slow
-RPC-COUNTCALLS                 # Slow, fails
-RPC-DSSETUP                            # No DSSETUP interface in Samba 3
-BASE-ALIASES
-BASE-UTABLE                            # Takes a lot of time
-RPC-SVCCTL
-RAW-PING-PONG
-RAW-HOLD-OPLOCK
-RAW-SAMBA3CLOSEER
-ntvfs/cifs.*
-ntvfs/simple.*
-RPC-AUTOIDL                            # We already have the IDL..
-RPC-SAMLOGON                   # Doesn't work against Samba 3 yet
-RPC-SCHANNEL                   # Doesn't work against Samba 3 yet
-RPC-SCHANNEL2                  # Doesn't work against Samba 3 yet
-RPC-JOIN                               # Doesn't work against Samba 3 yet
-RPC-SPOOLSS                            # Doesn't work against Samba 3 yet
-RPC-ALTERCONTEXT               # Doesn't work against Samba 3 yet
-BASE-IOMETER                   # Doesn't work against Samba 3 yet
-BASE-CASETABLE                 # Doesn't work against Samba 3 yet
-BASE-NTTRANS                   # Doesn't work against Samba 3 yet
-BASE-SCAN-MAXFID               # Doesn't work against Samba 3 yet
-BASE-TCONDEV                   # Doesn't work against Samba 3 yet
-RAW-SCAN-EAMAX                 # Doesn't work against Samba 3 yet
-RAW-BENCH-LOCK                 # Doesn't work against Samba 3 yet
-BASE-SMB                               # Doesn't work against Samba 3 yet
-RAW-QFSINFO                            # Doesn't work against Samba 3 yet
-RAW-QFILEINFO                  # Doesn't work against Samba 3 yet
-RAW-IOCTL                              # Doesn't work against Samba 3 yet
-RAW-SFILEINFO                  # Doesn't work against Samba 3 yet
-RAW-STREAMS                            # Doesn't work against Samba 3 yet
-RAW-EAS                                        # Doesn't work against Samba 3 yet
-RAW-CONTEXT                            # Doesn't work against Samba 3 yet
-RAW-STREAMS                            # Doesn't work against Samba 3 yet
-RAW-ACLS                               # Doesn't work against Samba 3 yet
-RAW-IOCTL                              # Doesn't work against Samba 3 yet
-^NET-.*                                        # Convenience wrapper, not protocol-level
-RPC-NETLOGON                   # Can't create users
-BASE-CHARSET
-BASE-DELAYWRITE                
-RAW-SAMBA3POSIXTIMEDLOC
-RAW-BENCH-OPLOCK
-pidl.*
-tdb stress
-RAW-COMPOSITE.*
-BASE-DEFER_OPEN
-BASE-SCAN-IOCTL
-^ldb$
-^samba3sam.js$
-blackbox.kinit                 # Samba3 doesn't have a KDC
-member:WINBIND-.*              # Samba3 doesn't provide the member env yet
-WINBIND                                # Skip untill the faked users work with a runnung winbindd
diff --git a/source3/samba3-skip-nobuildfarm b/source3/samba3-skip-nobuildfarm
deleted file mode 100644 (file)
index 757d8e3..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-RPC-NETLOGSAMBA3                               # FIXME: Should only be run on the build farm
-RPC-SAMBA3SESSIONKEY                   # FIXME: Should only be run on the build farm
-RPC-SAMBA3-GETUSERNAME                 # FIXME: Should only be run on the build farm
old mode 100644 (file)
new mode 100755 (executable)
index 56b64a42c2694feb556cf0b2796bb23e1d4bfa74..383891d2e0c1b7b28fafd6ea2091bcf500c33052 100644 (file)
@@ -16,7 +16,7 @@ BEGIN {
        print "   GNU General Public License for more details.";
        print "   ";
        print "   You should have received a copy of the GNU General Public License";
-       print "   along with this program; if not, see <http://www.gnu.org/licenses/>";
+       print "   along with this program; if not, see <http://www.gnu.org/licenses/>."
        print "*/";
        print "";
        print "#include \"includes.h\"";
old mode 100755 (executable)
new mode 100644 (file)
index 56b2a970e321eabd87d165e6c0a7a56040d34b83..8de6420b10abf4bfdef62b2644e8e55ec13ee97d 100755 (executable)
@@ -139,9 +139,6 @@ cat >$SERVERCONFFILE<<EOF
        printing = bsd
        printcap name = /dev/null
 
-#      host msdfs = yes
-#      panic action = "/bin/sleep 90000"
-
 [tmp]
        path = $PREFIX_ABS/tmp
        read only = no
index 9ad115502406b066933164055e7a23996a56ee2f..1cc9ea12643ee90529d1c627687d9b2ec5036535 100644 (file)
-plantest() {
+
+samba3_stop_sig_term() {
+       RET=0
+       kill -USR1 `cat $PIDDIR/timelimit.nmbd.pid` >/dev/null 2>&1 || \
+               kill -ALRM `cat $PIDDIR/timelimit.nmbd.pid` || RET=$?
+
+       kill -USR1 `cat $PIDDIR/timelimit.smbd.pid` >/dev/null 2>&1 || \
+               kill -ALRM `cat $PIDDIR/timelimit.smbd.pid` || RET=$?
+
+       return $RET;
+}
+
+samba3_stop_sig_kill() {
+       kill -ALRM `cat $PIDDIR/timelimit.nmbd.pid` >/dev/null 2>&1
+       kill -ALRM `cat $PIDDIR/timelimit.smbd.pid` >/dev/null 2>&1
+       return 0;
+}
+
+samba3_check_or_start() {
+       if [ -n "$SERVER_TEST_FIFO" ];then
+
+               trap samba3_stop_sig_kill INT QUIT
+               trap samba3_stop_sig_kill TERM
+
+               if [ -p "$SERVER_TEST_FIFO" ];then
+                       return 0;
+               fi
+
+               if [ -n "$SOCKET_WRAPPER_DIR" ];then
+                       if [ -d "$SOCKET_WRAPPER_DIR" ]; then
+                               rm -f $SOCKET_WRAPPER_DIR/*
+                       else
+                               mkdir -p $SOCKET_WRAPPER_DIR
+                       fi
+               fi
+
+               rm -f $SERVER_TEST_FIFO
+               mkfifo $SERVER_TEST_FIFO
+
+               rm -f $NMBD_TEST_LOG
+               echo -n "STARTING NMBD..."
+               ((
+                       if test x"$NMBD_MAXTIME" = x; then
+                           NMBD_MAXTIME=2700
+                       fi
+                       MAKE_TEST_BINARY=$BINDIR/nmbd
+                       export MAKE_TEST_BINARY
+                       timelimit $NMBD_MAXTIME $NMBD_VALGRIND $BINDIR/nmbd -F -S --no-process-group -d0 -s $SERVERCONFFILE > $NMBD_TEST_LOG 2>&1 &
+                       TIMELIMIT_NMBD_PID=$!
+                       MAKE_TEST_BINARY=
+                       echo $TIMELIMIT_NMBD_PID > $PIDDIR/timelimit.nmbd.pid
+                       wait $TIMELIMIT_NMBD_PID
+                       ret=$?;
+                       rm -f $SERVER_TEST_FIFO
+                       if [ -n "$SOCKET_WRAPPER_DIR" -a -d "$SOCKET_WRAPPER_DIR" ]; then
+                               rm -f $SOCKET_WRAPPER_DIR/*
+                       fi
+                       if [ x"$ret" = x"0" ];then
+                               echo "nmbd exits with status $ret";
+                               echo "nmbd exits with status $ret" >>$NMBD_TEST_LOG;
+                       elif [ x"$ret" = x"137" ];then
+                               echo "nmbd got SIGXCPU and exits with status $ret!"
+                               echo "nmbd got SIGXCPU and exits with status $ret!">>$NMBD_TEST_LOG;
+                       else
+                               echo "nmbd failed with status $ret!"
+                               echo "nmbd failed with status $ret!">>$NMBD_TEST_LOG;
+                       fi
+                       exit $ret;
+               ) || exit $? &) 2>/dev/null || exit $?
+               echo  "DONE"
+
+               rm -f $SMBD_TEST_LOG
+               echo -n "STARTING SMBD..."
+               ((
+                       if test x"$SMBD_MAXTIME" = x; then
+                           SMBD_MAXTIME=2700
+                       fi
+                       MAKE_TEST_BINARY=$BINDIR/smbd
+                       export MAKE_TEST_BINARY
+                       timelimit $SMBD_MAXTIME $SMBD_VALGRIND $BINDIR/smbd -F -S --no-process-group -d0 -s $SERVERCONFFILE > $SMBD_TEST_LOG 2>&1 &
+                       TIMELIMIT_SMBD_PID=$!
+                       MAKE_TEST_BINARY=
+                       echo $TIMELIMIT_SMBD_PID > $PIDDIR/timelimit.smbd.pid
+                       wait $TIMELIMIT_SMBD_PID
+                       ret=$?;
+                       rm -f $SERVER_TEST_FIFO
+                       if [ -n "$SOCKET_WRAPPER_DIR" -a -d "$SOCKET_WRAPPER_DIR" ]; then
+                               rm -f $SOCKET_WRAPPER_DIR/*
+                       fi
+                       if [ x"$ret" = x"0" ];then
+                               echo "smbd exits with status $ret";
+                               echo "smbd exits with status $ret" >>$SMBD_TEST_LOG;
+                       elif [ x"$ret" = x"137" ];then
+                               echo "smbd got SIGXCPU and exits with status $ret!"
+                               echo "smbd got SIGXCPU and exits with status $ret!">>$SMBD_TEST_LOG;
+                       else
+                               echo "smbd failed with status $ret!"
+                               echo "smbd failed with status $ret!">>$SMBD_TEST_LOG;
+                       fi
+                       exit $ret;
+               ) || exit $? &) 2>/dev/null || exit $?
+               echo  "DONE"
+       fi
+       return 0;
+}
+
+samba3_nmbd_test_log() {
+       if [ -n "$NMBD_TEST_LOG" ];then
+               if [ -r "$NMBD_TEST_LOG" ];then
+                       return 0;
+               fi
+       fi
+       return 1;
+}
+
+samba3_smbd_test_log() {
+       if [ -n "$SMBD_TEST_LOG" ];then
+               if [ -r "$SMBD_TEST_LOG" ];then
+                       return 0;
+               fi
+       fi
+       return 1;
+}
+
+samba3_check_only() {
+       if [ -n "$SERVER_TEST_FIFO" ];then
+               if [ -p "$SERVER_TEST_FIFO" ];then
+                       return 0;
+               fi
+               return 1;
+       fi
+       return 0;
+}
+
+testit() {
+       if [ -z "$PREFIX" ]; then
+           PREFIX=test_prefix
+           mkdir -p $PREFIX
+       fi
        name=$1
-       env=$2
-       shift 2
+       shift 1
+       binary=$1
        cmdline="$*"
-       echo "-- TEST --"
-       echo $name
-       echo $env
-       echo $cmdline
+
+       SERVERS_ARE_UP="no"
+
+       shname=`echo $name | \
+       sed -e 's%[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\-]%_%g'`
+
+       UNIQUE_PID=`/bin/sh -c 'echo $$'`
+       TEST_LOG="$PREFIX/test_log.${UNIQUE_PID}"
+       TEST_PCAP="$PREFIX/test_${shname}_${UNIQUE_PID}.pcap"
+       trap "rm -f $TEST_LOG $TEST_PCAP" EXIT
+
+       if [ -z "$nmbd_log_size" ]; then
+               nmbd_log_size=`wc -l < $NMBD_TEST_LOG`;
+       fi
+       if [ -z "$smbd_log_size" ]; then
+               smbd_log_size=`wc -l < $SMBD_TEST_LOG`;
+       fi
+
+       if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+               echo "--==--==--==--==--==--==--==--==--==--==--"
+               echo "Running test $name (level 0 stdout)"
+               echo "--==--==--==--==--==--==--==--==--==--==--"
+               date
+               echo "Testing $name"
+       else
+               echo "Testing $name ($failed)"
+       fi
+
+       samba3_check_only && SERVERS_ARE_UP="yes"
+       if [ x"$SERVERS_ARE_UP" != x"yes" ];then
+               if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+                       echo "SERVERS are down! Skipping: $cmdline"
+                       echo "=========================================="
+                       echo "TEST SKIPPED: $name (reason SERVERS are down)"
+                       echo "=========================================="
+               else
+                       echo "TEST SKIPPED: $name (reason SERVERS are down)"
+               fi
+               return 1
+       fi
+
+       if [ x"$MAKE_TEST_ENABLE_PCAP" = x"yes" ];then
+               SOCKET_WRAPPER_PCAP_FILE=$TEST_PCAP
+               export SOCKET_WRAPPER_PCAP_FILE
+       fi
+
+       MAKE_TEST_BINARY=$binary
+       export MAKE_TEST_BINARY
+       ( $cmdline > $TEST_LOG 2>&1 )
+       status=$?
+       MAKE_TEST_BINARY=
+       # show any additional output from smbd that has happened in this test
+       samba3_nmbd_test_log && {
+               new_log_size=`wc -l < $NMBD_TEST_LOG`;
+               test "$new_log_size" = "$nmbd_log_size" || {
+                       echo "NMBD OUTPUT:";
+                       incr_log_size=`expr $new_log_size - $nmbd_log_size`;
+                       tail -$incr_log_size $NMBD_TEST_LOG;
+                       nmbd_log_size=$new_log_size;
+               }
+       }
+       samba3_smbd_test_log && {
+               new_log_size=`wc -l < $SMBD_TEST_LOG`;
+               test "$new_log_size" = "$smbd_log_size" || {
+                       echo "SMBD OUTPUT:";
+                       incr_log_size=`expr $new_log_size - $smbd_log_size`;
+                       tail -$incr_log_size $SMBD_TEST_LOG;
+                       smbd_log_size=$new_log_size;
+               }
+       }
+
+       if [ x"$status" != x"0" ]; then
+               echo "TEST OUTPUT:"
+               cat $TEST_LOG;
+               rm -f $TEST_LOG;
+               if [ x"$MAKE_TEST_ENABLE_PCAP" = x"yes" ];then
+                       echo "TEST PCAP: $TEST_PCAP"
+               fi
+               if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+                       echo "=========================================="
+                       echo "TEST FAILED: $name (status $status)"
+                       echo "=========================================="
+               else
+                       echo "TEST FAILED: $cmdline (status $status)"
+               fi
+               trap "" EXIT
+               return 1;
+       fi
+       rm -f $TEST_LOG;
+       if [ x"$MAKE_TEST_KEEP_PCAP" = x"yes" ];then
+               echo "TEST PCAP: $TEST_PCAP"
+       else
+               rm -f $TEST_PCAP;
+       fi
+       if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+               echo "ALL OK: $cmdline"
+               echo "=========================================="
+               echo "TEST PASSED: $name"
+               echo "=========================================="
+       fi
+       trap "" EXIT
+       return 0;
+}
+
+testok() {
+       name=`basename $1`
+       failed=$2
+
+       if [ x"$failed" = x"0" ];then
+               :
+       else
+               echo "$failed TESTS FAILED or SKIPPED ($name)";
+       fi
+       exit $failed
 }
 
+teststatus() {
+       name=`basename $1`
+       failed=$2
+
+       if [ x"$failed" = x"0" ];then
+               echo "TEST STATUS: $failed";
+       else
+               echo "TEST STATUS: $failed";
+       fi
+       exit $failed
+}
+
+if [ -z "$VALGRIND" ]; then
+    MALLOC_CHECK_=2
+    export MALLOC_CHECK_
+fi
+
index f016e5d28f18aa852c4263bdbd186ecbc9824cd5..6117106c8a3c445aa7f9c5760f6b2f990db32a5d 100755 (executable)
@@ -2,11 +2,25 @@
 
 # this runs the file serving tests that are expected to pass with samba3
 
+if [ $# != 0 ]; then
+cat <<EOF
+Usage: test_local_s3.sh
+EOF
+exit 1;
+fi
+
 incdir=`dirname $0`
 . $incdir/test_functions.sh
 
-BINDIR=$incdir/../../bin
+failed=0
+
+testit "talloctort" $VALGRIND $BINDIR/talloctort || \
+    failed=`expr $failed + 1`
+
+testit "replacetort" $VALGRIND $BINDIR/replacetort || \
+    failed=`expr $failed + 1`
+
+testit "tdbtorture" $VALGRIND $BINDIR/tdbtorture || \
+    failed=`expr $failed +1`
 
-plantest "talloctort" none $VALGRIND $BINDIR/talloctort 
-plantest "replacetort" none $VALGRIND $BINDIR/replacetort 
-plantest "tdbtorture" none $VALGRIND $BINDIR/tdbtorture 
+testok $0 $failed
diff --git a/source3/script/tests/test_posix_s3.sh b/source3/script/tests/test_posix_s3.sh
new file mode 100755 (executable)
index 0000000..11c4ed7
--- /dev/null
@@ -0,0 +1,80 @@
+#!/bin/sh
+
+# this runs the file serving tests that are expected to pass with samba3
+
+if [ $# -lt 3 ]; then
+cat <<EOF
+Usage: test_posix_s3.sh UNC USERNAME PASSWORD <first> <smbtorture args>
+EOF
+exit 1;
+fi
+
+unc="$1"
+username="$2"
+password="$3"
+start="$4"
+shift 4
+ADDARGS="$*"
+
+incdir=`dirname $0`
+. $incdir/test_functions.sh
+
+base="BASE-ATTR BASE-CHARSET BASE-CHKPATH BASE-DEFER_OPEN BASE-DELAYWRITE BASE-DELETE"
+base="$base BASE-DENY1 BASE-DENY2 BASE-DENY3 BASE-DENYDOS BASE-DIR1 BASE-DIR2"
+base="$base BASE-DISCONNECT BASE-FDPASS BASE-LOCK"
+base="$base BASE-MANGLE BASE-NEGNOWAIT BASE-NTDENY1"
+base="$base BASE-NTDENY2 BASE-OPEN BASE-OPENATTR BASE-PROPERTIES BASE-RENAME BASE-RW1"
+base="$base BASE-SECLEAK BASE-TCON BASE-TCONDEV BASE-TRANS2 BASE-UNLINK BASE-VUID"
+base="$base BASE-XCOPY BASE-SAMBA3ERROR"
+
+raw="RAW-ACLS RAW-CHKPATH RAW-CLOSE RAW-COMPOSITE RAW-CONTEXT RAW-EAS"
+raw="$raw RAW-IOCTL RAW-LOCK RAW-MKDIR RAW-MUX RAW-NOTIFY RAW-OPEN RAW-OPLOCK"
+raw="$raw RAW-QFILEINFO RAW-QFSINFO RAW-READ RAW-RENAME RAW-SEARCH RAW-SEEK"
+raw="$raw RAW-SFILEINFO RAW-SFILEINFO-BUG RAW-STREAMS RAW-UNLINK RAW-WRITE"
+raw="$raw RAW-SAMBA3HIDE RAW-SAMBA3BADPATH RAW-SFILEINFO-RENAME"
+raw="$raw RAW-SAMBA3CASEINSENSITIVE RAW-SAMBA3POSIXTIMEDLOCK"
+raw="$raw RAW-SAMBA3ROOTDIRFID"
+
+rpc="RPC-AUTHCONTEXT RPC-BINDSAMBA3 RPC-SAMBA3-SRVSVC RPC-SAMBA3-SHARESEC"
+rpc="$rpc RPC-SAMBA3-SPOOLSS RPC-SAMBA3-WKSSVC"
+
+# NOTE: to enable the UNIX-WHOAMI test, we need to change the default share
+# config to allow guest access. I'm not sure whether this would break other
+# tests, so leaving it alone for now -- jpeach
+unix="UNIX-INFO2"
+
+if test x$RUN_FROM_BUILD_FARM = xyes; then
+       rpc="$rpc RPC-NETLOGSAMBA3 RPC-SAMBA3SESSIONKEY RPC-SAMBA3-GETUSERNAME"
+fi
+
+tests="$base $raw $rpc $unix"
+
+skipped="BASE-CHARSET BASE-DEFER_OPEN BASE-DELAYWRITE BASE-OPENATTR BASE-TCONDEV"
+skipped="$skipped RAW-ACLS RAW-COMPOSITE RAW-CONTEXT RAW-EAS"
+skipped="$skipped RAW-IOCTL RAW-MUX"
+skipped="$skipped RAW-QFILEINFO RAW-QFSINFO RAW-SEARCH"
+skipped="$skipped RAW-SFILEINFO RAW-STREAMS RAW-WRITE"
+
+echo "WARNING: Skipping tests $skipped"
+
+failed=0
+for t in $tests; do
+    if [ ! -z "$start" -a "$start" != $t ]; then
+       continue;
+    fi
+    skip=0
+    for s in $skipped; do
+       if [ x"$s" = x"$t" ]; then
+           skip=1;
+           break;
+       fi
+    done
+    if [ $skip = 1 ]; then
+       continue;
+    fi
+    start=""
+    name="$t"
+    testit "$name" $VALGRIND $SMBTORTURE4 $TORTURE4_OPTIONS $ADDARGS $unc -U"$username"%"$password" $t || failed=`expr $failed + 1`
+done
+
+testok $0 $failed
index 762b0c37a5e3acf9363d2c646e057a26d1490e53..3a8f3bd5b6c9bde49dff0c5dfd01f8c4c7e2e1e2 100755 (executable)
@@ -9,28 +9,14 @@ EOF
 exit 1;
 fi
 
-BINDIR=`dirname $0`/../../bin
-
 SERVER="$1"
 SERVER_IP="$2"
 SMBCLIENT="$VALGRIND ${SMBCLIENT:-$BINDIR/smbclient} $CONFIGURATION"
 
-failed=0
+incdir=`dirname $0`
+. $incdir/test_functions.sh
 
-testit() {
-       name="$1"
-       shift
-       cmdline="$*"
-       echo "test: $name"
-       $cmdline
-       status=$?
-       if [ x$status = x0 ]; then
-               echo "success: $name"
-       else
-               echo "failure: $name"
-       fi
-       return $status
-}
+failed=0
 
 # Test that a noninteractive smbclient does not prompt
 test_noninteractive_no_prompt()
@@ -96,4 +82,4 @@ testit "interactive smbclient -l prompts on stdout" \
    test_interactive_prompt_stdout -l /tmp || \
     failed=`expr $failed + 1`
 
-exit $failed
+testok $0 $failed
index 21c0fca4457e4ea36546b326e24c24fcb6590e26..f662eacd3ecf97f5674a80e66fb7cefb611178a0 100755 (executable)
@@ -2,20 +2,47 @@
 
 # this runs the file serving tests that are expected to pass with samba3
 
+if [ $# -lt 3 ]; then
+cat <<EOF
+Usage: test_smbtorture_s3.sh UNC USERNAME PASSWORD <first> <smbtorture args>
+EOF
+exit 1;
+fi
+
+unc="$1"
+username="$2"
+password="$3"
+start="$4"
+shift 4
 ADDARGS="$*"
 
 incdir=`dirname $0`
 . $incdir/test_functions.sh
 
-BINDIR=$incdir/../../bin
-
 tests="FDPASS LOCK1 LOCK2 LOCK3 LOCK4 LOCK5 LOCK6 LOCK7"
-tests="$tests UNLINK BROWSE ATTR TRANS2 MAXFID TORTURE "
+#tests="$tests UNLINK BROWSE ATTR TRANS2 MAXFID TORTURE "
+tests="$tests UNLINK BROWSE ATTR TRANS2 TORTURE "
 tests="$tests OPLOCK1 OPLOCK2 OPLOCK3"
 tests="$tests DIR DIR1 TCON TCONDEV RW1 RW2 RW3"
 tests="$tests OPEN XCOPY RENAME DELETE PROPERTIES W2K"
 tests="$tests TCON2 IOCTL CHKPATH FDSESS LOCAL-SUBSTITUTE"
 
+skipped1="RANDOMIPC NEGNOWAIT NBENCH ERRMAPEXTRACT TRANS2SCAN NTTRANSSCAN"
+skipped2="DENY1 DENY2 OPENATTR CASETABLE EATEST"
+skipped3="MANGLE UTABLE PIPE_NUMBER"
+echo "Skipping the following tests:"
+echo "$skipped1"
+echo "$skipped2"
+echo "$skipped3"
+
+failed=0
 for t in $tests; do
-    plantest "SAMBA3-$t" dc $VALGRIND $BINDIR/smbtorture $ADDARGS //\$SERVER_IP/tmp -U"\$USERNAME"%"\$PASSWORD" $t
+    if [ ! -z "$start" -a "$start" != $t ]; then
+       continue;
+    fi
+    start=""
+    name="$t"
+    testit "$name" $VALGRIND $BINDIR/smbtorture $ADDARGS $unc -U"$username"%"$password" $t || failed=`expr $failed + 1`
 done
+
+testok $0 $failed
index d001569c08817ef8443263b5c766a1762f825d46..dd593899e4b72e907cbc02699bc6722b8a9e72cc 100755 (executable)
@@ -1,7 +1,13 @@
-#!/bin/sh
-SCRIPTDIR=`dirname $0`
-. $SCRIPTDIR/test_functions.sh
 
-$SCRIPTDIR/test_local_s3.sh
-$SCRIPTDIR/test_smbtorture_s3.sh 
-plantest "smbclient" dc $SCRIPTDIR/test_smbclient_s3.sh \$SERVER \$SERVER_IP
+$SCRIPTDIR/test_local_s3.sh || failed=`expr $failed + $?`
+$SCRIPTDIR/test_smbtorture_s3.sh //$SERVER_IP/tmp $USERNAME $PASSWORD "" || failed=`expr $failed + $?`
+$SCRIPTDIR/test_smbclient_s3.sh $SERVER $SERVER_IP || failed=`expr $failed + $?`
+
+SMBTORTURE4VERSION=`$SMBTORTURE4 --version`
+if [ -n "$SMBTORTURE4" -a -n "$SMBTORTURE4VERSION" ];then
+       echo "Running Tests with Samba4's smbtorture"
+       echo $SMBTORTURE4VERSION
+       $SCRIPTDIR/test_posix_s3.sh //$SERVER_IP/tmp $USERNAME $PASSWORD "" || failed=`expr $failed + $?`
+else
+       echo "Skip Tests with Samba4's smbtorture"
+fi
diff --git a/source3/script/tests/tests_smbclient_s3.sh b/source3/script/tests/tests_smbclient_s3.sh
new file mode 100644 (file)
index 0000000..d48a692
--- /dev/null
@@ -0,0 +1 @@
+. $SCRIPTDIR/test_smbclient_s3.sh $SERVER $SERVER_IP
index 11185fd116b5430a36cfa20fd63b891a4ab3f61b..c5a5385cdd0aff1982f6c6b1bc906b48d9a98d2f 100644 (file)
@@ -31,7 +31,7 @@ static WERROR netlogon_status( const char *service, SERVICE_STATUS *service_stat
         service_status->type              = 0x20;
         service_status->controls_accepted = SVCCTL_ACCEPT_NONE;
 
-       if ( share_defined("NETLOGON") ) {
+       if ( lp_servicenumber("NETLOGON") != -1 ) {
                service_status->state              = SVCCTL_RUNNING;
                service_status->win32_exit_code    = WERR_SERVICE_NEVER_STARTED;
        }
@@ -56,7 +56,7 @@ static WERROR netlogon_stop( const char *service, SERVICE_STATUS *service_status
 
 static WERROR netlogon_start( const char *service )
 {
-       if ( !share_defined("NETLOGON") )
+       if ( lp_servicenumber("NETLOGON") == -1 )
                return WERR_SERVICE_DISABLED;
 
        return WERR_ACCESS_DENIED;
index 49855796b73926e9427eedb002089d9cab626810..6ee0fe16e1e88e0c0dfa671c72ac9e6482b29853 100644 (file)
@@ -48,10 +48,8 @@ static struct aio_extra *aio_list_head;
  of the aio_read call.
 *****************************************************************************/
 
-static struct aio_extra *create_aio_ex_read(files_struct *fsp,
-                                               size_t buflen,
-                                               uint16 mid,
-                                               const uint8 *inbuf)
+static struct aio_extra *create_aio_ex_read(files_struct *fsp, size_t buflen,
+                                           uint16 mid)
 {
        struct aio_extra *aio_ex = SMB_MALLOC_P(struct aio_extra);
 
@@ -67,14 +65,6 @@ static struct aio_extra *create_aio_ex_read(files_struct *fsp,
                SAFE_FREE(aio_ex);
                return NULL;
        }
-       /* Save the first 8 bytes of inbuf for possible enc data. */
-       aio_ex->inbuf = SMB_MALLOC_ARRAY(char, 8);
-       if (!aio_ex->inbuf) {
-               SAFE_FREE(aio_ex->outbuf);
-               SAFE_FREE(aio_ex);
-               return NULL;
-       }
-       memcpy(aio_ex->inbuf, inbuf, 8);
        DLIST_ADD(aio_list_head, aio_ex);
        aio_ex->fsp = fsp;
        aio_ex->read_req = True;
@@ -240,14 +230,13 @@ BOOL schedule_aio_read_and_X(connection_struct *conn,
 
        bufsize = smb_size + 12 * 2 + smb_maxcnt;
 
-       if (!(aio_ex = create_aio_ex_read(fsp, bufsize, req->mid,
-                                         req->inbuf))) {
+       if ((aio_ex = create_aio_ex_read(fsp, bufsize, req->mid)) == NULL) {
                DEBUG(10,("schedule_aio_read_and_X: malloc fail.\n"));
                return False;
        }
 
        construct_reply_common((char *)req->inbuf, aio_ex->outbuf);
-       set_message((char *)req->inbuf, aio_ex->outbuf, 12, 0, True);
+       set_message(aio_ex->outbuf, 12, 0, True);
        SCVAL(aio_ex->outbuf,smb_vwv0,0xFF); /* Never a chained reply. */
 
        a = &aio_ex->acb;
@@ -292,6 +281,7 @@ BOOL schedule_aio_write_and_X(connection_struct *conn,
        struct aio_extra *aio_ex;
        SMB_STRUCT_AIOCB *a;
        size_t inbufsize, outbufsize;
+       BOOL write_through = BITSETW(req->inbuf+smb_vwv7,0);
        size_t min_aio_write_size = lp_aio_write_size(SNUM(conn));
 
        if (!min_aio_write_size || (numtowrite < min_aio_write_size)) {
@@ -359,7 +349,22 @@ BOOL schedule_aio_write_and_X(connection_struct *conn,
                return False;
        }
 
-       srv_defer_sign_response(aio_ex->mid);
+       if (!write_through && !lp_syncalways(SNUM(fsp->conn))
+           && fsp->aio_write_behind) {
+               /* Lie to the client and immediately claim we finished the
+                * write. */
+               SSVAL(aio_ex->outbuf,smb_vwv2,numtowrite);
+                SSVAL(aio_ex->outbuf,smb_vwv4,(numtowrite>>16)&1);
+               show_msg(aio_ex->outbuf);
+               if (!send_smb(smbd_server_fd(),aio_ex->outbuf)) {
+                       exit_server_cleanly("handle_aio_write: send_smb "
+                                           "failed.");
+               }
+               DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write "
+                         "behind for file %s\n", fsp->fsp_name ));
+       } else {
+               srv_defer_sign_response(aio_ex->mid);
+       }
        outstanding_aio_calls++;
 
        DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write for file "
@@ -382,7 +387,6 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
        int ret = 0;
        int outsize;
        char *outbuf = aio_ex->outbuf;
-       char *inbuf = aio_ex->inbuf;
        char *data = smb_buf(outbuf);
        ssize_t nread = SMB_VFS_AIO_RETURN(aio_ex->fsp,&aio_ex->acb);
 
@@ -406,7 +410,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
                outsize = (UNIXERROR(ERRDOS,ERRnoaccess));
                ret = errno;
        } else {
-               outsize = set_message(inbuf,outbuf,12,nread,False);
+               outsize = set_message(outbuf,12,nread,False);
                SSVAL(outbuf,smb_vwv2,0xFFFF); /* Remaining - must be * -1. */
                SSVAL(outbuf,smb_vwv5,nread);
                SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf));
@@ -419,7 +423,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
                            (int)aio_ex->acb.aio_nbytes, (int)nread ) );
 
        }
-       smb_setlen(inbuf,outbuf,outsize - 4);
+       smb_setlen(outbuf,outsize - 4);
        show_msg(outbuf);
        if (!send_smb(smbd_server_fd(),outbuf)) {
                exit_server_cleanly("handle_aio_read_complete: send_smb "
@@ -444,10 +448,34 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
        int ret = 0;
        files_struct *fsp = aio_ex->fsp;
        char *outbuf = aio_ex->outbuf;
-       char *inbuf = aio_ex->inbuf;
        ssize_t numtowrite = aio_ex->acb.aio_nbytes;
        ssize_t nwritten = SMB_VFS_AIO_RETURN(fsp,&aio_ex->acb);
 
+       if (fsp->aio_write_behind) {
+               if (nwritten != numtowrite) {
+                       if (nwritten == -1) {
+                               DEBUG(5,("handle_aio_write_complete: "
+                                        "aio_write_behind failed ! File %s "
+                                        "is corrupt ! Error %s\n",
+                                        fsp->fsp_name, strerror(errno) ));
+                               ret = errno;
+                       } else {
+                               DEBUG(0,("handle_aio_write_complete: "
+                                        "aio_write_behind failed ! File %s "
+                                        "is corrupt ! Wanted %u bytes but "
+                                        "only wrote %d\n", fsp->fsp_name,
+                                        (unsigned int)numtowrite,
+                                        (int)nwritten ));
+                               ret = EIO;
+                       }
+               } else {
+                       DEBUG(10,("handle_aio_write_complete: "
+                                 "aio_write_behind completed for file %s\n",
+                                 fsp->fsp_name ));
+               }
+               return 0;
+       }
+
        /* We don't need outsize or set_message here as we've already set the
           fixed size length when we set up the aio call. */
 
@@ -589,6 +617,115 @@ int process_aio_queue(void)
        return ret;
 }
 
+/****************************************************************************
+ We're doing write behind and the client closed the file. Wait up to 30
+ seconds (my arbitrary choice) for the aio to complete. Return 0 if all writes
+ completed, errno to return if not.
+*****************************************************************************/
+
+#define SMB_TIME_FOR_AIO_COMPLETE_WAIT 29
+
+int wait_for_aio_completion(files_struct *fsp)
+{
+       struct aio_extra *aio_ex;
+       const SMB_STRUCT_AIOCB **aiocb_list;
+       int aio_completion_count = 0;
+       time_t start_time = time(NULL);
+       int seconds_left;
+
+       for (seconds_left = SMB_TIME_FOR_AIO_COMPLETE_WAIT;
+            seconds_left >= 0;) {
+               int err = 0;
+               int i;
+               struct timespec ts;
+
+               aio_completion_count = 0;
+               for( aio_ex = aio_list_head; aio_ex; aio_ex = aio_ex->next) {
+                       if (aio_ex->fsp == fsp) {
+                               aio_completion_count++;
+                       }
+               }
+
+               if (!aio_completion_count) {
+                       return 0;
+               }
+
+               DEBUG(3,("wait_for_aio_completion: waiting for %d aio events "
+                        "to complete.\n", aio_completion_count ));
+
+               aiocb_list = SMB_MALLOC_ARRAY(const SMB_STRUCT_AIOCB *,
+                                             aio_completion_count);
+               if (!aiocb_list) {
+                       return ENOMEM;
+               }
+
+               for( i = 0, aio_ex = aio_list_head;
+                    aio_ex;
+                    aio_ex = aio_ex->next) {
+                       if (aio_ex->fsp == fsp) {
+                               aiocb_list[i++] = &aio_ex->acb;
+                       }
+               }
+
+               /* Now wait up to seconds_left for completion. */
+               ts.tv_sec = seconds_left;
+               ts.tv_nsec = 0;
+
+               DEBUG(10,("wait_for_aio_completion: %d events, doing a wait "
+                         "of %d seconds.\n",
+                         aio_completion_count, seconds_left ));
+
+               err = SMB_VFS_AIO_SUSPEND(fsp, aiocb_list,
+                                         aio_completion_count, &ts);
+
+               DEBUG(10,("wait_for_aio_completion: returned err = %d, "
+                         "errno = %s\n", err, strerror(errno) ));
+               
+               if (err == -1 && errno == EAGAIN) {
+                       DEBUG(0,("wait_for_aio_completion: aio_suspend timed "
+                                "out waiting for %d events after a wait of "
+                                "%d seconds\n", aio_completion_count,
+                                seconds_left));
+                       /* Timeout. */
+                       cancel_aio_by_fsp(fsp);
+                       SAFE_FREE(aiocb_list);
+                       return EIO;
+               }
+
+               /* One or more events might have completed - process them if
+                * so. */
+               for( i = 0; i < aio_completion_count; i++) {
+                       uint16 mid = aiocb_list[i]->aio_sigevent.sigev_value.sival_int;
+
+                       aio_ex = find_aio_ex(mid);
+
+                       if (!aio_ex) {
+                               DEBUG(0, ("wait_for_aio_completion: mid %u "
+                                         "doesn't match an aio record\n",
+                                         (unsigned int)mid ));
+                               continue;
+                       }
+
+                       if (!handle_aio_completed(aio_ex, &err)) {
+                               continue;
+                       }
+                       delete_aio_ex(aio_ex);
+               }
+
+               SAFE_FREE(aiocb_list);
+               seconds_left = SMB_TIME_FOR_AIO_COMPLETE_WAIT
+                       - (time(NULL) - start_time);
+       }
+
+       /* We timed out - we don't know why. Return ret if already an error,
+        * else EIO. */
+       DEBUG(10,("wait_for_aio_completion: aio_suspend timed out waiting "
+                 "for %d events\n",
+                 aio_completion_count));
+
+       return EIO;
+}
+
 /****************************************************************************
  Cancel any outstanding aio requests. The client doesn't care about the reply.
 *****************************************************************************/
@@ -645,4 +782,8 @@ void cancel_aio_by_fsp(files_struct *fsp)
 {
 }
 
+BOOL wait_for_aio_completion(files_struct *fsp)
+{
+       return True;
+}
 #endif
index aee1c92f7b2422f5e42ccd49eee511a163c616c5..ae45aaa6dac81e7bd6adf601f83c6fa8c35d4736 100644 (file)
@@ -345,16 +345,28 @@ static NTSTATUS close_normal_file(files_struct *fsp, enum file_close_type close_
        NTSTATUS status = NT_STATUS_OK;
        NTSTATUS saved_status1 = NT_STATUS_OK;
        NTSTATUS saved_status2 = NT_STATUS_OK;
+       NTSTATUS saved_status3 = NT_STATUS_OK;
        connection_struct *conn = fsp->conn;
 
-       cancel_aio_by_fsp(fsp);
+       if (fsp->aio_write_behind) {
+               /*
+                * If we're finishing write behind on a close we can get a write
+                * error here, we must remember this.
+                */
+               int ret = wait_for_aio_completion(fsp);
+               if (ret) {
+                       saved_status1 = map_nt_error_from_unix(ret);
+               }
+       } else {
+               cancel_aio_by_fsp(fsp);
+       }
  
        /*
         * If we're flushing on a close we can get a write
         * error here, we must remember this.
         */
 
-       saved_status1 = close_filestruct(fsp);
+       saved_status2 = close_filestruct(fsp);
 
        if (fsp->print_file) {
                print_fsp_end(fsp, close_type);
@@ -368,7 +380,7 @@ static NTSTATUS close_normal_file(files_struct *fsp, enum file_close_type close_
 
        if (fsp->fh->ref_count == 1) {
                /* Should we return on error here... ? */
-               saved_status2 = close_remove_share_mode(fsp, close_type);
+               saved_status3 = close_remove_share_mode(fsp, close_type);
        }
 
        if(fsp->oplock_type) {
@@ -399,6 +411,8 @@ static NTSTATUS close_normal_file(files_struct *fsp, enum file_close_type close_
                        status = saved_status1;
                } else if (!NT_STATUS_IS_OK(saved_status2)) {
                        status = saved_status2;
+               } else if (!NT_STATUS_IS_OK(saved_status3)) {
+                       status = saved_status3;
                }
        }
 
index f9befb84d27208477decf16ae8996007aec5d34e..50a71edf9d304f8337e6c5555c5a4378dd292870 100644 (file)
@@ -285,6 +285,7 @@ void conn_free_internal(connection_struct *conn)
        free_namearray(conn->veto_list);
        free_namearray(conn->hide_list);
        free_namearray(conn->veto_oplock_list);
+       free_namearray(conn->aio_write_behind_list);
        
        string_free(&conn->user);
        string_free(&conn->dirpath);
index 4b807f7b90b9659533c5b24c8e7ec66af100cbab..65b7c352c550368ed1fbeb13d9525f574706889d 100644 (file)
@@ -83,19 +83,9 @@ static int count_fn(struct db_record *rec,
                }
                return 0;
        }
-       if (cs->name) {
-               /* We are counting all the connections to a given share. */
-               if (strequal(crec->servicename, cs->name)) {
-                       cs->curr_connections++;
-               }
-       } else {
-               /* We are counting all the connections. Static registrations
-                * like the lpq backgroud process and the smbd daemon process
-                * have a cnum of -1, so won't be counted here.
-                */
+
+       if (strequal(crec->servicename, cs->name))
                cs->curr_connections++;
-       }
 
        return 0;
 }
@@ -121,28 +111,12 @@ int count_current_connections( const char *sharename, BOOL clear  )
        if (connections_forall(count_fn, &cs) == -1) {
                DEBUG(0,("count_current_connections: traverse of "
                         "connections.tdb failed\n"));
-               DEBUGADD(0, ("count_current_connections: connection count of %d might not be accurate",
-                           cs.curr_connections));
+               return False;
        }
 
-       /* If the traverse failed part-way through, we at least return
-        * as many connections as we had already counted. If it failed
-        * right at the start, we will return 0, which is about all we
-        * can do anywway.
-        */
-
        return cs.curr_connections;
 }
 
-/****************************************************************************
- Count the number of connections open across all shares.
-****************************************************************************/
-
-int count_all_current_connections(void)
-{
-       return count_current_connections(NULL, True /* clear stale entries */);
-}
-
 /****************************************************************************
  Claim an entry in the connections database.
 ****************************************************************************/
index 143417dce361e929eb7003c0d9936036525c6759..6cb63f0c49e6a200fbef4cb3722528b968ef0e32 100644 (file)
@@ -28,7 +28,7 @@ extern uint32 global_client_caps;
  Create an error packet from errno.
 ****************************************************************************/
 
-int unix_error_packet(const char *inbuf,char *outbuf,int def_class,uint32 def_code, NTSTATUS def_status, int line, const char *file)
+int unix_error_packet(char *outbuf,int def_class,uint32 def_code, NTSTATUS def_status, int line, const char *file)
 {
        int eclass=def_class;
        int ecode=def_code;
@@ -49,7 +49,7 @@ int unix_error_packet(const char *inbuf,char *outbuf,int def_class,uint32 def_co
                }
        }
 
-       return error_packet(inbuf,outbuf,eclass,ecode,ntstatus,line,file);
+       return error_packet(outbuf,eclass,ecode,ntstatus,line,file);
 }
 
 BOOL use_nt_status(void)
@@ -109,9 +109,9 @@ void error_packet_set(char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatu
        }
 }
 
-int error_packet(const char *inbuf, char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatus, int line, const char *file)
+int error_packet(char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatus, int line, const char *file)
 {
-       int outsize = set_message(inbuf,outbuf,0,0,True);
+       int outsize = set_message(outbuf,0,0,True);
        error_packet_set(outbuf, eclass, ecode, ntstatus, line, file);
        return outsize;
 }
index f3740da32820c171249bbbf74a47b5c38566bb35..179963dae9b5250995608386b2dc5b17cb98362f 100644 (file)
@@ -558,6 +558,7 @@ NTSTATUS dup_file_fsp(files_struct *fsp,
        dup_fsp->modified = fsp->modified;
        dup_fsp->is_directory = fsp->is_directory;
        dup_fsp->is_stat = fsp->is_stat;
+       dup_fsp->aio_write_behind = fsp->aio_write_behind;
         string_set(&dup_fsp->fsp_name,fsp->fsp_name);
 
        *result = dup_fsp;
index da80c25407b918a3429e885fa0b3f260b2f0e931..b8c5085b4174d9c8ef70af2d14492601daa22ac2 100644 (file)
@@ -131,11 +131,10 @@ static BOOL notify_marshall_changes(int num_changes,
 static void change_notify_reply_packet(const uint8 *request_buf,
                                       NTSTATUS error_code)
 {
-       const char *inbuf = (char *)request_buf;
        char outbuf[smb_size+38];
 
        memset(outbuf, '\0', sizeof(outbuf));
-       construct_reply_common(inbuf, outbuf);
+       construct_reply_common((char *)request_buf, outbuf);
 
        ERROR_NT(error_code);
 
@@ -143,7 +142,7 @@ static void change_notify_reply_packet(const uint8 *request_buf,
         * Seems NT needs a transact command with an error code
         * in it. This is a longer packet than a simple error.
         */
-       set_message(inbuf,outbuf,18,0,False);
+       set_message(outbuf,18,0,False);
 
        show_msg(outbuf);
        if (!send_smb(smbd_server_fd(),outbuf))
@@ -187,7 +186,7 @@ void change_notify_reply(const uint8 *request_buf, uint32 max_param,
         * We're only interested in the header fields here
         */
 
-       smb_setlen(NULL, (char *)tmp_request, smb_size);
+       smb_setlen((char *)tmp_request, smb_size);
        SCVAL(tmp_request, smb_wct, 0);
 
        init_smb_request(req, tmp_request);
index c2d7807158e49983b23f58fc6103f3f8ae219303..fbc6f9ab64103d07d3fff69c8c8443e6106fddb7 100644 (file)
@@ -387,6 +387,10 @@ static NTSTATUS open_file(files_struct *fsp,
        fsp->sent_oplock_break = NO_BREAK_SENT;
        fsp->is_directory = False;
        fsp->is_stat = False;
+       if (conn->aio_write_behind_list &&
+           is_in_path(path, conn->aio_write_behind_list, conn->case_sensitive)) {
+               fsp->aio_write_behind = True;
+       }
 
        string_set(&fsp->fsp_name, path);
        fsp->wcp = NULL; /* Write cache pointer. */
index a5f74b89d05d8890b471d6f0cf0fce599d0c2a44..9ac9d7628400c7bf9671975f22b408e40579ae88 100644 (file)
@@ -253,7 +253,7 @@ static char *new_break_smb_message(TALLOC_CTX *mem_ctx,
        }
 
        memset(result,'\0',smb_size);
-       set_message(NULL,result,8,0,True);
+       set_message(result,8,0,True);
        SCVAL(result,smb_com,SMBlockingX);
        SSVAL(result,smb_tid,fsp->conn->cnum);
        SSVAL(result,smb_pid,0xFFFF);
index 9906bfb45be7e72dcf7041464166aade79d6832e..da43a2976773f3dcb00162f300e58f27a19ab96f 100644 (file)
@@ -291,7 +291,7 @@ void reply_pipe_read_and_X(struct smb_request *req)
                return;
        }
 
-       set_message(NULL, (char *)req->outbuf, 12, nread, False);
+       set_message((char *)req->outbuf, 12, nread, False);
   
        SSVAL(req->outbuf,smb_vwv5,nread);
        SSVAL(req->outbuf,smb_vwv6,smb_offset(data,req->outbuf));
index 29b942de81cc17e472873bf9319fb098f5de05b8..7faf26af25e1bce35962f7e31c21bd5e29a5099d 100644 (file)
@@ -91,8 +91,8 @@ void init_smb_request(struct smb_request *req, const uint8 *inbuf)
 static struct pending_message_list *deferred_open_queue;
 
 /****************************************************************************
- Function to push a message onto the tail of a linked list of smb messages
ready for processing.
+ Function to push a message onto the tail of a linked list of smb messages ready
+ for processing.
 ****************************************************************************/
 
 static BOOL push_queued_message(struct smb_request *req,
@@ -148,7 +148,7 @@ void remove_deferred_open_smb_message(uint16 mid)
 
        for (pml = deferred_open_queue; pml; pml = pml->next) {
                if (mid == SVAL(pml->buf.data,smb_mid)) {
-                       DEBUG(10,("remove_deferred_open_smb_message: "
+                       DEBUG(10,("remove_sharing_violation_open_smb_message: "
                                  "deleting mid %u len %u\n",
                                  (unsigned int)mid,
                                  (unsigned int)pml->buf.length ));
@@ -171,11 +171,11 @@ void schedule_deferred_open_smb_message(uint16 mid)
 
        for (pml = deferred_open_queue; pml; pml = pml->next) {
                uint16 msg_mid = SVAL(pml->buf.data,smb_mid);
-               DEBUG(10, ("schedule_deferred_open_smb_message: [%d] "
-                          "msg_mid = %u\n", i++, (unsigned int)msg_mid ));
+               DEBUG(10,("schedule_deferred_open_smb_message: [%d] msg_mid = %u\n", i++,
+                       (unsigned int)msg_mid ));
                if (mid == msg_mid) {
-                       DEBUG(10, ("schedule_deferred_open_smb_message: "
-                                  "scheduling mid %u\n", mid));
+                       DEBUG(10,("schedule_deferred_open_smb_message: scheduling mid %u\n",
+                               mid ));
                        pml->end_time.tv_sec = 0;
                        pml->end_time.tv_usec = 0;
                        DLIST_PROMOTE(deferred_open_queue, pml);
@@ -183,8 +183,8 @@ void schedule_deferred_open_smb_message(uint16 mid)
                }
        }
 
-       DEBUG(10, ("schedule_deferred_open_smb_message: failed to find "
-                  "message mid %u\n", mid ));
+       DEBUG(10,("schedule_deferred_open_smb_message: failed to find message mid %u\n",
+               mid ));
 }
 
 /****************************************************************************
@@ -932,8 +932,7 @@ void reply_outbuf(struct smb_request *req, uint8 num_words, uint32 num_bytes)
        }
 
        construct_reply_common((char *)req->inbuf, (char *)req->outbuf);
-       set_message((char *)req->inbuf, (char *)req->outbuf,
-                   num_words, num_bytes, False);
+       set_message((char *)req->outbuf, num_words, num_bytes, False);
        /*
         * Zero out the word area, the caller has to take care of the bcc area
         * himself
@@ -1226,8 +1225,8 @@ void remove_from_common_flags2(uint32 v)
 
 void construct_reply_common(const char *inbuf, char *outbuf)
 {
-       set_message(inbuf,outbuf,0,0,False);
-
+       set_message(outbuf,0,0,False);
+       
        SCVAL(outbuf,smb_com,CVAL(inbuf,smb_com));
        SIVAL(outbuf,smb_rcls,0);
        SCVAL(outbuf,smb_flg, FLAG_REPLY | (CVAL(inbuf,smb_flg) & FLAG_CASELESS_PATHNAMES)); 
@@ -1341,7 +1340,7 @@ void chain_reply(struct smb_request *req)
        }
 
        /* And set it in the header. */
-       smb_setlen(inbuf, inbuf2, new_size - 4);
+       smb_setlen(inbuf2, new_size - 4);
 
        DEBUG(3,("Chained message\n"));
        show_msg(inbuf2);
@@ -1428,7 +1427,7 @@ void chain_reply(struct smb_request *req)
                memset(outbuf + outsize, 0, outsize_padded - outsize);
        }
 
-       smb_setlen(NULL, outbuf, outsize2 + chain_size - 4);
+       smb_setlen(outbuf, outsize2 + chain_size - 4);
 
        /*
         * restore the saved data, being careful not to overwrite any data
index e27272f0dda7147c0bb91d358d5874146caf772c..7c44216aea4ee4329d903beaf44f8413195a7988 100644 (file)
@@ -402,7 +402,7 @@ void reply_special(char *inbuf)
        
        memset(outbuf, '\0', sizeof(outbuf));
 
-       smb_setlen(inbuf,outbuf,0);
+       smb_setlen(outbuf,0);
        
        switch (msg_type) {
        case 0x81: /* session request */
@@ -1645,8 +1645,8 @@ void reply_open(connection_struct *conn, struct smb_request *req)
 
        if (!NT_STATUS_IS_OK(status)) {
                if (open_was_deferred(req->mid)) {
-                       END_PROFILE(SMBopen);
                        /* We have re-scheduled this call. */
+                       END_PROFILE(SMBopen);
                        return;
                }
                reply_openerror(req, status);
@@ -2040,7 +2040,7 @@ void reply_mknew(connection_struct *conn, struct smb_request *req)
                        /* We have re-scheduled this call. */
                        return;
                }
-               reply_nterror(req, status);
+               reply_openerror(req, status);
                return;
        }
 
@@ -3017,7 +3017,7 @@ Returning short read of maximum allowed for compatibility with Windows 2000.\n",
                return;
        }
        
-       set_message(NULL, (char *)req->outbuf, 5, nread+3, False);
+       set_message((char *)req->outbuf, 5, nread+3, False);
 
        SSVAL(req->outbuf,smb_vwv0,nread);
        SSVAL(req->outbuf,smb_vwv5,nread+3);
@@ -3104,7 +3104,7 @@ Returning short read of maximum allowed for compatibility with Windows 2000.\n",
                return;
        }
 
-       set_message(NULL, (char *)req->outbuf, 5, nread+3, False);
+       set_message((char *)req->outbuf, 5, nread+3, False);
 
        SSVAL(req->outbuf,smb_vwv0,nread);
        SSVAL(req->outbuf,smb_vwv5,nread+3);
@@ -3122,14 +3122,12 @@ Returning short read of maximum allowed for compatibility with Windows 2000.\n",
  Setup readX header.
 ****************************************************************************/
 
-static int setup_readX_header(const uint8 *inbuf, uint8 *outbuf,
-                             size_t smb_maxcnt)
+static int setup_readX_header(char *outbuf, size_t smb_maxcnt)
 {
        int outsize;
        char *data;
 
-       outsize = set_message((char *)inbuf, (char *)outbuf,12,smb_maxcnt,
-                             False);
+       outsize = set_message(outbuf,12,smb_maxcnt,False);
        data = smb_buf(outbuf);
 
        memset(outbuf+smb_vwv0,'\0',24); /* valgrind init. */
@@ -3192,7 +3190,7 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
                header = data_blob_const(headerbuf, sizeof(headerbuf));
 
                construct_reply_common((char *)req->inbuf, (char *)headerbuf);
-               setup_readX_header(req->inbuf, headerbuf, smb_maxcnt);
+               setup_readX_header((char *)headerbuf, smb_maxcnt);
 
                if ((nread = SMB_VFS_SENDFILE( smbd_server_fd(), fsp, fsp->fh->fd, &header, startpos, smb_maxcnt)) == -1) {
                        /* Returning ENOSYS means no data at all was sent. Do this as a normal read. */
@@ -3243,7 +3241,7 @@ normal_read:
                uint8 headerbuf[smb_size + 2*12];
 
                construct_reply_common((char *)req->inbuf, (char *)headerbuf);
-               setup_readX_header(req->inbuf, headerbuf, smb_maxcnt);
+               setup_readX_header((char *)headerbuf, smb_maxcnt);
 
                /* Send out the header. */
                if (write_data(smbd_server_fd(), (char *)headerbuf,
@@ -3270,7 +3268,7 @@ normal_read:
                        return;
                }
 
-               setup_readX_header(req->inbuf, req->outbuf, nread);
+               setup_readX_header((char *)req->outbuf, nread);
 
                DEBUG( 3, ( "send_file_readX fnum=%d max=%d nread=%d\n",
                        fsp->fnum, (int)smb_maxcnt, (int)nread ) );
@@ -3334,8 +3332,8 @@ void reply_read_and_X(connection_struct *conn, struct smb_request *req)
                                END_PROFILE(SMBreadX);
                                return;
                        }
-                       /* We currently don't do this on signed or sealed data. */
-                       if (srv_is_signing_active() || srv_encryption_on()) {
+                       /* We currently don't do this on signed data. */
+                       if (srv_is_signing_active()) {
                                reply_nterror(req, NT_STATUS_NOT_SUPPORTED);
                                END_PROFILE(SMBreadX);
                                return;
@@ -3526,7 +3524,7 @@ void reply_writebraw(connection_struct *conn, struct smb_request *req)
         * it to send more bytes */
 
        memcpy(buf, req->inbuf, smb_size);
-       outsize = set_message(NULL,buf,
+       outsize = set_message(buf,
                        Protocol>PROTOCOL_COREPLUS?1:0,0,True);
        SCVAL(buf,smb_com,SMBwritebraw);
        SSVALS(buf,smb_vwv0,0xFFFF);
diff --git a/source3/smbd/seal.c b/source3/smbd/seal.c
deleted file mode 100644 (file)
index 0276e34..0000000
+++ /dev/null
@@ -1,703 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   SMB Transport encryption (sealing) code - server code.
-   Copyright (C) Jeremy Allison 2007.
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-
-/******************************************************************************
- Server side encryption.
-******************************************************************************/
-
-/******************************************************************************
- Global server state.
-******************************************************************************/
-
-struct smb_srv_trans_enc_ctx {
-       struct smb_trans_enc_state *es;
-       AUTH_NTLMSSP_STATE *auth_ntlmssp_state; /* Must be kept in sync with pointer in ec->ntlmssp_state. */
-};
-
-static struct smb_srv_trans_enc_ctx *partial_srv_trans_enc_ctx;
-static struct smb_srv_trans_enc_ctx *srv_trans_enc_ctx;
-
-/******************************************************************************
- Is server encryption on ?
-******************************************************************************/
-
-BOOL srv_encryption_on(void)
-{
-       if (srv_trans_enc_ctx) {
-               return common_encryption_on(srv_trans_enc_ctx->es);
-       }
-       return False;
-}
-
-/******************************************************************************
- Create an auth_ntlmssp_state and ensure pointer copy is correct.
-******************************************************************************/
-
-static NTSTATUS make_auth_ntlmssp(struct smb_srv_trans_enc_ctx *ec)
-{
-       NTSTATUS status = auth_ntlmssp_start(&ec->auth_ntlmssp_state);
-       if (!NT_STATUS_IS_OK(status)) {
-               return nt_status_squash(status);
-       }
-
-       /*
-        * We must remember to update the pointer copy for the common
-        * functions after any auth_ntlmssp_start/auth_ntlmssp_end.
-        */
-       ec->es->s.ntlmssp_state = ec->auth_ntlmssp_state->ntlmssp_state;
-       return status;
-}
-
-/******************************************************************************
- Destroy an auth_ntlmssp_state and ensure pointer copy is correct.
-******************************************************************************/
-
-static void destroy_auth_ntlmssp(struct smb_srv_trans_enc_ctx *ec)
-{
-       /*
-        * We must remember to update the pointer copy for the common
-        * functions after any auth_ntlmssp_start/auth_ntlmssp_end.
-        */
-
-       if (ec->auth_ntlmssp_state) {
-               auth_ntlmssp_end(&ec->auth_ntlmssp_state);
-               /* The auth_ntlmssp_end killed this already. */
-               ec->es->s.ntlmssp_state = NULL;
-       }
-}
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-
-/******************************************************************************
- Import a name.
-******************************************************************************/
-
-static NTSTATUS get_srv_gss_creds(const char *service,
-                               const char *name,
-                               gss_cred_usage_t cred_type,
-                               gss_cred_id_t *p_srv_cred)
-{
-       OM_uint32 ret;
-       OM_uint32 min;
-       gss_name_t srv_name;
-       gss_buffer_desc input_name;
-       char *host_princ_s = NULL;
-       NTSTATUS status = NT_STATUS_OK;
-
-       gss_OID_desc nt_hostbased_service =
-       {10, CONST_DISCARD(char *,"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x04")};
-
-       asprintf(&host_princ_s, "%s@%s", service, name);
-       if (host_princ_s == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       input_name.value = host_princ_s;
-       input_name.length = strlen(host_princ_s) + 1;
-
-       ret = gss_import_name(&min,
-                               &input_name,
-                               &nt_hostbased_service,
-                               &srv_name);
-
-       DEBUG(10,("get_srv_gss_creds: imported name %s\n",
-               host_princ_s ));
-
-       if (ret != GSS_S_COMPLETE) {
-               SAFE_FREE(host_princ_s);
-               return map_nt_error_from_gss(ret, min);
-       }
-
-       /*
-        * We're accessing the krb5.keytab file here.
-        * ensure we have permissions to do so.
-        */
-       become_root();
-
-       ret = gss_acquire_cred(&min,
-                               srv_name,
-                               GSS_C_INDEFINITE,
-                               GSS_C_NULL_OID_SET,
-                               cred_type,
-                               p_srv_cred,
-                               NULL,
-                               NULL);
-       unbecome_root();
-
-       if (ret != GSS_S_COMPLETE) {
-               ADS_STATUS adss = ADS_ERROR_GSS(ret, min);
-               DEBUG(10,("get_srv_gss_creds: gss_acquire_cred failed with %s\n",
-                       ads_errstr(adss)));
-               status = map_nt_error_from_gss(ret, min);
-       }
-
-       SAFE_FREE(host_princ_s);
-       gss_release_name(&min, &srv_name);
-       return status;
-}
-
-/******************************************************************************
- Create a gss state.
- Try and get the cifs/server@realm principal first, then fall back to
- host/server@realm.
-******************************************************************************/
-
-static NTSTATUS make_auth_gss(struct smb_srv_trans_enc_ctx *ec)
-{
-       NTSTATUS status;
-       gss_cred_id_t srv_cred;
-       fstring fqdn;
-
-       name_to_fqdn(fqdn, global_myname());
-       strlower_m(fqdn);
-
-       status = get_srv_gss_creds("cifs", fqdn, GSS_C_ACCEPT, &srv_cred);
-       if (!NT_STATUS_IS_OK(status)) {
-               status = get_srv_gss_creds("host", fqdn, GSS_C_ACCEPT, &srv_cred);
-               if (!NT_STATUS_IS_OK(status)) {
-                       return nt_status_squash(status);
-               }
-       }
-
-       ec->es->s.gss_state = SMB_MALLOC_P(struct smb_tran_enc_state_gss);
-       if (!ec->es->s.gss_state) {
-               OM_uint32 min;
-               gss_release_cred(&min, &srv_cred);
-               return NT_STATUS_NO_MEMORY;
-       }
-       ZERO_STRUCTP(ec->es->s.gss_state);
-       ec->es->s.gss_state->creds = srv_cred;
-
-       /* No context yet. */
-       ec->es->s.gss_state->gss_ctx = GSS_C_NO_CONTEXT;
-
-       return NT_STATUS_OK;
-}
-#endif
-
-/******************************************************************************
- Shutdown a server encryption context.
-******************************************************************************/
-
-static void srv_free_encryption_context(struct smb_srv_trans_enc_ctx **pp_ec)
-{
-       struct smb_srv_trans_enc_ctx *ec = *pp_ec;
-
-       if (!ec) {
-               return;
-       }
-
-       if (ec->es) {
-               switch (ec->es->smb_enc_type) {
-                       case SMB_TRANS_ENC_NTLM:
-                               destroy_auth_ntlmssp(ec);
-                               break;
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-                       case SMB_TRANS_ENC_GSS:
-                               break;
-#endif
-               }
-               common_free_encryption_state(&ec->es);
-       }
-
-       SAFE_FREE(ec);
-       *pp_ec = NULL;
-}
-
-/******************************************************************************
- Create a server encryption context.
-******************************************************************************/
-
-static NTSTATUS make_srv_encryption_context(enum smb_trans_enc_type smb_enc_type, struct smb_srv_trans_enc_ctx **pp_ec)
-{
-       struct smb_srv_trans_enc_ctx *ec;
-
-       *pp_ec = NULL;
-
-       ec = SMB_MALLOC_P(struct smb_srv_trans_enc_ctx);
-       if (!ec) {
-               return NT_STATUS_NO_MEMORY;
-       }
-       ZERO_STRUCTP(partial_srv_trans_enc_ctx);
-       ec->es = SMB_MALLOC_P(struct smb_trans_enc_state);
-       if (!ec->es) {
-               SAFE_FREE(ec);
-               return NT_STATUS_NO_MEMORY;
-       }
-       ZERO_STRUCTP(ec->es);
-       ec->es->smb_enc_type = smb_enc_type;
-       switch (smb_enc_type) {
-               case SMB_TRANS_ENC_NTLM:
-                       {
-                               NTSTATUS status = make_auth_ntlmssp(ec);
-                               if (!NT_STATUS_IS_OK(status)) {
-                                       srv_free_encryption_context(&ec);
-                                       return status;
-                               }
-                       }
-                       break;
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-               case SMB_TRANS_ENC_GSS:
-                       /* Acquire our credentials by calling gss_acquire_cred here. */
-                       {
-                               NTSTATUS status = make_auth_gss(ec);
-                               if (!NT_STATUS_IS_OK(status)) {
-                                       srv_free_encryption_context(&ec);
-                                       return status;
-                               }
-                       }
-                       break;
-#endif
-               default:
-                       srv_free_encryption_context(&ec);
-                       return NT_STATUS_INVALID_PARAMETER;
-       }
-       *pp_ec = ec;
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Free an encryption-allocated buffer.
-******************************************************************************/
-
-void srv_free_enc_buffer(char *buf)
-{
-       /* We know this is an smb buffer, and we
-        * didn't malloc, only copy, for a keepalive,
-        * so ignore session keepalives. */
-
-       if(CVAL(buf,0) == SMBkeepalive) {
-               return;
-       }
-
-       if (srv_trans_enc_ctx) {
-               common_free_enc_buffer(srv_trans_enc_ctx->es, buf);
-       }
-}
-
-/******************************************************************************
- Decrypt an incoming buffer.
-******************************************************************************/
-
-NTSTATUS srv_decrypt_buffer(char *buf)
-{
-       /* Ignore session keepalives. */
-       if(CVAL(buf,0) == SMBkeepalive) {
-               return NT_STATUS_OK;
-       }
-
-       if (srv_trans_enc_ctx) {
-               return common_decrypt_buffer(srv_trans_enc_ctx->es, buf);
-       }
-
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Encrypt an outgoing buffer. Return the encrypted pointer in buf_out.
-******************************************************************************/
-
-NTSTATUS srv_encrypt_buffer(char *buf, char **buf_out)
-{
-       *buf_out = buf;
-
-       /* Ignore session keepalives. */
-       if(CVAL(buf,0) == SMBkeepalive) {
-               return NT_STATUS_OK;
-       }
-
-       if (srv_trans_enc_ctx) {
-               return common_encrypt_buffer(srv_trans_enc_ctx->es, buf, buf_out);
-       }
-       /* Not encrypting. */
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Do the gss encryption negotiation. Parameters are in/out.
- Until success we do everything on the partial enc ctx.
-******************************************************************************/
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-static NTSTATUS srv_enc_spnego_gss_negotiate(unsigned char **ppdata, size_t *p_data_size, DATA_BLOB secblob)
-{
-       OM_uint32 ret;
-       OM_uint32 min;
-       OM_uint32 flags = 0;
-       gss_buffer_desc in_buf, out_buf;
-       struct smb_tran_enc_state_gss *gss_state;
-       DATA_BLOB auth_reply = data_blob_null;
-       DATA_BLOB response = data_blob_null;
-       NTSTATUS status;
-
-       if (!partial_srv_trans_enc_ctx) {
-               status = make_srv_encryption_context(SMB_TRANS_ENC_GSS, &partial_srv_trans_enc_ctx);
-               if (!NT_STATUS_IS_OK(status)) {
-                       return status;
-               }
-       }
-
-       gss_state = partial_srv_trans_enc_ctx->es->s.gss_state;
-
-       in_buf.value = secblob.data;
-       in_buf.length = secblob.length;
-
-       out_buf.value = NULL;
-       out_buf.length = 0;
-
-       become_root();
-
-       ret = gss_accept_sec_context(&min,
-                               &gss_state->gss_ctx,
-                               gss_state->creds,
-                               &in_buf,
-                               GSS_C_NO_CHANNEL_BINDINGS,
-                               NULL,
-                               NULL,           /* Ignore oids. */
-                               &out_buf,       /* To return. */
-                               &flags,
-                               NULL,           /* Ingore time. */
-                               NULL);          /* Ignore delegated creds. */
-       unbecome_root();
-
-       status = gss_err_to_ntstatus(ret, min);
-       if (ret != GSS_S_COMPLETE && ret != GSS_S_CONTINUE_NEEDED) {
-               return status;
-       }
-
-       /* Ensure we've got sign+seal available. */
-       if (ret == GSS_S_COMPLETE) {
-               if ((flags & (GSS_C_INTEG_FLAG|GSS_C_CONF_FLAG|GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG)) !=
-                               (GSS_C_INTEG_FLAG|GSS_C_CONF_FLAG|GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG)) {
-                       DEBUG(0,("srv_enc_spnego_gss_negotiate: quality of service not good enough "
-                               "for SMB sealing.\n"));
-                       gss_release_buffer(&min, &out_buf);
-                       return NT_STATUS_ACCESS_DENIED;
-               }
-       }
-
-       auth_reply = data_blob(out_buf.value, out_buf.length);
-       gss_release_buffer(&min, &out_buf);
-
-       /* Wrap in SPNEGO. */
-       response = spnego_gen_auth_response(&auth_reply, status, OID_KERBEROS5);
-       data_blob_free(&auth_reply);
-
-       SAFE_FREE(*ppdata);
-       *ppdata = response.data;
-       *p_data_size = response.length;
-
-       return status;
-}
-#endif
-
-/******************************************************************************
- Do the NTLM SPNEGO (or raw) encryption negotiation. Parameters are in/out.
- Until success we do everything on the partial enc ctx.
-******************************************************************************/
-
-static NTSTATUS srv_enc_ntlm_negotiate(unsigned char **ppdata, size_t *p_data_size, DATA_BLOB secblob, BOOL spnego_wrap)
-{
-       NTSTATUS status;
-       DATA_BLOB chal = data_blob_null;
-       DATA_BLOB response = data_blob_null;
-
-       status = make_srv_encryption_context(SMB_TRANS_ENC_NTLM, &partial_srv_trans_enc_ctx);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-
-       status = auth_ntlmssp_update(partial_srv_trans_enc_ctx->auth_ntlmssp_state, secblob, &chal);
-
-       /* status here should be NT_STATUS_MORE_PROCESSING_REQUIRED
-        * for success ... */
-
-       if (spnego_wrap) {
-               response = spnego_gen_auth_response(&chal, status, OID_NTLMSSP);
-               data_blob_free(&chal);
-       } else {
-               /* Return the raw blob. */
-               response = chal;
-       }
-
-       SAFE_FREE(*ppdata);
-       *ppdata = response.data;
-       *p_data_size = response.length;
-       return status;
-}
-
-/******************************************************************************
- Do the SPNEGO encryption negotiation. Parameters are in/out.
- Based off code in smbd/sesssionsetup.c
- Until success we do everything on the partial enc ctx.
-******************************************************************************/
-
-static NTSTATUS srv_enc_spnego_negotiate(connection_struct *conn,
-                                       unsigned char **ppdata,
-                                       size_t *p_data_size,
-                                       unsigned char **pparam,
-                                       size_t *p_param_size)
-{
-       NTSTATUS status;
-       DATA_BLOB blob = data_blob_null;
-       DATA_BLOB secblob = data_blob_null;
-       BOOL got_kerberos_mechanism = False;
-
-       blob = data_blob_const(*ppdata, *p_data_size);
-
-       status = parse_spnego_mechanisms(blob, &secblob, &got_kerberos_mechanism);
-       if (!NT_STATUS_IS_OK(status)) {
-               return nt_status_squash(status);
-       }
-
-       /* We should have no partial context at this point. */
-
-       srv_free_encryption_context(&partial_srv_trans_enc_ctx);
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-       if (got_kerberos_mechanism && lp_use_kerberos_keytab() ) {
-               status = srv_enc_spnego_gss_negotiate(ppdata, p_data_size, secblob);
-       } else 
-#endif
-       {
-               status = srv_enc_ntlm_negotiate(ppdata, p_data_size, secblob, True);
-       }
-
-       data_blob_free(&secblob);
-
-       if (!NT_STATUS_EQUAL(status,NT_STATUS_MORE_PROCESSING_REQUIRED) && !NT_STATUS_IS_OK(status)) {
-               srv_free_encryption_context(&partial_srv_trans_enc_ctx);
-               return nt_status_squash(status);
-       }
-
-       if (NT_STATUS_IS_OK(status)) {
-               /* Return the context we're using for this encryption state. */
-               if (!(*pparam = SMB_MALLOC_ARRAY(unsigned char, 2))) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-               SSVAL(*pparam,0,partial_srv_trans_enc_ctx->es->enc_ctx_num);
-               *p_param_size = 2;
-       }
-
-       return status;
-}
-
-/******************************************************************************
- Complete a SPNEGO encryption negotiation. Parameters are in/out.
- We only get this for a NTLM auth second stage.
-******************************************************************************/
-
-static NTSTATUS srv_enc_spnego_ntlm_auth(connection_struct *conn,
-                                       unsigned char **ppdata,
-                                       size_t *p_data_size,
-                                       unsigned char **pparam,
-                                       size_t *p_param_size)
-{
-       NTSTATUS status;
-       DATA_BLOB blob = data_blob_null;
-       DATA_BLOB auth = data_blob_null;
-       DATA_BLOB auth_reply = data_blob_null;
-       DATA_BLOB response = data_blob_null;
-       struct smb_srv_trans_enc_ctx *ec = partial_srv_trans_enc_ctx;
-
-       /* We must have a partial context here. */
-
-       if (!ec || !ec->es || ec->auth_ntlmssp_state == NULL || ec->es->smb_enc_type != SMB_TRANS_ENC_NTLM) {
-               srv_free_encryption_context(&partial_srv_trans_enc_ctx);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       blob = data_blob_const(*ppdata, *p_data_size);
-       if (!spnego_parse_auth(blob, &auth)) {
-               srv_free_encryption_context(&partial_srv_trans_enc_ctx);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       status = auth_ntlmssp_update(ec->auth_ntlmssp_state, auth, &auth_reply);
-       data_blob_free(&auth);
-
-       response = spnego_gen_auth_response(&auth_reply, status, OID_NTLMSSP);
-       data_blob_free(&auth_reply);
-
-       if (NT_STATUS_IS_OK(status)) {
-               /* Return the context we're using for this encryption state. */
-               if (!(*pparam = SMB_MALLOC_ARRAY(unsigned char, 2))) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-               SSVAL(*pparam,0,ec->es->enc_ctx_num);
-               *p_param_size = 2;
-       }
-
-       SAFE_FREE(*ppdata);
-       *ppdata = response.data;
-       *p_data_size = response.length;
-       return status;
-}
-
-/******************************************************************************
- Raw NTLM encryption negotiation. Parameters are in/out.
- This function does both steps.
-******************************************************************************/
-
-static NTSTATUS srv_enc_raw_ntlm_auth(connection_struct *conn,
-                                       unsigned char **ppdata,
-                                       size_t *p_data_size,
-                                       unsigned char **pparam,
-                                       size_t *p_param_size)
-{
-       NTSTATUS status;
-       DATA_BLOB blob = data_blob_const(*ppdata, *p_data_size);
-       DATA_BLOB response = data_blob_null;
-       struct smb_srv_trans_enc_ctx *ec;
-
-       if (!partial_srv_trans_enc_ctx) {
-               /* This is the initial step. */
-               status = srv_enc_ntlm_negotiate(ppdata, p_data_size, blob, False);
-               if (!NT_STATUS_EQUAL(status,NT_STATUS_MORE_PROCESSING_REQUIRED) && !NT_STATUS_IS_OK(status)) {
-                       srv_free_encryption_context(&partial_srv_trans_enc_ctx);
-                       return nt_status_squash(status);
-               }
-               return status;
-       }
-
-       ec = partial_srv_trans_enc_ctx;
-       if (!ec || !ec->es || ec->auth_ntlmssp_state == NULL || ec->es->smb_enc_type != SMB_TRANS_ENC_NTLM) {
-               srv_free_encryption_context(&partial_srv_trans_enc_ctx);
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       /* Second step. */
-       status = auth_ntlmssp_update(partial_srv_trans_enc_ctx->auth_ntlmssp_state, blob, &response);
-
-       if (NT_STATUS_IS_OK(status)) {
-               /* Return the context we're using for this encryption state. */
-               if (!(*pparam = SMB_MALLOC_ARRAY(unsigned char, 2))) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-               SSVAL(*pparam,0,ec->es->enc_ctx_num);
-               *p_param_size = 2;
-       }
-
-       /* Return the raw blob. */
-       SAFE_FREE(*ppdata);
-       *ppdata = response.data;
-       *p_data_size = response.length;
-       return status;
-}
-
-/******************************************************************************
- Do the SPNEGO encryption negotiation. Parameters are in/out.
-******************************************************************************/
-
-NTSTATUS srv_request_encryption_setup(connection_struct *conn,
-                                       unsigned char **ppdata,
-                                       size_t *p_data_size,
-                                       unsigned char **pparam,
-                                       size_t *p_param_size)
-{
-       unsigned char *pdata = *ppdata;
-
-       SAFE_FREE(*pparam);
-       *p_param_size = 0;
-
-       if (*p_data_size < 1) {
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       if (pdata[0] == ASN1_APPLICATION(0)) {
-               /* its a negTokenTarg packet */
-               return srv_enc_spnego_negotiate(conn, ppdata, p_data_size, pparam, p_param_size);
-       }
-
-       if (pdata[0] == ASN1_CONTEXT(1)) {
-               /* It's an auth packet */
-               return srv_enc_spnego_ntlm_auth(conn, ppdata, p_data_size, pparam, p_param_size);
-       }
-
-       /* Maybe it's a raw unwrapped auth ? */
-       if (*p_data_size < 7) {
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       if (strncmp((char *)pdata, "NTLMSSP", 7) == 0) {
-               return srv_enc_raw_ntlm_auth(conn, ppdata, p_data_size, pparam, p_param_size);
-       }
-
-       DEBUG(1,("srv_request_encryption_setup: Unknown packet\n"));
-
-       return NT_STATUS_LOGON_FAILURE;
-}
-
-/******************************************************************************
- Negotiation was successful - turn on server-side encryption.
-******************************************************************************/
-
-static NTSTATUS check_enc_good(struct smb_srv_trans_enc_ctx *ec)
-{
-       if (!ec || !ec->es) {
-               return NT_STATUS_LOGON_FAILURE;
-       }
-
-       if (ec->es->smb_enc_type == SMB_TRANS_ENC_NTLM) {
-               if ((ec->es->s.ntlmssp_state->neg_flags & (NTLMSSP_NEGOTIATE_SIGN|NTLMSSP_NEGOTIATE_SEAL)) !=
-                               (NTLMSSP_NEGOTIATE_SIGN|NTLMSSP_NEGOTIATE_SEAL)) {
-                       return NT_STATUS_INVALID_PARAMETER;
-               }
-       }
-       /* Todo - check gssapi case. */
-
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Negotiation was successful - turn on server-side encryption.
-******************************************************************************/
-
-NTSTATUS srv_encryption_start(connection_struct *conn)
-{
-       NTSTATUS status;
-
-       /* Check that we are really doing sign+seal. */
-       status = check_enc_good(partial_srv_trans_enc_ctx);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-       /* Throw away the context we're using currently (if any). */
-       srv_free_encryption_context(&srv_trans_enc_ctx);
-
-       /* Steal the partial pointer. Deliberate shallow copy. */
-       srv_trans_enc_ctx = partial_srv_trans_enc_ctx;
-       srv_trans_enc_ctx->es->enc_on = True;
-
-       partial_srv_trans_enc_ctx = NULL;
-       return NT_STATUS_OK;
-}
-
-/******************************************************************************
- Shutdown all server contexts.
-******************************************************************************/
-
-void server_encryption_shutdown(void)
-{
-       srv_free_encryption_context(&partial_srv_trans_enc_ctx);
-       srv_free_encryption_context(&srv_trans_enc_ctx);
-}
index 72eeb7ee6a8f20c46aabc0b6ca4253a74df0d274..0f47a550e9621af04ea87e458bd53a9bc9aedcc2 100644 (file)
@@ -4,7 +4,6 @@
    Copyright (C) Andrew Tridgell               1992-1998
    Copyright (C) Martin Pool                   2002
    Copyright (C) Jelmer Vernooij               2002-2003
-   Copyright (C) James Peach                   2007
    
    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
@@ -293,34 +292,26 @@ static BOOL allowable_number_of_smbd_processes(void)
        return num_children < max_processes;
 }
 
-/****************************************************************************
- Are we idle enough that we could safely exit?
-****************************************************************************/
-
-static BOOL smbd_is_idle(void)
-{
-       /* Currently we define "idle" as having no client connections. */
-       return count_all_current_connections() == 0;
-}
-
 /****************************************************************************
  Open the socket communication.
 ****************************************************************************/
 
-static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_ports)
+static BOOL open_sockets_smbd(BOOL is_daemon, BOOL interactive, const char *smb_ports)
 {
+       int num_interfaces = iface_count();
        int num_sockets = 0;
        int fd_listenset[FD_SETSIZE];
        fd_set listen_set;
        int s;
        int maxfd = 0;
        int i;
-       struct timeval idle_timeout = timeval_zero();
+       char *ports;
 
-       if (server_mode == SERVER_MODE_INETD) {
+       if (!is_daemon) {
                return open_sockets_inetd();
        }
 
+               
 #ifdef HAVE_ATEXIT
        {
                static int atexit_set;
@@ -333,21 +324,116 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
 
        /* Stop zombies */
        CatchSignal(SIGCLD, sig_cld);
-
+                               
        FD_ZERO(&listen_set);
 
-       /* At this point, it doesn't matter what daemon mode we are in, we
-        * need some sockets to listen on.
-        */
-       num_sockets = smbd_sockinit(smb_ports, fd_listenset, &idle_timeout);
-       if (num_sockets == 0) {
-               return False;
+       /* use a reasonable default set of ports - listing on 445 and 139 */
+       if (!smb_ports) {
+               ports = lp_smb_ports();
+               if (!ports || !*ports) {
+                       ports = smb_xstrdup(SMB_PORTS);
+               } else {
+                       ports = smb_xstrdup(ports);
+               }
+       } else {
+               ports = smb_xstrdup(smb_ports);
        }
 
-       for (i = 0; i < num_sockets; ++i) {
-               FD_SET(fd_listenset[i], &listen_set);
-               maxfd = MAX(maxfd, fd_listenset[i]);
-       }
+       if (lp_interfaces() && lp_bind_interfaces_only()) {
+               /* We have been given an interfaces line, and been 
+                  told to only bind to those interfaces. Create a
+                  socket per interface and bind to only these.
+               */
+               
+               /* Now open a listen socket for each of the
+                  interfaces. */
+               for(i = 0; i < num_interfaces; i++) {
+                       struct in_addr *ifip = iface_n_ip(i);
+                       fstring tok;
+                       const char *ptr;
+
+                       if(ifip == NULL) {
+                               DEBUG(0,("open_sockets_smbd: interface %d has NULL IP address !\n", i));
+                               continue;
+                       }
+
+                       for (ptr=ports; next_token(&ptr, tok, " \t,", sizeof(tok)); ) {
+                               unsigned port = atoi(tok);
+                               if (port == 0 || port > 0xffff) {
+                                       continue;
+                               }
+                               s = fd_listenset[num_sockets] = open_socket_in(SOCK_STREAM, port, 0, ifip->s_addr, True);
+                               if(s == -1)
+                                       return False;
+
+                               /* ready to listen */
+                               set_socket_options(s,"SO_KEEPALIVE"); 
+                               set_socket_options(s,user_socket_options);
+     
+                               /* Set server socket to non-blocking for the accept. */
+                               set_blocking(s,False); 
+                               if (listen(s, SMBD_LISTEN_BACKLOG) == -1) {
+                                       DEBUG(0,("listen: %s\n",strerror(errno)));
+                                       close(s);
+                                       return False;
+                               }
+                               FD_SET(s,&listen_set);
+                               maxfd = MAX( maxfd, s);
+
+                               num_sockets++;
+                               if (num_sockets >= FD_SETSIZE) {
+                                       DEBUG(0,("open_sockets_smbd: Too many sockets to bind to\n"));
+                                       return False;
+                               }
+                       }
+               }
+       } else {
+               /* Just bind to 0.0.0.0 - accept connections
+                  from anywhere. */
+
+               fstring tok;
+               const char *ptr;
+
+               num_interfaces = 1;
+               
+               for (ptr=ports; next_token(&ptr, tok, " \t,", sizeof(tok)); ) {
+                       unsigned port = atoi(tok);
+                       if (port == 0 || port > 0xffff) continue;
+                       /* open an incoming socket */
+                       s = open_socket_in(SOCK_STREAM, port, 0,
+                                          interpret_addr(lp_socket_address()),True);
+                       if (s == -1)
+                               return(False);
+               
+                       /* ready to listen */
+                       set_socket_options(s,"SO_KEEPALIVE"); 
+                       set_socket_options(s,user_socket_options);
+                       
+                       /* Set server socket to non-blocking for the accept. */
+                       set_blocking(s,False); 
+                       if (listen(s, SMBD_LISTEN_BACKLOG) == -1) {
+                               DEBUG(0,("open_sockets_smbd: listen: %s\n",
+                                        strerror(errno)));
+                               close(s);
+                               return False;
+                       }
+
+                       fd_listenset[num_sockets] = s;
+                       FD_SET(s,&listen_set);
+                       maxfd = MAX( maxfd, s);
+
+                       num_sockets++;
+
+                       if (num_sockets >= FD_SETSIZE) {
+                               DEBUG(0,("open_sockets_smbd: Too many sockets to bind to\n"));
+                               return False;
+                       }
+               }
+       } 
+
+       SAFE_FREE(ports);
 
 
        /* Setup the main smbd so that we can get messages. Note that
@@ -380,7 +466,7 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
           for each incoming connection */
        DEBUG(2,("waiting for a connection\n"));
        while (1) {
-               struct timeval now;
+               struct timeval now, idle_timeout;
                fd_set r_fds, w_fds;
                int num;
                
@@ -396,6 +482,8 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                        }
                }
 
+               idle_timeout = timeval_zero();
+
                memcpy((char *)&r_fds, (char *)&listen_set, 
                       sizeof(listen_set));
                FD_ZERO(&w_fds);
@@ -405,21 +493,9 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                                         &r_fds, &w_fds, &idle_timeout,
                                         &maxfd);
 
-               if (timeval_is_zero(&idle_timeout)) {
-                       num = sys_select(maxfd + 1, &r_fds, &w_fds,
-                                       NULL, NULL);
-               } else {
-                       num = sys_select(maxfd + 1, &r_fds, &w_fds,
-                                       NULL, &idle_timeout);
-
-                       /* If the idle timeout fired and we are idle, exit
-                        * gracefully. We expect to be running under a process
-                        * controller that will restart us if necessry.
-                        */
-                       if (num == 0 && smbd_is_idle()) {
-                               exit_server_cleanly("idle timeout");
-                       }
-               }
+               num = sys_select(maxfd+1,&r_fds,&w_fds,NULL,
+                                timeval_is_zero(&idle_timeout) ?
+                                NULL : &idle_timeout);
 
                if (num == -1 && errno == EINTR) {
                        if (got_sig_term) {
@@ -436,7 +512,7 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
 
                        continue;
                }
-
+               
                if (run_events(smbd_event_context(), num, &r_fds, &w_fds)) {
                        continue;
                }
@@ -476,13 +552,8 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                        /* Ensure child is set to blocking mode */
                        set_blocking(smbd_server_fd(),True);
 
-                       /* In interactive mode, return with a connected socket.
-                        * Foreground and daemon modes should fork worker
-                        * processes.
-                        */
-                       if (server_mode == SERVER_MODE_INTERACTIVE) {
+                       if (smbd_server_fd() != -1 && interactive)
                                return True;
-                       }
                        
                        if (allowable_number_of_smbd_processes() &&
                            smbd_server_fd() != -1 &&
@@ -694,8 +765,6 @@ static void exit_server_common(enum server_exit_reason how,
        locking_end();
        printing_end();
 
-       server_encryption_shutdown();
-
        if (how != SERVER_EXIT_NORMAL) {
                int oldlevel = DEBUGLEVEL;
 
@@ -804,26 +873,23 @@ extern void build_options(BOOL screen);
  int main(int argc,const char *argv[])
 {
        /* shall I run as a daemon */
-       BOOL no_process_group = False;
-       BOOL log_stdout = False;
-       const char *ports = NULL;
-       const char *profile_level = NULL;
+       static BOOL is_daemon = False;
+       static BOOL interactive = False;
+       static BOOL Fork = True;
+       static BOOL no_process_group = False;
+       static BOOL log_stdout = False;
+       static char *ports = NULL;
+       static char *profile_level = NULL;
        int opt;
        poptContext pc;
        BOOL print_build_options = False;
 
-       enum smb_server_mode server_mode = SERVER_MODE_DAEMON;
-
        struct poptOption long_options[] = {
        POPT_AUTOHELP
-       {"daemon", 'D', POPT_ARG_VAL, &server_mode, SERVER_MODE_DAEMON,
-               "Become a daemon (default)" },
-       {"interactive", 'i', POPT_ARG_VAL, &server_mode, SERVER_MODE_INTERACTIVE,
-               "Run interactive (not a daemon)"},
-       {"foreground", 'F', POPT_ARG_VAL, &server_mode, SERVER_MODE_FOREGROUND,
-               "Run daemon in foreground (for daemontools, etc.)" },
-       {"no-process-group", '\0', POPT_ARG_VAL, &no_process_group, True,
-               "Don't create a new process group" },
+       {"daemon", 'D', POPT_ARG_VAL, &is_daemon, True, "Become a daemon (default)" },
+       {"interactive", 'i', POPT_ARG_VAL, &interactive, True, "Run interactive (not a daemon)"},
+       {"foreground", 'F', POPT_ARG_VAL, &Fork, False, "Run daemon in foreground (for daemontools, etc.)" },
+       {"no-process-group", '\0', POPT_ARG_VAL, &no_process_group, True, "Don't create a new process group" },
        {"log-stdout", 'S', POPT_ARG_VAL, &log_stdout, True, "Log to stdout" },
        {"build-options", 'b', POPT_ARG_NONE, NULL, 'b', "Print build options" },
        {"port", 'p', POPT_ARG_STRING, &ports, 0, "Listen on the specified ports"},
@@ -870,14 +936,16 @@ extern void build_options(BOOL screen);
 
        set_remote_machine_name("smbd", False);
 
-       if (server_mode == SERVER_MODE_INTERACTIVE) {
+       if (interactive) {
+               Fork = False;
                log_stdout = True;
-               if (DEBUGLEVEL >= 9) {
-                       talloc_enable_leak_report();
-               }
        }
 
-       if (log_stdout && server_mode == SERVER_MODE_DAEMON) {
+       if (interactive && (DEBUGLEVEL >= 9)) {
+               talloc_enable_leak_report();
+       }
+
+       if (log_stdout && Fork) {
                DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
                exit(1);
        }
@@ -967,19 +1035,21 @@ extern void build_options(BOOL screen);
 
        DEBUG(3,( "loaded services\n"));
 
-       if (is_a_socket(0)) {
-               if (server_mode == SERVER_MODE_DAEMON) {
-                       DEBUG(0,("standard input is a socket, "
-                                   "assuming -F option\n"));
-               }
-               server_mode = SERVER_MODE_INETD;
+       if (!is_daemon && !is_a_socket(0)) {
+               if (!interactive)
+                       DEBUG(0,("standard input is not a socket, assuming -D option\n"));
+
+               /*
+                * Setting is_daemon here prevents us from eventually calling
+                * the open_sockets_inetd()
+                */
+
+               is_daemon = True;
        }
 
-       if (server_mode == SERVER_MODE_DAEMON) {
+       if (is_daemon && !interactive) {
                DEBUG( 3, ( "Becoming a daemon.\n" ) );
-               become_daemon(True, no_process_group);
-       } else if (server_mode == SERVER_MODE_FOREGROUND) {
-               become_daemon(False, no_process_group);
+               become_daemon(Fork, no_process_group);
        }
 
 #if HAVE_SETPGID
@@ -987,18 +1057,15 @@ extern void build_options(BOOL screen);
         * If we're interactive we want to set our own process group for
         * signal management.
         */
-       if (server_mode == SERVER_MODE_INTERACTIVE && !no_process_group) {
+       if (interactive && !no_process_group)
                setpgid( (pid_t)0, (pid_t)0);
-       }
 #endif
 
        if (!directory_exist(lp_lockdir(), NULL))
                mkdir(lp_lockdir(), 0755);
 
-       if (server_mode != SERVER_MODE_INETD &&
-           server_mode != SERVER_MODE_INTERACTIVE) {
+       if (is_daemon)
                pidfile_create("smbd");
-       }
 
        /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
 
@@ -1052,10 +1119,9 @@ extern void build_options(BOOL screen);
           running as a daemon -- bad things will happen if
           smbd is launched via inetd and we fork a copy of 
           ourselves here */
-       if (server_mode != SERVER_MODE_INETD &&
-           server_mode != SERVER_MODE_INTERACTIVE) {
+
+       if ( is_daemon && !interactive )
                start_background_queue(); 
-       }
 
        /* Always attempt to initialize DMAPI. We will only use it later if
         * lp_dmapi_support is set on the share, but we need a single global
@@ -1063,9 +1129,8 @@ extern void build_options(BOOL screen);
         */
        dmapi_init_session();
 
-       if (!open_sockets_smbd(server_mode, ports)) {
+       if (!open_sockets_smbd(is_daemon, interactive, ports))
                exit(1);
-       }
 
        /*
         * everything after this point is run after the fork()
@@ -1078,8 +1143,7 @@ extern void build_options(BOOL screen);
        /* Possibly reload the services file. Only worth doing in
         * daemon mode. In inetd mode, we know we only just loaded this.
         */
-       if (server_mode != SERVER_MODE_INETD &&
-           server_mode != SERVER_MODE_INTERACTIVE) {
+       if (is_daemon) {
                reload_services(True);
        }
 
index 4daa2924a27ac4566a9ddcee8fa2d9d932551593..1c46e3776c28442e94b6fc77770d61c314d4c86f 100644 (file)
@@ -312,14 +312,7 @@ static int load_registry_service(const char *servicename)
                TALLOC_FREE(value);
        }
 
-       if (!service_ok(res)) {
-               /* this is actually never reached, since 
-                * service_ok only returns False if the service
-                * entry does not have a service name, and we _know_
-                * we do have a service name here... */
-               res = -1;
-       }
-
+       res = 0;
  error:
 
        TALLOC_FREE(key);
@@ -409,6 +402,10 @@ int find_service(fstring service)
        if (iService < 0) {
        }
 
+       if (iService < 0) {
+               iService = load_registry_service(service);
+       }
+
        /* Is it a usershare service ? */
        if (iService < 0 && *lp_usershare_path()) {
                /* Ensure the name is canonicalized. */
@@ -444,10 +441,6 @@ int find_service(fstring service)
                }
        }
 
-       if (iService < 0) {
-               iService = load_registry_service(service);
-       }
-
        if (iService >= 0) {
                if (!VALID_SNUM(iService)) {
                        DEBUG(0,("Invalid snum %d for %s\n",iService, service));
@@ -789,6 +782,7 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
        conn->veto_list = NULL;
        conn->hide_list = NULL;
        conn->veto_oplock_list = NULL;
+       conn->aio_write_behind_list = NULL;
        string_set(&conn->dirpath,"");
        string_set(&conn->user,user);
 
index c7cdf41fb5b0ed19c4feb1512e6ea68252d91fa7..8dd321fad7c4d8f84e5f91669e92ccb02271ae73 100644 (file)
@@ -201,12 +201,9 @@ BOOL session_claim(user_struct *vuser)
                               sessionid.id_str, sessionid.id_num);
        }
 
-       TALLOC_FREE(rec);
-
        vuser->session_keystr = talloc_strdup(vuser, keystr);
        if (!vuser->session_keystr) {
-               DEBUG(0, ("session_claim:  talloc_strdup() failed for "
-                         "session_keystr\n"));
+               DEBUG(0, ("session_claim:  talloc_strdup() failed for session_keystr\n"));
                return False;
        }
        return True;
diff --git a/source3/smbd/sockinit.c b/source3/smbd/sockinit.c
deleted file mode 100644 (file)
index 598bbd1..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
-   Unix SMB/CIFS implementation.
-
-   Copyright (C) Andrew Tridgell               1992-1998
-   Copyright (C) James Peach                   2007
-
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "smb_launchd.h"
-
-extern pstring user_socket_options;
-
-static int init_sockets_smbd(const char *smb_ports, int listenset[FD_SETSIZE])
-{
-       int num_interfaces = iface_count();
-       char * ports;
-       int num_sockets = 0;
-       int i, s;
-
-       /* use a reasonable default set of ports - listing on 445 and 139 */
-       if (!smb_ports) {
-               ports = lp_smb_ports();
-               if (!ports || !*ports) {
-                       ports = smb_xstrdup(SMB_PORTS);
-               } else {
-                       ports = smb_xstrdup(ports);
-               }
-       } else {
-               ports = smb_xstrdup(smb_ports);
-       }
-
-       if (lp_interfaces() && lp_bind_interfaces_only()) {
-               /* We have been given an interfaces line, and been
-                  told to only bind to those interfaces. Create a
-                  socket per interface and bind to only these.
-               */
-
-               /* Now open a listen socket for each of the
-                  interfaces. */
-               for(i = 0; i < num_interfaces; i++) {
-                       struct in_addr *ifip = iface_n_ip(i);
-                       fstring tok;
-                       const char *ptr;
-
-                       if(ifip == NULL) {
-                               DEBUG(0,("init_sockets_smbd: interface %d has "
-                                       "NULL IP address !\n", i));
-                               continue;
-                       }
-
-                       for (ptr=ports; next_token(&ptr, tok, " \t,",
-                                               sizeof(tok)); ) {
-                               unsigned port = atoi(tok);
-                               if (port == 0 || port > 0xffff) {
-                                       continue;
-                               }
-                               s = listenset[num_sockets] =
-                                       open_socket_in(SOCK_STREAM,
-                                                       port,
-                                                       0,
-                                                       ifip->s_addr,
-                                                       True);
-                               if(s == -1)
-                                       return 0;
-
-                               /* ready to listen */
-                               set_socket_options(s,"SO_KEEPALIVE");
-                               set_socket_options(s,user_socket_options);
-
-                               /* Set server socket to non-blocking
-                                * for the accept. */
-                               set_blocking(s,False);
-
-                               if (listen(s, SMBD_LISTEN_BACKLOG) == -1) {
-                                       DEBUG(0,("listen: %s\n",
-                                               strerror(errno)));
-                                       close(s);
-                                       return 0;
-                               }
-
-                               num_sockets++;
-                               if (num_sockets >= FD_SETSIZE) {
-                                       DEBUG(0,("init_sockets_smbd: "
-                                       "Too many sockets to bind to\n"));
-                                       return 0;
-                               }
-                       }
-               }
-       } else {
-               /* Just bind to 0.0.0.0 - accept connections
-                  from anywhere. */
-
-               fstring tok;
-               const char *ptr;
-
-               num_interfaces = 1;
-
-               for (ptr=ports; next_token(&ptr, tok, " \t,", sizeof(tok)); ) {
-                       unsigned port = atoi(tok);
-                       if (port == 0  || port > 0xffff) continue;
-                       /* open an incoming socket */
-                       s = open_socket_in(SOCK_STREAM, port, 0,
-                                          interpret_addr(lp_socket_address()),
-                                          True);
-                       if (s == -1)
-                               return 0;
-
-                       /* ready to listen */
-                       set_socket_options(s,"SO_KEEPALIVE");
-                       set_socket_options(s,user_socket_options);
-
-                       /* Set server socket to non-blocking for the accept. */
-                       set_blocking(s,False);
-
-                       if (listen(s, SMBD_LISTEN_BACKLOG) == -1) {
-                               DEBUG(0,("init_sockets_smbd: listen: %s\n",
-                                        strerror(errno)));
-                               close(s);
-                               return 0;
-                       }
-
-                       listenset[num_sockets] = s;
-                       num_sockets++;
-
-                       if (num_sockets >= FD_SETSIZE) {
-                               DEBUG(0,("init_sockets_smbd: "
-                                       "Too many sockets to bind to\n"));
-                               return 0;
-                       }
-               }
-       }
-
-       SAFE_FREE(ports);
-       return num_sockets;
-}
-
-static int init_sockets_launchd(const struct smb_launch_info *linfo,
-                               const char * smb_ports,
-                               int listenset[FD_SETSIZE])
-{
-       int num_sockets;
-       int i;
-
-       /* The launchd service configuration does not have to provide sockets,
-        * even though it's basically useless without it.
-        */
-       if (!linfo->num_sockets) {
-               return init_sockets_smbd(smb_ports, listenset);
-       }
-
-       /* Make sure we don't get more sockets than we can handle. */
-       num_sockets = MIN(FD_SETSIZE, linfo->num_sockets);
-       memcpy(listenset, linfo->socket_list, num_sockets * sizeof(int));
-
-       /* Get the sockets ready. This could be hoisted into
-        * open_sockets_smbd(), but the order of socket operations might
-        * matter for some platforms, so this approach seems less risky.
-        *      --jpeach
-        */
-       for (i = 0; i < num_sockets; ++i) {
-               set_socket_options(listenset[i], "SO_KEEPALIVE");
-               set_socket_options(listenset[i], user_socket_options);
-
-               /* Set server socket to non-blocking for the accept. */
-               set_blocking(listenset[i], False);
-       }
-
-       return num_sockets;
-}
-
-/* This function is responsible for opening (or retrieving) all the sockets we
- * smbd will be listening on. It should apply all the configured socket options
- * and return the number of valid sockets in listenset.
- */
-int smbd_sockinit(const char *cmdline_ports, int listenset[FD_SETSIZE],
-                       struct timeval *idle)
-{
-       int num_sockets;
-       struct smb_launch_info linfo;
-
-       ZERO_STRUCTP(idle);
-
-       if (smb_launchd_checkin(&linfo)) {
-               /* We are running under launchd and launchd has
-                * opened some sockets for us.
-                */
-               num_sockets = init_sockets_launchd(&linfo,
-                                           cmdline_ports,
-                                           listenset);
-               idle->tv_sec = linfo.idle_timeout_secs;
-               smb_launchd_checkout(&linfo);
-       } else {
-               num_sockets = init_sockets_smbd(cmdline_ports,
-                                           listenset);
-       }
-
-       return num_sockets;
-}
index fbcf249ffb187b8e1893c09af4774d94707aecbd..68e61033ae1a30b482073a53ca62fb534a52afef 100644 (file)
@@ -79,7 +79,7 @@ ssize_t message_push_string(uint8 **outbuf, const char *str, int flags)
                DEBUG(0, ("srvstr_push failed\n"));
                return -1;
        }
-       set_message_bcc(NULL, (char *)tmp, smb_buflen(tmp) + result);
+       set_message_bcc((char *)tmp, smb_buflen(tmp) + result);
 
        *outbuf = tmp;
 
index ada4868bf887b35a6b66ac64bade89e78237cc75..7392271b483ddf3b33a2b70c2848edf42da3d75b 100644 (file)
@@ -2733,9 +2733,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                                        CIFS_UNIX_FCNTL_LOCKS_CAP|
                                        CIFS_UNIX_EXTATTR_CAP|
                                        CIFS_UNIX_POSIX_PATH_OPERATIONS_CAP|
-                                       /* Ensure we don't do this on signed or sealed data. */
-                                       (srv_is_signing_active() ? 0 : CIFS_UNIX_LARGE_READ_CAP)
-                                       )));
+                                       CIFS_UNIX_LARGE_READ_CAP)));
                        break;
 
                case SMB_QUERY_POSIX_FS_INFO:
@@ -2986,51 +2984,6 @@ cap_low = 0x%x, cap_high = 0x%x\n",
                                }
                                break;
                        }
-               case SMB_REQUEST_TRANSPORT_ENCRYPTION:
-                       {
-                               NTSTATUS status;
-                               size_t param_len = 0;
-                               size_t data_len = total_data;
-
-                               if (!lp_unix_extensions()) {
-                                       reply_nterror(
-                                               req, NT_STATUS_INVALID_LEVEL);
-                                       return;
-                               }
-
-                               DEBUG( 4,("call_trans2setfsinfo: request transport encrption.\n"));
-
-                               status = srv_request_encryption_setup(conn,
-                                                                       (unsigned char **)ppdata,
-                                                                       &data_len,
-                                                                       (unsigned char **)pparams,
-                                                                       &param_len
-                                                                       );
-
-                               if (!NT_STATUS_IS_OK(status)) {
-                                       /*
-                                        * TODO: Check
-                                        * MORE_PROCESSING_REQUIRED, this used
-                                        * to have special handling here.
-                                        */
-                                       reply_nterror(req, status);
-                                       return;
-                               }
-
-                               send_trans2_replies(req,
-                                                   *pparams, param_len,
-                                                   *ppdata, data_len,
-                                                   max_data_bytes);
-
-                               if (NT_STATUS_IS_OK(status)) {
-                                       /* Server-side transport encryption is now *on*. */
-                                       status = srv_encryption_start(conn);
-                                       if (!NT_STATUS_IS_OK(status)) {
-                                               exit_server_cleanly("Failure in setting up encrypted transport");
-                                       }
-                               }
-                               return;
-                       }
                case SMB_FS_QUOTA_INFORMATION:
                        {
                                files_struct *fsp = NULL;
index 7f437407549094ba525366b6ef452d3e222ae133..52174c4d8379484a27ea88e087ecd84a318fe8ce 100644 (file)
@@ -220,13 +220,13 @@ static void uw_pathname(pstring fname, const char *uw_name, const char *uw_defau
        }
 
        /* For u-files and non-explicit w-dir, look for "utmp dir" */
-       if (strlen(dirname) == 0) {
+       if (dirname == 0 || strlen(dirname) == 0) {
                pstrcpy(dirname,lp_utmpdir());
                trim_char(dirname,'\0','/');
        }
 
        /* If explicit directory above, use it */
-       if (strlen(dirname) != 0) {
+       if (dirname != 0 && strlen(dirname) != 0) {
                pstrcpy(fname, dirname);
                pstrcat(fname, "/");
                pstrcat(fname, uw_name);
index ee5a23235ed32bd312bf77b736177121a68d3418..0e500d54817698593b6a348ef9d228abf9bed5d7 100644 (file)
@@ -813,7 +813,7 @@ main()
 
        if((strcmp(c_out1, expected_out) != 0) && 
                (strcmp(c_out2, expected_out) == 0))
-               return 1;
+               exit(1);
 
 #ifdef HAVE_BIGCRYPT
        /*
@@ -842,10 +842,10 @@ main()
 
                if((strcmp(big_c_out1, big_expected_out) != 0) && 
                        (strcmp(big_c_out2, big_expected_out) == 0))
-                       return 1;
+                       exit(1);
 
        }
 #endif
 
-       return 0;
+       exit(0);
 }
index 728f94b6122501eefaa8524802de7b22d5eaf287..3dc12a389739fbeb6cce4d87a2e9b1b961c2f86d 100644 (file)
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
                if (fd == -1) {
                        fprintf(stderr,"ERROR: failed to open %s (errno=%d)\n", 
                                DATA, (int)errno);
-                       return 1;
+                       exit(1);
                }
 
                lock.l_type = F_WRLCK;
@@ -74,9 +74,9 @@ int main(int argc, char *argv[])
                if ((ret == -1) ||
                    (lock.l_type == F_UNLCK)) {
                        fprintf(stderr,"ERROR: lock test failed (ret=%d errno=%d)\n", ret, (int)errno);
-                       return 1;
+                       exit(1);
                } else {
-                       return 0;
+                       exit(0);
                }
        }
 
@@ -86,7 +86,7 @@ int main(int argc, char *argv[])
        if (fd == -1) {
                fprintf(stderr,"ERROR: failed to open %s (errno=%d)\n", 
                        DATA, (int)errno);
-               return 1;
+               exit(1);
        }
 
        lock.l_type = F_WRLCK;
@@ -117,5 +117,5 @@ int main(int argc, char *argv[])
                        status);
        }
 
-       return status;
+       exit(status);
 }
index b218fa9282e8043e2e0326a1021230e743b1a5ae..e5ecd88fd0444af79108cc335c382d5f27bac323 100644 (file)
 #include <sys/fcntl.h>
 #endif
 
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-
 #include <errno.h>
 
 static int sys_waitpid(pid_t pid,int *status,int options)
@@ -44,7 +40,7 @@ int main(int argc, char *argv[])
                sleep(2);
                fd = open64(DATA, O_RDONLY);
 
-               if (fd == -1) return 1;
+               if (fd == -1) exit(1);
 
                lock.l_type = F_WRLCK;
                lock.l_whence = SEEK_SET;
@@ -60,10 +56,10 @@ int main(int argc, char *argv[])
                if ((ret == -1) ||
                    (lock.l_type == F_UNLCK)) {
 /*            printf("No lock conflict\n"); */
-                       return 1;
+                       exit(1);
                } else {
 /*            printf("lock conflict\n"); */
-                       return 0;
+                       exit(0);
                }
        }
 
@@ -96,5 +92,5 @@ int main(int argc, char *argv[])
 
        unlink(DATA);
 
-       return status;
+       exit(status);
 }
index 700d5c8ce54f30154a63d8f307627f080bf2461c..93282782eedb15207ce51e42baaa377c9fc2961a 100644 (file)
@@ -21,7 +21,7 @@ main()
        unlink(DATA);
 
        if (lseek(fd, 0, SEEK_END) == LEN) {
-               return 0;
+               exit(0);
        }
-       return 1;
+       exit(1);
 }
index c73cd21650d75b43375ddb9458542da6839a70d0..343fd5a184f908e0c3d5686f249f76e4de674533 100644 (file)
 #include <unistd.h>
 #endif
 
-#if defined(HAVE_STDLIB_H)
-#include <stdlib.h>
-#endif
-
 #include <sys/types.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -30,7 +26,7 @@ main()
 
        if (sizeof(gid_t) == sizeof(int)) {
                fprintf(stderr,"gid_t and int are the same size\n");
-               return 1;
+               exit(1);
        }
 
        if (ngroups <= 0)
@@ -48,7 +44,7 @@ main()
 
        if (ngroups == 0) {
                printf("WARNING: can't determine getgroups return type\n");
-               return 1;
+               exit(1);
        }
        
        cgroups = (char *)igroups;
@@ -56,15 +52,15 @@ main()
        if (ngroups == 1 && 
            cgroups[2] == 0x42 && cgroups[3] == 0x42) {
                fprintf(stderr,"getgroups returns gid_t\n");
-               return 1;
+               exit(1);
        }
          
        for (i=0;i<ngroups;i++) {
                if (igroups[i] == 0x42424242) {
                        fprintf(stderr,"getgroups returns gid_t\n");
-                       return 1;
+                       exit(1);
                }
        }
 
-       return 0;
+       exit(0);
 }
diff --git a/source3/tests/os2_delete.c b/source3/tests/os2_delete.c
new file mode 100644 (file)
index 0000000..b3aaf67
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+  test readdir/unlink pattern that OS/2 uses
+  tridge@samba.org July 2005
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+
+#define NUM_FILES 700
+#define READDIR_SIZE 100
+#define DELETE_SIZE 4
+
+#define TESTDIR "test.dir"
+
+#define FAILED(d) (fprintf(stderr, "Failed for %s - %s\n", d, strerror(errno)), exit(1), 1)
+
+#ifndef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+
+static void cleanup(void)
+{
+       /* I'm a lazy bastard */
+       system("rm -rf " TESTDIR);
+       mkdir(TESTDIR, 0700) == 0 || FAILED("mkdir");
+}
+
+static void create_files()
+{
+       int i;
+       for (i=0;i<NUM_FILES;i++) {
+               char fname[40];
+               sprintf(fname, TESTDIR "/test%u.txt", i);
+               close(open(fname, O_CREAT|O_RDWR, 0600)) == 0 || FAILED("close");
+       }
+}
+
+static int os2_delete(DIR *d)
+{
+       off_t offsets[READDIR_SIZE];
+       int i, j;
+       struct dirent *de;
+       char names[READDIR_SIZE][30];
+
+       /* scan, remembering offsets */
+       for (i=0, de=readdir(d); 
+            de && i < READDIR_SIZE; 
+            de=readdir(d), i++) {
+               offsets[i] = telldir(d);
+               strcpy(names[i], de->d_name);
+       }
+
+       if (i == 0) {
+               return 0;
+       }
+
+       /* delete the first few */
+       for (j=0; j<MIN(i, DELETE_SIZE); j++) {
+               char fname[40];
+               sprintf(fname, TESTDIR "/%s", names[j]);
+               unlink(fname) == 0 || FAILED("unlink");
+       }
+
+       /* seek to just after the deletion */
+       seekdir(d, offsets[j-1]);
+
+       /* return number deleted */
+       return j;
+}
+
+int main(void)
+{
+       int total_deleted = 0;
+       DIR *d;
+       struct dirent *de;
+
+       cleanup();
+       create_files();
+       
+       d = opendir(TESTDIR);
+
+       /* skip past . and .. */
+       de = readdir(d);
+       strcmp(de->d_name, ".") == 0 || FAILED("match .");
+       de = readdir(d);
+       strcmp(de->d_name, "..") == 0 || FAILED("match ..");
+
+       while (1) {
+               int n = os2_delete(d);
+               if (n == 0) break;
+               total_deleted += n;
+       }
+       closedir(d);
+
+       printf("Deleted %d files of %d\n", total_deleted, NUM_FILES);
+
+       rmdir(TESTDIR) == 0 || FAILED("rmdir");
+
+       return 0;
+}
+/*
+  test readdir/unlink pattern that OS/2 uses
+  tridge@samba.org July 2005
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+
+#define NUM_FILES 700
+#define READDIR_SIZE 100
+#define DELETE_SIZE 4
+
+#define TESTDIR "test.dir"
+
+#define FAILED(d) (fprintf(stderr, "Failed for %s - %s\n", d, strerror(errno)), exit(1), 1)
+
+#ifndef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+
+static void cleanup(void)
+{
+       /* I'm a lazy bastard */
+       system("rm -rf " TESTDIR);
+       mkdir(TESTDIR, 0700) == 0 || FAILED("mkdir");
+}
+
+static void create_files()
+{
+       int i;
+       for (i=0;i<NUM_FILES;i++) {
+               char fname[40];
+               sprintf(fname, TESTDIR "/test%u.txt", i);
+               close(open(fname, O_CREAT|O_RDWR, 0600)) == 0 || FAILED("close");
+       }
+}
+
+static int os2_delete(DIR *d)
+{
+       off_t offsets[READDIR_SIZE];
+       int i, j;
+       struct dirent *de;
+       char names[READDIR_SIZE][30];
+
+       /* scan, remembering offsets */
+       for (i=0, de=readdir(d); 
+            de && i < READDIR_SIZE; 
+            de=readdir(d), i++) {
+               offsets[i] = telldir(d);
+               strcpy(names[i], de->d_name);
+       }
+
+       if (i == 0) {
+               return 0;
+       }
+
+       /* delete the first few */
+       for (j=0; j<MIN(i, DELETE_SIZE); j++) {
+               char fname[40];
+               sprintf(fname, TESTDIR "/%s", names[j]);
+               unlink(fname) == 0 || FAILED("unlink");
+       }
+
+       /* seek to just after the deletion */
+       seekdir(d, offsets[j-1]);
+
+       /* return number deleted */
+       return j;
+}
+
+int main(void)
+{
+       int total_deleted = 0;
+       DIR *d;
+       struct dirent *de;
+
+       cleanup();
+       create_files();
+       
+       d = opendir(TESTDIR);
+
+       /* skip past . and .. */
+       de = readdir(d);
+       strcmp(de->d_name, ".") == 0 || FAILED("match .");
+       de = readdir(d);
+       strcmp(de->d_name, "..") == 0 || FAILED("match ..");
+
+       while (1) {
+               int n = os2_delete(d);
+               if (n == 0) break;
+               total_deleted += n;
+       }
+       closedir(d);
+
+       printf("Deleted %d files of %d\n", total_deleted, NUM_FILES);
+
+       rmdir(TESTDIR) == 0 || FAILED("rmdir");
+
+       return 0;
+}
index 6af9ba0b39414321f5af15b596e7059346aebc14..fcef75d0d615918ca6c1caf987c17924809ce02b 100644 (file)
@@ -22,7 +22,7 @@ main()
        int fd = open(DATA,O_RDWR|O_CREAT|O_TRUNC,0666);
        int count=7;
 
-       if (fd == -1) return 1;
+       if (fd == -1) exit(1);
 
        for (i=0;i<10000;i++) {
                write(fd,&i,sizeof(i));
@@ -32,7 +32,7 @@ main()
 
        if (fork() == 0) {
                fd = open(DATA,O_RDWR);
-               if (fd == -1) return 1;
+               if (fd == -1) exit(1);
 
                buf = (int *)mmap(NULL, 10000*sizeof(int), 
                                   (PROT_READ | PROT_WRITE), 
@@ -41,21 +41,21 @@ main()
 
                while (count-- && buf[9124] != 55732) sleep(1);
 
-               if (count <= 0) return 1;
+               if (count <= 0) exit(1);
 
                buf[1763] = 7268;
-               return 0;
+               exit(0);
        }
 
        fd = open(DATA,O_RDWR);
-       if (fd == -1) return 1;
+       if (fd == -1) exit(1);
 
        buf = (int *)mmap(NULL, 10000*sizeof(int), 
                           (PROT_READ | PROT_WRITE), 
                           MAP_FILE | MAP_SHARED, 
                           fd, 0);
 
-       if (buf == (int *)-1) return 1;
+       if (buf == (int *)-1) exit(1);
 
        buf[9124] = 55732;
 
@@ -63,6 +63,6 @@ main()
 
        unlink(DATA);
                
-       if (count > 0) return 0;
-       return 1;
+       if (count > 0) exit(0);
+       exit(1);
 }
index c3da22f1708eef23b472d5639be3cb903278b87f..8fcde7bd998e91456823fbc472886cab4047be29 100644 (file)
@@ -1,4 +1,3 @@
-#include <stdlib.h>
 #include <stdio.h>
 
 main()
index ae368a139807d7aa393e9622052f3ff6a68976d5..2723637a0ffc0d6af5d53018e0436bc3dba766d5 100644 (file)
@@ -1,4 +1,3 @@
-#include <stdlib.h>
 main()
 {
        exit(0);
index ba384ae36260a84815dd4edbfdc9cf22870787e2..f2765d68f67decfd2709fa9db9711bb699534296 100644 (file)
@@ -1,5 +1,4 @@
-/*
- * -*- c-file-style: "linux" -*-
+/* -*- c-file-style: "linux" -*-
  *
  * Try creating a Unix-domain socket, opening it, and reading from it.
  * The POSIX name for these is AF_LOCAL/PF_LOCAL.
@@ -9,17 +8,15 @@
  * on which they are broken under some conditions, such as RedHat 7.0
  * (unpatched).  We can't build WinBind there at the moment.
  *
- * Martin Pool <mbp@samba.org>, June 2000.
- */
+ * Coding standard says to always use exit() for this, not return, so
+ * we do.
+ *
+ * Martin Pool <mbp@samba.org>, June 2000. */
 
 /* TODO: Look for AF_LOCAL (most standard), AF_UNIX, and AF_FILE. */
 
 #include <stdio.h>
 
-#if defined(HAVE_UNISTD_H)
-#include <unistd.h>
-#endif
-
 #ifdef HAVE_SYS_SOCKET_H
 #  include <sys/socket.h>
 #endif
@@ -51,7 +48,7 @@ static int bind_socket(char const *filename)
        /* Create the socket. */
        if ((sock_fd = socket(PF_LOCAL, SOCK_STREAM, 0)) < 0) {
                perror ("socket(PF_LOCAL, SOCK_STREAM)");
-               return 1;
+               exit(1);
        }
      
        /* Bind a name to the socket. */
@@ -70,7 +67,7 @@ static int bind_socket(char const *filename)
      
        if (bind(sock_fd, (struct sockaddr *) &name, size) < 0) {
                perror ("bind");
-               return 1;
+               exit(1);
        }
 
        return sock_fd;
@@ -87,10 +84,10 @@ int main(void)
        alarm(15);              /* secs */
 
        if ((sock_fd = bind_socket(filename)) < 0)
-               return 1;
+               exit(1);
 
        /* the socket will be deleted when autoconf cleans up these
            files. */
 
-       return 0;
+       exit(0);
 }
index 8fbd1836063e0400fb5c025d831ee020a8720d87..795cc4d71a7f1bf63eb7ffd60d3a4818e0b2e86d 100644 (file)
@@ -66,8 +66,6 @@ enum netdom_domain_t { ND_TYPE_NT4, ND_TYPE_AD };
 /* INCLUDE FILES */
 
 #include "utils/net_proto.h"
-#include "libmsrpc.h"
-
  
 /* MACROS & DEFINES */
 
index a8683e0375f4e4c0469eec64b60a021e9229cc5e..cbccc95b476a92c820a0d5534f5fd7114054b7e0 100644 (file)
@@ -3018,16 +3018,13 @@ static NTSTATUS rpc_share_add_internals(const DOM_SID *domain_sid,
                                        TALLOC_CTX *mem_ctx,int argc,
                                        const char **argv)
 {
-       NTSTATUS result;
+       WERROR result;
        char *sharename;
        char *path;
        uint32 type = STYPE_DISKTREE; /* only allow disk shares to be added */
        uint32 num_users=0, perms=0;
        char *password=NULL; /* don't allow a share password */
        uint32 level = 2;
-       uint32 parm_error;
-       union srvsvc_NetShareInfo info;
-       struct srvsvc_NetShareInfo2 info2;
 
        if ((sharename = talloc_strdup(mem_ctx, argv[0])) == NULL) {
                return NT_STATUS_NO_MEMORY;
@@ -3038,20 +3035,11 @@ static NTSTATUS rpc_share_add_internals(const DOM_SID *domain_sid,
                return NT_STATUS_UNSUCCESSFUL;
        *path++ = '\0';
 
-       info.info2 = &info2;
-
-       info2.type = type;
-       info2.comment = opt_comment;
-       info2.permissions = perms;
-       info2.max_users = opt_maxusers;
-       info2.current_users = num_users;
-       info2.path = path;
-       info2.password = password;
-       info2.name = sharename;
-
-       result = rpccli_srvsvc_NetShareAdd(pipe_hnd, mem_ctx, NULL, level, 
-                                          info, &parm_error);
-       return result;
+       result = rpccli_srvsvc_net_share_add(pipe_hnd, mem_ctx, sharename, type,
+                                         opt_comment, perms, opt_maxusers,
+                                         num_users, path, password, 
+                                         level, NULL);
+       return werror_to_ntstatus(result);
 }
 
 static int rpc_share_add(int argc, const char **argv)
@@ -3088,7 +3076,10 @@ static NTSTATUS rpc_share_del_internals(const DOM_SID *domain_sid,
                                        int argc,
                                        const char **argv)
 {
-       return rpccli_srvsvc_NetShareDel(pipe_hnd, mem_ctx, NULL, argv[0], 0);
+       WERROR result;
+
+       result = rpccli_srvsvc_net_share_del(pipe_hnd, mem_ctx, argv[0]);
+       return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
 }
 
 /** 
@@ -3115,83 +3106,169 @@ static int rpc_share_delete(int argc, const char **argv)
 /**
  * Formatted print of share info
  *
- * @param info1  pointer to struct srvsvc_NetShareInfo1 to format
+ * @param info1  pointer to SRV_SHARE_INFO_1 to format
  **/
  
-static void display_share_info_1(struct srvsvc_NetShareInfo1 *info1)
+static void display_share_info_1(SRV_SHARE_INFO_1 *info1)
 {
+       fstring netname = "", remark = "";
+
+       rpcstr_pull_unistr2_fstring(netname, &info1->info_1_str.uni_netname);
+       rpcstr_pull_unistr2_fstring(remark, &info1->info_1_str.uni_remark);
+
        if (opt_long_list_entries) {
                d_printf("%-12s %-8.8s %-50s\n",
-                        info1->name, share_type[info1->type & ~(STYPE_TEMPORARY|STYPE_HIDDEN)],
-                        info1->comment ? info1->comment : "");
+                        netname, share_type[info1->info_1.type & ~(STYPE_TEMPORARY|STYPE_HIDDEN)], remark);
        } else {
-               d_printf("%s\n", info1->name);
+               d_printf("%s\n", netname);
        }
 
 }
 
-static NTSTATUS get_share_info(struct rpc_pipe_client *pipe_hnd,
+static WERROR get_share_info(struct rpc_pipe_client *pipe_hnd,
                                TALLOC_CTX *mem_ctx, 
                                uint32 level,
                                int argc,
                                const char **argv, 
-                               union srvsvc_NetShareCtr *ctr, 
-                               uint32 *numentries)
+                               SRV_SHARE_INFO_CTR *ctr)
 {
-       union srvsvc_NetShareInfo info;
-       NTSTATUS status;
-
-       switch(level) {
-       case 1:
-               if (!(ctr->ctr1 = TALLOC_ZERO_P(
-                             mem_ctx, struct srvsvc_NetShareCtr1))) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-               break;
-       case 502:
-               if (!(ctr->ctr502 = TALLOC_ZERO_P(
-                             mem_ctx, struct srvsvc_NetShareCtr502))) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-               break;
-       default:
-               return NT_STATUS_INVALID_LEVEL;
-               break;
-       }
+       WERROR result;
+       SRV_SHARE_INFO info;
 
        /* no specific share requested, enumerate all */
        if (argc == 0) {
-               uint32 hnd = 0;
 
-               return rpccli_srvsvc_NetShareEnum(pipe_hnd, mem_ctx, NULL,
-                                                 &level, ctr, 0xffffffff,
-                                                 numentries, &hnd);
+               ENUM_HND hnd;
+               uint32 preferred_len = 0xffffffff;
+
+               init_enum_hnd(&hnd, 0);
+
+               return rpccli_srvsvc_net_share_enum(pipe_hnd, mem_ctx, level, ctr, 
+                                                preferred_len, &hnd);
        }
 
        /* request just one share */
-       status = rpccli_srvsvc_NetShareGetInfo(pipe_hnd, mem_ctx, NULL,
-                                              argv[0], level, &info);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
+       result = rpccli_srvsvc_net_share_get_info(pipe_hnd, mem_ctx, argv[0], level, &info);
+
+       if (!W_ERROR_IS_OK(result))
+               goto done;
+
+       /* construct ctr */
+       ZERO_STRUCTP(ctr);
 
-       *numentries = 1;
+       ctr->info_level = ctr->switch_value = level;
+       ctr->ptr_share_info = ctr->ptr_entries = 1;
+       ctr->num_entries = ctr->num_entries2 = 1;
 
-       switch(level) {
+       switch (level) {
        case 1:
-               ctr->ctr1->count = 1;
-               ctr->ctr1->array = info.info1;
-               break;
+       {
+               char *s;
+               SRV_SHARE_INFO_1 *info1;
+               
+               ctr->share.info1 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_1, 1);
+               if (ctr->share.info1 == NULL) {
+                       result = WERR_NOMEM;
+                       goto done;
+               }
+               info1 = ctr->share.info1;
+                               
+               memset(ctr->share.info1, 0, sizeof(SRV_SHARE_INFO_1));
+
+               /* Copy pointer crap */
+
+               memcpy(&info1->info_1, &info.share.info1.info_1, sizeof(SH_INFO_1));
+
+               /* Duplicate strings */
+
+               s = unistr2_tdup(mem_ctx, &info.share.info1.info_1_str.uni_netname);
+               if (s)
+                       init_unistr2(&info1->info_1_str.uni_netname, s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info.share.info1.info_1_str.uni_remark);
+               if (s)
+                       init_unistr2(&info1->info_1_str.uni_remark, s, UNI_STR_TERMINATE);
+       }
+       case 2:
+       {
+               char *s;
+               SRV_SHARE_INFO_2 *info2;
+               
+               ctr->share.info2 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_2, 1);
+               if (ctr->share.info2 == NULL) {
+                       result = WERR_NOMEM;
+                       goto done;
+               }
+               info2 = ctr->share.info2;
+                               
+               memset(ctr->share.info2, 0, sizeof(SRV_SHARE_INFO_2));
+
+               /* Copy pointer crap */
+
+               memcpy(&info2->info_2, &info.share.info2.info_2, sizeof(SH_INFO_2));
+
+               /* Duplicate strings */
+
+               s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_netname);
+               if (s)
+                       init_unistr2(&info2->info_2_str.uni_netname, s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_remark);
+               if (s)
+                       init_unistr2(&info2->info_2_str.uni_remark, s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_path);
+               if (s)
+                       init_unistr2(&info2->info_2_str.uni_path, s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_passwd);
+               if (s)
+                       init_unistr2(&info2->info_2_str.uni_passwd, s, UNI_STR_TERMINATE);
+       }
        case 502:
-               ctr->ctr501->count = 1;
-               ctr->ctr502->array = info.info502;
-               break;
-       default:
-               return NT_STATUS_INTERNAL_ERROR;
-               break;
+       {
+               char *s;
+               SRV_SHARE_INFO_502 *info502;
+
+               ctr->share.info502 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_502, 1);
+               if (ctr->share.info502 == NULL) {
+                       result = WERR_NOMEM;
+                       goto done;
+               }
+               info502 = ctr->share.info502;
+
+               memset(ctr->share.info502, 0, sizeof(SRV_SHARE_INFO_502));
+
+               /* Copy pointer crap */
+
+               memcpy(&info502->info_502, &info.share.info502.info_502, sizeof(SH_INFO_502));
+
+               /* Duplicate strings */
+
+               s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_netname);
+               if (s)
+                       init_unistr2(&info502->info_502_str.uni_netname, s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_remark);
+               if (s)
+                       init_unistr2(&info502->info_502_str.uni_remark, s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_path);
+               if (s)
+                       init_unistr2(&info502->info_502_str.uni_path, s, UNI_STR_TERMINATE);
+
+               s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_passwd);
+               if (s)
+                       init_unistr2(&info502->info_502_str.uni_passwd, s, UNI_STR_TERMINATE);
+
+               info502->info_502_str.sd = dup_sec_desc(mem_ctx, info.share.info502.info_502_str.sd);
+                               
        }
 
-       return NT_STATUS_OK;
+       } /* switch */
+
+done:
+       return result;
 }
 
 /** 
@@ -3218,14 +3295,12 @@ static NTSTATUS rpc_share_list_internals(const DOM_SID *domain_sid,
                                        int argc,
                                        const char **argv)
 {
-       union srvsvc_NetShareCtr ctr;
-       NTSTATUS result;
+       SRV_SHARE_INFO_CTR ctr;
+       WERROR result;
        uint32 i, level = 1;
-       uint32 numentries;
 
-       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr, 
-                                                       &numentries);
-       if (!NT_STATUS_IS_OK(result))
+       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr);
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
        /* Display results */
@@ -3236,10 +3311,10 @@ static NTSTATUS rpc_share_list_internals(const DOM_SID *domain_sid,
        "\nShare name   Type     Description\n"\
        "----------   ----     -----------\n");
        }
-       for (i = 0; i < numentries; i++)
-               display_share_info_1(&ctr.ctr1->array[i]);
+       for (i = 0; i < ctr.num_entries; i++)
+               display_share_info_1(&ctr.share.info1[i]);
  done:
-       return NT_STATUS_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
+       return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
 }
 
 /*** 
@@ -3266,7 +3341,7 @@ static BOOL check_share_availability(struct cli_state *cli, const char *netname)
        return True;
 }
 
-static BOOL check_share_sanity(struct cli_state *cli, const char *netname, uint32 type)
+static BOOL check_share_sanity(struct cli_state *cli, fstring netname, uint32 type)
 {
        /* only support disk shares */
        if (! ( type == STYPE_DISKTREE || type == (STYPE_DISKTREE | STYPE_HIDDEN)) ) {
@@ -3312,18 +3387,18 @@ static NTSTATUS rpc_share_migrate_shares_internals(const DOM_SID *domain_sid,
                                                int argc,
                                                const char **argv)
 {
-       NTSTATUS result;
+       WERROR result;
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-       union srvsvc_NetShareCtr ctr_src;
+       SRV_SHARE_INFO_CTR ctr_src;
+       uint32 type = STYPE_DISKTREE; /* only allow disk shares to be added */
+       char *password = NULL; /* don't allow a share password */
        uint32 i;
        struct rpc_pipe_client *srvsvc_pipe = NULL;
        struct cli_state *cli_dst = NULL;
        uint32 level = 502; /* includes secdesc */
-       uint32 numentries;
 
-       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src, 
-                                                       &numentries);
-       if (!NT_STATUS_IS_OK(result))
+       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src);
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
        /* connect destination PI_SRVSVC */
@@ -3332,37 +3407,41 @@ static NTSTATUS rpc_share_migrate_shares_internals(const DOM_SID *domain_sid,
                 return nt_status;
 
 
-       for (i = 0; i < numentries; i++) {
-               uint32 parm_error = 0;
-               union srvsvc_NetShareInfo info;
+       for (i = 0; i < ctr_src.num_entries; i++) {
 
+               fstring netname = "", remark = "", path = "";
                /* reset error-code */
                nt_status = NT_STATUS_UNSUCCESSFUL;
 
-               if (!check_share_sanity(cli, ctr_src.ctr502->array[i].name, 
-                                                               ctr_src.ctr502->array[i].type))
-                                                               
+               rpcstr_pull_unistr2_fstring(
+                       netname, &ctr_src.share.info502[i].info_502_str.uni_netname);
+               rpcstr_pull_unistr2_fstring(
+                       remark, &ctr_src.share.info502[i].info_502_str.uni_remark);
+               rpcstr_pull_unistr2_fstring(
+                       path, &ctr_src.share.info502[i].info_502_str.uni_path);
+
+               if (!check_share_sanity(cli, netname, ctr_src.share.info502[i].info_502.type))
                        continue;
 
                /* finally add the share on the dst server */ 
 
                printf("migrating: [%s], path: %s, comment: %s, without share-ACLs\n", 
-                       ctr_src.ctr502->array[i].name, 
-                       ctr_src.ctr502->array[i].path, 
-                       ctr_src.ctr502->array[i].comment);
-
-               info.info502 = &ctr_src.ctr502->array[i];
-
-               result = rpccli_srvsvc_NetShareAdd(srvsvc_pipe, mem_ctx, NULL
-                                                  502, info, &parm_error);
+                       netname, path, remark);
+
+               result = rpccli_srvsvc_net_share_add(srvsvc_pipe, mem_ctx, netname, type, remark,
+                                                 ctr_src.share.info502[i].info_502.perms,
+                                                 ctr_src.share.info502[i].info_502.max_uses,
+                                                 ctr_src.share.info502[i].info_502.num_uses,
+                                                 path, password, level
+                                                 NULL);
        
-                if (NT_STATUS_EQUAL(result, NT_STATUS_OBJECT_NAME_COLLISION)) {
-                       printf("           [%s] does already exist\n", ctr_src.ctr502->array[i].name);
+                if (W_ERROR_V(result) == W_ERROR_V(WERR_ALREADY_EXISTS)) {
+                       printf("           [%s] does already exist\n", netname);
                        continue;
                }
 
-               if (!NT_STATUS_IS_OK(result)) {
-                       printf("cannot add share: %s\n", nt_errstr(result));
+               if (!W_ERROR_IS_OK(result)) {
+                       printf("cannot add share: %s\n", dos_errstr(result));
                        goto done;
                }
 
@@ -3592,9 +3671,9 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid,
                                                int argc,
                                                const char **argv)
 {
-       NTSTATUS result;
+       WERROR result;
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-       union srvsvc_NetShareCtr ctr_src;
+       SRV_SHARE_INFO_CTR ctr_src;
        uint32 i;
        uint32 level = 502;
        struct copy_clistate cp_clistate;
@@ -3602,24 +3681,27 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid,
        BOOL got_dst_share = False;
        pstring mask = "\\*";
        char *dst = NULL;
-       uint32 numentries;
 
        dst = SMB_STRDUP(opt_destination?opt_destination:"127.0.0.1");
 
-       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src, 
-                                                       &numentries);
+       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src);
 
-       if (!NT_STATUS_IS_OK(result))
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
-       for (i = 0; i < numentries; i++) {
-               if (!check_share_sanity(cli, ctr_src.ctr502->array[i].name,
-                                                       ctr_src.ctr502->array[i].type))
+       for (i = 0; i < ctr_src.num_entries; i++) {
+
+               fstring netname = "";
+
+               rpcstr_pull_unistr2_fstring(
+                       netname, &ctr_src.share.info502[i].info_502_str.uni_netname);
+
+               if (!check_share_sanity(cli, netname, ctr_src.share.info502[i].info_502.type))
                        continue;
 
                /* one might not want to mirror whole discs :) */
-               if (strequal(ctr_src.ctr502->array[i].name, "print$") || ctr_src.ctr502->array[i].name[1] == '$') {
-                       d_printf("skipping   [%s]: builtin/hidden share\n", ctr_src.ctr502->array[i].name);
+               if (strequal(netname, "print$") || netname[1] == '$') {
+                       d_printf("skipping   [%s]: builtin/hidden share\n", netname);
                        continue;
                }
 
@@ -3633,7 +3715,7 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid,
                        break;
                }
                printf("    [%s] files and directories %s ACLs, %s DOS Attributes %s\n", 
-                       ctr_src.ctr502->array[i].name, 
+                       netname, 
                        opt_acls ? "including" : "without", 
                        opt_attrs ? "including" : "without",
                        opt_timestamps ? "(preserving timestamps)" : "");
@@ -3647,7 +3729,7 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid,
                /* open share source */
                nt_status = connect_to_service(&cp_clistate.cli_share_src,
                                               &cli->dest_ip, cli->desthost,
-                                                  ctr_src.ctr502->array[i].name, "A:");
+                                              netname, "A:");
                if (!NT_STATUS_IS_OK(nt_status))
                        goto done;
 
@@ -3656,22 +3738,21 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid,
                if (net_mode_share == NET_MODE_SHARE_MIGRATE) {
                        /* open share destination */
                        nt_status = connect_to_service(&cp_clistate.cli_share_dst,
-                                                      NULL, dst, ctr_src.ctr502->array[i].name, "A:");
+                                                      NULL, dst, netname, "A:");
                        if (!NT_STATUS_IS_OK(nt_status))
                                goto done;
 
                        got_dst_share = True;
                }
 
-               if (!copy_top_level_perms(&cp_clistate, ctr_src.ctr502->array[i].name)) {
-                       d_fprintf(stderr, "Could not handle the top level directory permissions for the share: %s\n", ctr_src.ctr502->array[i].name);
+               if (!copy_top_level_perms(&cp_clistate, netname)) {
+                       d_fprintf(stderr, "Could not handle the top level directory permissions for the share: %s\n", netname);
                        nt_status = NT_STATUS_UNSUCCESSFUL;
                        goto done;
                }
 
                if (!sync_files(&cp_clistate, mask)) {
-                       d_fprintf(stderr, "could not handle files for share: %s\n", 
-                                         ctr_src.ctr502->array[i].name);
+                       d_fprintf(stderr, "could not handle files for share: %s\n", netname);
                        nt_status = NT_STATUS_UNSUCCESSFUL;
                        goto done;
                }
@@ -3728,21 +3809,18 @@ static NTSTATUS rpc_share_migrate_security_internals(const DOM_SID *domain_sid,
                                                int argc,
                                                const char **argv)
 {
-       NTSTATUS result;
+       WERROR result;
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-       union srvsvc_NetShareCtr ctr_src;
-       union srvsvc_NetShareInfo info;
+       SRV_SHARE_INFO_CTR ctr_src;
+       SRV_SHARE_INFO info;
        uint32 i;
        struct rpc_pipe_client *srvsvc_pipe = NULL;
        struct cli_state *cli_dst = NULL;
        uint32 level = 502; /* includes secdesc */
-       uint32 numentries;
-       uint32 parm_error = 0;
 
-       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src,
-                                                       &numentries);
+       result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src);
 
-       if (!NT_STATUS_IS_OK(result))
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
        /* connect destination PI_SRVSVC */
@@ -3751,31 +3829,42 @@ static NTSTATUS rpc_share_migrate_security_internals(const DOM_SID *domain_sid,
                 return nt_status;
 
 
-       for (i = 0; i < numentries; i++) {
+       for (i = 0; i < ctr_src.num_entries; i++) {
+
+               fstring netname = "", remark = "", path = "";
                /* reset error-code */
                nt_status = NT_STATUS_UNSUCCESSFUL;
 
-               if (!check_share_sanity(cli, ctr_src.ctr502->array[i].name, ctr_src.ctr502->array[i].type))
+               rpcstr_pull_unistr2_fstring(
+                       netname, &ctr_src.share.info502[i].info_502_str.uni_netname);
+               rpcstr_pull_unistr2_fstring(
+                       remark, &ctr_src.share.info502[i].info_502_str.uni_remark);
+               rpcstr_pull_unistr2_fstring(
+                       path, &ctr_src.share.info502[i].info_502_str.uni_path);
+
+               if (!check_share_sanity(cli, netname, ctr_src.share.info502[i].info_502.type))
                        continue;
 
                printf("migrating: [%s], path: %s, comment: %s, including share-ACLs\n", 
-                       ctr_src.ctr502->array[i].name, 
-                       ctr_src.ctr502->array[i].path, 
-                       ctr_src.ctr502->array[i].comment);
+                       netname, path, remark);
 
                if (opt_verbose)
-                       display_sec_desc(ctr_src.ctr502->array[i].sd);
+                       display_sec_desc(ctr_src.share.info502[i].info_502_str.sd);
 
                /* init info */
                ZERO_STRUCT(info);
 
+               info.switch_value = level;
+               info.ptr_share_ctr = 1;
+
+               /* FIXME: shouldn't we be able to just set the security descriptor ? */
+               info.share.info502 = ctr_src.share.info502[i];
+
                /* finally modify the share on the dst server */
-               result = rpccli_srvsvc_NetShareSetInfo(
-                       srvsvc_pipe, mem_ctx, NULL, argv[0], level, info,
-                       &parm_error);
+               result = rpccli_srvsvc_net_share_set_info(srvsvc_pipe, mem_ctx, netname, level, &info);
        
-               if (!NT_STATUS_IS_OK(result)) {
-                       printf("cannot set share-acl: %s\n", nt_errstr(result));
+               if (!W_ERROR_IS_OK(result)) {
+                       printf("cannot set share-acl: %s\n", dos_errstr(result));
                        goto done;
                }
 
@@ -4409,20 +4498,20 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd,
        SEC_DESC *root_sd = NULL;
        struct cli_state *cli = pipe_hnd->cli;
        int i;
-       union srvsvc_NetShareInfo info;
-       NTSTATUS result;
+       SRV_SHARE_INFO info;
+       WERROR result;
        uint16 cnum;
 
-       result = rpccli_srvsvc_NetShareGetInfo(pipe_hnd, mem_ctx, NULL, netname,
+       result = rpccli_srvsvc_net_share_get_info(pipe_hnd, mem_ctx, netname,
                                               502, &info);
 
-       if (!NT_STATUS_IS_OK(result)) {
+       if (!W_ERROR_IS_OK(result)) {
                DEBUG(1, ("Coult not query secdesc for share %s\n",
                          netname));
                return;
        }
 
-       share_sd = info.info502->sd;
+       share_sd = info.share.info502.info_502_str.sd;
        if (share_sd == NULL) {
                DEBUG(1, ("Got no secdesc for share %s\n",
                          netname));
@@ -4536,7 +4625,7 @@ static NTSTATUS rpc_share_allowedusers_internals(const DOM_SID *domain_sid,
 {
        int ret;
        BOOL r;
-       uint32 hnd;
+       ENUM_HND hnd;
        uint32 i;
        FILE *f;
 
@@ -4574,7 +4663,8 @@ static NTSTATUS rpc_share_allowedusers_internals(const DOM_SID *domain_sid,
        for (i=0; i<num_tokens; i++)
                collect_alias_memberships(&tokens[i].token);
 
-       hnd = 0;
+       init_enum_hnd(&hnd, 0);
+
        share_list.num_shares = 0;
        share_list.shares = NULL;
 
@@ -4705,10 +4795,7 @@ static NTSTATUS rpc_sh_share_add(TALLOC_CTX *mem_ctx,
                                 struct rpc_pipe_client *pipe_hnd,
                                 int argc, const char **argv)
 {
-       union srvsvc_NetShareInfo info;
-       struct srvsvc_NetShareInfo2 info2;
-       NTSTATUS result;
-       uint32 parm_error = 0;
+       WERROR result;
 
        if ((argc < 2) || (argc > 3)) {
                d_fprintf(stderr, "usage: %s <share> <path> [comment]\n",
@@ -4716,15 +4803,12 @@ static NTSTATUS rpc_sh_share_add(TALLOC_CTX *mem_ctx,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       info.info2 = &info2;
-       info2.name = argv[0];
-       info2.type = STYPE_DISKTREE;
-       info2.comment = (argc == 3) ? argv[2] : "";
-
-       result = rpccli_srvsvc_NetShareAdd(
-               pipe_hnd, mem_ctx, NULL, 2, info, &parm_error); 
+       result = rpccli_srvsvc_net_share_add(
+               pipe_hnd, mem_ctx, argv[0], STYPE_DISKTREE,
+               (argc == 3) ? argv[2] : "",
+               0, 0, 0, argv[1], NULL, 2, NULL);
                                             
-       return result;
+       return werror_to_ntstatus(result);
 }
 
 static NTSTATUS rpc_sh_share_delete(TALLOC_CTX *mem_ctx,
@@ -4732,15 +4816,15 @@ static NTSTATUS rpc_sh_share_delete(TALLOC_CTX *mem_ctx,
                                    struct rpc_pipe_client *pipe_hnd,
                                    int argc, const char **argv)
 {
-       NTSTATUS result;
+       WERROR result;
 
        if (argc != 1) {
                d_fprintf(stderr, "usage: %s <share>\n", ctx->whoami);
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       result = rpccli_srvsvc_NetShareDel(pipe_hnd, mem_ctx, NULL, argv[0], 0);
-       return result;
+       result = rpccli_srvsvc_net_share_del(pipe_hnd, mem_ctx, argv[0]);
+       return werror_to_ntstatus(result);
 }
 
 static NTSTATUS rpc_sh_share_info(TALLOC_CTX *mem_ctx,
@@ -4748,27 +4832,37 @@ static NTSTATUS rpc_sh_share_info(TALLOC_CTX *mem_ctx,
                                  struct rpc_pipe_client *pipe_hnd,
                                  int argc, const char **argv)
 {
-       union srvsvc_NetShareInfo info;
-       NTSTATUS result;
+       SRV_SHARE_INFO info;
+       SRV_SHARE_INFO_2 *info2 = &info.share.info2;
+       WERROR result;
 
        if (argc != 1) {
                d_fprintf(stderr, "usage: %s <share>\n", ctx->whoami);
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       result = rpccli_srvsvc_NetShareGetInfo(
-               pipe_hnd, mem_ctx, NULL, argv[0], 2, &info);
-       if (!NT_STATUS_IS_OK(result)) {
+       result = rpccli_srvsvc_net_share_get_info(
+               pipe_hnd, mem_ctx, argv[0], 2, &info);
+       if (!W_ERROR_IS_OK(result)) {
                goto done;
        }
 
-       d_printf("Name:     %s\n", info.info2->name);
-       d_printf("Comment:  %s\n", info.info2->comment);
-       d_printf("Path:     %s\n", info.info2->path);
-       d_printf("Password: %s\n", info.info2->password);
+       d_printf("Name:     %s\n",
+                rpcstr_pull_unistr2_talloc(mem_ctx,
+                                           &info2->info_2_str.uni_netname));
+       d_printf("Comment:  %s\n",
+                rpcstr_pull_unistr2_talloc(mem_ctx,
+                                           &info2->info_2_str.uni_remark));
+       
+       d_printf("Path:     %s\n",
+                rpcstr_pull_unistr2_talloc(mem_ctx,
+                                           &info2->info_2_str.uni_path));
+       d_printf("Password: %s\n",
+                rpcstr_pull_unistr2_talloc(mem_ctx,
+                                           &info2->info_2_str.uni_passwd));
 
  done:
-       return result;
+       return werror_to_ntstatus(result);
 }
 
 struct rpc_sh_cmd *net_rpc_share_cmds(TALLOC_CTX *mem_ctx,
@@ -4824,9 +4918,9 @@ static NTSTATUS rpc_file_close_internals(const DOM_SID *domain_sid,
                                        int argc,
                                        const char **argv)
 {
-       NTSTATUS result;
-       result = rpccli_srvsvc_NetFileClose(pipe_hnd, mem_ctx, NULL, atoi(argv[0]));
-       return NT_STATUS_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
+       return rpccli_srvsvc_NetFileClose(pipe_hnd, mem_ctx, 
+                                           pipe_hnd->cli->desthost, 
+                                           atoi(argv[0]));
 }
 
 /** 
@@ -4857,10 +4951,15 @@ static int rpc_file_close(int argc, const char **argv)
  * @param str3   strings for FILE_INFO_3
  **/
 
-static void display_file_info_3( struct srvsvc_NetFileInfo3 *info3 )
+static void display_file_info_3( FILE_INFO_3 *info3 )
 {
+       fstring user = "", path = "";
+
+       rpcstr_pull_unistr2_fstring(user, info3->user);
+       rpcstr_pull_unistr2_fstring(path, info3->path);
+
        d_printf("%-7.1d %-20.20s 0x%-4.2x %-6.1d %s\n",
-                info3->fid, info3->user, info3->permissions, info3->num_locks, info3->path);
+                info3->id, user, info3->perms, info3->num_locks, path);
 }
 
 /** 
@@ -4887,28 +4986,22 @@ static NTSTATUS rpc_file_list_internals(const DOM_SID *domain_sid,
                                        int argc,
                                        const char **argv)
 {
-       struct srvsvc_NetFileCtr3 ctr3;
-       union srvsvc_NetFileCtr ctr;
-       NTSTATUS result;
-       uint32 hnd;
+       SRV_FILE_INFO_CTR ctr;
+       WERROR result;
+       ENUM_HND hnd;
        uint32 preferred_len = 0xffffffff, i;
        const char *username=NULL;
-       uint32 level = 3;
-       uint32 numentries;
 
-       hnd = 0;
+       init_enum_hnd(&hnd, 0);
 
        /* if argc > 0, must be user command */
        if (argc > 0)
                username = smb_xstrdup(argv[0]);
-
-       ctr.ctr3 = &ctr3;
                
-       result = rpccli_srvsvc_NetFileEnum(pipe_hnd, mem_ctx, NULL, NULL,
-                                          username, &level, &ctr,
-                                          preferred_len, &numentries, &hnd);
+       result = rpccli_srvsvc_net_file_enum(pipe_hnd,
+                                       mem_ctx, 3, username, &ctr, preferred_len, &hnd);
 
-       if (!NT_STATUS_IS_OK(result))
+       if (!W_ERROR_IS_OK(result))
                goto done;
 
        /* Display results */
@@ -4917,10 +5010,10 @@ static NTSTATUS rpc_file_list_internals(const DOM_SID *domain_sid,
                 "\nEnumerating open files on remote server:\n\n"\
                 "\nFileId  Opened by            Perms  Locks  Path"\
                 "\n------  ---------            -----  -----  ---- \n");
-       for (i = 0; i < numentries; i++)
-               display_file_info_3(&ctr.ctr3->array[i]);
+       for (i = 0; i < ctr.num_entries; i++)
+               display_file_info_3(&ctr.file.info3[i]);
  done:
-       return NT_STATUS_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
+       return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
 }
 
 /** 
index cea2cd7cfaa51377b7f09961c39501976a0c4f35..66a706d1ce99c990ffa4a5bd1e29358495ba8305 100644 (file)
@@ -828,8 +828,7 @@ int main (int argc, char **argv)
        if (user_name == NULL)
                user_name = poptGetArg(pc);
 
-       if (!lp_load(configfile?configfile:dyn_CONFIGFILE,
-                    True,False,False,True)) {
+       if (!lp_load(dyn_CONFIGFILE,True,False,False,True)) {
                fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE);
                exit(1);
        }
index 5d5a9743d5399fc11d316309ddfc618a7c0e1bcc..7d62d65b05695e926242b8b9f36ca7536954cbc1 100644 (file)
@@ -133,12 +133,10 @@ static BOOL get_rpc_shares(struct cli_state *cli,
        NTSTATUS status;
        struct rpc_pipe_client *pipe_hnd;
        TALLOC_CTX *mem_ctx;
-       uint32 enum_hnd;
-       struct srvsvc_NetShareCtr1 ctr1;
-       union srvsvc_NetShareCtr ctr;
-       uint32 numentries;
+       ENUM_HND enum_hnd;
+       WERROR werr;
+       SRV_SHARE_INFO_CTR ctr;
        int i;
-       uint32 info_level = 1;
 
        mem_ctx = talloc_new(NULL);
        if (mem_ctx == NULL) {
@@ -146,7 +144,8 @@ static BOOL get_rpc_shares(struct cli_state *cli,
                return False;
        }
 
-       enum_hnd = 0;
+       init_enum_hnd(&enum_hnd, 0);
+
        pipe_hnd = cli_rpc_pipe_open_noauth(cli, PI_SRVSVC, &status);
 
        if (pipe_hnd == NULL) {
@@ -156,23 +155,23 @@ static BOOL get_rpc_shares(struct cli_state *cli,
                return False;
        }
 
-       ZERO_STRUCT(ctr1);
-       ctr.ctr1 = &ctr1;
-
-       status = rpccli_srvsvc_NetShareEnum(pipe_hnd, mem_ctx, NULL,
-                                           &info_level, &ctr,
-                                           0xffffffff, &numentries,
-                                           &enum_hnd);
+       werr = rpccli_srvsvc_net_share_enum(pipe_hnd, mem_ctx, 1, &ctr,
+                                           0xffffffff, &enum_hnd);
 
-       if (!NT_STATUS_IS_OK(status)) {
+       if (!W_ERROR_IS_OK(werr)) {
                TALLOC_FREE(mem_ctx);
                cli_rpc_pipe_close(pipe_hnd);
                return False;
        }
 
-       for (i=0; i<numentries; i++) {
-               fn(ctr.ctr1->array[i].name, ctr.ctr1->array[i].type, 
-                  ctr.ctr1->array[i].comment, state);
+       for (i=0; i<ctr.num_entries; i++) {
+               SRV_SHARE_INFO_1 *info = &ctr.share.info1[i];
+               char *name, *comment;
+               name = rpcstr_pull_unistr2_talloc(
+                       mem_ctx, &info->info_1_str.uni_netname);
+               comment = rpcstr_pull_unistr2_talloc(
+                       mem_ctx, &info->info_1_str.uni_remark);
+               fn(name, info->info_1.type, comment, state);
        }
 
        TALLOC_FREE(mem_ctx);
index 17915fb01b1613db9630d2f2691494949c3a2aa3..81f07c4c8c5a0aad2acf03f6fba44cf132f2c1a6 100644 (file)
@@ -7,7 +7,6 @@
    Copyright (C) Andrew Tridgell 2002
    Copyright (C) Jelmer Vernooij 2003
    Copyright (C) Volker Lendecke 2004
-   Copyright (C) James Peach 2007
    
    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
@@ -30,6 +29,7 @@
 #define DBGC_CLASS DBGC_WINBIND
 
 BOOL opt_nocache = False;
+static BOOL interactive = False;
 
 extern BOOL override_logfile;
 
@@ -129,8 +129,13 @@ static void flush_caches(void)
 
 static void terminate(void)
 {
+       pstring path;
+
+       /* Remove socket file */
+       pstr_sprintf(path, "%s/%s", 
+                get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME);
+       unlink(path);
 
-       winbindd_release_sockets();
        idmap_close();
        
        trustdom_cache_shutdown();
@@ -791,14 +796,23 @@ static BOOL remove_idle_client(void)
    simultaneous connections while remaining impervious to many denial of
    service attacks. */
 
-static int process_loop(int listen_sock, int listen_priv_sock)
+static void process_loop(void)
 {
        struct winbindd_cli_state *state;
        struct fd_event *ev;
        fd_set r_fds, w_fds;
-       int maxfd, selret;
+       int maxfd, listen_sock, listen_priv_sock, selret;
        struct timeval timeout, ev_timeout;
 
+       /* Open Sockets here to get stuff going ASAP */
+       listen_sock = open_winbindd_socket();
+       listen_priv_sock = open_winbindd_priv_socket();
+
+       if (listen_sock == -1 || listen_priv_sock == -1) {
+               perror("open_winbind_socket");
+               exit(1);
+       }
+
        /* We'll be doing this a lot */
 
        /* Handle messages */
@@ -963,58 +977,6 @@ static int process_loop(int listen_sock, int listen_priv_sock)
                        winbind_child_died(pid);
                }
        }
-
-
-       return winbindd_num_clients();
-}
-
-static void winbindd_process_loop(enum smb_server_mode server_mode)
-{
-       int idle_timeout_sec;
-       struct timeval starttime;
-       int listen_public, listen_priv;
-
-       errno = 0;
-       if (!winbindd_init_sockets(&listen_public, &listen_priv,
-                                   &idle_timeout_sec)) {
-               terminate();
-       }
-
-       starttime = timeval_current();
-
-       if (listen_public == -1 || listen_priv == -1) {
-               DEBUG(0, ("failed to open winbindd pipes: %s\n",
-                           errno ? strerror(errno) : "unknown error"));
-               terminate();
-       }
-
-       for (;;) {
-               TALLOC_CTX *frame = talloc_stackframe();
-               int clients = process_loop(listen_public, listen_priv);
-
-               /* Don't bother figuring out the idle time if we won't be
-                * timing out anyway.
-                */
-               if (idle_timeout_sec < 0) {
-                       TALLOC_FREE(frame);
-                       continue;
-               }
-
-               if (clients == 0 && server_mode == SERVER_MODE_FOREGROUND) {
-                       struct timeval now;
-
-                       now = timeval_current();
-                       if (timeval_elapsed2(&starttime, &now) >
-                               (double)idle_timeout_sec) {
-                               DEBUG(0, ("idle for %d secs, exitting\n",
-                                           idle_timeout_sec));
-                               terminate();
-                       }
-               } else {
-                       starttime = timeval_current();
-               }
-               TALLOC_FREE(frame);
-       }
 }
 
 /* Main function */
@@ -1022,18 +984,17 @@ static void winbindd_process_loop(enum smb_server_mode server_mode)
 int main(int argc, char **argv, char **envp)
 {
        pstring logfile;
-       BOOL log_stdout = False;
-       BOOL no_process_group = False;
-
-       enum smb_server_mode server_mode = SERVER_MODE_DAEMON;
-
+       static BOOL is_daemon = False;
+       static BOOL Fork = True;
+       static BOOL log_stdout = False;
+       static BOOL no_process_group = False;
        struct poptOption long_options[] = {
                POPT_AUTOHELP
                { "stdout", 'S', POPT_ARG_VAL, &log_stdout, True, "Log to stdout" },
-               { "foreground", 'F', POPT_ARG_VAL, &server_mode, SERVER_MODE_FOREGROUND, "Daemon in foreground mode" },
+               { "foreground", 'F', POPT_ARG_VAL, &Fork, False, "Daemon in foreground mode" },
                { "no-process-group", 0, POPT_ARG_VAL, &no_process_group, True, "Don't create a new process group" },
-               { "daemon", 'D', POPT_ARG_VAL, &server_mode, SERVER_MODE_DAEMON, "Become a daemon (default)" },
-               { "interactive", 'i', POPT_ARG_VAL, &server_mode, SERVER_MODE_INTERACTIVE, "Interactive mode" },
+               { "daemon", 'D', POPT_ARG_NONE, NULL, 'D', "Become a daemon (default)" },
+               { "interactive", 'i', POPT_ARG_NONE, NULL, 'i', "Interactive mode" },
                { "no-caching", 'n', POPT_ARG_VAL, &opt_nocache, True, "Disable caching" },
                POPT_COMMON_SAMBA
                POPT_TABLEEND
@@ -1072,6 +1033,15 @@ int main(int argc, char **argv, char **envp)
 
        while ((opt = poptGetNextOpt(pc)) != -1) {
                switch (opt) {
+                       /* Don't become a daemon */
+               case 'D':
+                       is_daemon = True;
+                       break;
+               case 'i':
+                       interactive = True;
+                       log_stdout = True;
+                       Fork = False;
+                       break;
                default:
                        d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
                                  poptBadOption(pc, 0), poptStrerror(opt));
@@ -1080,15 +1050,16 @@ int main(int argc, char **argv, char **envp)
                }
        }
 
-       if (server_mode == SERVER_MODE_INTERACTIVE) {
-               log_stdout = True;
-               if (DEBUGLEVEL >= 9) {
-                       talloc_enable_leak_report();
-               }
+       if (is_daemon && interactive) {
+               d_fprintf(stderr,"\nERROR: "
+                         "Option -i|--interactive is not allowed together with -D|--daemon\n\n");
+               poptPrintUsage(pc, stderr, 0);
+               exit(1);
        }
 
-       if (log_stdout && server_mode == SERVER_MODE_DAEMON) {
-               printf("Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n");
+       if (log_stdout && Fork) {
+               d_fprintf(stderr, "\nERROR: "
+                         "Can't log to stdout (-S) unless daemon is in foreground +(-F) or interactive (-i)\n\n");
                poptPrintUsage(pc, stderr, 0);
                exit(1);
        }
@@ -1161,12 +1132,8 @@ int main(int argc, char **argv, char **envp)
        CatchSignal(SIGUSR2, sigusr2_handler);         /* Debugging sigs */
        CatchSignal(SIGHUP, sighup_handler);
 
-       if (server_mode == SERVER_MODE_DAEMON) {
-               DEBUG( 3, ( "Becoming a daemon.\n" ) );
-               become_daemon(True, no_process_group);
-       } else if (server_mode == SERVER_MODE_FOREGROUND) {
-               become_daemon(False, no_process_group);
-       }
+       if (!interactive)
+               become_daemon(Fork, no_process_group);
 
        pidfile_create("winbindd");
 
@@ -1189,9 +1156,8 @@ int main(int argc, char **argv, char **envp)
         * If we're interactive we want to set our own process group for
         * signal management.
         */
-       if (server_mode == SERVER_MODE_INTERACTIVE && !no_process_group) {
+       if (interactive && !no_process_group)
                setpgid( (pid_t)0, (pid_t)0);
-       }
 #endif
 
        TimeInit();
@@ -1248,7 +1214,12 @@ int main(int argc, char **argv, char **envp)
        smb_nscd_flush_group_cache();
 
        /* Loop waiting for requests */
-       winbindd_process_loop(server_mode);
+
+       while (1) {
+               TALLOC_CTX *frame = talloc_stackframe();
+               process_loop();
+               TALLOC_FREE(frame);
+       }
 
        return 0;
 }
index d61254af4a27124787053afe9b2adfe7137ccb74..ebede0f0076987a6ea0dba4a12eb3f1a62a28abe 100644 (file)
@@ -134,17 +134,6 @@ struct winbindd_async_request;
 
 /* Async child */
 
-struct winbindd_domain;
-
-struct winbindd_child_dispatch_table {
-       enum winbindd_cmd cmd;
-       enum winbindd_result (*fn)(struct winbindd_domain *domain,
-                                  struct winbindd_cli_state *state);
-       const char *winbindd_cmd_name;
-};
-
-extern const struct winbindd_child_dispatch_table domain_dispatch_table[];
-
 struct winbindd_child {
        struct winbindd_child *next, *prev;
 
@@ -155,8 +144,6 @@ struct winbindd_child {
        struct fd_event event;
        struct timed_event *lockout_policy_event;
        struct winbindd_async_request *requests;
-
-       const struct winbindd_child_dispatch_table *table;
 };
 
 /* Structures to hold per domain information */
@@ -178,14 +165,6 @@ struct winbindd_domain {
        time_t startup_time;                   /* When we set "startup" true. */
        BOOL startup;                          /* are we in the first 30 seconds after startup_time ? */
 
-       BOOL can_do_samlogon_ex; /* Due to the lack of finer control what type
-                                 * of DC we have, let us try to do a
-                                 * credential-chain less samlogon_ex call
-                                 * with AD and schannel. If this fails with
-                                 * DCERPC_FAULT_OP_RNG_ERROR, then set this
-                                 * to False. This variable is around so that
-                                 * we don't have to try _ex every time. */
-
        /* Lookup methods for this domain (LDAP or RPC) */
        struct winbindd_methods *methods;
 
index 00c20529c57f503d3e1bc48f63cbd598fd21ceb8..5d31ff0a41a18cd69ae47da6938cb328b3d9aed1 100644 (file)
@@ -57,12 +57,12 @@ static void do_async_recv(void *private_data, BOOL success)
                    state->c, state->private_data);
 }
 
-void do_async(TALLOC_CTX *mem_ctx, struct winbindd_child *child,
-             const struct winbindd_request *request,
-             void (*cont)(TALLOC_CTX *mem_ctx, BOOL success,
-                          struct winbindd_response *response,
-                          void *c, void *private_data),
-             void *c, void *private_data)
+static void do_async(TALLOC_CTX *mem_ctx, struct winbindd_child *child,
+                    const struct winbindd_request *request,
+                    void (*cont)(TALLOC_CTX *mem_ctx, BOOL success,
+                                 struct winbindd_response *response,
+                                 void *c, void *private_data),
+                    void *c, void *private_data)
 {
        struct do_async_state *state;
 
@@ -111,6 +111,581 @@ void do_async_domain(TALLOC_CTX *mem_ctx, struct winbindd_domain *domain,
                             &state->response, do_async_recv, state);
 }
 
+static void winbindd_set_mapping_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                                  struct winbindd_response *response,
+                                  void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ) = (void (*)(void *, BOOL))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger idmap_set_mapping\n"));
+               cont(private_data, False);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("idmap_set_mapping returned an error\n"));
+               cont(private_data, False);
+               return;
+       }
+
+       cont(private_data, True);
+}
+
+void winbindd_set_mapping_async(TALLOC_CTX *mem_ctx, const struct id_map *map,
+                            void (*cont)(void *private_data, BOOL success),
+                            void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_SET_MAPPING;
+       request.data.dual_idmapset.id = map->xid.id;
+       request.data.dual_idmapset.type = map->xid.type;
+       sid_to_string(request.data.dual_idmapset.sid, map->sid);
+
+       do_async(mem_ctx, idmap_child(), &request, winbindd_set_mapping_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_set_mapping(struct winbindd_domain *domain,
+                                           struct winbindd_cli_state *state)
+{
+       struct id_map map;
+       DOM_SID sid;
+       NTSTATUS result;
+
+       DEBUG(3, ("[%5lu]: dual_idmapset\n", (unsigned long)state->pid));
+
+       if (!string_to_sid(&sid, state->request.data.dual_idmapset.sid))
+               return WINBINDD_ERROR;
+
+       map.sid = &sid;
+       map.xid.id = state->request.data.dual_idmapset.id;
+       map.xid.type = state->request.data.dual_idmapset.type;
+       map.status = ID_MAPPED;
+
+       result = idmap_set_mapping(&map);
+       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
+}
+
+static void winbindd_set_hwm_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                                  struct winbindd_response *response,
+                                  void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ) = (void (*)(void *, BOOL))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger idmap_set_hwm\n"));
+               cont(private_data, False);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("idmap_set_hwm returned an error\n"));
+               cont(private_data, False);
+               return;
+       }
+
+       cont(private_data, True);
+}
+
+void winbindd_set_hwm_async(TALLOC_CTX *mem_ctx, const struct unixid *xid,
+                            void (*cont)(void *private_data, BOOL success),
+                            void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_SET_HWM;
+       request.data.dual_idmapset.id = xid->id;
+       request.data.dual_idmapset.type = xid->type;
+
+       do_async(mem_ctx, idmap_child(), &request, winbindd_set_hwm_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_set_hwm(struct winbindd_domain *domain,
+                                           struct winbindd_cli_state *state)
+{
+       struct unixid xid;
+       NTSTATUS result;
+
+       DEBUG(3, ("[%5lu]: dual_set_hwm\n", (unsigned long)state->pid));
+
+       xid.id = state->request.data.dual_idmapset.id;
+       xid.type = state->request.data.dual_idmapset.type;
+
+       switch (xid.type) {
+       case ID_TYPE_UID:
+               result = idmap_set_uid_hwm(&xid);
+               break;
+       case ID_TYPE_GID:
+               result = idmap_set_gid_hwm(&xid);
+               break;
+       default:
+               return WINBINDD_ERROR;
+       }
+       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
+}
+
+static void winbindd_sids2xids_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                              struct winbindd_response *response,
+                              void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, void *, int) =
+               (void (*)(void *, BOOL, void *, int))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger sids2xids\n"));
+               cont(private_data, False, NULL, 0);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("sids2xids returned an error\n"));
+               cont(private_data, False, NULL, 0);
+               return;
+       }
+
+       cont(private_data, True, response->extra_data.data, response->length - sizeof(response));
+}
+                        
+void winbindd_sids2xids_async(TALLOC_CTX *mem_ctx, void *sids, int size,
+                        void (*cont)(void *private_data, BOOL success, void *data, int len),
+                        void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_SIDS2XIDS;
+       request.extra_data.data = (char *)sids;
+       request.extra_len = size;
+       do_async(mem_ctx, idmap_child(), &request, winbindd_sids2xids_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_sids2xids(struct winbindd_domain *domain,
+                                          struct winbindd_cli_state *state)
+{
+       DOM_SID *sids;
+       struct unixid *xids;
+       struct id_map **ids;
+       NTSTATUS result;
+       int num, i;
+
+       DEBUG(3, ("[%5lu]: sids to unix ids\n", (unsigned long)state->pid));
+
+       if (state->request.extra_len == 0) {
+               DEBUG(0, ("Invalid buffer size!\n"));
+               return WINBINDD_ERROR;
+       }
+
+       sids = (DOM_SID *)state->request.extra_data.data;
+       num = state->request.extra_len / sizeof(DOM_SID);
+
+       ids = TALLOC_ZERO_ARRAY(state->mem_ctx, struct id_map *, num + 1);
+       if ( ! ids) {
+               DEBUG(0, ("Out of memory!\n"));
+               return WINBINDD_ERROR;
+       }
+       for (i = 0; i < num; i++) {
+               ids[i] = TALLOC_P(ids, struct id_map);
+               if ( ! ids[i]) {
+                       DEBUG(0, ("Out of memory!\n"));
+                       talloc_free(ids);
+                       return WINBINDD_ERROR;
+               }
+               ids[i]->sid = &sids[i];
+       }
+
+       result = idmap_sids_to_unixids(ids);
+
+       if (NT_STATUS_IS_OK(result)) {
+
+               xids = SMB_MALLOC_ARRAY(struct unixid, num);
+               if ( ! xids) {
+                       DEBUG(0, ("Out of memory!\n"));
+                       talloc_free(ids);
+                       return WINBINDD_ERROR;
+               }
+               
+               for (i = 0; i < num; i++) {
+                       if (ids[i]->status == ID_MAPPED) {
+                               xids[i].type = ids[i]->xid.type;
+                               xids[i].id = ids[i]->xid.id;
+                       } else {
+                               xids[i].type = -1;
+                       }
+               }
+
+               state->response.length = sizeof(state->response) + (sizeof(struct unixid) * num);
+               state->response.extra_data.data = xids;
+
+       } else {
+               DEBUG (2, ("idmap_sids_to_unixids returned an error: 0x%08x\n", NT_STATUS_V(result)));
+               talloc_free(ids);
+               return WINBINDD_ERROR;
+       }
+
+       talloc_free(ids);
+       return WINBINDD_OK;
+}
+
+static void winbindd_sid2uid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                              struct winbindd_response *response,
+                              void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, uid_t uid) =
+               (void (*)(void *, BOOL, uid_t))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger sid2uid\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("sid2uid returned an error\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       cont(private_data, True, response->data.uid);
+}
+                        
+void winbindd_sid2uid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
+                        void (*cont)(void *private_data, BOOL success, uid_t uid),
+                        void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_SID2UID;
+       sid_to_string(request.data.dual_sid2id.sid, sid);
+       do_async(mem_ctx, idmap_child(), &request, winbindd_sid2uid_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_sid2uid(struct winbindd_domain *domain,
+                                          struct winbindd_cli_state *state)
+{
+       DOM_SID sid;
+       NTSTATUS result;
+
+       DEBUG(3, ("[%5lu]: sid to uid %s\n", (unsigned long)state->pid,
+                 state->request.data.dual_sid2id.sid));
+
+       if (!string_to_sid(&sid, state->request.data.dual_sid2id.sid)) {
+               DEBUG(1, ("Could not get convert sid %s from string\n",
+                         state->request.data.dual_sid2id.sid));
+               return WINBINDD_ERROR;
+       }
+
+       /* Find uid for this sid and return it, possibly ask the slow remote idmap */
+
+       result = idmap_sid_to_uid(&sid, &(state->response.data.uid));
+
+       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
+}
+
+#if 0  /* not used */
+static void uid2name_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                         struct winbindd_response *response,
+                         void *c, void *private_data);
+
+void winbindd_uid2name_async(TALLOC_CTX *mem_ctx, uid_t uid,
+                            void (*cont)(void *private_data, BOOL success,
+                                         const char *name),
+                            void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_UID2NAME;
+       request.data.uid = uid;
+       do_async(mem_ctx, idmap_child(), &request, uid2name_recv,
+                (void *)cont, private_data);
+}
+#endif /* not used */
+
+enum winbindd_result winbindd_dual_uid2name(struct winbindd_domain *domain,
+                                           struct winbindd_cli_state *state)
+{
+       struct passwd *pw;
+
+       DEBUG(3, ("[%5lu]: uid2name %lu\n", (unsigned long)state->pid, 
+                 (unsigned long)state->request.data.uid));
+
+       pw = getpwuid(state->request.data.uid);
+       if (pw == NULL) {
+               DEBUG(5, ("User %lu not found\n",
+                         (unsigned long)state->request.data.uid));
+               return WINBINDD_ERROR;
+       }
+
+       fstrcpy(state->response.data.name.name, pw->pw_name);
+       return WINBINDD_OK;
+}
+
+#if 0  /* not used */
+static void uid2name_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                         struct winbindd_response *response,
+                         void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, const char *name) =
+               (void (*)(void *, BOOL, const char *))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger uid2name\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("uid2name returned an error\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       cont(private_data, True, response->data.name.name);
+}
+
+static void name2uid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                         struct winbindd_response *response,
+                         void *c, void *private_data);
+
+static void winbindd_name2uid_async(TALLOC_CTX *mem_ctx, const char *name,
+                                   void (*cont)(void *private_data, BOOL success,
+                                                uid_t uid),
+                                   void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_NAME2UID;
+       fstrcpy(request.data.username, name);
+       do_async(mem_ctx, idmap_child(), &request, name2uid_recv,
+                (void *)cont, private_data);
+}
+#endif /* not used */
+
+enum winbindd_result winbindd_dual_name2uid(struct winbindd_domain *domain,
+                                           struct winbindd_cli_state *state)
+{
+       struct passwd *pw;
+
+       /* Ensure null termination */
+       state->request.data.username
+               [sizeof(state->request.data.username)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: name2uid %s\n", (unsigned long)state->pid, 
+                 state->request.data.username));
+
+       pw = getpwnam(state->request.data.username);
+       if (pw == NULL) {
+               return WINBINDD_ERROR;
+       }
+
+       state->response.data.uid = pw->pw_uid;
+       return WINBINDD_OK;
+}
+
+#if 0  /* not used */
+static void name2uid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                         struct winbindd_response *response,
+                         void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, uid_t uid) =
+               (void (*)(void *, BOOL, uid_t))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger name2uid\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("name2uid returned an error\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       cont(private_data, True, response->data.uid);
+}
+#endif /* not used */
+
+static void winbindd_sid2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                              struct winbindd_response *response,
+                              void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, gid_t gid) =
+               (void (*)(void *, BOOL, gid_t))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger sid2gid\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("sid2gid returned an error\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       cont(private_data, True, response->data.gid);
+}
+                        
+void winbindd_sid2gid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
+                        void (*cont)(void *private_data, BOOL success, gid_t gid),
+                        void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_SID2GID;
+       sid_to_string(request.data.dual_sid2id.sid, sid);
+
+       DEBUG(7,("winbindd_sid2gid_async: Resolving %s to a gid\n", 
+               request.data.dual_sid2id.sid));
+
+       do_async(mem_ctx, idmap_child(), &request, winbindd_sid2gid_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_sid2gid(struct winbindd_domain *domain,
+                                          struct winbindd_cli_state *state)
+{
+       DOM_SID sid;
+       NTSTATUS result;
+
+       DEBUG(3, ("[%5lu]: sid to gid %s\n", (unsigned long)state->pid,
+                 state->request.data.dual_sid2id.sid));
+
+       if (!string_to_sid(&sid, state->request.data.dual_sid2id.sid)) {
+               DEBUG(1, ("Could not get convert sid %s from string\n",
+                         state->request.data.dual_sid2id.sid));
+               return WINBINDD_ERROR;
+       }
+
+       /* Find gid for this sid and return it, possibly ask the slow remote idmap */
+
+       result = idmap_sid_to_gid(&sid, &state->response.data.gid);
+       
+       DEBUG(10, ("winbindd_dual_sid2gid: 0x%08x - %s - %u\n", NT_STATUS_V(result), sid_string_static(&sid), state->response.data.gid));
+
+       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
+}
+
+static void gid2name_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                         struct winbindd_response *response,
+                         void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, const char *name) =
+               (void (*)(void *, BOOL, const char *))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger gid2name\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("gid2name returned an error\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       cont(private_data, True, response->data.name.name);
+}
+
+void winbindd_gid2name_async(TALLOC_CTX *mem_ctx, gid_t gid,
+                            void (*cont)(void *private_data, BOOL success,
+                                         const char *name),
+                            void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_GID2NAME;
+       request.data.gid = gid;
+       do_async(mem_ctx, idmap_child(), &request, gid2name_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_gid2name(struct winbindd_domain *domain,
+                                           struct winbindd_cli_state *state)
+{
+       struct group *gr;
+
+       DEBUG(3, ("[%5lu]: gid2name %lu\n", (unsigned long)state->pid, 
+                 (unsigned long)state->request.data.gid));
+
+       gr = getgrgid(state->request.data.gid);
+       if (gr == NULL)
+               return WINBINDD_ERROR;
+
+       fstrcpy(state->response.data.name.name, gr->gr_name);
+       return WINBINDD_OK;
+}
+
+#if 0  /* not used */
+static void name2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                         struct winbindd_response *response,
+                         void *c, void *private_data);
+
+static void winbindd_name2gid_async(TALLOC_CTX *mem_ctx, const char *name,
+                                   void (*cont)(void *private_data, BOOL success,
+                                                gid_t gid),
+                                   void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_NAME2GID;
+       fstrcpy(request.data.groupname, name);
+       do_async(mem_ctx, idmap_child(), &request, name2gid_recv,
+                (void *)cont, private_data);
+}
+#endif /* not used */
+
+enum winbindd_result winbindd_dual_name2gid(struct winbindd_domain *domain,
+                                           struct winbindd_cli_state *state)
+{
+       struct group *gr;
+
+       /* Ensure null termination */
+       state->request.data.groupname
+               [sizeof(state->request.data.groupname)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: name2gid %s\n", (unsigned long)state->pid, 
+                 state->request.data.groupname));
+
+       gr = getgrnam(state->request.data.groupname);
+       if (gr == NULL) {
+               return WINBINDD_ERROR;
+       }
+
+       state->response.data.gid = gr->gr_gid;
+       return WINBINDD_OK;
+}
+
+#if 0  /* not used */
+static void name2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                         struct winbindd_response *response,
+                         void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, gid_t gid) =
+               (void (*)(void *, BOOL, gid_t))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger name2gid\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("name2gid returned an error\n"));
+               cont(private_data, False, 0);
+               return;
+       }
+
+       cont(private_data, True, response->data.gid);
+}
+#endif /* not used */
+
 struct lookupsid_state {
        DOM_SID sid;    
        void *caller_private_data;
@@ -952,3 +1527,169 @@ void query_user_async(TALLOC_CTX *mem_ctx, struct winbindd_domain *domain,
        do_async_domain(mem_ctx, domain, &request, query_user_recv,
                        (void *)cont, private_data);
 }
+
+/* The following uid2sid/gid2sid functions has been contributed by
+ * Keith Reynolds <Keith.Reynolds@centrify.com> */
+
+static void winbindd_uid2sid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                                 struct winbindd_response *response,
+                                 void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, const char *sid) =
+               (void (*)(void *, BOOL, const char *))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger uid2sid\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("uid2sid returned an error\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       cont(private_data, True, response->data.sid.sid);
+}
+
+void winbindd_uid2sid_async(TALLOC_CTX *mem_ctx, uid_t uid,
+                           void (*cont)(void *private_data, BOOL success, const char *sid),
+                           void *private_data)
+{
+       struct winbindd_request request;
+
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_UID2SID;
+       request.data.uid = uid;
+       do_async(mem_ctx, idmap_child(), &request, winbindd_uid2sid_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_uid2sid(struct winbindd_domain *domain,
+                                          struct winbindd_cli_state *state)
+{
+       DOM_SID sid;
+       NTSTATUS result;
+
+       DEBUG(3,("[%5lu]: uid to sid %lu\n",
+                (unsigned long)state->pid,
+                (unsigned long) state->request.data.uid));
+
+       /* Find sid for this uid and return it, possibly ask the slow remote idmap */
+       result = idmap_uid_to_sid(&sid, state->request.data.uid);
+
+       if (NT_STATUS_IS_OK(result)) {
+               sid_to_string(state->response.data.sid.sid, &sid);
+               state->response.data.sid.type = SID_NAME_USER;
+               return WINBINDD_OK;
+       }
+
+       return WINBINDD_ERROR;
+}
+
+static void winbindd_gid2sid_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                                 struct winbindd_response *response,
+                                 void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ, const char *sid) =
+               (void (*)(void *, BOOL, const char *))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger gid2sid\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("gid2sid returned an error\n"));
+               cont(private_data, False, NULL);
+               return;
+       }
+
+       cont(private_data, True, response->data.sid.sid);
+}
+
+void winbindd_gid2sid_async(TALLOC_CTX *mem_ctx, gid_t gid,
+                           void (*cont)(void *private_data, BOOL success, const char *sid),
+                           void *private_data)
+{
+       struct winbindd_request request;
+
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_GID2SID;
+       request.data.gid = gid;
+       do_async(mem_ctx, idmap_child(), &request, winbindd_gid2sid_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_gid2sid(struct winbindd_domain *domain,
+                                          struct winbindd_cli_state *state)
+{
+       DOM_SID sid;
+       NTSTATUS result;
+
+       DEBUG(3,("[%5lu]: gid %lu to sid\n",
+               (unsigned long)state->pid,
+               (unsigned long) state->request.data.gid));
+
+       /* Find sid for this gid and return it, possibly ask the slow remote idmap */
+       result = idmap_gid_to_sid(&sid, state->request.data.gid);
+
+       if (NT_STATUS_IS_OK(result)) {
+               sid_to_string(state->response.data.sid.sid, &sid);
+               DEBUG(10, ("[%5lu]: retrieved sid: %s\n",
+                          (unsigned long)state->pid,
+                          state->response.data.sid.sid));
+               state->response.data.sid.type = SID_NAME_DOM_GRP;
+               return WINBINDD_OK;
+       }
+
+       return WINBINDD_ERROR;
+}
+
+static void winbindd_dump_id_maps_recv(TALLOC_CTX *mem_ctx, BOOL success,
+                              struct winbindd_response *response,
+                              void *c, void *private_data)
+{
+       void (*cont)(void *priv, BOOL succ) =
+               (void (*)(void *, BOOL))c;
+
+       if (!success) {
+               DEBUG(5, ("Could not trigger a map dump\n"));
+               cont(private_data, False);
+               return;
+       }
+
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("idmap dump maps returned an error\n"));
+               cont(private_data, False);
+               return;
+       }
+
+       cont(private_data, True);
+}
+                        
+void winbindd_dump_maps_async(TALLOC_CTX *mem_ctx, void *data, int size,
+                        void (*cont)(void *private_data, BOOL success),
+                        void *private_data)
+{
+       struct winbindd_request request;
+       ZERO_STRUCT(request);
+       request.cmd = WINBINDD_DUAL_DUMP_MAPS;
+       request.extra_data.data = (char *)data;
+       request.extra_len = size;
+       do_async(mem_ctx, idmap_child(), &request, winbindd_dump_id_maps_recv,
+                (void *)cont, private_data);
+}
+
+enum winbindd_result winbindd_dual_dump_maps(struct winbindd_domain *domain,
+                                          struct winbindd_cli_state *state)
+{
+       DEBUG(3, ("[%5lu]: dual dump maps\n", (unsigned long)state->pid));
+
+       idmap_dump_maps((char *)state->request.extra_data.data);
+
+       return WINBINDD_OK;
+}
+
index 9ffb3dfb239bb6dc028c6a1ae8737d62a6141495..e12b13cbbd1b16ef5c7f7c5e7a543fc6bb2c37b6 100644 (file)
@@ -2224,12 +2224,6 @@ NTSTATUS cm_connect_netlogon(struct winbindd_domain *domain,
  no_schannel:
        if ((lp_client_schannel() == False) ||
                        ((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) {
-
-               /*
-                * NetSamLogonEx only works for schannel
-                */
-               domain->can_do_samlogon_ex = False;
-
                /* We're done - just keep the existing connection to NETLOGON
                 * open */
                conn->netlogon_pipe = netlogon_pipe;
@@ -2261,11 +2255,6 @@ NTSTATUS cm_connect_netlogon(struct winbindd_domain *domain,
                return !NT_STATUS_IS_OK(result) ? result : NT_STATUS_PIPE_NOT_AVAILABLE;
        }
 
-       /*
-        * Try NetSamLogonEx for AD domains
-        */
-       domain->can_do_samlogon_ex = domain->active_directory;
-       
        *cli = conn->netlogon_pipe;
        return NT_STATUS_OK;
 }
index 7e53fbbbeeb91570825cf79371e1d2e999fdae6e..d9a42c31dc12f9e76e32838d6b6cc0f47a374f97 100644 (file)
@@ -408,14 +408,23 @@ void sendto_domain(struct winbindd_cli_state *state,
                             recvfrom_child, state);
 }
 
-const struct winbindd_child_dispatch_table domain_dispatch_table[] = {
 
+struct winbindd_child_dispatch_table {
+       enum winbindd_cmd cmd;
+       enum winbindd_result (*fn)(struct winbindd_domain *domain,
+                                  struct winbindd_cli_state *state);
+       const char *winbindd_cmd_name;
+};
+
+static struct winbindd_child_dispatch_table child_dispatch_table[] = {
+       
        { WINBINDD_LOOKUPSID,            winbindd_dual_lookupsid,             "LOOKUPSID" },
        { WINBINDD_LOOKUPNAME,           winbindd_dual_lookupname,            "LOOKUPNAME" },
        { WINBINDD_LOOKUPRIDS,           winbindd_dual_lookuprids,            "LOOKUPRIDS" },
        { WINBINDD_LIST_TRUSTDOM,        winbindd_dual_list_trusted_domains,  "LIST_TRUSTDOM" },
        { WINBINDD_INIT_CONNECTION,      winbindd_dual_init_connection,       "INIT_CONNECTION" },
        { WINBINDD_GETDCNAME,            winbindd_dual_getdcname,             "GETDCNAME" },
+       { WINBINDD_DSGETDCNAME,          winbindd_dual_dsgetdcname,           "DSGETDCNAME" },
        { WINBINDD_SHOW_SEQUENCE,        winbindd_dual_show_sequence,         "SHOW_SEQUENCE" },
        { WINBINDD_PAM_AUTH,             winbindd_dual_pam_auth,              "PAM_AUTH" },
        { WINBINDD_PAM_AUTH_CRAP,        winbindd_dual_pam_auth_crap,         "AUTH_CRAP" },
@@ -423,7 +432,23 @@ const struct winbindd_child_dispatch_table domain_dispatch_table[] = {
        { WINBINDD_PAM_CHNG_PSWD_AUTH_CRAP,winbindd_dual_pam_chng_pswd_auth_crap,"CHNG_PSWD_AUTH_CRAP" },
        { WINBINDD_PAM_CHAUTHTOK,        winbindd_dual_pam_chauthtok,         "PAM_CHAUTHTOK" },
        { WINBINDD_CHECK_MACHACC,        winbindd_dual_check_machine_acct,    "CHECK_MACHACC" },
+       { WINBINDD_DUAL_SID2UID,         winbindd_dual_sid2uid,               "DUAL_SID2UID" },
+       { WINBINDD_DUAL_SID2GID,         winbindd_dual_sid2gid,               "DUAL_SID2GID" },
+#if 0   /* DISABLED until we fix the interface in Samba 3.0.26 --jerry */
+       { WINBINDD_DUAL_SIDS2XIDS,       winbindd_dual_sids2xids,             "DUAL_SIDS2XIDS" },
+#endif  /* end DISABLED */
+       { WINBINDD_DUAL_UID2SID,         winbindd_dual_uid2sid,               "DUAL_UID2SID" },
+       { WINBINDD_DUAL_GID2SID,         winbindd_dual_gid2sid,               "DUAL_GID2SID" },
+       { WINBINDD_DUAL_UID2NAME,        winbindd_dual_uid2name,              "DUAL_UID2NAME" },
+       { WINBINDD_DUAL_NAME2UID,        winbindd_dual_name2uid,              "DUAL_NAME2UID" },
+       { WINBINDD_DUAL_GID2NAME,        winbindd_dual_gid2name,              "DUAL_GID2NAME" },
+       { WINBINDD_DUAL_NAME2GID,        winbindd_dual_name2gid,              "DUAL_NAME2GID" },
+       { WINBINDD_DUAL_SET_MAPPING,     winbindd_dual_set_mapping,           "DUAL_SET_MAPPING" },
+       { WINBINDD_DUAL_SET_HWM,         winbindd_dual_set_hwm,               "DUAL_SET_HWMS" },
+       { WINBINDD_DUAL_DUMP_MAPS,       winbindd_dual_dump_maps,             "DUAL_DUMP_MAPS" },
        { WINBINDD_DUAL_USERINFO,        winbindd_dual_userinfo,              "DUAL_USERINFO" },
+       { WINBINDD_ALLOCATE_UID,         winbindd_dual_allocate_uid,          "ALLOCATE_UID" },
+       { WINBINDD_ALLOCATE_GID,         winbindd_dual_allocate_gid,          "ALLOCATE_GID" },
        { WINBINDD_GETUSERDOMGROUPS,     winbindd_dual_getuserdomgroups,      "GETUSERDOMGROUPS" },
        { WINBINDD_DUAL_GETSIDALIASES,   winbindd_dual_getsidaliases,         "GETSIDALIASES" },
        { WINBINDD_CCACHE_NTLMAUTH,      winbindd_dual_ccache_ntlm_auth,      "CCACHE_NTLM_AUTH" },
@@ -432,11 +457,10 @@ const struct winbindd_child_dispatch_table domain_dispatch_table[] = {
        { WINBINDD_NUM_CMDS, NULL, "NONE" }
 };
 
-static void child_process_request(struct winbindd_child *child,
+static void child_process_request(struct winbindd_domain *domain,
                                  struct winbindd_cli_state *state)
 {
-       struct winbindd_domain *domain = child->domain;
-       const struct winbindd_child_dispatch_table *table = child->table;
+       struct winbindd_child_dispatch_table *table;
 
        /* Free response data - we may be interrupted and receive another
           command before being able to send this data off. */
@@ -449,7 +473,7 @@ static void child_process_request(struct winbindd_child *child,
 
        /* Process command */
 
-       for (; table->fn; table++) {
+       for (table = child_dispatch_table; table->fn; table++) {
                if (state->request.cmd == table->cmd) {
                        DEBUG(10,("process_request: request fn %s\n",
                                  table->winbindd_cmd_name ));
@@ -459,7 +483,7 @@ static void child_process_request(struct winbindd_child *child,
        }
 
        if (!table->fn) {
-               DEBUG(1 ,("child_process_request: unknown request fn number %d\n",
+               DEBUG(10,("process_request: unknown request fn number %d\n",
                          (int)state->request.cmd ));
                state->response.result = WINBINDD_ERROR;
        }
@@ -467,7 +491,6 @@ static void child_process_request(struct winbindd_child *child,
 
 void setup_domain_child(struct winbindd_domain *domain,
                        struct winbindd_child *child,
-                       const struct winbindd_child_dispatch_table *table,
                        const char *explicit_logfile)
 {
        if (explicit_logfile != NULL) {
@@ -482,7 +505,6 @@ void setup_domain_child(struct winbindd_domain *domain,
        }
 
        child->domain = domain;
-       child->table = table;
 }
 
 struct winbindd_child *children = NULL;
@@ -1084,7 +1106,7 @@ static BOOL fork_domain_child(struct winbindd_child *child)
 
                ZERO_STRUCT(state.response);
                state.request.null_term = '\0';
-               child_process_request(child, &state);
+               child_process_request(child->domain, &state);
 
                SAFE_FREE(state.request.extra_data.data);
 
diff --git a/source3/winbindd/winbindd_idmap.c b/source3/winbindd/winbindd_idmap.c
deleted file mode 100644 (file)
index e8b0610..0000000
+++ /dev/null
@@ -1,819 +0,0 @@
-/*
-   Unix SMB/CIFS implementation.
-
-   Async helpers for blocking functions
-
-   Copyright (C) Volker Lendecke 2005
-   Copyright (C) Gerald Carter 2006
-   Copyright (C) Simo Sorce 2007
-
-   The helpers always consist of three functions:
-
-   * A request setup function that takes the necessary parameters together
-     with a continuation function that is to be called upon completion
-
-   * A private continuation function that is internal only. This is to be
-     called by the lower-level functions in do_async(). Its only task is to
-     properly call the continuation function named above.
-
-   * A worker function that is called inside the appropriate child process.
-
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "winbindd.h"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_WINBIND
-
-static const struct winbindd_child_dispatch_table idmap_dispatch_table[];
-
-static struct winbindd_child static_idmap_child;
-
-void init_idmap_child(void)
-{
-       setup_domain_child(NULL,
-                          &static_idmap_child,
-                          idmap_dispatch_table,
-                          "idmap");
-}
-
-struct winbindd_child *idmap_child(void)
-{
-       return &static_idmap_child;
-}
-
-static void winbindd_set_mapping_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                                  struct winbindd_response *response,
-                                  void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ) = (void (*)(void *, BOOL))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger idmap_set_mapping\n"));
-               cont(private_data, False);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("idmap_set_mapping returned an error\n"));
-               cont(private_data, False);
-               return;
-       }
-
-       cont(private_data, True);
-}
-
-void winbindd_set_mapping_async(TALLOC_CTX *mem_ctx, const struct id_map *map,
-                            void (*cont)(void *private_data, BOOL success),
-                            void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_SET_MAPPING;
-       request.data.dual_idmapset.id = map->xid.id;
-       request.data.dual_idmapset.type = map->xid.type;
-       sid_to_string(request.data.dual_idmapset.sid, map->sid);
-
-       do_async(mem_ctx, idmap_child(), &request, winbindd_set_mapping_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_set_mapping(struct winbindd_domain *domain,
-                                           struct winbindd_cli_state *state)
-{
-       struct id_map map;
-       DOM_SID sid;
-       NTSTATUS result;
-
-       DEBUG(3, ("[%5lu]: dual_idmapset\n", (unsigned long)state->pid));
-
-       if (!string_to_sid(&sid, state->request.data.dual_idmapset.sid))
-               return WINBINDD_ERROR;
-
-       map.sid = &sid;
-       map.xid.id = state->request.data.dual_idmapset.id;
-       map.xid.type = state->request.data.dual_idmapset.type;
-       map.status = ID_MAPPED;
-
-       result = idmap_set_mapping(&map);
-       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
-}
-
-static void winbindd_set_hwm_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                                  struct winbindd_response *response,
-                                  void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ) = (void (*)(void *, BOOL))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger idmap_set_hwm\n"));
-               cont(private_data, False);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("idmap_set_hwm returned an error\n"));
-               cont(private_data, False);
-               return;
-       }
-
-       cont(private_data, True);
-}
-
-void winbindd_set_hwm_async(TALLOC_CTX *mem_ctx, const struct unixid *xid,
-                            void (*cont)(void *private_data, BOOL success),
-                            void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_SET_HWM;
-       request.data.dual_idmapset.id = xid->id;
-       request.data.dual_idmapset.type = xid->type;
-
-       do_async(mem_ctx, idmap_child(), &request, winbindd_set_hwm_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_set_hwm(struct winbindd_domain *domain,
-                                           struct winbindd_cli_state *state)
-{
-       struct unixid xid;
-       NTSTATUS result;
-
-       DEBUG(3, ("[%5lu]: dual_set_hwm\n", (unsigned long)state->pid));
-
-       xid.id = state->request.data.dual_idmapset.id;
-       xid.type = state->request.data.dual_idmapset.type;
-
-       switch (xid.type) {
-       case ID_TYPE_UID:
-               result = idmap_set_uid_hwm(&xid);
-               break;
-       case ID_TYPE_GID:
-               result = idmap_set_gid_hwm(&xid);
-               break;
-       default:
-               return WINBINDD_ERROR;
-       }
-       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
-}
-
-static void winbindd_sids2xids_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                              struct winbindd_response *response,
-                              void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, void *, int) =
-               (void (*)(void *, BOOL, void *, int))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger sids2xids\n"));
-               cont(private_data, False, NULL, 0);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("sids2xids returned an error\n"));
-               cont(private_data, False, NULL, 0);
-               return;
-       }
-
-       cont(private_data, True, response->extra_data.data, response->length - sizeof(response));
-}
-
-void winbindd_sids2xids_async(TALLOC_CTX *mem_ctx, void *sids, int size,
-                        void (*cont)(void *private_data, BOOL success, void *data, int len),
-                        void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_SIDS2XIDS;
-       request.extra_data.data = (char *)sids;
-       request.extra_len = size;
-       do_async(mem_ctx, idmap_child(), &request, winbindd_sids2xids_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_sids2xids(struct winbindd_domain *domain,
-                                          struct winbindd_cli_state *state)
-{
-       DOM_SID *sids;
-       struct unixid *xids;
-       struct id_map **ids;
-       NTSTATUS result;
-       int num, i;
-
-       DEBUG(3, ("[%5lu]: sids to unix ids\n", (unsigned long)state->pid));
-
-       if (state->request.extra_len == 0) {
-               DEBUG(0, ("Invalid buffer size!\n"));
-               return WINBINDD_ERROR;
-       }
-
-       sids = (DOM_SID *)state->request.extra_data.data;
-       num = state->request.extra_len / sizeof(DOM_SID);
-
-       ids = TALLOC_ZERO_ARRAY(state->mem_ctx, struct id_map *, num + 1);
-       if ( ! ids) {
-               DEBUG(0, ("Out of memory!\n"));
-               return WINBINDD_ERROR;
-       }
-       for (i = 0; i < num; i++) {
-               ids[i] = TALLOC_P(ids, struct id_map);
-               if ( ! ids[i]) {
-                       DEBUG(0, ("Out of memory!\n"));
-                       talloc_free(ids);
-                       return WINBINDD_ERROR;
-               }
-               ids[i]->sid = &sids[i];
-       }
-
-       result = idmap_sids_to_unixids(ids);
-
-       if (NT_STATUS_IS_OK(result)) {
-
-               xids = SMB_MALLOC_ARRAY(struct unixid, num);
-               if ( ! xids) {
-                       DEBUG(0, ("Out of memory!\n"));
-                       talloc_free(ids);
-                       return WINBINDD_ERROR;
-               }
-
-               for (i = 0; i < num; i++) {
-                       if (ids[i]->status == ID_MAPPED) {
-                               xids[i].type = ids[i]->xid.type;
-                               xids[i].id = ids[i]->xid.id;
-                       } else {
-                               xids[i].type = -1;
-                       }
-               }
-
-               state->response.length = sizeof(state->response) + (sizeof(struct unixid) * num);
-               state->response.extra_data.data = xids;
-
-       } else {
-               DEBUG (2, ("idmap_sids_to_unixids returned an error: 0x%08x\n", NT_STATUS_V(result)));
-               talloc_free(ids);
-               return WINBINDD_ERROR;
-       }
-
-       talloc_free(ids);
-       return WINBINDD_OK;
-}
-
-static void winbindd_sid2uid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                              struct winbindd_response *response,
-                              void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, uid_t uid) =
-               (void (*)(void *, BOOL, uid_t))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger sid2uid\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("sid2uid returned an error\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       cont(private_data, True, response->data.uid);
-}
-
-void winbindd_sid2uid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
-                        void (*cont)(void *private_data, BOOL success, uid_t uid),
-                        void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_SID2UID;
-       sid_to_string(request.data.dual_sid2id.sid, sid);
-       do_async(mem_ctx, idmap_child(), &request, winbindd_sid2uid_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_sid2uid(struct winbindd_domain *domain,
-                                          struct winbindd_cli_state *state)
-{
-       DOM_SID sid;
-       NTSTATUS result;
-
-       DEBUG(3, ("[%5lu]: sid to uid %s\n", (unsigned long)state->pid,
-                 state->request.data.dual_sid2id.sid));
-
-       if (!string_to_sid(&sid, state->request.data.dual_sid2id.sid)) {
-               DEBUG(1, ("Could not get convert sid %s from string\n",
-                         state->request.data.dual_sid2id.sid));
-               return WINBINDD_ERROR;
-       }
-
-       /* Find uid for this sid and return it, possibly ask the slow remote idmap */
-
-       result = idmap_sid_to_uid(&sid, &(state->response.data.uid));
-
-       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
-}
-
-#if 0  /* not used */
-static void uid2name_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                         struct winbindd_response *response,
-                         void *c, void *private_data);
-
-void winbindd_uid2name_async(TALLOC_CTX *mem_ctx, uid_t uid,
-                            void (*cont)(void *private_data, BOOL success,
-                                         const char *name),
-                            void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_UID2NAME;
-       request.data.uid = uid;
-       do_async(mem_ctx, idmap_child(), &request, uid2name_recv,
-                (void *)cont, private_data);
-}
-#endif /* not used */
-
-enum winbindd_result winbindd_dual_uid2name(struct winbindd_domain *domain,
-                                           struct winbindd_cli_state *state)
-{
-       struct passwd *pw;
-
-       DEBUG(3, ("[%5lu]: uid2name %lu\n", (unsigned long)state->pid,
-                 (unsigned long)state->request.data.uid));
-
-       pw = getpwuid(state->request.data.uid);
-       if (pw == NULL) {
-               DEBUG(5, ("User %lu not found\n",
-                         (unsigned long)state->request.data.uid));
-               return WINBINDD_ERROR;
-       }
-
-       fstrcpy(state->response.data.name.name, pw->pw_name);
-       return WINBINDD_OK;
-}
-
-#if 0  /* not used */
-static void uid2name_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                         struct winbindd_response *response,
-                         void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, const char *name) =
-               (void (*)(void *, BOOL, const char *))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger uid2name\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("uid2name returned an error\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       cont(private_data, True, response->data.name.name);
-}
-
-static void name2uid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                         struct winbindd_response *response,
-                         void *c, void *private_data);
-
-static void winbindd_name2uid_async(TALLOC_CTX *mem_ctx, const char *name,
-                                   void (*cont)(void *private_data, BOOL success,
-                                                uid_t uid),
-                                   void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_NAME2UID;
-       fstrcpy(request.data.username, name);
-       do_async(mem_ctx, idmap_child(), &request, name2uid_recv,
-                (void *)cont, private_data);
-}
-#endif /* not used */
-
-enum winbindd_result winbindd_dual_name2uid(struct winbindd_domain *domain,
-                                           struct winbindd_cli_state *state)
-{
-       struct passwd *pw;
-
-       /* Ensure null termination */
-       state->request.data.username
-               [sizeof(state->request.data.username)-1] = '\0';
-
-       DEBUG(3, ("[%5lu]: name2uid %s\n", (unsigned long)state->pid,
-                 state->request.data.username));
-
-       pw = getpwnam(state->request.data.username);
-       if (pw == NULL) {
-               return WINBINDD_ERROR;
-       }
-
-       state->response.data.uid = pw->pw_uid;
-       return WINBINDD_OK;
-}
-
-#if 0  /* not used */
-static void name2uid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                         struct winbindd_response *response,
-                         void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, uid_t uid) =
-               (void (*)(void *, BOOL, uid_t))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger name2uid\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("name2uid returned an error\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       cont(private_data, True, response->data.uid);
-}
-#endif /* not used */
-
-static void winbindd_sid2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                              struct winbindd_response *response,
-                              void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, gid_t gid) =
-               (void (*)(void *, BOOL, gid_t))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger sid2gid\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("sid2gid returned an error\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       cont(private_data, True, response->data.gid);
-}
-
-void winbindd_sid2gid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
-                        void (*cont)(void *private_data, BOOL success, gid_t gid),
-                        void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_SID2GID;
-       sid_to_string(request.data.dual_sid2id.sid, sid);
-
-       DEBUG(7,("winbindd_sid2gid_async: Resolving %s to a gid\n",
-               request.data.dual_sid2id.sid));
-
-       do_async(mem_ctx, idmap_child(), &request, winbindd_sid2gid_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_sid2gid(struct winbindd_domain *domain,
-                                          struct winbindd_cli_state *state)
-{
-       DOM_SID sid;
-       NTSTATUS result;
-
-       DEBUG(3, ("[%5lu]: sid to gid %s\n", (unsigned long)state->pid,
-                 state->request.data.dual_sid2id.sid));
-
-       if (!string_to_sid(&sid, state->request.data.dual_sid2id.sid)) {
-               DEBUG(1, ("Could not get convert sid %s from string\n",
-                         state->request.data.dual_sid2id.sid));
-               return WINBINDD_ERROR;
-       }
-
-       /* Find gid for this sid and return it, possibly ask the slow remote idmap */
-
-       result = idmap_sid_to_gid(&sid, &state->response.data.gid);
-
-       DEBUG(10, ("winbindd_dual_sid2gid: 0x%08x - %s - %u\n", NT_STATUS_V(result), sid_string_static(&sid), state->response.data.gid));
-
-       return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;
-}
-
-static void gid2name_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                         struct winbindd_response *response,
-                         void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, const char *name) =
-               (void (*)(void *, BOOL, const char *))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger gid2name\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("gid2name returned an error\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       cont(private_data, True, response->data.name.name);
-}
-
-void winbindd_gid2name_async(TALLOC_CTX *mem_ctx, gid_t gid,
-                            void (*cont)(void *private_data, BOOL success,
-                                         const char *name),
-                            void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_GID2NAME;
-       request.data.gid = gid;
-       do_async(mem_ctx, idmap_child(), &request, gid2name_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_gid2name(struct winbindd_domain *domain,
-                                           struct winbindd_cli_state *state)
-{
-       struct group *gr;
-
-       DEBUG(3, ("[%5lu]: gid2name %lu\n", (unsigned long)state->pid,
-                 (unsigned long)state->request.data.gid));
-
-       gr = getgrgid(state->request.data.gid);
-       if (gr == NULL)
-               return WINBINDD_ERROR;
-
-       fstrcpy(state->response.data.name.name, gr->gr_name);
-       return WINBINDD_OK;
-}
-
-#if 0  /* not used */
-static void name2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                         struct winbindd_response *response,
-                         void *c, void *private_data);
-
-static void winbindd_name2gid_async(TALLOC_CTX *mem_ctx, const char *name,
-                                   void (*cont)(void *private_data, BOOL success,
-                                                gid_t gid),
-                                   void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_NAME2GID;
-       fstrcpy(request.data.groupname, name);
-       do_async(mem_ctx, idmap_child(), &request, name2gid_recv,
-                (void *)cont, private_data);
-}
-#endif /* not used */
-
-enum winbindd_result winbindd_dual_name2gid(struct winbindd_domain *domain,
-                                           struct winbindd_cli_state *state)
-{
-       struct group *gr;
-
-       /* Ensure null termination */
-       state->request.data.groupname
-               [sizeof(state->request.data.groupname)-1] = '\0';
-
-       DEBUG(3, ("[%5lu]: name2gid %s\n", (unsigned long)state->pid,
-                 state->request.data.groupname));
-
-       gr = getgrnam(state->request.data.groupname);
-       if (gr == NULL) {
-               return WINBINDD_ERROR;
-       }
-
-       state->response.data.gid = gr->gr_gid;
-       return WINBINDD_OK;
-}
-
-#if 0  /* not used */
-static void name2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                         struct winbindd_response *response,
-                         void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, gid_t gid) =
-               (void (*)(void *, BOOL, gid_t))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger name2gid\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("name2gid returned an error\n"));
-               cont(private_data, False, 0);
-               return;
-       }
-
-       cont(private_data, True, response->data.gid);
-}
-#endif /* not used */
-
-/* The following uid2sid/gid2sid functions has been contributed by
- * Keith Reynolds <Keith.Reynolds@centrify.com> */
-
-static void winbindd_uid2sid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                                 struct winbindd_response *response,
-                                 void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, const char *sid) =
-               (void (*)(void *, BOOL, const char *))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger uid2sid\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("uid2sid returned an error\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       cont(private_data, True, response->data.sid.sid);
-}
-
-void winbindd_uid2sid_async(TALLOC_CTX *mem_ctx, uid_t uid,
-                           void (*cont)(void *private_data, BOOL success, const char *sid),
-                           void *private_data)
-{
-       struct winbindd_request request;
-
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_UID2SID;
-       request.data.uid = uid;
-       do_async(mem_ctx, idmap_child(), &request, winbindd_uid2sid_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_uid2sid(struct winbindd_domain *domain,
-                                          struct winbindd_cli_state *state)
-{
-       DOM_SID sid;
-       NTSTATUS result;
-
-       DEBUG(3,("[%5lu]: uid to sid %lu\n",
-                (unsigned long)state->pid,
-                (unsigned long) state->request.data.uid));
-
-       /* Find sid for this uid and return it, possibly ask the slow remote idmap */
-       result = idmap_uid_to_sid(&sid, state->request.data.uid);
-
-       if (NT_STATUS_IS_OK(result)) {
-               sid_to_string(state->response.data.sid.sid, &sid);
-               state->response.data.sid.type = SID_NAME_USER;
-               return WINBINDD_OK;
-       }
-
-       return WINBINDD_ERROR;
-}
-
-static void winbindd_gid2sid_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                                 struct winbindd_response *response,
-                                 void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, const char *sid) =
-               (void (*)(void *, BOOL, const char *))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger gid2sid\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("gid2sid returned an error\n"));
-               cont(private_data, False, NULL);
-               return;
-       }
-
-       cont(private_data, True, response->data.sid.sid);
-}
-
-void winbindd_gid2sid_async(TALLOC_CTX *mem_ctx, gid_t gid,
-                           void (*cont)(void *private_data, BOOL success, const char *sid),
-                           void *private_data)
-{
-       struct winbindd_request request;
-
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_GID2SID;
-       request.data.gid = gid;
-       do_async(mem_ctx, idmap_child(), &request, winbindd_gid2sid_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_gid2sid(struct winbindd_domain *domain,
-                                          struct winbindd_cli_state *state)
-{
-       DOM_SID sid;
-       NTSTATUS result;
-
-       DEBUG(3,("[%5lu]: gid %lu to sid\n",
-               (unsigned long)state->pid,
-               (unsigned long) state->request.data.gid));
-
-       /* Find sid for this gid and return it, possibly ask the slow remote idmap */
-       result = idmap_gid_to_sid(&sid, state->request.data.gid);
-
-       if (NT_STATUS_IS_OK(result)) {
-               sid_to_string(state->response.data.sid.sid, &sid);
-               DEBUG(10, ("[%5lu]: retrieved sid: %s\n",
-                          (unsigned long)state->pid,
-                          state->response.data.sid.sid));
-               state->response.data.sid.type = SID_NAME_DOM_GRP;
-               return WINBINDD_OK;
-       }
-
-       return WINBINDD_ERROR;
-}
-
-static void winbindd_dump_id_maps_recv(TALLOC_CTX *mem_ctx, BOOL success,
-                              struct winbindd_response *response,
-                              void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ) =
-               (void (*)(void *, BOOL))c;
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger a map dump\n"));
-               cont(private_data, False);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("idmap dump maps returned an error\n"));
-               cont(private_data, False);
-               return;
-       }
-
-       cont(private_data, True);
-}
-
-void winbindd_dump_maps_async(TALLOC_CTX *mem_ctx, void *data, int size,
-                        void (*cont)(void *private_data, BOOL success),
-                        void *private_data)
-{
-       struct winbindd_request request;
-       ZERO_STRUCT(request);
-       request.cmd = WINBINDD_DUAL_DUMP_MAPS;
-       request.extra_data.data = (char *)data;
-       request.extra_len = size;
-       do_async(mem_ctx, idmap_child(), &request, winbindd_dump_id_maps_recv,
-                (void *)cont, private_data);
-}
-
-enum winbindd_result winbindd_dual_dump_maps(struct winbindd_domain *domain,
-                                          struct winbindd_cli_state *state)
-{
-       DEBUG(3, ("[%5lu]: dual dump maps\n", (unsigned long)state->pid));
-
-       idmap_dump_maps((char *)state->request.extra_data.data);
-
-       return WINBINDD_OK;
-}
-
-static const struct winbindd_child_dispatch_table idmap_dispatch_table[] = {
-
-       { WINBINDD_DUAL_SID2UID,         winbindd_dual_sid2uid,               "DUAL_SID2UID" },
-       { WINBINDD_DUAL_SID2GID,         winbindd_dual_sid2gid,               "DUAL_SID2GID" },
-#if 0   /* DISABLED until we fix the interface in Samba 3.0.26 --jerry */
-       { WINBINDD_DUAL_SIDS2XIDS,       winbindd_dual_sids2xids,             "DUAL_SIDS2XIDS" },
-#endif  /* end DISABLED */
-       { WINBINDD_DUAL_UID2SID,         winbindd_dual_uid2sid,               "DUAL_UID2SID" },
-       { WINBINDD_DUAL_GID2SID,         winbindd_dual_gid2sid,               "DUAL_GID2SID" },
-       { WINBINDD_DUAL_UID2NAME,        winbindd_dual_uid2name,              "DUAL_UID2NAME" },
-       { WINBINDD_DUAL_NAME2UID,        winbindd_dual_name2uid,              "DUAL_NAME2UID" },
-       { WINBINDD_DUAL_GID2NAME,        winbindd_dual_gid2name,              "DUAL_GID2NAME" },
-       { WINBINDD_DUAL_NAME2GID,        winbindd_dual_name2gid,              "DUAL_NAME2GID" },
-       { WINBINDD_DUAL_SET_MAPPING,     winbindd_dual_set_mapping,           "DUAL_SET_MAPPING" },
-       { WINBINDD_DUAL_SET_HWM,         winbindd_dual_set_hwm,               "DUAL_SET_HWMS" },
-       { WINBINDD_DUAL_DUMP_MAPS,       winbindd_dual_dump_maps,             "DUAL_DUMP_MAPS" },
-       { WINBINDD_ALLOCATE_UID,         winbindd_dual_allocate_uid,          "ALLOCATE_UID" },
-       { WINBINDD_ALLOCATE_GID,         winbindd_dual_allocate_gid,          "ALLOCATE_GID" },
-       /* End of list */
-
-       { WINBINDD_NUM_CMDS, NULL, "NONE" }
-};
diff --git a/source3/winbindd/winbindd_locator.c b/source3/winbindd/winbindd_locator.c
deleted file mode 100644 (file)
index ade2c15..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-   Unix SMB/CIFS implementation.
-
-   Winbind daemon - miscellaneous other functions
-
-   Copyright (C) Tim Potter      2000
-   Copyright (C) Andrew Bartlett 2002
-
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "winbindd.h"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_WINBIND
-
-
-static const struct winbindd_child_dispatch_table locator_dispatch_table[];
-
-static struct winbindd_child static_locator_child;
-
-void init_locator_child(void)
-{
-       setup_domain_child(NULL,
-                          &static_locator_child,
-                          locator_dispatch_table,
-                          "locator");
-}
-
-struct winbindd_child *locator_child(void)
-{
-       return &static_locator_child;
-}
-
-void winbindd_dsgetdcname(struct winbindd_cli_state *state)
-{
-       state->request.domain_name
-               [sizeof(state->request.domain_name)-1] = '\0';
-
-       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
-                 state->request.domain_name));
-
-       sendto_child(state, locator_child());
-}
-
-static enum winbindd_result dual_dsgetdcname(struct winbindd_domain *domain,
-                                            struct winbindd_cli_state *state)
-{
-       NTSTATUS result;
-       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
-       const char *dc = NULL;
-
-       state->request.domain_name
-               [sizeof(state->request.domain_name)-1] = '\0';
-
-       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
-                 state->request.domain_name));
-
-       result = DsGetDcName(state->mem_ctx, NULL, state->request.domain_name,
-                            NULL, NULL, state->request.flags, &info);
-
-       if (!NT_STATUS_IS_OK(result)) {
-               return WINBINDD_ERROR;
-       }
-
-       if (info->domain_controller_address) {
-               dc = info->domain_controller_address;
-               if ((dc[0] == '\\') && (dc[1] == '\\')) {
-                       dc += 2;
-               }
-       }
-
-       if ((!dc || !is_ipaddress(dc)) && info->domain_controller_name) {
-               dc = info->domain_controller_name;
-       }
-
-       if (!dc || !*dc) {
-               return WINBINDD_ERROR;
-       }
-
-       fstrcpy(state->response.data.dc_name, dc);
-
-       return WINBINDD_OK;
-}
-
-static const struct winbindd_child_dispatch_table locator_dispatch_table[] = {
-       { WINBINDD_DSGETDCNAME, dual_dsgetdcname, "DSGETDCNAME" },
-
-       { WINBINDD_NUM_CMDS, NULL, "NONE" }
-};
index 987926e398a115b3f621bf32eca5747573a47eb5..5513e1790ba820f6318d90d20c5a37d8ffbdd8da 100644 (file)
@@ -289,6 +289,70 @@ enum winbindd_result winbindd_dual_getdcname(struct winbindd_domain *domain,
        return WINBINDD_OK;
 }
 
+static struct winbindd_child static_locator_child;
+
+void init_locator_child(void)
+{
+       setup_domain_child(NULL, &static_locator_child, "locator");
+}
+
+struct winbindd_child *locator_child(void)
+{
+       return &static_locator_child;
+}
+
+void winbindd_dsgetdcname(struct winbindd_cli_state *state)
+{
+       state->request.domain_name
+               [sizeof(state->request.domain_name)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
+                 state->request.domain_name));
+
+       sendto_child(state, locator_child());
+}
+
+enum winbindd_result winbindd_dual_dsgetdcname(struct winbindd_domain *domain,
+                                              struct winbindd_cli_state *state)
+{
+       NTSTATUS result;
+       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
+       const char *dc = NULL;
+
+       state->request.domain_name
+               [sizeof(state->request.domain_name)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
+                 state->request.domain_name));
+
+       result = DsGetDcName(state->mem_ctx, NULL, state->request.domain_name,
+                            NULL, NULL, state->request.flags, &info);
+
+       if (!NT_STATUS_IS_OK(result)) {
+               return WINBINDD_ERROR;
+       }
+
+       if (info->domain_controller_address) {
+               dc = info->domain_controller_address;
+               if ((dc[0] == '\\') && (dc[1] == '\\')) {
+                       dc += 2;
+               }
+       }
+
+       if ((!dc || !is_ipaddress(dc)) && info->domain_controller_name) {
+               dc = info->domain_controller_name;
+       }
+
+       if (!dc || !*dc) {
+               return WINBINDD_ERROR;
+       }
+
+       fstrcpy(state->response.data.dc_name, dc);
+
+       return WINBINDD_OK;
+}
+
+
 struct sequence_state {
        TALLOC_CTX *mem_ctx;
        struct winbindd_cli_state *cli_state;
index f823e1d7b277b04a3f1a5c5f3365eeb4b8424c9f..78128521c44393392604af5a87569efdd78c8b28 100644 (file)
@@ -1261,17 +1261,6 @@ NTSTATUS winbindd_dual_pam_auth_samlogon(struct winbindd_domain *domain,
        /* check authentication loop */
 
        do {
-               NTSTATUS (*logon_fn)(struct rpc_pipe_client
-                                    *cli, TALLOC_CTX *mem_ctx,
-                                    uint32 logon_parameters,
-                                    const char *server,
-                                    const char *username,
-                                    const char *domain,
-                                    const char *workstation, 
-                                    const uint8 chal[8], 
-                                    DATA_BLOB lm_response,
-                                    DATA_BLOB nt_response,
-                                    NET_USER_INFO_3 *info3);
 
                ZERO_STRUCTP(my_info3);
                retry = False;
@@ -1283,11 +1272,7 @@ NTSTATUS winbindd_dual_pam_auth_samlogon(struct winbindd_domain *domain,
                        goto done;
                }
 
-               logon_fn = contact_domain->can_do_samlogon_ex
-                       ? rpccli_netlogon_sam_network_logon_ex
-                       : rpccli_netlogon_sam_network_logon;
-
-               result = logon_fn(netlogon_pipe,
+               result = rpccli_netlogon_sam_network_logon(netlogon_pipe,
                                                           state->mem_ctx,
                                                           0,
                                                           contact_domain->dcname, /* server name */
@@ -1298,16 +1283,6 @@ NTSTATUS winbindd_dual_pam_auth_samlogon(struct winbindd_domain *domain,
                                                           lm_resp,
                                                           nt_resp,
                                                           my_info3);
-
-               if ((NT_STATUS_V(result) == DCERPC_FAULT_OP_RNG_ERROR)
-                   && contact_domain->can_do_samlogon_ex) {
-                       DEBUG(3, ("Got a DC that can not do NetSamLogonEx, "
-                                 "retrying with NetSamLogon\n"));
-                       contact_domain->can_do_samlogon_ex = False;
-                       retry = True;
-                       continue;
-               }
-                       
                attempts += 1;
 
                /* We have to try a second time as cm_connect_netlogon
@@ -1803,18 +1778,6 @@ enum winbindd_result winbindd_dual_pam_auth_crap(struct winbindd_domain *domain,
        }
 
        do {
-               NTSTATUS (*logon_fn)(struct rpc_pipe_client
-                                    *cli, TALLOC_CTX *mem_ctx,
-                                    uint32 logon_parameters,
-                                    const char *server,
-                                    const char *username,
-                                    const char *domain,
-                                    const char *workstation, 
-                                    const uint8 chal[8], 
-                                    DATA_BLOB lm_response,
-                                    DATA_BLOB nt_response,
-                                    NET_USER_INFO_3 *info3);
-
                ZERO_STRUCT(info3);
                retry = False;
 
@@ -1827,32 +1790,19 @@ enum winbindd_result winbindd_dual_pam_auth_crap(struct winbindd_domain *domain,
                        goto done;
                }
 
-               logon_fn = contact_domain->can_do_samlogon_ex
-                       ? rpccli_netlogon_sam_network_logon_ex
-                       : rpccli_netlogon_sam_network_logon;
-
-               result = logon_fn(netlogon_pipe,
-                                 state->mem_ctx,
-                                 state->request.data.auth_crap.logon_parameters,
-                                 contact_domain->dcname,
-                                 name_user,
-                                 name_domain, 
-                                       /* Bug #3248 - found by Stefan Burkei. */
-                                 workstation, /* We carefully set this above so use it... */
-                                 state->request.data.auth_crap.chal,
-                                 lm_resp,
-                                 nt_resp,
-                                 &info3);
-
-               if ((NT_STATUS_V(result) == DCERPC_FAULT_OP_RNG_ERROR)
-                   && contact_domain->can_do_samlogon_ex) {
-                       DEBUG(3, ("Got a DC that can not do NetSamLogonEx, "
-                                 "retrying with NetSamLogon\n"));
-                       contact_domain->can_do_samlogon_ex = False;
-                       retry = True;
-                       continue;
-               }
-                       
+               result = rpccli_netlogon_sam_network_logon(netlogon_pipe,
+                                                          state->mem_ctx,
+                                                          state->request.data.auth_crap.logon_parameters,
+                                                          contact_domain->dcname,
+                                                          name_user,
+                                                          name_domain, 
+                                                                       /* Bug #3248 - found by Stefan Burkei. */
+                                                          workstation, /* We carefully set this above so use it... */
+                                                          state->request.data.auth_crap.chal,
+                                                          lm_resp,
+                                                          nt_resp,
+                                                          &info3);
+
                attempts += 1;
 
                /* We have to try a second time as cm_connect_netlogon
index b607db2b191e9a0115e6f7a396153da7a614e93e..48e84d35e5d47008a3defc8636e80370c5b9d1f3 100644 (file)
@@ -152,6 +152,18 @@ void winbindd_lookuprids(struct winbindd_cli_state *state)
        sendto_domain(state, domain);
 }
 
+static struct winbindd_child static_idmap_child;
+
+void init_idmap_child(void)
+{
+       setup_domain_child(NULL, &static_idmap_child, "idmap");
+}
+
+struct winbindd_child *idmap_child(void)
+{
+       return &static_idmap_child;
+}
+
 /* Convert a sid to a uid.  We assume we only have one rid attached to the
    sid. */
 
diff --git a/source3/winbindd/winbindd_sockinit.c b/source3/winbindd/winbindd_sockinit.c
deleted file mode 100644 (file)
index 886b67f..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   Copyright (C) Tim Potter 2000-2001
-   Copyright (C) 2001 by Martin Pool <mbp@samba.org>
-   Copyright (C) James Peach 2007
-   
-   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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "winbindd.h"
-#include "smb_launchd.h"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_WINBIND
-
-/* Open the winbindd socket */
-
-static int _winbindd_socket = -1;
-static int _winbindd_priv_socket = -1;
-static BOOL unlink_winbindd_socket = True;
-
-static int open_winbindd_socket(void)
-{
-       if (_winbindd_socket == -1) {
-               _winbindd_socket = create_pipe_sock(
-                       get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME, 0755);
-               DEBUG(10, ("open_winbindd_socket: opened socket fd %d\n",
-                          _winbindd_socket));
-       }
-
-       return _winbindd_socket;
-}
-
-static int open_winbindd_priv_socket(void)
-{
-       if (_winbindd_priv_socket == -1) {
-               _winbindd_priv_socket = create_pipe_sock(
-                       get_winbind_priv_pipe_dir(), WINBINDD_SOCKET_NAME, 0750);
-               DEBUG(10, ("open_winbindd_priv_socket: opened socket fd %d\n",
-                          _winbindd_priv_socket));
-       }
-
-       return _winbindd_priv_socket;
-}
-
-/* Close the winbindd socket */
-
-static void close_winbindd_socket(void)
-{
-       if (_winbindd_socket != -1) {
-               DEBUG(10, ("close_winbindd_socket: closing socket fd %d\n",
-                          _winbindd_socket));
-               close(_winbindd_socket);
-               _winbindd_socket = -1;
-       }
-       if (_winbindd_priv_socket != -1) {
-               DEBUG(10, ("close_winbindd_socket: closing socket fd %d\n",
-                          _winbindd_priv_socket));
-               close(_winbindd_priv_socket);
-               _winbindd_priv_socket = -1;
-       }
-}
-
-BOOL winbindd_init_sockets(int *public_sock, int *priv_sock,
-                               int *idle_timeout_sec)
-{
-       struct smb_launch_info linfo;
-
-       if (smb_launchd_checkin_names(&linfo, "WinbindPublicPipe",
-                   "WinbindPrivilegedPipe", NULL)) {
-               if (linfo.num_sockets != 2) {
-                       DEBUG(0, ("invalid launchd configuration, "
-                               "expected 2 sockets but got %d\n",
-                               linfo.num_sockets));
-                       return False;
-               }
-
-               *public_sock = _winbindd_socket = linfo.socket_list[0];
-               *priv_sock = _winbindd_priv_socket = linfo.socket_list[1];
-               *idle_timeout_sec = linfo.idle_timeout_secs;
-
-               unlink_winbindd_socket = False;
-
-               smb_launchd_checkout(&linfo);
-               return True;
-       } else {
-               *public_sock = open_winbindd_socket();
-               *priv_sock = open_winbindd_priv_socket();
-               *idle_timeout_sec = -1;
-
-               if (*public_sock == -1 || *priv_sock == -1) {
-                       DEBUG(0, ("failed to open winbindd pipes: %s\n",
-                           errno ? strerror(errno) : "unknown error"));
-                       return False;
-               }
-
-               return True;
-       }
-}
-
-void winbindd_release_sockets(void)
-{
-       pstring path;
-
-       close_winbindd_socket();
-
-       /* Remove socket file */
-       if (unlink_winbindd_socket) {
-               pstr_sprintf(path, "%s/%s",
-                        get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME);
-               unlink(path);
-       }
-}
-
index 49d20c527e54305ec7c55f3d62d88677690b0c1d..c2fe09eead3a3177d4a2c46a334ccb11c2ba0fd0 100644 (file)
@@ -35,6 +35,7 @@ extern struct winbindd_methods passdb_methods;
  * Winbind daemon for NT domain authentication nss module.
  **/
 
+
 /* The list of trusted domains.  Note that the list can be deleted and
    recreated using the init_domain_list() function so pointers to
    individual winbindd_domain structures cannot be made.  Keep a copy of
@@ -324,10 +325,7 @@ static void trustdom_recv(void *private_data, BOOL success)
                                                    &cache_methods,
                                                    &sid);
                        if (domain) {
-                               setup_domain_child(domain,
-                                                  &domain->child,
-                                                  domain_dispatch_table,
-                                                  NULL);
+                               setup_domain_child(domain, &domain->child, NULL);
                        }
                }
                p=q;
@@ -696,10 +694,7 @@ BOOL init_domain_list(void)
        domain = add_trusted_domain("BUILTIN", NULL, &passdb_methods,
                                    &global_sid_Builtin);
        if (domain) {
-               setup_domain_child(domain,
-                                  &domain->child,
-                                  domain_dispatch_table,
-                                  NULL);
+               setup_domain_child(domain, &domain->child, NULL);
        }
 
        /* Local SAM */
@@ -710,10 +705,7 @@ BOOL init_domain_list(void)
                if ( role != ROLE_DOMAIN_MEMBER ) {
                        domain->primary = True;
                }
-               setup_domain_child(domain,
-                                  &domain->child,
-                                  domain_dispatch_table,
-                                  NULL);
+               setup_domain_child(domain, &domain->child, NULL);
        }
 
        /* Add ourselves as the first entry. */
@@ -730,11 +722,8 @@ BOOL init_domain_list(void)
                                             &cache_methods, &our_sid);
                if (domain) {
                        domain->primary = True;
-                       setup_domain_child(domain,
-                                          &domain->child,
-                                          domain_dispatch_table,
-                                          NULL);
-
+                       setup_domain_child(domain, &domain->child, NULL);
+               
                        /* Even in the parent winbindd we'll need to
                           talk to the DC, so try and see if we can
                           contact it. Theoretically this isn't neccessary
@@ -779,10 +768,7 @@ void check_domain_trusted( const char *name, const DOM_SID *user_sid )
        domain->internal = False;
        domain->online = True;  
 
-       setup_domain_child(domain,
-                          &domain->child,
-                          domain_dispatch_table,
-                          NULL);
+       setup_domain_child(domain, &domain->child, NULL);
 
        wcache_tdc_add_domain( domain );
 
@@ -1179,6 +1165,53 @@ char *get_winbind_priv_pipe_dir(void)
        return lock_path(WINBINDD_PRIV_SOCKET_SUBDIR);
 }
 
+/* Open the winbindd socket */
+
+static int _winbindd_socket = -1;
+static int _winbindd_priv_socket = -1;
+
+int open_winbindd_socket(void)
+{
+       if (_winbindd_socket == -1) {
+               _winbindd_socket = create_pipe_sock(
+                       get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME, 0755);
+               DEBUG(10, ("open_winbindd_socket: opened socket fd %d\n",
+                          _winbindd_socket));
+       }
+
+       return _winbindd_socket;
+}
+
+int open_winbindd_priv_socket(void)
+{
+       if (_winbindd_priv_socket == -1) {
+               _winbindd_priv_socket = create_pipe_sock(
+                       get_winbind_priv_pipe_dir(), WINBINDD_SOCKET_NAME, 0750);
+               DEBUG(10, ("open_winbindd_priv_socket: opened socket fd %d\n",
+                          _winbindd_priv_socket));
+       }
+
+       return _winbindd_priv_socket;
+}
+
+/* Close the winbindd socket */
+
+void close_winbindd_socket(void)
+{
+       if (_winbindd_socket != -1) {
+               DEBUG(10, ("close_winbindd_socket: closing socket fd %d\n",
+                          _winbindd_socket));
+               close(_winbindd_socket);
+               _winbindd_socket = -1;
+       }
+       if (_winbindd_priv_socket != -1) {
+               DEBUG(10, ("close_winbindd_socket: closing socket fd %d\n",
+                          _winbindd_priv_socket));
+               close(_winbindd_priv_socket);
+               _winbindd_priv_socket = -1;
+       }
+}
+
 /*
  * Client list accessor functions
  */