[SCM] Samba Shared Repository - branch master updated

Andreas Schneider asn at samba.org
Wed Sep 15 04:54:10 MDT 2010


The branch, master has been updated
       via  db46b2b s3-winbindd: Use rpc_open_pipe_interface in winbindd.
       via  e580c6d s3-rpc_server: Use talloc_stackframe.
       via  8ec7aae s3-rpc_server: Moved ncacn_np declarations in common header file.
       via  390642a s3-rpc_server: Moved "external" pipe functions to rpc_ncacn_np.c.
       via  34225c9 s3-rpc_server: Added new parametric option 'rpc_server'
       via  738c843 s3-rpc_server: Renamed rpc_ncacn_np_internal.c.
       via  5685914 s3-rpc_server: Convert rpc_connect_spoolss_pipe into a generic interface.
       via  344260d s3-rpc_server: Added support for internal connections to external daemons.
       via  e7c4555 s3-rpc_server: Accept connections and process requests.
       via  f7f9916 s3-rpc_server: Added helper functions to read data from a ncacn socket.
       via  7b1748d s3-rpc_client: Added a tstream based transport.
       via  a1f1da7 s3-rpc_server: Addded function to create custom pipes_struct.
       via  b1fdc5a s3-rpc_server: Add generic listener callback.
       via  3c26e95 s3-rpc_server: Added initial generic RPC server infrastructure.
       via  1172187 s3-rpc_server: Added debug to see how much data has been read out.
       via  5ccd7a5 s3-rpc_server: Make process_incoming_data() public.
       via  2ef693e s3-rpc_server: Make pipe destructor public.
       via  3f04b54 s3-rpc_server: Fixed unhandled error condition.
       via  94d86a2 s3-misc: Introduce lp_ncalrpc_dir() in S3, like we have in S4.
       via  65bd8f8 s3-printing: Document the printer list functions.
       via  25a2d94 s3-printing: Add method to skip refresh if just happned.
       via  7022554 s3-printing: Use printer list tdb in pcap.
       via  d2a027e s3-printing: Added a printer list database.
      from  c35629c s3-nltest: add dsgetdc command.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit db46b2bdb04174b90508605911fa0325fb22fd7f
Author: Simo Sorce <idra at samba.org>
Date:   Tue Jul 6 15:29:32 2010 -0400

    s3-winbindd: Use rpc_open_pipe_interface in winbindd.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>

commit e580c6d88f4f124e06562fe56c1d9437d1205658
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Sep 15 11:38:53 2010 +0200

    s3-rpc_server: Use talloc_stackframe.

commit 8ec7aaef48c3d9a6b1f07602c5410b5524099d36
Author: Simo Sorce <idra at samba.org>
Date:   Wed Jul 7 15:24:30 2010 -0400

    s3-rpc_server: Moved ncacn_np declarations in common header file.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>

commit 390642a9e6d1b0d1aacbe17b48c4f3695ee1d80d
Author: Simo Sorce <idra at samba.org>
Date:   Wed Jul 7 15:24:00 2010 -0400

    s3-rpc_server: Moved "external" pipe functions to rpc_ncacn_np.c.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>

commit 34225c93af154fc205be7bf14edd609d39bbdb9c
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Sep 14 13:37:46 2010 +0200

    s3-rpc_server: Added new parametric option 'rpc_server'
    
    Signed-off-by: Andreas Schneider <asn at samba.org>

commit 738c843e99b780e8b4457eef8c4f94d23e08c754
Author: Simo Sorce <idra at samba.org>
Date:   Tue Jul 6 13:03:35 2010 -0400

    s3-rpc_server: Renamed rpc_ncacn_np_internal.c.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>

commit 5685914344d21e5fdac98c367b3dd1eba555f227
Author: Simo Sorce <idra at samba.org>
Date:   Tue Jul 6 11:33:15 2010 -0400

    s3-rpc_server: Convert rpc_connect_spoolss_pipe into a generic interface.
    
    This way we have one common way to open internal pipes whether they
    are shortcircuited or piped to an external process.

commit 344260d03e9a50bce051e180df75f696e2478228
Author: Simo Sorce <idra at samba.org>
Date:   Tue Jun 22 18:03:55 2010 -0400

    s3-rpc_server: Added support for internal connections to external daemons.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>

