If signing starts successfully, don't just turn it off automatically if
[jra/samba/.git] / source3 / printing / printfsp.c
index f6ab69fd93e2131a204ec6d6e25ef2cd08563887..0b6d4fdbe1cef6bbf645f21846c6cafc4e6afe90 100644 (file)
@@ -1,8 +1,5 @@
-#define OLD_NTDOMAIN 1
-
 /* 
-   Unix SMB/Netbios implementation.
-   Version 3.0
+   Unix SMB/CIFS implementation.
    printing backend routines for smbd - using files_struct rather
    than only snum
    Copyright (C) Andrew Tridgell 1992-2000
 */
 
 #include "includes.h"
-extern int DEBUGLEVEL;
-
 
 /***************************************************************************
 open a print file and setup a fsp for it. This is a wrapper around
 print_job_start().
 ***************************************************************************/
 
-files_struct *print_fsp_open(connection_struct *conn,char *jobname)
+files_struct *print_fsp_open(connection_struct *conn, char *fname)
 {
        int jobid;
        SMB_STRUCT_STAT sbuf;
        extern struct current_user current_user;
-       files_struct *fsp = file_new();
+       files_struct *fsp = file_new(conn);
+       fstring name;
 
        if(!fsp)
                return NULL;
 
-       jobid = print_job_start(&current_user, SNUM(conn), jobname);
+       fstrcpy( name, "Remote Downlevel Document");
+       if (fname) {
+               char *p = strrchr(fname, '/');
+               fstrcat(name, " ");
+               if (!p)
+                       p = fname;
+               fstrcat(name, p);
+       }
+
+       jobid = print_job_start(&current_user, SNUM(conn), name, NULL);
        if (jobid == -1) {
                file_free(fsp);
                return NULL;
        }
 
+       /* Convert to RAP id. */
+       fsp->rap_print_jobid = pjobid_to_rap(SNUM(conn), jobid);
+       if (fsp->rap_print_jobid == 0) {
+               /* We need to delete the entry in the tdb. */
+               pjob_delete(SNUM(conn), jobid);
+               file_free(fsp);
+               return NULL;
+       }
+
        /* setup a full fsp */
-       fsp->print_jobid = jobid;
-       fsp->fd = print_job_fd(jobid);
+       fsp->fd = print_job_fd(SNUM(conn),jobid);
        GetTimeOfDay(&fsp->open_time);
        fsp->vuid = current_user.vuid;
        fsp->size = 0;
@@ -63,13 +76,11 @@ files_struct *print_fsp_open(connection_struct *conn,char *jobname)
        fsp->oplock_type = NO_OPLOCK;
        fsp->sent_oplock_break = NO_BREAK_SENT;
        fsp->is_directory = False;
-       fsp->stat_open = False;
        fsp->directory_delete_on_close = False;
-       fsp->conn = conn;
-       string_set(&fsp->fsp_name,print_job_fname(jobid));
+       string_set(&fsp->fsp_name,print_job_fname(SNUM(conn),jobid));
        fsp->wbmpx_ptr = NULL;      
        fsp->wcp = NULL; 
-       conn->vfs_ops.fstat(fsp,fsp->fd, &sbuf);
+       SMB_VFS_FSTAT(fsp,fsp->fd, &sbuf);
        fsp->mode = sbuf.st_mode;
        fsp->inode = sbuf.st_ino;
        fsp->dev = sbuf.st_dev;
@@ -84,11 +95,26 @@ print a file - called on closing the file
 ****************************************************************************/
 void print_fsp_end(files_struct *fsp, BOOL normal_close)
 {
-       print_job_end(fsp->print_jobid, normal_close);
+       uint32 jobid;
+       int snum;
+
+       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);
+       }
 
        if (fsp->fsp_name) {
                string_free(&fsp->fsp_name);
        }
-}
 
-#undef OLD_NTDOMAIN
+       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);
+}