svn commit: samba r6889 - in trunk/source: lib printing rpc_server smbd

jra at samba.org jra at samba.org
Wed May 18 18:02:16 GMT 2005


Author: jra
Date: 2005-05-18 18:02:12 +0000 (Wed, 18 May 2005)
New Revision: 6889

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6889

Log:
Refactor printing interface to take offset into job. Fixes bug
where large print jobs can have out-of-order offsets. Bug found
by Arcady Chernyak <Arcady.Chernyak at efi.com>
Jeremy.

Modified:
   trunk/source/lib/util.c
   trunk/source/lib/util_sock.c
   trunk/source/printing/printing.c
   trunk/source/rpc_server/srv_spoolss_nt.c
   trunk/source/smbd/fileio.c


Changeset:
Modified: trunk/source/lib/util.c
===================================================================
--- trunk/source/lib/util.c	2005-05-18 16:43:23 UTC (rev 6888)
+++ trunk/source/lib/util.c	2005-05-18 18:02:12 UTC (rev 6889)
@@ -640,6 +640,46 @@
 #endif
 }
 
+/*******************************************************************
+ Write data into an fd at a given offset. Ignore seek errors.
+********************************************************************/
+
+ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
+{
+	size_t total=0;
+	ssize_t ret;
+
+	if (pos == (SMB_OFF_T)-1) {
+		return write_data(fd, buffer, N);
+	}
+#if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
+	while (total < N) {
+		ret = sys_pwrite(fd,buffer + total,N - total, pos);
+		if (ret == -1 && errno == ESPIPE) {
+			return write_data(fd, buffer + total,N - total);
+		}
+		if (ret == -1) {
+			DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
+			return -1;
+		}
+		if (ret == 0) {
+			return total;
+		}
+		total += ret;
+		pos += ret;
+	}
+	return (ssize_t)total;
+#else
+	/* Use lseek and write_data. */
+	if (sys_lseek(fd, pos, SEEK_SET) == -1) {
+		if (errno != ESPIPE) {
+			return -1;
+		}
+	}
+	return write_data(fd, buffer, N);
+#endif
+}
+
 /****************************************************************************
  Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
  else

Modified: trunk/source/lib/util_sock.c
===================================================================
--- trunk/source/lib/util_sock.c	2005-05-18 16:43:23 UTC (rev 6888)
+++ trunk/source/lib/util_sock.c	2005-05-18 18:02:12 UTC (rev 6889)
@@ -490,7 +490,7 @@
  Write data to a socket - use send rather than write.
 ****************************************************************************/
 