commit e7c4555b7caf379af38403fe497eea58415b51ed
Author: Simo Sorce <idra at samba.org>
Date:   Fri Jun 18 10:56:58 2010 -0400

    s3-rpc_server: Accept connections and process requests.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit f7f9916dc78d2fb31f65a5186ce68a66fd707cd7
Author: Simo Sorce <idra at samba.org>
Date:   Fri Jun 18 10:55:44 2010 -0400

    s3-rpc_server: Added helper functions to read data from a ncacn socket.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit 7b1748d959d42ae69cfd2936cbc4fafd76046f02
Author: Simo Sorce <idra at samba.org>
Date:   Tue Jun 22 18:01:45 2010 -0400

    s3-rpc_client: Added a tstream based transport.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit a1f1da722633f0e52b85ee4bf3420b6c70b9907b
Author: Simo Sorce <idra at samba.org>
Date:   Fri Jun 18 10:40:19 2010 -0400

    s3-rpc_server: Addded function to create custom pipes_struct.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit b1fdc5a70457979d8aea6574ae135d83efd7628a
Author: Simo Sorce <ssorce at redhat.com>
Date:   Thu May 20 09:16:29 2010 -0400

    s3-rpc_server: Add generic listener callback.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit 3c26e95840454f8a311df037d90663abbda5854c
Author: Simo Sorce <idra at samba.org>
Date:   Fri Jun 18 11:00:38 2010 -0400

    s3-rpc_server: Added initial generic RPC server infrastructure.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit 11721874c3bc47fe7612cae611fbe321f683df6f
Author: Simo Sorce <idra at samba.org>
Date:   Wed Jun 16 09:03:37 2010 -0400

    s3-rpc_server: Added debug to see how much data has been read out.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit 5ccd7a56fa07426c19905d080d6202d7335b4847
Author: Simo Sorce <idra at samba.org>
Date:   Mon Jun 14 21:11:10 2010 -0400

    s3-rpc_server: Make process_incoming_data() public.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit 2ef693e3c83fa0ce298ef8b592d7d4c4ec3dd845
Author: Simo Sorce <ssorce at redhat.com>
Date:   Mon Jun 7 15:18:31 2010 -0400

    s3-rpc_server: Make pipe destructor public.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit 3f04b54197ba7dadd9831d7b5d1f57cf9d0b4014
Author: Simo Sorce <idra at samba.org>
Date:   Tue Jun 22 18:03:17 2010 -0400

    s3-rpc_server: Fixed unhandled error condition.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>

commit 94d86a22a1ecfb74ccaa4ce441c33186544a69c8
Author: Simo Sorce <ssorce at redhat.com>
Date:   Thu May 20 08:39:10 2010 -0400

    s3-misc: Introduce lp_ncalrpc_dir() in S3, like we have in S4.

commit 65bd8f881db3315c1369835fe6cfc2f27a04ae15
Author: Andreas Schneider <asn at cynapses.org>
Date:   Mon Sep 13 11:29:31 2010 +0200

    s3-printing: Document the printer list functions.

commit 25a2d94974c7befd13f90e52b61e297c31ae52e9
Author: Simo Sorce <ssorce at redhat.com>
Date:   Fri May 14 15:49:29 2010 -0400

    s3-printing: Add method to skip refresh if just happned.
    
    This way if multiple process try to refresh at the same time we don't do it
    over and over again.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit 7022554915a0dc7522151eb2a9a21317372471b9
Author: Simo Sorce <ssorce at redhat.com>
Date:   Thu May 13 18:42:55 2010 -0400

    s3-printing: Use printer list tdb in pcap.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

