r23779: Change from v2 or later to v3 or later.
[tprouty/samba.git] / source3 / printing / printing.c
index fbb81665650c27da3ccba6c1be9bea514bec8661..de2e4150d227150d0e36eef9aa6f7bb53b6405b3 100644 (file)
@@ -7,7 +7,7 @@
    
    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
+   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,
@@ -25,6 +25,8 @@
 
 extern SIG_ATOMIC_T got_sig_term;
 extern SIG_ATOMIC_T reload_after_sighup;
+extern struct current_user current_user;
+extern userdom_struct current_user_info;
 
 /* Current printer interface */
 static BOOL remove_from_jobs_changed(const char* sharename, uint32 jobid);
@@ -74,7 +76,7 @@ uint16 pjobid_to_rap(const char* sharename, uint32 jobid)
        ZERO_STRUCT( jinfo );
        fstrcpy( jinfo.sharename, sharename );
        jinfo.jobid = jobid;
-       key.dptr = (char*)&jinfo;
+       key.dptr = (uint8 *)&jinfo;
        key.dsize = sizeof(jinfo);
 
        data = tdb_fetch(rap_tdb, key);
@@ -91,7 +93,7 @@ uint16 pjobid_to_rap(const char* sharename, uint32 jobid)
        if (rap_jobid == 0)
                rap_jobid = ++next_rap_jobid;
        SSVAL(buf,0,rap_jobid);
-       data.dptr = (char*)buf;
+       data.dptr = buf;
        data.dsize = sizeof(rap_jobid);
        tdb_store(rap_tdb, key, data, TDB_REPLACE);
        tdb_store(rap_tdb, data, key, TDB_REPLACE);
@@ -112,7 +114,7 @@ BOOL rap_to_pjobid(uint16 rap_jobid, fstring sharename, uint32 *pjobid)
                return False;
 
        SSVAL(buf,0,rap_jobid);
-       key.dptr = (char*)buf;
+       key.dptr = buf;
        key.dsize = sizeof(rap_jobid);
        data = tdb_fetch(rap_tdb, key);
        if ( data.dptr && data.dsize == sizeof(struct rap_jobid_key) ) 
@@ -147,7 +149,7 @@ static void rap_jobid_delete(const char* sharename, uint32 jobid)
        ZERO_STRUCT( jinfo );
        fstrcpy( jinfo.sharename, sharename );
        jinfo.jobid = jobid;
-       key.dptr = (char*)&jinfo;
+       key.dptr = (uint8 *)&jinfo;
        key.dsize = sizeof(jinfo);
 
        data = tdb_fetch(rap_tdb, key);
@@ -164,7 +166,7 @@ static void rap_jobid_delete(const char* sharename, uint32 jobid)
        rap_jobid = SVAL(data.dptr, 0);
        SAFE_FREE(data.dptr);
        SSVAL(buf,0,rap_jobid);
-       data.dptr = (char*)buf;
+       data.dptr = buf;
        data.dsize = sizeof(rap_jobid);
        tdb_delete(rap_tdb, key);
        tdb_delete(rap_tdb, data);
@@ -176,7 +178,7 @@ static int get_queue_status(const char* sharename, print_status_struct *);
  Initialise the printing backend. Called once at startup before the fork().
 ****************************************************************************/
 
-BOOL print_backend_init(void)
+BOOL print_backend_init(struct messaging_context *msg_ctx)
 {
        const char *sversion = "INFO/version";
        pstring printing_path;
@@ -213,7 +215,7 @@ BOOL print_backend_init(void)
        close_all_print_db(); /* Don't leave any open. */
 
        /* do NT print initialization... */
-       return nt_printing_init();
+       return nt_printing_init(msg_ctx);
 }
 
 /****************************************************************************
@@ -271,7 +273,7 @@ static TDB_DATA print_key(uint32 jobid)
        TDB_DATA ret;
 
        SIVAL(&j, 0, jobid);
-       ret.dptr = (void *)&j;
+       ret.dptr = (uint8 *)&j;
        ret.dsize = sizeof(j);
        return ret;
 }
@@ -280,7 +282,7 @@ static TDB_DATA print_key(uint32 jobid)
  unpack a pjob from a tdb buffer 
 ***********************************************************************/
  
