The branch, master has been updated via db3a1b9... s4-selftest: skip RAP-PRINTING tests. via 8878be3... s3-selftest: enable RAP-PRINTING against s3. via d535448... s3-lanman: support level 0 NetPrintQEnum RAP query. via 2c5b3fc... s4-smbtorture: link in ../../librpc/gen_ndr/ndr_rap.o. via bdfb9a4... s4-smbtorture: add test for rap_NetPrintQEnum. via 03d8312... s4-smbtorture: add RAP-PRINTING suite. via 1764bce... s4-smbtorture: add smbcli_rap_netprintqenum. via 42003e5... s3: re-run make samba3-idl via b666028... rap: add rap_NetPrintQEnum to IDL. from ac09506... Connect set security descriptor into SMB2 code.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit db3a1b9d515dadc43bca5b2fc3217ca2ef2f00a6 Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 23:20:46 2010 +0200 s4-selftest: skip RAP-PRINTING tests. Guenther commit 8878be3c456c8562558024c1fef3a73e9eb71d82 Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 23:19:33 2010 +0200 s3-selftest: enable RAP-PRINTING against s3. Guenther commit d53544800fffd07b01ae77dac0d391c8e0c3dd79 Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 23:11:37 2010 +0200 s3-lanman: support level 0 NetPrintQEnum RAP query. Guenther commit 2c5b3fc40b4b8e288463a98c9edbcf07f2cfbd73 Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 23:08:14 2010 +0200 s4-smbtorture: link in ../../librpc/gen_ndr/ndr_rap.o. Guenther commit bdfb9a43d33ab0bff84591914566a8dff3f4cb46 Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 18:29:18 2010 +0200 s4-smbtorture: add test for rap_NetPrintQEnum. Guenther commit 03d83128dd9d24d9aabeef51895f8995ae5a3b81 Author: Günther Deschner <g...@samba.org> Date: Sat Apr 24 00:45:40 2010 +0200 s4-smbtorture: add RAP-PRINTING suite. Guenther commit 1764bcecf2f0fd388a888835019a8e064e6c30fa Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 12:50:58 2010 +0200 s4-smbtorture: add smbcli_rap_netprintqenum. Guenther commit 42003e5661549ed9c4f34174509c0f4977510f30 Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 17:43:47 2010 +0200 s3: re-run make samba3-idl Guenther commit b66602898a2b99bc1628b7a3f7571926959d8e21 Author: Günther Deschner <g...@samba.org> Date: Wed Apr 28 12:50:45 2010 +0200 rap: add rap_NetPrintQEnum to IDL. Guenther ----------------------------------------------------------------------- Summary of changes: librpc/gen_ndr/rap.h | 196 +++++++++++++++++++++++++++++++++ librpc/idl/rap.idl | 166 ++++++++++++++++++++++++++++ source3/script/tests/test_posix_s3.sh | 2 +- source3/smbd/lanman.c | 1 + source4/librpc/config.mk | 5 + source4/librpc/wscript_build | 5 + source4/selftest/skip | 1 + source4/torture/config.mk | 4 +- source4/torture/rap/printing.c | 124 +++++++++++++++++++++ source4/torture/rap/rap.c | 111 ++++++++++++++++++- source4/torture/wscript_build | 4 +- 11 files changed, 613 insertions(+), 6 deletions(-) create mode 100644 source4/torture/rap/printing.c Changeset truncated at 500 lines: diff --git a/librpc/gen_ndr/rap.h b/librpc/gen_ndr/rap.h index 6c5f154..e4a02ba 100644 --- a/librpc/gen_ndr/rap.h +++ b/librpc/gen_ndr/rap.h @@ -411,6 +411,185 @@ union rap_server_info { struct rap_server_info_1 info1;/* [case] */ }/* [nodiscriminant] */; +enum rap_PrintQStatusCode +#ifndef USE_UINT_ENUMS + { + PRQ_ACTIVE=(int)(0x0000), + PRQ_PAUSE=(int)(0x0001), + PRQ_ERROR=(int)(0x0002), + PRQ_PENDING=(int)(0x0003) +} +#else + { __donnot_use_enum_rap_PrintQStatusCode=0x7FFFFFFF} +#define PRQ_ACTIVE ( 0x0000 ) +#define PRQ_PAUSE ( 0x0001 ) +#define PRQ_ERROR ( 0x0002 ) +#define PRQ_PENDING ( 0x0003 ) +#endif +; + +struct rap_PrintQueue0 { + uint8_t PrintQName[13]; +}; + +struct rap_PrintQueue1 { + uint8_t PrintQName[13]; + uint8_t Pad1; + uint16_t Priority; + uint16_t StartTime; + uint16_t UntilTime; + const char *SeparatorPageFilename;/* [charset(DOS),relative_short] */ + uint16_t SeparatorPageFilenameHigh; + const char *PrintProcessorDllName;/* [charset(DOS),relative_short] */ + uint16_t PrintProcessorDllNameHigh; + const char *PrintDestinationsName;/* [charset(DOS),relative_short] */ + uint16_t PrintDestinationsNameHigh; + const char *PrintParameterString;/* [charset(DOS),relative_short] */ + uint16_t PrintParameterStringHigh; + const char *CommentString;/* [charset(DOS),relative_short] */ + uint16_t CommentStringHigh; + enum rap_PrintQStatusCode PrintQStatus; + uint16_t PrintJobCount; +}; + +struct rap_PrintQueue2 { + char _empty_; +}; + +struct rap_PrintQueue3 { + const char *PrintQueueName;/* [charset(DOS),relative_short] */ + uint16_t PrintQueueNameHigh; + uint16_t Priority; + uint16_t StartTime; + uint16_t UntilTime; + uint16_t Pad; + const char *SeparatorPageFilename;/* [charset(DOS),relative_short] */ + uint16_t SeparatorPageFilenameHigh; + const char *PrintProcessorDllName;/* [charset(DOS),relative_short] */ + uint16_t PrintProcessorDllNameHigh; + const char *PrintParameterString;/* [charset(DOS),relative_short] */ + uint16_t PrintParameterStringHigh; + const char *CommentString;/* [charset(DOS),relative_short] */ + uint16_t CommentStringHigh; + enum rap_PrintQStatusCode PrintQStatus; + uint16_t PrintJobCount; + const char *Printers;/* [charset(DOS),relative_short] */ + uint16_t PrintersHigh; + const char *DriverName;/* [charset(DOS),relative_short] */ + uint16_t DriverNameHigh; + const char *PrintDriverData;/* [charset(DOS),relative_short] */ + uint16_t PrintDriverDataHigh; +}; + +struct rap_PrintQueue4 { + char _empty_; +}; + +struct rap_PrintQueue5 { + const char *PrintQueueName;/* [charset(DOS),relative_short] */ + uint16_t PrintQueueNameHigh; +}; + +union rap_printq_info { + struct rap_PrintQueue0 info0;/* [case(0)] */ + struct rap_PrintQueue1 info1;/* [case] */ + struct rap_PrintQueue2 info2;/* [case(2)] */ + struct rap_PrintQueue3 info3;/* [case(3)] */ + struct rap_PrintQueue4 info4;/* [case(4)] */ + struct rap_PrintQueue5 info5;/* [case(5)] */ +}/* [nodiscriminant] */; + +enum rap_PrintJStatusCode +#ifndef USE_UINT_ENUMS + { + PRJ_QS_QUEUED=(int)(0x0000), + PRJ_QS_PAUSED=(int)(0x0001), + PRJ_QS_SPOOLING=(int)(0x0002), + PRJ_QS_PRINTING=(int)(0x0003), + PRJ_QS_ERROR=(int)(0x0010) +} +#else + { __donnot_use_enum_rap_PrintJStatusCode=0x7FFFFFFF} +#define PRJ_QS_QUEUED ( 0x0000 ) +#define PRJ_QS_PAUSED ( 0x0001 ) +#define PRJ_QS_SPOOLING ( 0x0002 ) +#define PRJ_QS_PRINTING ( 0x0003 ) +#define PRJ_QS_ERROR ( 0x0010 ) +#endif +; + +struct rap_PrintJobInfo0 { + uint16_t JobID; +}; + +struct rap_PrintJobInfo1 { + uint16_t JobID; + uint8_t UserName[21]; + uint8_t Pad; + uint8_t NotifyName[16]; + uint8_t DataType[10]; + const char *PrintParameterString;/* [charset(DOS),relative_short] */ + uint16_t PrintParameterStringHigh; + uint16_t JobPosition; + enum rap_PrintJStatusCode JobStatus; + const char *JobStatusString;/* [charset(DOS),relative_short] */ + uint16_t JobStatusStringHigh; + uint32_t TimeSubmitted; + uint32_t JobSize; + const char *JobCommentString;/* [charset(DOS),relative_short] */ + uint16_t JobCommentStringHigh; +}; + +struct rap_PrintJobInfo2 { + uint16_t JobID; + uint16_t Priority; + const char *UserName;/* [charset(DOS),relative_short] */ + uint16_t UserNameHigh; + uint16_t JobPosition; + enum rap_PrintJStatusCode JobStatus; + uint32_t TimeSubmitted; + uint32_t JobSize; + const char *JobCommentString;/* [charset(DOS),relative_short] */ + uint16_t JobCommentStringHigh; + const char *DocumentName;/* [charset(DOS),relative_short] */ + uint16_t DocumentNameHigh; +}; + +struct rap_PrintJobInfo3 { + uint16_t JobID; + uint16_t Priority; + const char *UserName;/* [charset(DOS),relative_short] */ + uint16_t UserNameHigh; + uint16_t JobPosition; + enum rap_PrintJStatusCode JobStatus; + uint32_t TimeSubmitted; + uint32_t JobSize; + const char *JobCommentString;/* [charset(DOS),relative_short] */ + uint16_t JobCommentStringHigh; + const char *DocumentName;/* [charset(DOS),relative_short] */ + uint16_t DocumentNameHigh; + const char *NotifyName;/* [charset(DOS),relative_short] */ + uint16_t NotifyNameHigh; + const char *DataType;/* [charset(DOS),relative_short] */ + uint16_t DataTypeHigh; + const char *PrintParameterString;/* [charset(DOS),relative_short] */ + uint16_t PrintParameterStringHigh; + const char *StatusString;/* [charset(DOS),relative_short] */ + uint16_t StatusStringHigh; + const char *QueueName;/* [charset(DOS),relative_short] */ + uint16_t QueueNameHigh; + const char *PrintProcessorName;/* [charset(DOS),relative_short] */ + uint16_t PrintProcessorNameHigh; + const char *PrintProcessorParams;/* [charset(DOS),relative_short] */ + uint16_t PrintProcessorParamsHigh; + const char *DriverName;/* [charset(DOS),relative_short] */ + uint16_t DriverNameHigh; + const char *DriverDataOffset;/* [charset(DOS),relative_short] */ + uint16_t DriverDataOffsetHigh; + const char *PrinterNameOffset;/* [charset(DOS),relative_short] */ + uint16_t PrinterNameOffsetHigh; +}; + struct rap_NetShareEnum { struct { @@ -463,4 +642,21 @@ struct rap_WserverGetInfo { }; + +struct rap_NetPrintQEnum { + struct { + uint16_t level; + uint16_t bufsize; + } in; + + struct { + uint16_t status; + uint16_t convert; + uint16_t count; + uint16_t available; + union rap_printq_info *info;/* [ref,switch_is(level)] */ + } out; + +}; + #endif /* _HEADER_rap */ diff --git a/librpc/idl/rap.idl b/librpc/idl/rap.idl index 3ba1ad5..9259d4c 100644 --- a/librpc/idl/rap.idl +++ b/librpc/idl/rap.idl @@ -385,6 +385,172 @@ interface rap [out,switch_is(level)] rap_server_info info ); + typedef [public] enum { + PRQ_ACTIVE = 0x0000, + PRQ_PAUSE = 0x0001, + PRQ_ERROR = 0x0002, + PRQ_PENDING = 0x0003 + } rap_PrintQStatusCode; + + typedef struct { + uint8 PrintQName[13]; + } rap_PrintQueue0; + + typedef struct { + uint8 PrintQName[13]; + uint8 Pad1; + uint16 Priority; + uint16 StartTime; + uint16 UntilTime; + [relative_short] [string,charset(DOS)] uint8 *SeparatorPageFilename; + uint16 SeparatorPageFilenameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintProcessorDllName; + uint16 PrintProcessorDllNameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintDestinationsName; + uint16 PrintDestinationsNameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintParameterString; + uint16 PrintParameterStringHigh; + [relative_short] [string,charset(DOS)] uint8 *CommentString; + uint16 CommentStringHigh; + rap_PrintQStatusCode PrintQStatus; + uint16 PrintJobCount; + } rap_PrintQueue1; + + typedef struct { + } rap_PrintQueue2; + + typedef struct { + [relative_short] [string,charset(DOS)] uint8 *PrintQueueName; + uint16 PrintQueueNameHigh; + uint16 Priority; + uint16 StartTime; + uint16 UntilTime; + uint16 Pad; + [relative_short] [string,charset(DOS)] uint8 *SeparatorPageFilename; + uint16 SeparatorPageFilenameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintProcessorDllName; + uint16 PrintProcessorDllNameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintParameterString; + uint16 PrintParameterStringHigh; + [relative_short] [string,charset(DOS)] uint8 *CommentString; + uint16 CommentStringHigh; + rap_PrintQStatusCode PrintQStatus; + uint16 PrintJobCount; + [relative_short] [string,charset(DOS)] uint8 *Printers; + uint16 PrintersHigh; + [relative_short] [string,charset(DOS)] uint8 *DriverName; + uint16 DriverNameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintDriverData; + uint16 PrintDriverDataHigh; + } rap_PrintQueue3; + + typedef struct { + } rap_PrintQueue4; + + typedef struct { + [relative_short] [string,charset(DOS)] uint8 *PrintQueueName; + uint16 PrintQueueNameHigh; + } rap_PrintQueue5; + + typedef [nodiscriminant] union { + [case(0)] rap_PrintQueue0 info0; + [case(1)] rap_PrintQueue1 info1; + [case(2)] rap_PrintQueue2 info2; + [case(3)] rap_PrintQueue3 info3; + [case(4)] rap_PrintQueue4 info4; + [case(5)] rap_PrintQueue5 info5; + } rap_printq_info; + + typedef [public] enum { + PRJ_QS_QUEUED = 0x0000, + PRJ_QS_PAUSED = 0x0001, + PRJ_QS_SPOOLING = 0x0002, + PRJ_QS_PRINTING = 0x0003, + PRJ_QS_ERROR = 0x0010 + } rap_PrintJStatusCode; + + typedef struct { + uint16 JobID; + } rap_PrintJobInfo0; + + typedef struct { + uint16 JobID; + uint8 UserName[21]; + uint8 Pad; + uint8 NotifyName[16]; + uint8 DataType[10]; + [relative_short] [string,charset(DOS)] uint8 *PrintParameterString; + uint16 PrintParameterStringHigh; + uint16 JobPosition; + rap_PrintJStatusCode JobStatus; + [relative_short] [string,charset(DOS)] uint8 *JobStatusString; + uint16 JobStatusStringHigh; + uint32 TimeSubmitted; + uint32 JobSize; + [relative_short] [string,charset(DOS)] uint8 *JobCommentString; + uint16 JobCommentStringHigh; + } rap_PrintJobInfo1; + + typedef struct { + uint16 JobID; + uint16 Priority; + [relative_short] [string,charset(DOS)] uint8 *UserName; + uint16 UserNameHigh; + uint16 JobPosition; + rap_PrintJStatusCode JobStatus; + uint32 TimeSubmitted; + uint32 JobSize; + [relative_short] [string,charset(DOS)] uint8 *JobCommentString; + uint16 JobCommentStringHigh; + [relative_short] [string,charset(DOS)] uint8 *DocumentName; + uint16 DocumentNameHigh; + } rap_PrintJobInfo2; + + typedef struct { + uint16 JobID; + uint16 Priority; + [relative_short] [string,charset(DOS)] uint8 *UserName; + uint16 UserNameHigh; + uint16 JobPosition; + rap_PrintJStatusCode JobStatus; + uint32 TimeSubmitted; + uint32 JobSize; + [relative_short] [string,charset(DOS)] uint8 *JobCommentString; + uint16 JobCommentStringHigh; + [relative_short] [string,charset(DOS)] uint8 *DocumentName; + uint16 DocumentNameHigh; + [relative_short] [string,charset(DOS)] uint8 *NotifyName; + uint16 NotifyNameHigh; + [relative_short] [string,charset(DOS)] uint8 *DataType; + uint16 DataTypeHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintParameterString; + uint16 PrintParameterStringHigh; + [relative_short] [string,charset(DOS)] uint8 *StatusString; + uint16 StatusStringHigh; + [relative_short] [string,charset(DOS)] uint8 *QueueName; + uint16 QueueNameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintProcessorName; + uint16 PrintProcessorNameHigh; + [relative_short] [string,charset(DOS)] uint8 *PrintProcessorParams; + uint16 PrintProcessorParamsHigh; + [relative_short] [string,charset(DOS)] uint8 *DriverName; + uint16 DriverNameHigh; + [relative_short] [string,charset(DOS)] uint8 *DriverDataOffset; + uint16 DriverDataOffsetHigh; + [relative_short] [string,charset(DOS)] uint8 *PrinterNameOffset; + uint16 PrinterNameOffsetHigh; + } rap_PrintJobInfo3; + + [public] void rap_NetPrintQEnum( + [in] uint16 level, + [in] uint16 bufsize, + [out] uint16 status, + [out] uint16 convert, + [out] uint16 count, + [out] uint16 available, + [out,switch_is(level)] rap_printq_info *info + ); + /* Parameter description strings for RAP calls */ /* Names are defined name for RAP call with _REQ */ /* appended to end. */ diff --git a/source3/script/tests/test_posix_s3.sh b/source3/script/tests/test_posix_s3.sh index 0bd982a..47fb2c6 100755 --- a/source3/script/tests/test_posix_s3.sh +++ b/source3/script/tests/test_posix_s3.sh @@ -55,7 +55,7 @@ local="LOCAL-NSS-WRAPPER LOCAL-NDR" winbind="WINBIND-STRUCT WINBIND-WBCLIENT" -rap="RAP-BASIC RAP-RPC" +rap="RAP-BASIC RAP-RPC RAP-PRINTING" # 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 diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index e3c94cf..65b9e39 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -669,6 +669,7 @@ static void fill_printq_info(int uLevel, struct spoolss_PrinterInfo2 *printer_info) { switch (uLevel) { + case 0: case 1: case 2: PACKS(desc,"B13", printer_info->printername); diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk index de9fa6d..78e7d18 100644 --- a/source4/librpc/config.mk +++ b/source4/librpc/config.mk @@ -575,6 +575,11 @@ PUBLIC_DEPENDENCIES = dcerpc NDR_KEYSVC RPC_NDR_KEYSVC_OBJ_FILES = ../librpc/gen_ndr/ndr_keysvc_c.o +[SUBSYSTEM::NDR_RAP] +PUBLIC_DEPENDENCIES = LIBNDR + +NDR_RAP_OBJ_FILES = ../librpc/gen_ndr/ndr_rap.o + [SUBSYSTEM::NDR_DCERPC] PUBLIC_DEPENDENCIES = LIBNDR diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build index f9a5eab..01449bb 100644 --- a/source4/librpc/wscript_build +++ b/source4/librpc/wscript_build @@ -263,6 +263,11 @@ bld.SAMBA_SUBSYSTEM('NDR_KEYSVC', public_deps='LIBNDR' ) +bld.SAMBA_SUBSYSTEM('NDR_RAP', + source='../../librpc/gen_ndr/ndr_rap.c', + public_deps='LIBNDR' + ) + bld.SAMBA_SUBSYSTEM('NDR_KRB5PAC', source='../../librpc/ndr/ndr_krb5pac.c ../../librpc/gen_ndr/ndr_krb5pac.c', diff --git a/source4/selftest/skip b/source4/selftest/skip index 4061589..06acff2 100644 --- a/source4/selftest/skip +++ b/source4/selftest/skip @@ -63,6 +63,7 @@ raw.offline # Samba 4 doesn't have much offline support yet rpc.autoidl # this one just generates a lot of noise, and is no longer useful samba4.rpc.countcalls # this is not useful now we have full IDL samba4.rap.scan # same thing here - we have docs now +samba4.rap.printing # Not provided by Samba 4 samba4.gensec.python # not finished bench # don't run benchmarks in our selftest trans2.scan # uses huge number of file descriptors diff --git a/source4/torture/config.mk b/source4/torture/config.mk index 3315865..3d566c0 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -136,11 +136,11 @@ mkinclude drs/config.mk OUTPUT_TYPE = MERGED_OBJ SUBSYSTEM = smbtorture INIT_FUNCTION = torture_rap_init -PRIVATE_DEPENDENCIES = TORTURE_UTIL LIBCLI_SMB +PRIVATE_DEPENDENCIES = TORTURE_UTIL LIBCLI_SMB NDR_RAP # End SUBSYSTEM TORTURE_RAP ################################# -TORTURE_RAP_OBJ_FILES = $(torturesrcdir)/rap/rap.o $(torturesrcdir)/rap/rpc.o +TORTURE_RAP_OBJ_FILES = $(torturesrcdir)/rap/rap.o $(torturesrcdir)/rap/rpc.o $(torturesrcdir)/rap/printing.o $(eval $(call proto_header_template,$(torturesrcdir)/rap/proto.h,$(TORTURE_RAP_OBJ_FILES:.o=.c))) diff --git a/source4/torture/rap/printing.c b/source4/torture/rap/printing.c new file mode 100644 index 0000000..b57151a --- /dev/null +++ b/source4/torture/rap/printing.c @@ -0,0 +1,124 @@ +/* + Unix SMB/CIFS implementation. + test suite for SMB printing operations + + Copyright (C) Guenther Deschner 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/>. -- Samba Shared Repository