commit d2a027ea941a963de2ff2ee569440a408e883869
Author: Simo Sorce <ssorce at redhat.com>
Date:   Thu May 13 11:35:59 2010 -0400

    s3-printing: Added a printer list database.
    
    Signed-off-by: Andreas Schneider <asn at cynapses.org>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/misc/rpcserver.xml     |   46 ++
 source3/Makefile.in                        |   15 +-
 source3/include/proto.h                    |   19 +-
 source3/librpc/rpc/dcerpc.h                |    4 +
 source3/param/loadparm.c                   |   14 +
 source3/printing/nt_printing_migrate.c     |    1 +
 source3/printing/pcap.c                    |   62 ++-
 source3/printing/printer_list.c            |  415 +++++++++++++
 source3/printing/printer_list.h            |  108 ++++
 source3/printing/printspoolss.c            |   26 +-
 source3/rpc_client/rpc_transport_tstream.c |  361 ++++++++++++
 source3/rpc_server/rpc_ncacn_np.c          |  875 ++++++++++++++++++++++++++++
 source3/rpc_server/rpc_ncacn_np.h          |   61 ++
 source3/rpc_server/rpc_ncacn_np_internal.c |  579 ------------------
 source3/rpc_server/rpc_server.c            |  630 ++++++++++++++++++++
 source3/rpc_server/rpc_server.h            |    4 +-
 source3/rpc_server/srv_netlog_nt.c         |    1 +
 source3/rpc_server/srv_pipe_hnd.c          |  189 +------
 source3/rpc_server/srv_spoolss_util.c      |    1 +
 source3/smbd/lanman.c                      |   64 ++-
 source3/smbd/reply.c                       |    8 +-
 source3/winbindd/winbindd_samr.c           |    5 +-
 22 files changed, 2700 insertions(+), 788 deletions(-)
 create mode 100644 docs-xml/smbdotconf/misc/rpcserver.xml
 create mode 100644 source3/printing/printer_list.c
 create mode 100644 source3/printing/printer_list.h
 create mode 100644 source3/rpc_client/rpc_transport_tstream.c
 create mode 100644 source3/rpc_server/rpc_ncacn_np.c
 create mode 100644 source3/rpc_server/rpc_ncacn_np.h
 delete mode 100644 source3/rpc_server/rpc_ncacn_np_internal.c
 create mode 100644 source3/rpc_server/rpc_server.c


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/misc/rpcserver.xml b/docs-xml/smbdotconf/misc/rpcserver.xml
new file mode 100644
index 0000000..c69dc4a
--- /dev/null
+++ b/docs-xml/smbdotconf/misc/rpcserver.xml
@@ -0,0 +1,46 @@
+<samba:parameter name="rpc_server"
+                 context="G"
+		 type="string"
+		 advanced="1" print="1"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+	<para>
+	Defines what kind of rpc server to use for a named pipe.
+	The rpc_server prefix must be followed by the pipe name, and a value.
+	</para>
+
+	<para>
+	Three possible values are currently supported:
+		<command moreinfo="none">embedded</command>
+		<command moreinfo="none">daemon</command>
+		<command moreinfo="none">external</command>
+	</para>
+
+	<para>
+	The classic method is to run every pipe as an internal function
+	<emphasis>embedded</emphasis> in smbd.
+	</para>
+
+	<para>
+	An alternative method is to fork a <emphasis>daemon</emphasis>
+	early on at smbd startup time. this is supported only for selected
+	pipes.
+	</para>
+
+	<para>
+	Choosing the <emphasis>external</emphasis> option allows to run a
+	completely indipendent (3rd party) server capable of interfacing
+	with samba via the MS-RPC intrerface over named pipes.
+	</para>
+
+	<para>
+	Currently only the spoolss pipe can be configured in
+	<emphasis>daemon</emphasis> mode like this:
+	<programlisting>
+	rpc_server:spoolss = daemon
+	</programlisting>
+	</para>
+</description>
+
+<value type="default">none</value>
+</samba:parameter>
diff --git a/source3/Makefile.in b/source3/Makefile.in
index cde2d7d..8632745 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -599,6 +599,7 @@ LIBMSRPC_OBJ = $(SCHANNEL_OBJ) \
 	       librpc/rpc/rpc_common.o \
 	       rpc_client/rpc_transport_np.o \
 	       rpc_client/rpc_transport_sock.o \
+	       rpc_client/rpc_transport_tstream.o \
 	       ../librpc/rpc/binding.o \
 	       ../librpc/rpc/dcerpc_util.o \
 	       ../librpc/rpc/binding_handle.o \
@@ -705,11 +706,13 @@ RPC_EVENTLOG_OBJ = rpc_server/srv_eventlog_nt.o \
 NPA_TSTREAM_OBJ = ../libcli/named_pipe_auth/npa_tstream.o \
 		  librpc/gen_ndr/ndr_named_pipe_auth.o
 
