0001-01-01 02:30:17 +02:30
/*
0001-01-01 02:30:17 +02:30
Unix SMB / CIFS implementation .
0001-01-01 02:30:17 +02:30
printing backend routines for smbd - using files_struct rather
than only snum
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
the Free Software Foundation ; either version 2 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 , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
/***************************************************************************
open a print file and setup a fsp for it . This is a wrapper around
print_job_start ( ) .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
files_struct * print_fsp_open ( connection_struct * conn , char * fname )
0001-01-01 02:30:17 +02:30
{
int jobid ;
SMB_STRUCT_STAT sbuf ;
extern struct current_user current_user ;
0001-01-01 02:30:17 +02:30
files_struct * fsp = file_new ( conn ) ;
0001-01-01 02:30:17 +02:30
fstring name ;
0001-01-01 02:30:17 +02:30
if ( ! fsp )
return NULL ;
0001-01-01 02:30:17 +02:30
fstrcpy ( name , " Remote Downlevel Document " ) ;
if ( fname ) {
char * p = strrchr ( fname , ' / ' ) ;
fstrcat ( name , " " ) ;
if ( ! p )
p = fname ;
fstrcat ( name , p ) ;
}
0001-01-01 02:30:17 +02:30
jobid = print_job_start ( & current_user , SNUM ( conn ) , name , NULL ) ;
0001-01-01 02:30:17 +02:30
if ( jobid = = - 1 ) {
file_free ( fsp ) ;
return NULL ;
}
0001-01-01 02:30:17 +02:30
/* Convert to RAP id. */
fsp - > rap_print_jobid = pjobid_to_rap ( SNUM ( conn ) , jobid ) ;
if ( fsp - > rap_print_jobid = = 0 ) {
0001-01-01 02:30:17 +02:30
/* We need to delete the entry in the tdb. */
pjob_delete ( SNUM ( conn ) , jobid ) ;
0001-01-01 02:30:17 +02:30
file_free ( fsp ) ;
return NULL ;
}
0001-01-01 02:30:17 +02:30
/* setup a full fsp */
0001-01-01 02:30:17 +02:30
fsp - > fd = print_job_fd ( SNUM ( conn ) , jobid ) ;
0001-01-01 02:30:17 +02:30
GetTimeOfDay ( & fsp - > open_time ) ;
fsp - > vuid = current_user . vuid ;
fsp - > size = 0 ;
fsp - > pos = - 1 ;
fsp - > can_lock = True ;
fsp - > can_read = False ;
fsp - > can_write = True ;
fsp - > share_mode = 0 ;
fsp - > print_file = True ;
fsp - > modified = False ;
fsp - > oplock_type = NO_OPLOCK ;
fsp - > sent_oplock_break = NO_BREAK_SENT ;
fsp - > is_directory = False ;
fsp - > directory_delete_on_close = False ;
fsp - > conn = conn ;
0001-01-01 02:30:17 +02:30
string_set ( & fsp - > fsp_name , print_job_fname ( SNUM ( conn ) , jobid ) ) ;
0001-01-01 02:30:17 +02:30
fsp - > wbmpx_ptr = NULL ;
0001-01-01 02:30:17 +02:30
fsp - > wcp = NULL ;
0001-01-01 02:30:17 +02:30
conn - > vfs_ops . fstat ( fsp , fsp - > fd , & sbuf ) ;
fsp - > mode = sbuf . st_mode ;
fsp - > inode = sbuf . st_ino ;
fsp - > dev = sbuf . st_dev ;
0001-01-01 02:30:17 +02:30
conn - > num_files_open + + ;
return fsp ;
}
/****************************************************************************
print a file - called on closing the file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
void print_fsp_end ( files_struct * fsp , BOOL normal_close )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
uint32 jobid ;
int snum ;
0001-01-01 02:30:17 +02:30
if ( fsp - > share_mode = = FILE_DELETE_ON_CLOSE ) {
/*
* Truncate the job . print_job_end will take
* care of deleting it for us . JRA .
*/
sys_ftruncate ( fsp - > fd , 0 ) ;
}
0001-01-01 02:30:17 +02:30
if ( fsp - > fsp_name ) {
string_free ( & fsp - > fsp_name ) ;
}
0001-01-01 02:30:17 +02:30
if ( ! rap_to_pjobid ( fsp - > rap_print_jobid , & snum , & jobid ) ) {
DEBUG ( 3 , ( " print_fsp_end: Unable to convert RAP jobid %u to print jobid. \n " ,
( unsigned int ) fsp - > rap_print_jobid ) ) ;
return ;
}
print_job_end ( SNUM ( fsp - > conn ) , jobid , normal_close ) ;
0001-01-01 02:30:17 +02:30
}