summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Leighton <lkcl@samba.org>2000-04-07 06:33:10 +0000
committerLuke Leighton <lkcl@samba.org>2000-04-07 06:33:10 +0000
commitfc77255f46cdcc16b884dd273385b497bfb4faea (patch)
treed15092cd62de5c479b3fd971122cd12000d9de28
parent8f6b89d9540c6303030eb452d869587950eaaeb5 (diff)
downloadsamba-fc77255f46cdcc16b884dd273385b497bfb4faea.tar.gz
cut too much across.
-rw-r--r--source/include/proto.h16
-rw-r--r--source/include/smb.h7
-rw-r--r--source/printing/printing.c62
-rwxr-xr-xsource/spoolssd/srv_spoolss_nt.c30
4 files changed, 75 insertions, 40 deletions
diff --git a/source/include/proto.h b/source/include/proto.h
index 8cc84bc16e0..1b1620a5e41 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -2309,15 +2309,19 @@ int cups_printername_ok(char *name);
/*The following definitions come from printing/printing.c */
void lpq_reset(int snum);
-void print_file(connection_struct *conn, files_struct *file);
-int get_printqueue(int snum,
- connection_struct *conn,print_queue_struct **queue,
+void print_file(connection_struct *conn, const vuser_key *key,
+ int snum, files_struct *file);
+int get_printqueue(int snum, connection_struct *conn, const vuser_key *key,
+ print_queue_struct **queue,
print_status_struct *status);
-void del_printqueue(connection_struct *conn,int snum,int jobid);
-void status_printjob(connection_struct *conn,int snum,int jobid,int status);
+void del_printqueue(connection_struct *conn,const vuser_key *key,
+ int snum,int jobid);
+void status_printjob(connection_struct *conn,const vuser_key *key,
+ int snum,int jobid,int status);
int printjob_encode(int snum, int job);
void printjob_decode(int jobid, int *snum, int *job);
-void status_printqueue(connection_struct *conn,int snum,int status);
+uint32 status_printqueue(connection_struct *conn,const vuser_key *key,
+ int snum,int status);
void load_printers(void);
/*The following definitions come from printing/print_svid.c */
diff --git a/source/include/smb.h b/source/include/smb.h
index d484bd1e663..605b950f51e 100644
--- a/source/include/smb.h
+++ b/source/include/smb.h
@@ -176,11 +176,14 @@ implemented */
#define ERRbaddirectory 267 /* Invalid directory name in a path. */
#define ERRunknownipc 2142
-#define ERROR_ACCESS_DENIED (5)
+#define ERROR_INVALID_FUNCTION (ERRbadfunc)
+#define ERROR_ACCESS_DENIED (ERRnoaccess)
+#define ERROR_INVALID_HANDLE (ERRbadfid)
+#define ERROR_NOT_ENOUGH_MEMORY (ERRnomem)
#define ERROR_INVALID_PARAMETER (87)
#define ERROR_INSUFFICIENT_BUFFER (122)
#define ERROR_INVALID_NAME (123)
-#define ERROR_INVALID_LEVEL (124)
+#define ERROR_INVALID_LEVEL (ERRunknownlevel)
#define ERROR_NO_MORE_ITEMS (259)
#define ERROR_EAS_DIDNT_FIT (275) /* Extended attributes didn't fit */
#define ERROR_EAS_NOT_SUPPORTED (282) /* Extended attributes not supported */
diff --git a/source/printing/printing.c b/source/printing/printing.c
index e4768582a8e..23fe729bd27 100644
--- a/source/printing/printing.c
+++ b/source/printing/printing.c
@@ -20,6 +20,8 @@
*/
#include "includes.h"
+#include "nterr.h"
+
extern int DEBUGLEVEL;
static BOOL * lpq_cache_reset=NULL;
@@ -49,11 +51,11 @@ Build the print command in the supplied buffer. This means getting the
print command for the service and inserting the printer name and the
print file name. Return NULL on error, else the passed buffer pointer.
****************************************************************************/
-static char *build_print_command(connection_struct *conn,
+static char *build_print_command(connection_struct *conn, const vuser_key *key,
+ int snum,
char *command,
char *syscmd, char *filename)
{
- int snum = SNUM(conn);
char *tstr;
/* get the print command for the service. */
@@ -87,7 +89,11 @@ static char *build_print_command(connection_struct *conn,
pstring_sub(syscmd, "%p", tstr);
- standard_sub(conn,syscmd);
+ {
+ user_struct *vuser = get_valid_user_struct(key);
+ standard_sub(conn, vuser, syscmd);
+ vuid_free_user_struct(vuser);
+ }
return (syscmd);
}
@@ -96,10 +102,10 @@ static char *build_print_command(connection_struct *conn,
/****************************************************************************
print a file - called on closing the file
****************************************************************************/
-void print_file(connection_struct *conn, files_struct *file)
+void print_file(connection_struct *conn, const vuser_key *key,
+ int snum, files_struct *file)
{
pstring syscmd;
- int snum = SNUM(conn);
char *tempstr;
*syscmd = 0;
@@ -110,7 +116,7 @@ void print_file(connection_struct *conn, files_struct *file)
return;
}
- tempstr = build_print_command(conn,
+ tempstr = build_print_command(conn, key, snum,
PRINTCOMMAND(snum),
syscmd, file->fsp_name);
if (tempstr != NULL) {
@@ -985,8 +991,8 @@ static BOOL parse_lpq_entry(int snum,char *line,
/****************************************************************************
get a printer queue
****************************************************************************/
-int get_printqueue(int snum,
- connection_struct *conn,print_queue_struct **queue,
+int get_printqueue(int snum, connection_struct *conn, const vuser_key *key,
+ print_queue_struct **queue,
print_status_struct *status)
{
char *lpq_command = lp_lpqcommand(snum);
@@ -1017,7 +1023,11 @@ int get_printqueue(int snum,
pstrcpy(syscmd,lpq_command);
pstring_sub(syscmd,"%p",printername);
- standard_sub(conn,syscmd);
+ {
+ user_struct *vuser = get_valid_user_struct(key);
+ standard_sub(conn, vuser, syscmd);
+ vuid_free_user_struct(vuser);
+ }
slprintf(outfile,sizeof(outfile)-1, "%s/lpq.%08x",tmpdir(),str_checksum(syscmd));
@@ -1080,7 +1090,8 @@ int get_printqueue(int snum,
/****************************************************************************
delete a printer queue entry
****************************************************************************/
-void del_printqueue(connection_struct *conn,int snum,int jobid)
+void del_printqueue(connection_struct *conn,const vuser_key *key,
+ int snum,int jobid)
{
char *lprm_command = lp_lprmcommand(snum);
char *printername = PRINTERNAME(snum);
@@ -1106,7 +1117,11 @@ void del_printqueue(connection_struct *conn,int snum,int jobid)
pstrcpy(syscmd,lprm_command);
pstring_sub(syscmd,"%p",printername);
pstring_sub(syscmd,"%j",jobstr);
- standard_sub(conn,syscmd);
+ {
+ user_struct *vuser = get_valid_user_struct(key);
+ standard_sub(conn, vuser, syscmd);
+ vuid_free_user_struct(vuser);
+ }
ret = smbrun(syscmd,NULL,False);
DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
@@ -1116,7 +1131,8 @@ void del_printqueue(connection_struct *conn,int snum,int jobid)
/****************************************************************************
change status of a printer queue entry
****************************************************************************/
-void status_printjob(connection_struct *conn,int snum,int jobid,int status)
+void status_printjob(connection_struct *conn,const vuser_key *key,
+ int snum,int jobid,int status)
{
char *lpstatus_command =
(status==LPQ_PAUSED?lp_lppausecommand(snum):lp_lpresumecommand(snum));
@@ -1144,7 +1160,11 @@ void status_printjob(connection_struct *conn,int snum,int jobid,int status)
pstrcpy(syscmd,lpstatus_command);
pstring_sub(syscmd,"%p",printername);
pstring_sub(syscmd,"%j",jobstr);
- standard_sub(conn,syscmd);
+ {
+ user_struct *vuser = get_valid_user_struct(key);
+ standard_sub(conn, vuser, syscmd);
+ vuid_free_user_struct(vuser);
+ }
ret = smbrun(syscmd,NULL,False);
DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
@@ -1176,8 +1196,8 @@ void printjob_decode(int jobid, int *snum, int *job)
/****************************************************************************
Change status of a printer queue
****************************************************************************/
-
-void status_printqueue(connection_struct *conn,int snum,int status)
+uint32 status_printqueue(connection_struct *conn,const vuser_key *key,
+ int snum,int status)
{
char *queuestatus_command = (status==LPSTAT_STOPPED ?
lp_queuepausecommand(snum):lp_queueresumecommand(snum));
@@ -1194,12 +1214,20 @@ void status_printqueue(connection_struct *conn,int snum,int status)
if (!queuestatus_command || !(*queuestatus_command)) {
DEBUG(5,("No queuestatus command to %s job\n",
(status==LPSTAT_STOPPED?"pause":"resume")));
- return;
+ return NT_STATUS_INVALID_PARAMETER;
}
pstrcpy(syscmd,queuestatus_command);
pstring_sub(syscmd,"%p",printername);
- standard_sub(conn,syscmd);
+ {
+ user_struct *vuser = get_valid_user_struct(key);
+ standard_sub(conn, vuser, syscmd);
+ vuid_free_user_struct(vuser);
+ }
+
+ return ret == 0 ? 0x0 : NT_STATUS_INVALID_PARAMETER;
+
+
ret = smbrun(syscmd,NULL,False);
DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
diff --git a/source/spoolssd/srv_spoolss_nt.c b/source/spoolssd/srv_spoolss_nt.c
index 242412dc8b6..7a192873709 100755
--- a/source/spoolssd/srv_spoolss_nt.c
+++ b/source/spoolssd/srv_spoolss_nt.c
@@ -1017,7 +1017,7 @@ static void spoolss_notify_status(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_
print_status_struct status;
memset(&status, 0, sizeof(status));
- count=get_printqueue(snum, NULL, &q, &status);
+ count=get_printqueue(snum, NULL, UID_FIELD_INVALID, &q, &status);
data->notify_data.value[0]=(uint32) status.status;
safe_free(q);
}
@@ -1031,7 +1031,7 @@ static void spoolss_notify_cjobs(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_q
print_status_struct status;
memset(&status, 0, sizeof(status));
- data->notify_data.value[0]=get_printqueue(snum, NULL, &q, &status);
+ data->notify_data.value[0]=get_printqueue(snum, NULL, UID_FIELD_INVALID, &q, &status);
safe_free(q);
}
@@ -1465,7 +1465,7 @@ static uint32 printer_notify_info(const POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info
case JOB_NOTIFY_TYPE:
memset(&status, 0, sizeof(status));
- count=get_printqueue(snum, NULL, &queue, &status);
+ count=get_printqueue(snum, NULL, UID_FIELD_INVALID, &queue, &status);
for (j=0; j<count; j++)
construct_notify_jobs_info(&(queue[j]), info, snum, option_type, queue[j].job);
safe_free(queue);
@@ -1554,7 +1554,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer,int snum, pstring s
if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) != 0)
return False;
- count=get_printqueue(snum, NULL, &queue, &status);
+ count=get_printqueue(snum, NULL, UID_FIELD_INVALID, &queue, &status);
/* check if we already have a counter for this printer */
session_counter = (counter_printer_0 *)ubi_dlFirst(&counter_list);
@@ -1754,8 +1754,8 @@ static BOOL construct_printer_info_2(pstring servername, PRINTER_INFO_2 *printer
if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0 )
return False;
- memset(&status, 0, sizeof(status));
- count=get_printqueue(snum, NULL, &queue, &status);
+ ZERO_STRUCT(status);
+ count=get_printqueue(snum, NULL, UID_FIELD_INVALID, &queue, &status);
snprintf(chaine, sizeof(chaine)-1, "%s", servername);
@@ -2819,13 +2819,13 @@ static uint32 control_printer(const POLICY_HND *handle, uint32 command)
switch (command) {
case PRINTER_CONTROL_PAUSE:
/* pause the printer here */
- status_printqueue(NULL, snum, LPSTAT_STOPPED);
+ status_printqueue(NULL, UID_FIELD_INVALID, snum, LPSTAT_STOPPED);
return 0x0;
break;
case PRINTER_CONTROL_RESUME:
case PRINTER_CONTROL_UNPAUSE:
/* UN-pause the printer here */
- status_printqueue(NULL, snum, LPSTAT_OK);
+ status_printqueue(NULL, UID_FIELD_INVALID, snum, LPSTAT_OK);
return 0x0;
break;
case PRINTER_CONTROL_PURGE:
@@ -3168,7 +3168,7 @@ uint32 _spoolss_enumjobs( POLICY_HND *handle, uint32 firstjob, uint32 numofjobs,
if (!get_printer_snum(handle, &snum))
return ERROR_INVALID_HANDLE;
- *returned = get_printqueue(snum, NULL, &queue, &prt_status);
+ *returned = get_printqueue(snum, NULL, UID_FIELD_INVALID, &queue, &prt_status);
DEBUGADD(4,("count:[%d], status:[%d], [%s]\n", *returned, prt_status.status, prt_status.message));
switch (level) {
@@ -3217,7 +3217,7 @@ uint32 _spoolss_setjob( const POLICY_HND *handle,
return ERROR_INVALID_HANDLE;
}
- count=get_printqueue(snum, NULL, &queue, &prt_status);
+ count=get_printqueue(snum, NULL, UID_FIELD_INVALID, &queue, &prt_status);
while ( (i<count) && found==False ) {
if ( jobid == queue[i].job )
@@ -3231,19 +3231,19 @@ uint32 _spoolss_setjob( const POLICY_HND *handle,
case JOB_CONTROL_CANCEL:
case JOB_CONTROL_DELETE:
{
- del_printqueue(NULL, snum, jobid);
+ del_printqueue(NULL, UID_FIELD_INVALID, snum, jobid);
safe_free(queue);
return 0x0;
}
case JOB_CONTROL_PAUSE:
{
- status_printjob(NULL, snum, jobid, LPQ_PAUSED);
+ status_printjob(NULL, UID_FIELD_INVALID, snum, jobid, LPQ_PAUSED);
safe_free(queue);
return 0x0;
}
case JOB_CONTROL_RESUME:
{
- status_printjob(NULL, snum, jobid, LPQ_QUEUED);
+ status_printjob(NULL, UID_FIELD_INVALID, snum, jobid, LPQ_QUEUED);
safe_free(queue);
return 0x0;
}
@@ -4368,7 +4368,7 @@ uint32 _spoolss_getjob( POLICY_HND *handle, uint32 jobid, uint32 level,
if (!get_printer_snum(handle, &snum))
return ERROR_INVALID_HANDLE;
- count=get_printqueue(snum, NULL, &queue, &prt_status);
+ count=get_printqueue(snum, NULL, UID_FIELD_INVALID, &queue, &prt_status);
DEBUGADD(4,("count:[%d], prt_status:[%d], [%s]\n",
count, prt_status.status, prt_status.message));
@@ -4378,7 +4378,7 @@ uint32 _spoolss_getjob( POLICY_HND *handle, uint32 jobid, uint32 level,
return getjob_level_1(queue, count, snum, jobid, buffer, offered, needed);
break;
case 2:
- return getjob_level_2(queue, count, snum, jobid, buffer, offered, needed);
+ return getjob_level_1(queue, count, snum, jobid, buffer, offered, needed);
break;
default:
safe_free(queue);