-RPC_NCACN_NP_INTERNAL = rpc_server/srv_pipe_register.o rpc_server/rpc_ncacn_np_internal.o \
-			rpc_server/rpc_handles.o
+RPC_NCACN_NP = rpc_server/srv_pipe_register.o rpc_server/rpc_ncacn_np.o \
+	       rpc_server/rpc_handles.o
+
+RPC_SERVICE = rpc_server/rpc_server.o
 
 RPC_PIPE_OBJ = rpc_server/srv_pipe.o rpc_server/srv_pipe_hnd.o \
-	       $(RPC_NCACN_NP_INTERNAL)
+	       $(RPC_NCACN_NP) $(RPC_SERVICE)
 
 RPC_RPCECHO_OBJ = rpc_server/srv_echo_nt.o librpc/gen_ndr/srv_echo.o
 
@@ -906,7 +909,8 @@ SMBD_OBJ_BASE = $(PARAM_WITHOUT_REG_OBJ) $(SMBD_OBJ_SRV) $(LIBSMB_OBJ) \
 PRINTING_OBJ = printing/pcap.o printing/print_svid.o printing/print_aix.o \
                printing/print_cups.o printing/print_generic.o \
                printing/lpq_parse.o printing/load.o \
-               printing/print_iprint.o printing/print_standard.o
+               printing/print_iprint.o printing/print_standard.o \
+               printing/printer_list.o
 
 PRINTBASE_OBJ = printing/notify.o printing/printing_db.o
 PRINTBACKEND_OBJ = printing/printing.o \
@@ -1382,7 +1386,8 @@ WINBINDD_OBJ = \
 		$(PROFILE_OBJ) $(SLCACHE_OBJ) $(SMBLDAP_OBJ) \
 		$(LIBADS_OBJ) $(KRBCLIENT_OBJ) $(POPT_LIB_OBJ) \
 		$(DCUTIL_OBJ) $(IDMAP_OBJ) $(NSS_INFO_OBJ) \
-		$(RPC_NCACN_NP_INTERNAL) $(RPC_SAMR_OBJ) $(RPC_LSARPC_OBJ) \
+		$(RPC_NCACN_NP) $(RPC_SAMR_OBJ) $(RPC_LSARPC_OBJ) \
+		$(NPA_TSTREAM_OBJ) \
 		$(AFS_OBJ) $(AFS_SETTOKEN_OBJ) \
 		$(LIBADS_SERVER_OBJ) \
 		$(TDB_VALIDATE_OBJ) \
diff --git a/source3/include/proto.h b/source3/include/proto.h
index e1751e8..6fe8f64 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -3667,6 +3667,7 @@ int lp_min_receive_file_size(void);
 char* lp_perfcount_module(void);
 void lp_set_passdb_backend(const char *backend);
 void widelinks_warning(int snum);
+char *lp_ncalrpc_dir(void);
 
 /* The following definitions come from param/loadparm_server_role.c  */
 
@@ -4162,8 +4163,12 @@ NTSTATUS rpc_pipe_open_internal(TALLOC_CTX *mem_ctx,
 				struct client_address *client_id,
 				struct messaging_context *msg_ctx,
 				struct rpc_pipe_client **presult);
-NTSTATUS rpc_connect_spoolss_pipe(connection_struct *conn,
-				  struct rpc_pipe_client **spoolss_pipe);
+NTSTATUS rpc_pipe_open_interface(TALLOC_CTX *mem_ctx,
+				 const struct ndr_syntax_id *syntax,
+				 struct auth_serversupplied_info *server_info,
+				 struct client_address *client_id,
+				 struct messaging_context *msg_ctx,
+				 struct rpc_pipe_client **cli_pipe);
 NTSTATUS cli_rpc_pipe_open_noauth(struct cli_state *cli,
 				  const struct ndr_syntax_id *interface,
 				  struct rpc_pipe_client **presult);
@@ -4282,6 +4287,13 @@ struct cli_state *rpc_pipe_smbd_smb_conn(struct rpc_pipe_client *p);
 NTSTATUS rpc_transport_sock_init(TALLOC_CTX *mem_ctx, int fd,
 				 struct rpc_cli_transport **presult);
 
+/* The following definitions come from rpc_client/rpc_transport_tstream.c  */
+NTSTATUS rpc_transport_tstream_init(TALLOC_CTX *mem_ctx,
+				struct tstream_context *npipe,
+				struct tevent_queue *read_queue,
+				struct tevent_queue *write_queue,
+				 struct rpc_cli_transport **presult);
+
 /* The following definitions come from rpc_server/srv_eventlog_nt.c  */
 
 /* The following definitions come from rpc_server/rpc_handles.c  */