-int unpack_pjob( char* buf, int buflen, struct printjob *pjob )
+int unpack_pjob( uint8 *buf, int buflen, struct printjob *pjob )
 {
        int     len = 0;
        int     used;
@@ -516,7 +518,7 @@ static BOOL pjob_store(const char* sharename, uint32 jobid, struct printjob *pjo
        TDB_DATA                old_data, new_data;
        BOOL                    ret = False;
        struct tdb_print_db     *pdb = get_print_db_byname(sharename);
-       char                    *buf = NULL;
+       uint8                   *buf = NULL;
        int                     len, newlen, buflen;
        
 
@@ -552,7 +554,7 @@ static BOOL pjob_store(const char* sharename, uint32 jobid, struct printjob *pjo
                len += pack_devicemode(pjob->nt_devmode, buf+len, buflen-len);
        
                if (buflen != len) {
-                       buf = (char *)SMB_REALLOC(buf, len);
+                       buf = (uint8 *)SMB_REALLOC(buf, len);
                        if (!buf) {
                                DEBUG(0,("pjob_store: failed to enlarge buffer!\n"));
                                goto done;
@@ -865,8 +867,7 @@ static pid_t get_updating_pid(const char *sharename)
        if (!pdb)
                return (pid_t)-1;
        slprintf(keystr, sizeof(keystr)-1, "UPDATING/%s", sharename);
-       key.dptr = keystr;
-       key.dsize = strlen(keystr);
+       key = string_tdb_data(keystr);
 
        data = tdb_fetch(pdb->tdb, key);
        release_print_db(pdb);
@@ -903,8 +904,7 @@ static void set_updating_pid(const fstring sharename, BOOL updating)
                return;
 
        slprintf(keystr, sizeof(keystr)-1, "UPDATING/%s", sharename);
-       key.dptr = keystr;
-       key.dsize = strlen(keystr);
+       key = string_tdb_data(keystr);
        
        DEBUG(5, ("set_updating_pid: %s updating lpq cache for print share %s\n", 
                updating ? "" : "not ",
@@ -917,7 +917,7 @@ static void set_updating_pid(const fstring sharename, BOOL updating)
        }
        
        SIVAL( buffer, 0, updating_pid);
-       data.dptr = (void *)buffer;
+       data.dptr = buffer;
        data.dsize = 4;         /* we always assume this is a 4 byte value */
 
        tdb_store(pdb->tdb, key, data, TDB_REPLACE);    
@@ -984,7 +984,7 @@ static void store_queue_struct(struct tdb_print_db *pdb, struct traverse_struct
                                queue[i].fs_file);
        }
 
-       if ((data.dptr = SMB_MALLOC(data.dsize)) == NULL)
+       if ((data.dptr = (uint8 *)SMB_MALLOC(data.dsize)) == NULL)
                return;
 
         len = 0;
@@ -1231,11 +1231,10 @@ static void print_queue_update_internal( const char *sharename,
 
        /* store the new queue status structure */
        slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", sharename);
-       key.dptr = keystr;
-       key.dsize = strlen(keystr);
+       key = string_tdb_data(keystr);
 
        status.qcount = qcount;
-       data.dptr = (void *)&status;
+       data.dptr = (uint8 *)&status;
        data.dsize = sizeof(status);
        tdb_store(pdb->tdb, key, data, TDB_REPLACE);    
 
@@ -1349,15 +1348,18 @@ static void print_queue_update_with_lock( const char *sharename,
 /****************************************************************************
 this is the receive function of the background lpq updater
 ****************************************************************************/
-static void print_queue_receive(int msg_type, struct process_id src,
-                               void *buf, size_t msglen)
+static void print_queue_receive(struct messaging_context *msg,
+                               void *private_data,
+                               uint32_t msg_type,
+                               struct server_id server_id,
+                               DATA_BLOB *data)
 {
        fstring sharename;
        pstring lpqcommand, lprmcommand;
        int printing_type;
        size_t len;
 
-       len = tdb_unpack( buf, msglen, "fdPP",
+       len = tdb_unpack( (uint8 *)data->data, data->length, "fdPP",
                sharename,
                &printing_type,
                lpqcommand,
@@ -1394,14 +1396,15 @@ void start_background_queue(void)
                /* Child. */
                DEBUG(5,("start_background_queue: background LPQ thread started\n"));
 
-               claim_connection( NULL, "smbd lpq backend", 0, False, 
+               claim_connection( NULL, "smbd lpq backend",
                        FLAG_MSG_GENERAL|FLAG_MSG_SMBD|FLAG_MSG_PRINT_GENERAL);
 
                if (!locking_init(0)) {
                        exit(1);
                }
 
-               message_register(MSG_PRINTER_UPDATE, print_queue_receive);
+               messaging_register(smbd_messaging_context(), NULL,
+                                  MSG_PRINTER_UPDATE, print_queue_receive);
                
                DEBUG(5,("start_background_queue: background LPQ thread waiting for messages\n"));
                while (1) {
@@ -1423,11 +1426,12 @@ void start_background_queue(void)
                        /* now check for messages */
                        
                        DEBUG(10,("start_background_queue: background LPQ thread got a message\n"));
-                       message_dispatch();
+                       message_dispatch(smbd_messaging_context());
 
                        /* process any pending print change notify messages */
 
-                       print_notify_send_messages(0);
+                       print_notify_send_messages(smbd_messaging_context(),
+                                                  0);
                }
        }
 }
@@ -1438,12 +1442,10 @@ 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;
-       char *buffer = NULL;
+       uint8 *buffer = NULL;
        size_t len = 0;
        size_t newlen;
        struct tdb_print_db *pdb;
@@ -1497,7 +1499,7 @@ static void print_queue_update(int snum, BOOL force)
                lpqcommand, 
                lprmcommand );
 
-       buffer = SMB_XMALLOC_ARRAY( char, len );
+       buffer = SMB_XMALLOC_ARRAY( uint8, len );
 
        /* now pack the buffer */
        newlen = tdb_pack( buffer, len, "fdPP",
@@ -1535,8 +1537,9 @@ static void print_queue_update(int snum, BOOL force)
 
        /* finally send the message */
        
-       message_send_pid(pid_to_procid(background_lpq_updater_pid),
-                MSG_PRINTER_UPDATE, buffer, len, False);
+       messaging_send_buf(smbd_messaging_context(),
+                          pid_to_procid(background_lpq_updater_pid),
+                          MSG_PRINTER_UPDATE, (uint8 *)buffer, len);
 
        SAFE_FREE( buffer );
 
@@ -1605,7 +1608,7 @@ BOOL print_notify_register_pid(int snum)
 
        if (i == data.dsize) {
                /* We weren't in the list. Realloc. */
-               data.dptr = SMB_REALLOC(data.dptr, data.dsize + 8);
+               data.dptr = (uint8 *)SMB_REALLOC(data.dptr, data.dsize + 8);
                if (!data.dptr) {
                        DEBUG(0,("print_notify_register_pid: Relloc fail for printer %s\n",
                                                printername));
@@ -2300,7 +2303,7 @@ static BOOL add_to_jobs_changed(struct tdb_print_db *pdb, uint32 jobid)
        uint32 store_jobid;
 
        SIVAL(&store_jobid, 0, jobid);
-       data.dptr = (char *)&store_jobid;
+       data.dptr = (uint8 *)&store_jobid;
        data.dsize = 4;
 
        DEBUG(10,("add_to_jobs_changed: Added jobid %u\n", (unsigned int)jobid ));
@@ -2394,7 +2397,11 @@ uint32 print_job_start(struct current_user *user, int snum, char *jobname, NT_DE
        fstrcpy(pjob.jobname, jobname);
 
        if ((vuser = get_valid_user_struct(user->vuid)) != NULL) {
-               fstrcpy(pjob.user, vuser->user.smb_name);
+               fstrcpy(pjob.user, lp_printjob_username(snum));
+               standard_sub_basic(vuser->user.smb_name, vuser->user.domain, 
+                                  pjob.user, sizeof(pjob.user)-1);
+               /* ensure NULL termination */ 
+               pjob.user[sizeof(pjob.user)-1] = '\0'; 
        } else {
                fstrcpy(pjob.user, uidtoname(user->ut.uid));
        }
@@ -2695,8 +2702,8 @@ int print_queue_status(int snum,
 
        ZERO_STRUCTP(status);
        slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", sharename);
-       key.dptr = keystr;
-       key.dsize = strlen(keystr);
+       key = string_tdb_data(keystr);
+
        data = tdb_fetch(pdb->tdb, key);
        if (data.dptr) {
                if (data.dsize == sizeof(*status)) {