-static ssize_t write_socket_data(int fd,char *buffer,size_t N)
+static ssize_t write_socket_data(int fd, const char *buffer, size_t N)
 {
 	size_t total=0;
 	ssize_t ret;
@@ -514,7 +514,7 @@
  Write to a socket.
 ****************************************************************************/
 
-ssize_t write_socket(int fd,char *buf,size_t len)
+ssize_t write_socket(int fd, const char *buf, size_t len)
 {
 	ssize_t ret=0;
 
@@ -552,7 +552,7 @@
  Timeout is in milliseconds.
 ****************************************************************************/
 
-static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int timeout)
+static ssize_t read_smb_length_return_keepalive(int fd, char *inbuf, unsigned int timeout)
 {
 	ssize_t len=0;
 	int msg_type;
@@ -586,7 +586,7 @@
  Timeout is in milliseconds.
 ****************************************************************************/
 
-ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
+ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout)
 {
 	ssize_t len;
 
@@ -615,7 +615,7 @@
  Doesn't check the MAC on signed packets.
 ****************************************************************************/
 
-BOOL receive_smb_raw(int fd,char *buffer, unsigned int timeout)
+BOOL receive_smb_raw(int fd, char *buffer, unsigned int timeout)
 {
 	ssize_t len,ret;
 
@@ -680,7 +680,7 @@
  Checks the MAC on signed packets.
 ****************************************************************************/
 
-BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
+BOOL receive_smb(int fd, char *buffer, unsigned int timeout)
 {
 	if (!receive_smb_raw(fd, buffer, timeout)) {
 		return False;
@@ -701,7 +701,7 @@
  Send an smb to a fd.
 ****************************************************************************/
 
-BOOL send_smb(int fd,char *buffer)
+BOOL send_smb(int fd, char *buffer)
 {
 	size_t len;
 	size_t nwritten=0;

Modified: trunk/source/printing/printing.c
===================================================================
--- trunk/source/printing/printing.c	2005-05-18 16:43:23 UTC (rev 6888)
+++ trunk/source/printing/printing.c	2005-05-18 18:02:12 UTC (rev 6889)
@@ -2031,7 +2031,7 @@
  Write to a print file.
 ****************************************************************************/
 
-int print_job_write(int snum, uint32 jobid, const char *buf, int size)
+ssize_t print_job_write(int snum, uint32 jobid, const char *buf, SMB_OFF_T pos, size_t size)
 {
 	const char* sharename = lp_const_servicename(snum);
 	int return_code;
@@ -2045,7 +2045,8 @@
 	if (pjob->pid != sys_getpid())
 		return -1;
 
-	return_code = write(pjob->fd, buf, size);
+	return_code = write_data_at_offset(pjob->fd, buf, size, pos);
+
 	if (return_code>0) {
 		pjob->size += size;
 		pjob_store(sharename, jobid, pjob);

Modified: trunk/source/rpc_server/srv_spoolss_nt.c
===================================================================
--- trunk/source/rpc_server/srv_spoolss_nt.c	2005-05-18 16:43:23 UTC (rev 6888)
+++ trunk/source/rpc_server/srv_spoolss_nt.c	2005-05-18 18:02:12 UTC (rev 6889)
@@ -5796,8 +5796,9 @@
 	if (!get_printer_snum(p, handle, &snum))
 		return WERR_BADFID;
 
-	(*buffer_written) = print_job_write(snum, Printer->jobid, (char *)buffer, buffer_size);
-	if (*buffer_written == -1) {
+	(*buffer_written) = (uint32)print_job_write(snum, Printer->jobid, (const char *)buffer,
+					(SMB_OFF_T)-1, (size_t)buffer_size);
+	if (*buffer_written == (uint32)-1) {
 		r_u->buffer_written = 0;
 		if (errno == ENOSPC)
 			return WERR_NO_SPOOL_SPACE;

Modified: trunk/source/smbd/fileio.c
===================================================================
--- trunk/source/smbd/fileio.c	2005-05-18 16:43:23 UTC (rev 6888)
+++ trunk/source/smbd/fileio.c	2005-05-18 18:02:12 UTC (rev 6889)
@@ -117,7 +117,7 @@
  *Really* write to a file.
 ****************************************************************************/
 
-static ssize_t real_write_file(files_struct *fsp,char *data,SMB_OFF_T pos, size_t n)
+static ssize_t real_write_file(files_struct *fsp,const char *data, SMB_OFF_T pos, size_t n)
 {
 	ssize_t ret;
 
@@ -192,7 +192,7 @@
  Write to a file.
 ****************************************************************************/
 
-ssize_t write_file(files_struct *fsp, char *data, SMB_OFF_T pos, size_t n)
+ssize_t write_file(files_struct *fsp, const char *data, SMB_OFF_T pos, size_t n)
 {
 	write_cache *wcp = fsp->wcp;
 	ssize_t total_written = 0;
@@ -209,7 +209,7 @@
 			return -1;
 		}
 
-		return print_job_write(SNUM(fsp->conn), jobid, data, n);
+		return print_job_write(SNUM(fsp->conn), jobid, data, pos, n);
 	}
 
 	if (!fsp->can_write) {



More information about the samba-cvs mailing list