@@ -4344,6 +4356,7 @@ bool is_known_pipename(const char *cli_filename, struct ndr_syntax_id *syntax);
 struct pipes_struct *get_first_internal_pipe(void);
 struct pipes_struct *get_next_internal_pipe(struct pipes_struct *p);
 bool check_open_pipes(void);
+int close_internal_rpc_pipe_hnd(struct pipes_struct *p);
 
 bool fsp_is_np(struct files_struct *fsp);
 struct tsocket_address;
@@ -4365,6 +4378,8 @@ struct tevent_req *np_read_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
 NTSTATUS np_read_recv(struct tevent_req *req, ssize_t *nread,
 		      bool *is_data_outstanding);
 
+ssize_t process_incoming_data(struct pipes_struct *p, char *data, size_t n);
+
 /* The following definitions come from rpc_server/srv_spoolss_nt.c  */
 void srv_spoolss_cleanup(void);
 
diff --git a/source3/librpc/rpc/dcerpc.h b/source3/librpc/rpc/dcerpc.h
index 56d6d32..3183645 100644
--- a/source3/librpc/rpc/dcerpc.h
+++ b/source3/librpc/rpc/dcerpc.h
@@ -168,6 +168,10 @@ struct ndr_pull;
 struct tevent_context;
 struct tstream_context;
 
+/* from ../librpc/rpc/dcerpc_util.c */
+void dcerpc_set_frag_length(DATA_BLOB *blob, uint16_t v);
+uint16_t dcerpc_get_frag_length(const DATA_BLOB *blob);
+void dcerpc_set_auth_length(DATA_BLOB *blob, uint16_t v);
 struct tevent_req *dcerpc_read_ncacn_packet_send(TALLOC_CTX *mem_ctx,
 						 struct tevent_context *ev,
 						 struct tstream_context *stream);
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index bb6e132..4ae699a 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -376,6 +376,7 @@ struct global {
 	int ismb2_max_read;
 	int ismb2_max_write;
 	int ismb2_max_trans;
+	char *ncalrpc_dir;
 };
 
 static struct global Globals;
@@ -4722,6 +4723,15 @@ static struct parm_struct parm_table[] = {
 		.enum_list	= NULL,
 		.flags		= FLAG_ADVANCED,
 	},
+	{
+		.label		= "ncalrpc dir",
+		.type		= P_STRING,
+		.p_class	= P_GLOBAL,
+		.ptr		= &Globals.ncalrpc_dir,
+		.special	= NULL,
+		.enum_list	= NULL,
+		.flags		= FLAG_ADVANCED,
+	},
 
 	{NULL,  P_BOOL,  P_NONE,  NULL,  NULL,  NULL,  0}
 };
@@ -5365,6 +5375,8 @@ static void init_globals(bool reinit_globals)
 	Globals.ismb2_max_write = 1024*1024;
 	Globals.ismb2_max_trans = 1024*1024;
 
+	string_set(&Globals.ncalrpc_dir, get_dyn_NCALRPCDIR());
+
 	/* Now put back the settings that were set with lp_set_cmdline() */
 	apply_lp_set_cmdline();
 }
@@ -5895,6 +5907,8 @@ FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
 FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
 FN_GLOBAL_INTEGER(lp_client_ldap_sasl_wrapping, &Globals.client_ldap_sasl_wrapping)
 
+FN_GLOBAL_STRING(lp_ncalrpc_dir, &Globals.ncalrpc_dir)
+
 /* local prototypes */
 
 static int map_parameter_canonical(const char *pszParmName, bool *inverse);
diff --git a/source3/printing/nt_printing_migrate.c b/source3/printing/nt_printing_migrate.c
index 2060b91..c646676 100644
--- a/source3/printing/nt_printing_migrate.c
+++ b/source3/printing/nt_printing_migrate.c
@@ -25,6 +25,7 @@
 #include "librpc/gen_ndr/cli_spoolss.h"
 #include "rpc_client/cli_spoolss.h"
 #include "librpc/gen_ndr/ndr_security.h"
