r16945: Sync trunk -> 3.0 for 3.0.24 code. Still need
[vlendec/samba-autobuild/.git] / source3 / printing / printing.c
index fed9c005d0f85d3949ef25d27434bd74389c9af6..bb756c8870734ee3d54665a776f5b2f6d11f8f67 100644 (file)
@@ -234,7 +234,7 @@ void printing_end(void)
  when asked for (and only when supported)
 ****************************************************************************/
 
-static struct printif *get_printer_fns_from_type( int type )
+static struct printif *get_printer_fns_from_type( enum printing_types type )
 {
        struct printif *printer_fns = &generic_printif;
 
@@ -257,7 +257,7 @@ static struct printif *get_printer_fns_from_type( int type )
 
 static struct printif *get_printer_fns( int snum )
 {
-       return get_printer_fns_from_type( lp_printing(snum) );
+       return get_printer_fns_from_type( (enum printing_types)lp_printing(snum) );
 }
 
 
@@ -839,10 +839,9 @@ static int traverse_fn_delete(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void
  Check if the print queue has been updated recently enough.
 ****************************************************************************/
 
-static void print_cache_flush(int snum)
+static void print_cache_flush(const char *sharename)
 {
        fstring key;
-       const char *sharename = lp_const_servicename(snum);
        struct tdb_print_db *pdb = get_print_db_byname(sharename);
 
        if (!pdb)
@@ -1370,7 +1369,7 @@ static void print_queue_receive(int msg_type, struct process_id src,
        }
 
        print_queue_update_with_lock(sharename, 
-               get_printer_fns_from_type(printing_type),
+               get_printer_fns_from_type((enum printing_types)printing_type),
                lpqcommand, lprmcommand );
 
        return;
@@ -1439,6 +1438,8 @@ update the internal database from the system print queue for a queue
 
 static void print_queue_update(int snum, BOOL force)
 {
+       extern struct current_user current_user;
+       extern userdom_struct current_user_info;
        fstring key;
        fstring sharename;
        pstring lpqcommand, lprmcommand;
@@ -1456,12 +1457,22 @@ static void print_queue_update(int snum, BOOL force)
        pstrcpy( lpqcommand, lp_lpqcommand(snum));
        string_sub2( lpqcommand, "%p", PRINTERNAME(snum), sizeof(lpqcommand), 
                     False, False, False );
-       standard_sub_snum( snum, lpqcommand, sizeof(lpqcommand) );
+       standard_sub_advanced(lp_servicename(snum),
+                             current_user_info.unix_name, "",
+                             current_user.ut.gid,
+                             get_current_username(),
+                             current_user_info.domain,
+                             lpqcommand, sizeof(lpqcommand) );
        
        pstrcpy( lprmcommand, lp_lprmcommand(snum));
        string_sub2( lprmcommand, "%p", PRINTERNAME(snum), sizeof(lprmcommand), 
                     False, False, False );
-       standard_sub_snum( snum, lprmcommand, sizeof(lprmcommand) );
+       standard_sub_advanced(lp_servicename(snum),
+                             current_user_info.unix_name, "",
+                             current_user.ut.gid,
+                             get_current_username(),
+                             current_user_info.domain,
+                             lprmcommand, sizeof(lprmcommand) );
        
        /* 
         * Make sure that the background queue process exists.  
@@ -1781,7 +1792,7 @@ NT_DEVICEMODE *print_job_devmode(const char* sharename, uint32 jobid)
  Set the place in the queue for a job.
 ****************************************************************************/
 
-BOOL print_job_set_place(int snum, uint32 jobid, int place)
+BOOL print_job_set_place(const char *sharename, uint32 jobid, int place)
 {
        DEBUG(2,("print_job_set_place not implemented yet\n"));
        return False;
@@ -1791,9 +1802,8 @@ BOOL print_job_set_place(int snum, uint32 jobid, int place)
  Set the name of a job. Only possible for owner.
 ****************************************************************************/
 
-BOOL print_job_set_name(int snum, uint32 jobid, char *name)
+BOOL print_job_set_name(const char *sharename, uint32 jobid, char *name)
 {
-       const char* sharename = lp_const_servicename(snum);
        struct printjob *pjob;
 
        pjob = print_job_find(sharename, jobid);
@@ -1930,9 +1940,10 @@ static BOOL print_job_delete1(int snum, uint32 jobid)
  Return true if the current user owns the print job.
 ****************************************************************************/
 
-static BOOL is_owner(struct current_user *user, int snum, uint32 jobid)
+static BOOL is_owner(struct current_user *user, const char *servicename,
+                    uint32 jobid)
 {
-       struct printjob *pjob = print_job_find(lp_const_servicename(snum), jobid);
+       struct printjob *pjob = print_job_find(servicename, jobid);
        user_struct *vuser;
 
        if (!pjob || !user)
@@ -1958,7 +1969,7 @@ BOOL print_job_delete(struct current_user *user, int snum, uint32 jobid, WERROR
 
        *errcode = WERR_OK;
                
-       owner = is_owner(user, snum, jobid);
+       owner = is_owner(user, lp_const_servicename(snum), jobid);
        
        /* Check access against security descriptor or whether the user
           owns their job. */
@@ -2037,7 +2048,7 @@ BOOL print_job_pause(struct current_user *user, int snum, uint32 jobid, WERROR *
                return False;
        }
 
-       if (!is_owner(user, snum, jobid) &&
+       if (!is_owner(user, lp_const_servicename(snum), jobid) &&
            !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
                DEBUG(3, ("pause denied by security descriptor\n"));
 
@@ -2061,7 +2072,7 @@ pause, or resume print job. User name: %s. Printer name: %s.",
        }
 
        /* force update the database */
-       print_cache_flush(snum);
+       print_cache_flush(lp_const_servicename(snum));
 
        /* Send a printer notify message */
 
@@ -2097,7 +2108,7 @@ BOOL print_job_resume(struct current_user *user, int snum, uint32 jobid, WERROR
                return False;
        }
 
-       if (!is_owner(user, snum, jobid) &&
+       if (!is_owner(user, lp_const_servicename(snum), jobid) &&
            !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
                DEBUG(3, ("resume denied by security descriptor\n"));
                *errcode = WERR_ACCESS_DENIED;
@@ -2119,7 +2130,7 @@ pause, or resume print job. User name: %s. Printer name: %s.",
        }
 
        /* force update the database */
-       print_cache_flush(snum);
+       print_cache_flush(lp_const_servicename(snum));
 
        /* Send a printer notify message */
 
@@ -2325,7 +2336,7 @@ uint32 print_job_start(struct current_user *user, int snum, char *jobname, NT_DE
                return (uint32)-1;
        }
 
-       if (!print_time_access_check(snum)) {
+       if (!print_time_access_check(lp_servicename(snum))) {
                DEBUG(3, ("print_job_start: job start denied by time check\n"));
                release_print_db(pdb);
                return (uint32)-1;
@@ -2739,7 +2750,7 @@ BOOL print_queue_pause(struct current_user *user, int snum, WERROR *errcode)
        }
 
        /* force update the database */
-       print_cache_flush(snum);
+       print_cache_flush(lp_const_servicename(snum));
 
        /* Send a printer notify message */
 
@@ -2805,7 +2816,7 @@ BOOL print_queue_purge(struct current_user *user, int snum, WERROR *errcode)
                become_root();
 
        for (i=0;i<njobs;i++) {
-               BOOL owner = is_owner(user, snum, queue[i].job);
+               BOOL owner = is_owner(user, lp_const_servicename(snum), queue[i].job);
 
                if (owner || can_job_admin) {
                        print_job_delete1(snum, queue[i].job);