2002-03-08 00:51:59 +03:00
# ifndef PRINTING_H_
# define PRINTING_H_
2001-03-16 03:35:57 +03:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-03-16 03:35:57 +03:00
printing definitions
Copyright ( C ) Andrew Tridgell 1992 - 2000
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
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2001-03-16 03:35:57 +03:00
( 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
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2001-03-16 03:35:57 +03:00
*/
/*
This file defines the low - level printing system interfaces used by the
SAMBA printing subsystem .
*/
2011-06-20 13:10:32 +04:00
# include "tdb_compat.h"
2001-03-16 03:35:57 +03:00
2011-02-22 21:46:11 +03:00
/* Extra fields above "LPQ_PRINTING" are used to map extra NT status codes. */
enum {
LPQ_QUEUED = 0 ,
LPQ_PAUSED ,
LPQ_SPOOLING ,
LPQ_PRINTING ,
LPQ_ERROR ,
LPQ_DELETING ,
LPQ_OFFLINE ,
LPQ_PAPEROUT ,
LPQ_PRINTED ,
LPQ_DELETED ,
LPQ_BLOCKED ,
LPQ_USER_INTERVENTION ,
/* smbd is dooing the file spooling before passing control to spoolss */
PJOB_SMBD_SPOOLING
} ;
typedef struct _print_queue_struct {
int job ; /* normally the UNIX jobid -- see note in
printing . c : traverse_fn_delete ( ) */
int size ;
int page_count ;
int status ;
int priority ;
time_t time ;
fstring fs_user ;
fstring fs_file ;
} print_queue_struct ;
enum { LPSTAT_OK , LPSTAT_STOPPED , LPSTAT_ERROR } ;
typedef struct {
fstring message ;
int qcount ;
int status ;
} print_status_struct ;
2001-03-16 03:35:57 +03:00
/* Information for print jobs */
struct printjob {
pid_t pid ; /* which process launched the job */
int sysjob ; /* the system (lp) job number */
int fd ; /* file descriptor of open file if open */
time_t starttime ; /* when the job started spooling */
int status ; /* the status of this job */
size_t size ; /* the size of the job so far */
2002-03-19 05:35:12 +03:00
int page_count ; /* then number of pages so far */
2007-10-19 04:40:25 +04:00
bool spooled ; /* has it been sent to the spooler yet? */
bool smbjob ; /* set if the job is a SMB job */
2001-03-16 03:35:57 +03:00
fstring filename ; /* the filename used to spool the file */
fstring jobname ; /* the job name given to us by the client */
fstring user ; /* the user who started the job */
2010-08-16 15:53:10 +04:00
fstring clientmachine ; /* The client machine which started this job */
2002-03-21 00:55:57 +03:00
fstring queuename ; /* service number of printer for this job */
2010-04-23 00:53:15 +04:00
struct spoolss_DeviceMode * devmode ;
2001-03-16 03:35:57 +03:00
} ;
/* Information for print interfaces */
struct printif
{
2004-10-19 21:05:01 +04:00
/* value of the 'printing' option for this service */
enum printing_types type ;
int ( * queue_get ) ( const char * printer_name ,
enum printing_types printing_type ,
char * lpq_command ,
print_queue_struct * * q ,
2001-03-16 03:35:57 +03:00
print_status_struct * status ) ;
int ( * queue_pause ) ( int snum ) ;
int ( * queue_resume ) ( int snum ) ;
2005-09-30 21:13:37 +04:00
int ( * job_delete ) ( const char * sharename , const char * lprm_command , struct printjob * pjob ) ;
2001-03-16 03:35:57 +03:00
int ( * job_pause ) ( int snum , struct printjob * pjob ) ;
int ( * job_resume ) ( int snum , struct printjob * pjob ) ;
int ( * job_submit ) ( int snum , struct printjob * pjob ) ;
} ;
extern struct printif generic_printif ;
2001-08-23 23:06:20 +04:00
# ifdef HAVE_CUPS
2001-03-16 03:35:57 +03:00
extern struct printif cups_printif ;
2001-08-23 23:06:20 +04:00
# endif /* HAVE_CUPS */
2001-03-16 03:35:57 +03:00
2005-09-21 03:28:22 +04:00
# ifdef HAVE_IPRINT
extern struct printif iprint_printif ;
# endif /* HAVE_IPRINT */
2002-10-05 02:53:18 +04:00
/* PRINT_MAX_JOBID is now defined in local.h */
2001-03-16 03:35:57 +03:00
# define UNIX_JOB_START PRINT_MAX_JOBID
# define NEXT_JOBID(j) ((j+1) % PRINT_MAX_JOBID > 0 ? (j+1) % PRINT_MAX_JOBID : 1)
2002-03-08 00:51:59 +03:00
# define MAX_CACHE_VALID_TIME 3600
2008-09-24 20:53:21 +04:00
# define CUPS_DEFAULT_CONNECTION_TIMEOUT 30
2002-03-08 00:51:59 +03:00
2005-03-08 02:24:19 +03:00
# ifndef PRINT_SPOOL_PREFIX
2001-03-16 03:35:57 +03:00
# define PRINT_SPOOL_PREFIX "smbprn."
2005-03-08 02:24:19 +03:00
# endif
2010-04-29 16:00:30 +04:00
# define PRINT_DATABASE_VERSION 7
2002-03-08 00:51:59 +03:00
2011-02-24 14:03:19 +03:00
# ifdef AIX
# define DEFAULT_PRINTING PRINT_AIX
# define PRINTCAP_NAME " / etc / qconfig"
# endif
# ifdef HPUX
# define DEFAULT_PRINTING PRINT_HPUX
# endif
# ifdef QNX
# define DEFAULT_PRINTING PRINT_QNX
# endif
# ifndef DEFAULT_PRINTING
# ifdef HAVE_CUPS
# define DEFAULT_PRINTING PRINT_CUPS
# define PRINTCAP_NAME "cups"
# elif defined(SYSV)
# define DEFAULT_PRINTING PRINT_SYSV
# define PRINTCAP_NAME "lpstat"
# else
# define DEFAULT_PRINTING PRINT_BSD
# define PRINTCAP_NAME " / etc / printcap"
# endif
# endif
# ifndef PRINTCAP_NAME
# define PRINTCAP_NAME " / etc / printcap"
# endif
2002-11-26 03:46:31 +03:00
/* There can be this many printing tdb's open, plus any locked ones. */
# define MAX_PRINT_DBS_OPEN 1
struct tdb_print_db {
struct tdb_print_db * next , * prev ;
2011-05-05 13:25:29 +04:00
struct tdb_context * tdb ;
2002-11-26 03:46:31 +03:00
int ref_count ;
fstring printer_name ;
} ;
/*
* Used for print notify
*/
# define NOTIFY_PID_LIST_KEY "NOTIFY_PID_LIST"
2011-02-22 21:24:31 +03:00
/* The following definitions come from printing/printspoolss.c */
2010-04-29 02:55:20 +04:00
NTSTATUS print_spool_open ( files_struct * fsp ,
const char * fname ,
uint16_t current_vuid ) ;
int print_spool_write ( files_struct * fsp , const char * data , uint32_t size ,
SMB_OFF_T offset , uint32_t * written ) ;
void print_spool_end ( files_struct * fsp , enum file_close_type close_type ) ;
void print_spool_terminate ( struct connection_struct * conn ,
struct print_file_data * print_file ) ;
2010-05-07 16:01:13 +04:00
/* The following definitions come from printing/printing.c */
uint32 sysjob_to_jobid ( int unix_jobid ) ;
bool print_notify_register_pid ( int snum ) ;
bool print_notify_deregister_pid ( int snum ) ;
bool print_job_exists ( const char * sharename , uint32 jobid ) ;
char * print_job_fname ( const char * sharename , uint32 jobid ) ;
struct spoolss_DeviceMode * print_job_devmode ( const char * sharename , uint32 jobid ) ;
2010-08-08 19:11:23 +04:00
bool print_job_set_name ( struct tevent_context * ev ,
struct messaging_context * msg_ctx ,
const char * sharename , uint32 jobid , const char * name ) ;
2010-05-07 16:01:13 +04:00
bool print_job_get_name ( TALLOC_CTX * mem_ctx , const char * sharename , uint32_t jobid , char * * name ) ;
2011-07-15 06:45:17 +04:00
WERROR print_job_delete ( const struct auth3_session_info * server_info ,
2010-08-08 16:42:47 +04:00
struct messaging_context * msg_ctx ,
int snum , uint32_t jobid ) ;
2011-07-15 06:45:17 +04:00
bool print_job_pause ( const struct auth3_session_info * server_info ,
2010-08-08 16:44:32 +04:00
struct messaging_context * msg_ctx ,
int snum , uint32 jobid , WERROR * errcode ) ;
2011-07-15 06:45:17 +04:00
bool print_job_resume ( const struct auth3_session_info * server_info ,
2010-08-08 16:46:04 +04:00
struct messaging_context * msg_ctx ,
int snum , uint32 jobid , WERROR * errcode ) ;
2010-08-08 19:15:23 +04:00
ssize_t print_job_write ( struct tevent_context * ev ,
struct messaging_context * msg_ctx ,
2010-08-15 16:45:48 +04:00
int snum , uint32 jobid , const char * buf , size_t size ) ;
2010-08-08 17:47:51 +04:00
int print_queue_length ( struct messaging_context * msg_ctx , int snum ,
print_status_struct * pstatus ) ;
2011-07-15 06:45:17 +04:00
WERROR print_job_start ( const struct auth3_session_info * server_info ,
2010-08-08 16:48:30 +04:00
struct messaging_context * msg_ctx ,
2010-08-17 11:34:27 +04:00
const char * clientmachine ,
2010-05-07 16:01:13 +04:00
int snum , const char * docname , const char * filename ,
struct spoolss_DeviceMode * devmode , uint32_t * _jobid ) ;
2010-08-08 19:17:05 +04:00
void print_job_endpage ( struct messaging_context * msg_ctx ,
int snum , uint32 jobid ) ;
2010-08-08 17:51:30 +04:00
NTSTATUS print_job_end ( struct messaging_context * msg_ctx , int snum ,
uint32 jobid , enum file_close_type close_type ) ;
2010-08-08 17:55:19 +04:00
int print_queue_status ( struct messaging_context * msg_ctx , int snum ,
2010-05-07 16:01:13 +04:00
print_queue_struct * * ppqueue ,
print_status_struct * status ) ;
2011-07-15 06:45:17 +04:00
WERROR print_queue_pause ( const struct auth3_session_info * server_info ,
2010-08-08 16:50:15 +04:00
struct messaging_context * msg_ctx , int snum ) ;
2011-07-15 06:45:17 +04:00
WERROR print_queue_resume ( const struct auth3_session_info * server_info ,
2010-08-08 16:51:40 +04:00
struct messaging_context * msg_ctx , int snum ) ;
2011-07-15 06:45:17 +04:00
WERROR print_queue_purge ( const struct auth3_session_info * server_info ,
2010-08-08 16:52:59 +04:00
struct messaging_context * msg_ctx , int snum ) ;
2011-02-22 21:24:31 +03:00
uint16 pjobid_to_rap ( const char * sharename , uint32 jobid ) ;
bool rap_to_pjobid ( uint16 rap_jobid , fstring sharename , uint32 * pjobid ) ;
void rap_jobid_delete ( const char * sharename , uint32 jobid ) ;
bool print_backend_init ( struct messaging_context * msg_ctx ) ;
void start_background_queue ( struct tevent_context * ev ,
struct messaging_context * msg ) ;
void printing_end ( void ) ;
/* The following definitions come from printing/lpq_parse.c */
bool parse_lpq_entry ( enum printing_types printing_type , char * line ,
print_queue_struct * buf ,
print_status_struct * status , bool first ) ;
uint32_t print_parse_jobid ( const char * fname ) ;
/* The following definitions come from printing/printing_db.c */
struct tdb_print_db * get_print_db_byname ( const char * printername ) ;
void release_print_db ( struct tdb_print_db * pdb ) ;
void close_all_print_db ( void ) ;
2011-06-20 13:10:32 +04:00
TDB_DATA get_printer_notify_pid_list ( struct tdb_context * tdb , const char * printer_name , bool cleanlist ) ;
2010-05-07 16:01:13 +04:00
2010-05-20 16:49:50 +04:00
void print_queue_receive ( struct messaging_context * msg ,
void * private_data ,
uint32_t msg_type ,
struct server_id server_id ,
DATA_BLOB * data ) ;
2002-03-08 00:51:59 +03:00
# endif /* PRINTING_H_ */