+#include "rpc_server/rpc_ncacn_np.h"
 
 #define FORMS_PREFIX "FORMS/"
 #define DRIVERS_PREFIX "DRIVERS/"
diff --git a/source3/printing/pcap.c b/source3/printing/pcap.c
index d9c2941..3bc8e9e 100644
--- a/source3/printing/pcap.c
+++ b/source3/printing/pcap.c
@@ -38,6 +38,7 @@
 
 #include "includes.h"
 #include "printing/pcap.h"
+#include "printer_list.h"
 
 struct pcap_cache {
 	char *name;
@@ -45,9 +46,6 @@ struct pcap_cache {
 	struct pcap_cache *next;
 };
 
-/* The systemwide printcap cache. */
-static struct pcap_cache *pcap_cache = NULL;
-
 bool pcap_cache_add_specific(struct pcap_cache **ppcache, const char *name, const char *comment)
 {
 	struct pcap_cache *p;
@@ -83,19 +81,26 @@ void pcap_cache_destroy_specific(struct pcap_cache **pp_cache)
 
 bool pcap_cache_add(const char *name, const char *comment)
 {
-	return pcap_cache_add_specific(&pcap_cache, name, comment);
+	NTSTATUS status;
+	time_t t = time(NULL);
+
+	status = printer_list_set_printer(talloc_tos(), name, comment, t);
+	return NT_STATUS_IS_OK(status);
 }
 
 bool pcap_cache_loaded(void)
 {
-	return (pcap_cache != NULL);
+	NTSTATUS status;
+	time_t last;
+
+	status = printer_list_get_last_refresh(&last);
+	return NT_STATUS_IS_OK(status);
 }
 
 void pcap_cache_replace(const struct pcap_cache *pcache)
 {
 	const struct pcap_cache *p;
 
-	pcap_cache_destroy_specific(&pcap_cache);
 	for (p = pcache; p; p = p->next) {
 		pcap_cache_add(p->name, p->comment);
 	}
@@ -106,7 +111,7 @@ void pcap_cache_reload(struct tevent_context *ev,
 {
 	const char *pcap_name = lp_printcapname();
 	bool pcap_reloaded = False;
-	struct pcap_cache *tmp_cache = NULL;
+	NTSTATUS status;
 
 	DEBUG(3, ("reloading printcap cache\n"));
 
@@ -116,8 +121,17 @@ void pcap_cache_reload(struct tevent_context *ev,
 		return;
 	}
 
-	tmp_cache = pcap_cache;
-	pcap_cache = NULL;
+	if (!printer_list_need_refresh()) {
+		/* has been just refeshed, skip */
+		DEBUG(5, ("Refresh just happend, skipping.\n"));
+		return;
+	}
+
+	status = printer_list_mark_reload();
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0, ("Failed to mark printer list for reload!\n"));
+		return;
+	}
 
 #ifdef HAVE_CUPS
 	if (strequal(pcap_name, "cups")) {
@@ -152,11 +166,14 @@ void pcap_cache_reload(struct tevent_context *ev,
 done:
 	DEBUG(3, ("reload status: %s\n", (pcap_reloaded) ? "ok" : "error"));
 
-	if (pcap_reloaded)
-		pcap_cache_destroy_specific(&tmp_cache);
-	else {
-		pcap_cache_destroy_specific(&pcap_cache);
-		pcap_cache = tmp_cache;
+	if (pcap_reloaded) {
+		/* cleanup old entries only if the operation was successful,
+		 * otherwise keep around the old entries until we can
+		 * successfuly reaload */
+		status = printer_list_clean_old();
+		if (!NT_STATUS_IS_OK(status)) {
+			DEBUG(0, ("Failed to cleanup printer list!\n"));
+		}
 	}
 
 	return;
@@ -165,13 +182,10 @@ done:
 
 bool pcap_printername_ok(const char *printername)
 {
-	struct pcap_cache *p;
-
-	for (p = pcap_cache; p != NULL; p = p->next)
-		if (strequal(p->name, printername))
-			return True;
+	NTSTATUS status;
 
-	return False;
+	status = printer_list_get_printer(talloc_tos(), printername, NULL, 0);
+	return NT_STATUS_IS_OK(status);
 }
 
 /***************************************************************************
@@ -192,5 +206,11 @@ void pcap_printer_fn_specific(const struct pcap_cache *pc,
 
 void pcap_printer_fn(void (*fn)(const char *, const char *, void *), void *pdata)
 {
-	pcap_printer_fn_specific(pcap_cache, fn, pdata);
+	NTSTATUS status;
+
+	status = printer_list_run_fn(fn, pdata);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(3, ("Failed to run fn for all printers!\n"));
+	}
+	return;
 }
diff --git a/source3/printing/printer_list.c b/source3/printing/printer_list.c
new file mode 100644
index 0000000..6392755
--- /dev/null
+++ b/source3/printing/printer_list.c
@@ -0,0 +1,415 @@
+/*
+   Unix SMB/CIFS implementation.
+   Share Database of available printers.
+   Copyright (C) Simo Sorce 2010
+
+   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 "dbwrap.h"
+#include "printer_list.h"
+
+#define PL_DB_NAME() lock_path("printer_list.tdb")
+#define PL_KEY_PREFIX "PRINTERLIST/PRN/"
+#define PL_KEY_FORMAT PL_KEY_PREFIX"%s"
+#define PL_TIMESTAMP_KEY "PRINTERLIST/GLOBAL/LAST_REFRESH"
+#define PL_DATA_FORMAT "ddPP"
+#define PL_TSTAMP_FORMAT "dd"
+
+static struct db_context *get_printer_list_db(void)
+{
+	static struct db_context *db;
+
+	if (db != NULL) {
+		return db;
+	}
+	db = db_open(talloc_autofree_context(), PL_DB_NAME(), 0,
+		     TDB_DEFAULT|TDB_CLEAR_IF_FIRST,
+		     O_RDWR|O_CREAT, 0644);
+	return db;
+}
+
+bool printer_list_parent_init(void)
+{
+	struct db_context *db;
+
+	/*
+	 * Open the tdb in the parent process (smbd) so that our
+	 * CLEAR_IF_FIRST optimization in tdb_reopen_all can properly
+	 * work.
+	 */
+
+	db = get_printer_list_db();
+	if (db == NULL) {
+		DEBUG(1, ("could not open Printer List Database: %s\n",
+			  strerror(errno)));
+		return false;
+	}
+	return true;
+}
+
+NTSTATUS printer_list_get_printer(TALLOC_CTX *mem_ctx,
+				  const char *name,
+				  const char **comment,
+				  time_t *last_refresh)
+{
+	struct db_context *db;
+	char *key;
+	TDB_DATA data;
+	uint32_t time_h, time_l;
+	char *nstr = NULL;
+	char *cstr = NULL;
+	NTSTATUS status;
+	int ret;
+
+	db = get_printer_list_db();
+	if (db == NULL) {
+		return NT_STATUS_INTERNAL_DB_CORRUPTION;
+	}
+
+	key = talloc_asprintf(mem_ctx, PL_KEY_FORMAT, name);
+	if (!key) {
+		DEBUG(0, ("Failed to allocate key name!\n"));
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	data = dbwrap_fetch_bystring_upper(db, key, key);
+	if (data.dptr == NULL) {
+		DEBUG(1, ("Failed to fetch record!\n"));
+		status = NT_STATUS_NOT_FOUND;
+		goto done;
+	}
+
+	ret = tdb_unpack(data.dptr, data.dsize,
+			 PL_DATA_FORMAT,
+			 &time_h, &time_l, &nstr, &cstr);
+	if (ret == -1) {
+		DEBUG(1, ("Failed to un pack printer data"));
+		status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+		goto done;
+	}
+
+	if (last_refresh) {
+		*last_refresh = (time_t)(((uint64_t)time_h << 32) + time_l);
+	}
+
+	if (comment) {
+		*comment = talloc_strdup(mem_ctx, cstr);
+		if (!*comment) {
+			DEBUG(1, ("Failed to strdup comment!\n"));
+			status = NT_STATUS_NO_MEMORY;
+			goto done;
+		}
+	}
+
+	status = NT_STATUS_OK;
+
+done:
+	SAFE_FREE(nstr);
+	SAFE_FREE(cstr);
+	TALLOC_FREE(key);
+	return status;
+}
+
+NTSTATUS printer_list_set_printer(TALLOC_CTX *mem_ctx,
+				  const char *name,
+				  const char *comment,
+				  time_t last_refresh)
+{
+	struct db_context *db;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list