]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
cupsFileTell() did not work for log files opened in append mode (STR #2810)
authormike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Wed, 23 Apr 2008 22:07:37 +0000 (22:07 +0000)
committermike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Wed, 23 Apr 2008 22:07:37 +0000 (22:07 +0000)
Update installation instructions to note new CUPS_DEBUG_LOG stuff.

git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@7491 7a7537e8-13f0-0310-91df-b6672ffda945

CHANGES-1.3.txt
INSTALL.txt
cups/file.c
cups/testfile.c

index f668b502fa78cb068dd70b4bf78481f429564553..d62d2d031fe7b5280776ae6cc6fc1d89f3ea8c94 100644 (file)
@@ -4,6 +4,8 @@ CHANGES-1.3.txt
 CHANGES IN CUPS V1.3.8
 
        - Documentation updates (STR #2785)
+       - cupsFileTell() did not work for log files opened in append
+         mode (STR #2810)
        - The scheduler did not set QUERY_STRING all of the time
          for CGI scripts (STR #2781)
        - The scheduler now returns an error for bad job-sheets
index ba785ed4d8731c7b4478b09c4e8d9a1bce9b78eb..46104948d883b8200f3c9893554e197ba1bfe526 100644 (file)
@@ -1,4 +1,4 @@
-INSTALL - CUPS v1.4svn - 2008-04-08
+INSTALL - CUPS v1.4svn - 2008-04-23
 -----------------------------------
 
 This file describes how to compile and install CUPS from source
@@ -14,10 +14,10 @@ code. For more information on CUPS see the file called
 
 BEFORE YOU BEGIN
 
-    You'll need an ANSI-compliant C compiler, plus a make program
-    and Bourne shell.  The GNU compiler tools work well - we've
-    tested the current CUPS code against several versions of GCC
-    with excellent results.
+    You'll need ANSI-compliant C and C++ compilers, plus a make
+    program and Bourne shell.  The GNU compiler tools work well -
+    we've tested the current CUPS code against several versions
+    of GCC with excellent results.
 
     The makefiles used by the project should work with most
     versions of make.  We've tested them with GNU make as well as
@@ -96,6 +96,10 @@ CONFIGURATION
        LDFLAGS="-L/some/directory" \
        ./configure ...
 
+    The "--enable-debug" option compiles CUPS with debugging enabled,
+    as well as support for debug logging via the CUPS_DEBUG_LOG
+    environment variable at run-time.
+
     Once you have configured things, just type:
 
        make ENTER
@@ -164,6 +168,15 @@ CREATING BINARY DISTRIBUTIONS WITH EPM
        tardist   - Builds an IRIX package (also inst)
 
 
+GETTING DEBUG LOGGING FROM CUPS
+
+    When configured with the "--enable-debug" option, CUPS compiles
+    in additional debug logging support in the scheduler, CUPS API,
+    and CUPS Imaging API.  Set the CUPS_DEBUG_LOG environment
+    variable to a filename to append logging information at run-time.
+    Use the name "-" to send the messages to stderr.
+
+
 REPORTING PROBLEMS
 
     If you have problems, READ THE DOCUMENTATION FIRST!  If the
index f15c7e3fd6b5b84020fb5531a1672458014d0b66..68d605fa9ace6cf0e3dac987fe17344fadd7bdb8 100644 (file)
@@ -111,7 +111,8 @@ struct _cups_file_s                 /**** CUPS file structure... ****/
                buf[4096],              /* Buffer */
                *ptr,                   /* Pointer into buffer */
                *end;                   /* End of buffer data */
-  off_t                pos;                    /* File position for start of buffer */
+  off_t                pos,                    /* Position in file */
+               bufpos;                 /* File position for start of buffer */
 
 #ifdef HAVE_LIBZ
   z_stream     stream;                 /* (De)compression stream */
@@ -413,13 +414,14 @@ cupsFileFlush(cups_file_t *fp)            /* I - CUPS file */
 
   if (!fp || fp->mode != 'w')
   {
-    DEBUG_puts("    Attempt to flush a read-only file...");
+    DEBUG_puts("cupsFileFlush: Attempt to flush a read-only file...");
     return (-1);
   }
 
   bytes = (ssize_t)(fp->ptr - fp->buf);
 
-  DEBUG_printf(("    Flushing %ld bytes...\n", (long)bytes));
+  DEBUG_printf(("cupsFileFlush: Flushing " CUPS_LLFMT " bytes...\n",
+                CUPS_LLCAST bytes));
 
   if (bytes > 0)
   {
@@ -453,6 +455,8 @@ cupsFileGetChar(cups_file_t *fp)    /* I - CUPS file */
   * Range check input...
   */
 
+  DEBUG_printf(("cupsFileGetChar(fp=%p)\n", fp));
+
   if (!fp || (fp->mode != 'r' && fp->mode != 's'))
   {
     DEBUG_puts("cupsFileGetChar: Bad arguments!");
@@ -476,6 +480,10 @@ cupsFileGetChar(cups_file_t *fp)   /* I - CUPS file */
 
   DEBUG_printf(("cupsFileGetChar: Returning %d...\n", *(fp->ptr) & 255));
 
+  fp->pos ++;
+
+  DEBUG_printf(("cupsFileGetChar: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   return (*(fp->ptr)++ & 255);
 }
 
@@ -500,6 +508,10 @@ cupsFileGetConf(cups_file_t *fp,   /* I  - CUPS file */
   * Range check input...
   */
 
+  DEBUG_printf(("cupsFileGetConf(fp=%p, buf=%p, buflen=" CUPS_LLFMT
+                ", value=%p, linenum=%p)\n", fp, buf, CUPS_LLCAST buflen,
+               value, linenum));
+
   if (!fp || (fp->mode != 'r' && fp->mode != 's') ||
       !buf || buflen < 2 || !value)
   {
@@ -640,6 +652,9 @@ cupsFileGetLine(cups_file_t *fp,    /* I - File to read from */
   * Range check input...
   */
 
+  DEBUG_printf(("cupsFileGetLine(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")\n",
+                fp, buf, CUPS_LLCAST buflen));
+
   if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 3)
     return (0);
 
@@ -654,6 +669,7 @@ cupsFileGetLine(cups_file_t *fp,    /* I - File to read from */
         break;
 
     *ptr++ = ch = *(fp->ptr)++;
+    fp->pos ++;
 
     if (ch == '\r')
     {
@@ -666,7 +682,10 @@ cupsFileGetLine(cups_file_t *fp,   /* I - File to read from */
           break;
 
       if (*(fp->ptr) == '\n')
+      {
         *ptr++ = *(fp->ptr)++;
+       fp->pos ++;
+      }
 
       break;
     }
@@ -682,6 +701,8 @@ cupsFileGetLine(cups_file_t *fp,    /* I - File to read from */
 
   *ptr = '\0';
 
+  DEBUG_printf(("cupsFileGetLine: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   return (ptr - buf);
 }
 
@@ -706,6 +727,9 @@ cupsFileGets(cups_file_t *fp,               /* I - CUPS file */
   * Range check input...
   */
 
+  DEBUG_printf(("cupsFileGets(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")\n", fp, buf,
+                CUPS_LLCAST buflen));
+
   if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 2)
     return (NULL);
 
@@ -725,6 +749,7 @@ cupsFileGets(cups_file_t *fp,               /* I - CUPS file */
       }
 
     ch = *(fp->ptr)++;
+    fp->pos ++;
 
     if (ch == '\r')
     {
@@ -737,7 +762,10 @@ cupsFileGets(cups_file_t *fp,              /* I - CUPS file */
           break;
 
       if (*(fp->ptr) == '\n')
-        fp->ptr ++;      
+      {
+        fp->ptr ++;
+       fp->pos ++;
+      }
 
       break;
     }
@@ -755,6 +783,8 @@ cupsFileGets(cups_file_t *fp,               /* I - CUPS file */
 
   *ptr = '\0';
 
+  DEBUG_printf(("cupsFileGets: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   return (buf);
 }
 
@@ -811,8 +841,9 @@ cupsFileNumber(cups_file_t *fp)             /* I - CUPS file */
  * existing file, "a" to append to an existing file or create a new file,
  * or "s" to open a socket connection.
  *
- * When opening for writing ("w") or appending ("a"), an optional number from
- * 1 to 9 can be supplied which enables Flate compression of the file.
+ * When opening for writing ("w"), an optional number from 1 to 9 can be
+ * supplied which enables Flate compression of the file.  Compression is
+ * not supported for the "a" (append) mode.
  *
  * When opening a socket connection, the filename is a string of the form
  * "address:port" or "hostname:port". The socket will make an IPv4 or IPv6
@@ -841,7 +872,8 @@ cupsFileOpen(const char *filename,  /* I - Name of file */
   */
 
   if (!filename || !mode ||
-      (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's'))
+      (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') ||
+      (*mode == 'a' && isdigit(mode[1] & 255)))
     return (NULL);
 
  /*
@@ -918,11 +950,12 @@ cupsFileOpen(const char *filename,        /* I - Name of file */
 /*
  * 'cupsFileOpenFd()' - Open a CUPS file using a file descriptor.
  *
- * The "mode" parameter can be "r" to read, "a" or "w" to write, or "s"
- * to treat the file descriptor as a bidirectional socket connection.
+ * The "mode" parameter can be "r" to read, "w" to write, "a" to append,
+ * or "s" to treat the file descriptor as a bidirectional socket connection.
  *
- * When opening for writing ("w") or appending ("a"), an optional number from
- * 1 to 9 can be supplied which enables Flate compression of the file.
+ * When opening for writing ("w"), an optional number from 1 to 9 can be
+ * supplied which enables Flate compression of the file.  Compression is
+ * not supported for the "a" (append) mode.
  *
  * @since CUPS 1.2@
  */
@@ -941,7 +974,8 @@ cupsFileOpenFd(int        fd,               /* I - File descriptor */
   */
 
   if (fd < 0 || !mode ||
-      (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's'))
+      (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') ||
+      (*mode == 'a' && isdigit(mode[1] & 255)))
     return (NULL);
 
  /*
@@ -959,8 +993,10 @@ cupsFileOpenFd(int        fd,              /* I - File descriptor */
 
   switch (*mode)
   {
-    case 'w' :
     case 'a' :
+        fp->pos = lseek(fd, 0, SEEK_END);
+
+    case 'w' :
        fp->mode = 'w';
        fp->ptr  = fp->buf;
        fp->end  = fp->buf + sizeof(fp->buf);
@@ -1091,7 +1127,16 @@ cupsFilePrintf(cups_file_t *fp,          /* I - CUPS file */
     return (-1);
 
   if (fp->mode == 's')
-    return (cups_write(fp, buf, bytes));
+  {
+    if (cups_write(fp, buf, bytes) < 0)
+      return (-1);
+
+    fp->pos += bytes;
+
+    DEBUG_printf(("cupsFilePrintf: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
+    return (bytes);
+  }
 
   if ((fp->ptr + bytes) > fp->end)
     if (cupsFileFlush(fp))
@@ -1099,6 +1144,8 @@ cupsFilePrintf(cups_file_t *fp,           /* I - CUPS file */
 
   fp->pos += bytes;
 
+  DEBUG_printf(("cupsFilePrintf: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   if (bytes > sizeof(fp->buf))
   {
 #ifdef HAVE_LIBZ
@@ -1163,6 +1210,8 @@ cupsFilePutChar(cups_file_t *fp,  /* I - CUPS file */
 
   fp->pos ++;
 
+  DEBUG_printf(("cupsFilePutChar: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   return (0);
 }
 
@@ -1202,6 +1251,8 @@ cupsFilePuts(cups_file_t *fp,             /* I - CUPS file */
 
     fp->pos += bytes;
 
+    DEBUG_printf(("cupsFilePuts: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
     return (bytes);
   }
 
@@ -1211,6 +1262,8 @@ cupsFilePuts(cups_file_t *fp,             /* I - CUPS file */
 
   fp->pos += bytes;
 
+  DEBUG_printf(("cupsFilePuts: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   if (bytes > sizeof(fp->buf))
   {
 #ifdef HAVE_LIBZ
@@ -1244,8 +1297,8 @@ cupsFileRead(cups_file_t *fp,             /* I - CUPS file */
   ssize_t      count;                  /* Bytes read */
 
 
-  DEBUG_printf(("cupsFileRead(fp=%p, buf=%p, bytes=%ld)\n", fp, buf,
-                (long)bytes));
+  DEBUG_printf(("cupsFileRead(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")\n", fp, buf,
+                CUPS_LLCAST bytes));
 
  /*
   * Range check input...
@@ -1267,7 +1320,8 @@ cupsFileRead(cups_file_t *fp,             /* I - CUPS file */
     if (fp->ptr >= fp->end)
       if (cups_fill(fp) <= 0)
       {
-        DEBUG_printf(("    cups_fill() returned -1, total=%d\n", (int)total));
+        DEBUG_printf(("cupsFileRead: cups_fill() returned -1, total=" CUPS_LLFMT "\n",
+                     CUPS_LLCAST total));
 
         if (total > 0)
           return ((ssize_t)total);
@@ -1281,6 +1335,9 @@ cupsFileRead(cups_file_t *fp,             /* I - CUPS file */
 
     memcpy(buf, fp->ptr, count);
     fp->ptr += count;
+    fp->pos += count;
+
+    DEBUG_printf(("cupsFileRead: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
 
    /*
     * Update the counts for the last read...
@@ -1295,7 +1352,7 @@ cupsFileRead(cups_file_t *fp,             /* I - CUPS file */
   * Return the total number of bytes read...
   */
 
-  DEBUG_printf(("    total=%d\n", (int)total));
+  DEBUG_printf(("cupsFileRead: total=%d\n", (int)total));
 
   return ((ssize_t)total);
 }
@@ -1315,6 +1372,9 @@ cupsFileRewind(cups_file_t *fp)           /* I - CUPS file */
   * Range check input...
   */
 
+  DEBUG_printf(("cupsFileRewind(fp=%p)\n", fp));
+  DEBUG_printf(("cupsFileRewind: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   if (!fp || fp->mode != 'r')
     return (-1);
 
@@ -1322,18 +1382,22 @@ cupsFileRewind(cups_file_t *fp)         /* I - CUPS file */
   * Handle special cases...
   */
 
-  if (fp->pos == 0)
+  if (fp->bufpos == 0)
   {
    /*
     * No seeking necessary...
     */
 
+    fp->pos = 0;
+
     if (fp->ptr)
     {
       fp->ptr = fp->buf;
       fp->eof = 0;
     }
 
+    DEBUG_printf(("cupsFileRewind: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
     return (0);
   }
 
@@ -1351,10 +1415,13 @@ cupsFileRewind(cups_file_t *fp)         /* I - CUPS file */
 
   lseek(fp->fd, 0, SEEK_SET);
 
-  fp->pos = 0;
-  fp->ptr = NULL;
-  fp->end = NULL;
-  fp->eof = 0;
+  fp->bufpos = 0;
+  fp->pos    = 0;
+  fp->ptr    = NULL;
+  fp->end    = NULL;
+  fp->eof    = 0;
+
+  DEBUG_printf(("cupsFileRewind: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
 
   return (0);
 }
@@ -1373,9 +1440,10 @@ cupsFileSeek(cups_file_t *fp,            /* I - CUPS file */
   ssize_t      bytes;                  /* Number bytes in buffer */
 
 
-  DEBUG_printf(("cupsFileSeek(fp=%p, pos=" CUPS_LLFMT ")\n", fp, pos));
-  DEBUG_printf(("    fp->pos=" CUPS_LLFMT "\n", fp->pos));
-  DEBUG_printf(("    fp->ptr=%p, fp->end=%p\n", fp->ptr, fp->end));
+  DEBUG_printf(("cupsFileSeek(fp=%p, pos=" CUPS_LLFMT ")\n", fp,
+                CUPS_LLCAST pos));
+  DEBUG_printf(("cupsFileSeek: fp->pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+  DEBUG_printf(("cupsFileSeek: fp->ptr=%p, fp->end=%p\n", fp->ptr, fp->end));
 
  /*
   * Range check input...
@@ -1391,19 +1459,22 @@ cupsFileSeek(cups_file_t *fp,           /* I - CUPS file */
   if (pos == 0)
     return (cupsFileRewind(fp));
 
-  if (fp->pos == pos)
+  if (fp->ptr)
   {
-   /*
-    * No seeking necessary...
-    */
+    bytes = (ssize_t)(fp->end - fp->buf);
 
-    if (fp->ptr)
+    if (pos >= fp->bufpos && pos < (fp->bufpos + bytes))
     {
-      fp->ptr = fp->buf;
+     /*
+      * No seeking necessary...
+      */
+
+      fp->pos = pos;
+      fp->ptr = fp->buf + pos - fp->bufpos;
       fp->eof = 0;
-    }
 
-    return (pos);
+      return (pos);
+    }
   }
 
 #ifdef HAVE_LIBZ
@@ -1419,26 +1490,20 @@ cupsFileSeek(cups_file_t *fp,           /* I - CUPS file */
 #endif /* HAVE_LIBZ */
 
  /*
-  * Figure out the number of bytes in the current buffer, and then
-  * see if we are outside of it...
+  * Seek forwards or backwards...
   */
 
-  if (fp->ptr)
-    bytes = (ssize_t)(fp->end - fp->buf);
-  else
-    bytes = 0;
-
   fp->eof = 0;
 
-  DEBUG_printf(("    bytes=" CUPS_LLFMT "\n", CUPS_LLCAST bytes));
+  DEBUG_printf(("cupsFileSeek: bytes=" CUPS_LLFMT "\n", CUPS_LLCAST bytes));
 
-  if (pos < fp->pos)
+  if (pos < fp->bufpos)
   {
    /*
     * Need to seek backwards...
     */
 
-    DEBUG_puts("    SEEK BACKWARDS");
+    DEBUG_puts("cupsFileSeek: SEEK BACKWARDS");
 
 #ifdef HAVE_LIBZ
     if (fp->compressed)
@@ -1446,72 +1511,70 @@ cupsFileSeek(cups_file_t *fp,           /* I - CUPS file */
       inflateEnd(&fp->stream);
 
       lseek(fp->fd, 0, SEEK_SET);
-      fp->pos = 0;
-      fp->ptr = NULL;
-      fp->end = NULL;
+      fp->bufpos = 0;
+      fp->pos    = 0;
+      fp->ptr    = NULL;
+      fp->end    = NULL;
 
       while ((bytes = cups_fill(fp)) > 0)
-        if (pos >= fp->pos && pos < (fp->pos + bytes))
+        if (pos >= fp->bufpos && pos < (fp->bufpos + bytes))
          break;
 
       if (bytes <= 0)
         return (-1);
 
-      fp->ptr = fp->buf + pos - fp->pos;
+      fp->ptr = fp->buf + pos - fp->bufpos;
+      fp->pos = pos;
     }
     else
 #endif /* HAVE_LIBZ */
     {
-      fp->pos = lseek(fp->fd, pos, SEEK_SET);
-      fp->ptr = NULL;
-      fp->end = NULL;
+      fp->bufpos = lseek(fp->fd, pos, SEEK_SET);
+      fp->pos    = fp->bufpos;
+      fp->ptr    = NULL;
+      fp->end    = NULL;
 
-      DEBUG_printf(("    lseek() returned %ld...\n", (long)fp->pos));
+      DEBUG_printf(("cupsFileSeek: lseek() returned " CUPS_LLFMT "...\n",
+                    CUPS_LLCAST fp->pos));
     }
   }
-  else if (pos >= (fp->pos + bytes))
+  else
   {
    /*
     * Need to seek forwards...
     */
 
-    DEBUG_puts("    SEEK FORWARDS");
+    DEBUG_puts("cupsFileSeek: SEEK FORWARDS");
 
 #ifdef HAVE_LIBZ
     if (fp->compressed)
     {
       while ((bytes = cups_fill(fp)) > 0)
       {
-        if (pos >= fp->pos && pos < (fp->pos + bytes))
+        if (pos >= fp->bufpos && pos < (fp->bufpos + bytes))
          break;
       }
 
       if (bytes <= 0)
         return (-1);
 
-      fp->ptr = fp->buf + pos - fp->pos;
+      fp->ptr = fp->buf + pos - fp->bufpos;
+      fp->pos = pos;
     }
     else
 #endif /* HAVE_LIBZ */
     {
-      fp->pos = lseek(fp->fd, pos, SEEK_SET);
-      fp->ptr = NULL;
-      fp->end = NULL;
+      fp->bufpos = lseek(fp->fd, pos, SEEK_SET);
+      fp->pos    = fp->bufpos;
+      fp->ptr    = NULL;
+      fp->end    = NULL;
 
-      DEBUG_printf(("    lseek() returned " CUPS_LLFMT "...\n", fp->pos));
+      DEBUG_printf(("cupsFileSeek: lseek() returned " CUPS_LLFMT "...\n",
+                    CUPS_LLCAST fp->pos));
     }
   }
-  else
-  {
-   /*
-    * Just reposition the current pointer, since we have the right
-    * range...
-    */
 
-    DEBUG_puts("    SEEK INSIDE BUFFER");
-
-    fp->ptr = fp->buf + pos - fp->pos;
-  }
+  DEBUG_printf(("cupsFileSeek: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
 
   return (fp->pos);
 }
@@ -1628,6 +1691,9 @@ cupsFileStdout(void)
 off_t                                  /* O - File position */
 cupsFileTell(cups_file_t *fp)          /* I - CUPS file */
 {
+  DEBUG_printf(("cupsFileTell(fp=%p)\n", fp));
+  DEBUG_printf(("cupsFileTell: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   return (fp ? fp->pos : 0);
 }
 
@@ -1645,6 +1711,8 @@ cupsFileUnlock(cups_file_t *fp)           /* I - CUPS file */
   * Range check...
   */
 
+  DEBUG_printf(("cupsFileUnlock(fp=%p)\n", fp));
+
   if (!fp || fp->mode == 's')
     return (-1);
 
@@ -1675,6 +1743,9 @@ cupsFileWrite(cups_file_t *fp,            /* I - CUPS file */
   * Range check input...
   */
 
+  DEBUG_printf(("cupsFileWrite(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")\n",
+                fp, buf, CUPS_LLCAST bytes));
+
   if (!fp || !buf || bytes < 0 || (fp->mode != 'w' && fp->mode != 's'))
     return (-1);
 
@@ -1692,6 +1763,8 @@ cupsFileWrite(cups_file_t *fp,            /* I - CUPS file */
 
     fp->pos += (off_t)bytes;
 
+    DEBUG_printf(("cupsFileWrite: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
     return ((ssize_t)bytes);
   }
 
@@ -1701,6 +1774,8 @@ cupsFileWrite(cups_file_t *fp,            /* I - CUPS file */
 
   fp->pos += (off_t)bytes;
 
+  DEBUG_printf(("cupsFileWrite: pos=" CUPS_LLFMT "\n", CUPS_LLCAST fp->pos));
+
   if (bytes > sizeof(fp->buf))
   {
 #ifdef HAVE_LIBZ
@@ -1729,8 +1804,8 @@ cups_compress(cups_file_t *fp,            /* I - CUPS file */
               const char  *buf,                /* I - Buffer */
              size_t      bytes)        /* I - Number bytes */
 {
-  DEBUG_printf(("cups_compress(fp=%p, buf=%p, bytes=%ld)\n", fp, buf,
-                (long)bytes));
+  DEBUG_printf(("cups_compress(fp=%p, buf=%p, bytes=" CUPS_LLFMT "\n", fp, buf,
+                CUPS_LLCAST bytes));
 
  /*
   * Update the CRC...
@@ -1751,8 +1826,8 @@ cups_compress(cups_file_t *fp,            /* I - CUPS file */
     * Flush the current buffer...
     */
 
-    DEBUG_printf(("    avail_in=%d, avail_out=%d\n", fp->stream.avail_in,
-                  fp->stream.avail_out));
+    DEBUG_printf(("cups_compress: avail_in=%d, avail_out=%d\n",
+                  fp->stream.avail_in, fp->stream.avail_out));
 
     if (fp->stream.avail_out < (int)(sizeof(fp->cbuf) / 8))
     {
@@ -1787,19 +1862,15 @@ cups_fill(cups_file_t *fp)              /* I - CUPS file */
 
 
   DEBUG_printf(("cups_fill(fp=%p)\n", fp));
-  DEBUG_printf(("    fp->ptr=%p, fp->end=%p, fp->buf=%p, "
-                "fp->pos=" CUPS_LLFMT ", fp->eof=%d\n",
-                fp->ptr, fp->end, fp->buf, fp->pos, fp->eof));
-
- /*
-  * Update the "pos" element as needed...
-  */
+  DEBUG_printf(("cups_fill: fp->ptr=%p, fp->end=%p, fp->buf=%p, "
+                "fp->bufpos=" CUPS_LLFMT ", fp->eof=%d\n",
+                fp->ptr, fp->end, fp->buf, CUPS_LLCAST fp->bufpos, fp->eof));
 
   if (fp->ptr && fp->end)
-    fp->pos += (off_t)(fp->end - fp->buf);
+    fp->bufpos += fp->end - fp->ptr;
 
 #ifdef HAVE_LIBZ
-  DEBUG_printf(("    fp->compressed=%d\n", fp->compressed));
+  DEBUG_printf(("cups_fill: fp->compressed=%d\n", fp->compressed));
 
   while (!fp->ptr || fp->compressed)
   {
@@ -1827,7 +1898,7 @@ cups_fill(cups_file_t *fp)                /* I - CUPS file */
        * Can't read from file!
        */
 
-        DEBUG_printf(("    cups_read() returned " CUPS_LLFMT "!\n",
+        DEBUG_printf(("cups_fill: cups_read() returned " CUPS_LLFMT "!\n",
                      CUPS_LLCAST bytes));
 
        return (-1);
@@ -2107,6 +2178,9 @@ cups_read(cups_file_t *fp,                /* I - CUPS file */
   ssize_t      total;                  /* Total bytes read */
 
 
+  DEBUG_printf(("cups_read(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")\n", fp, buf,
+                CUPS_LLCAST bytes));
+
  /*
   * Loop until we read at least 0 bytes...
   */
@@ -2125,6 +2199,8 @@ cups_read(cups_file_t *fp,                /* I - CUPS file */
       total = read(fp->fd, buf, bytes);
 #endif /* WIN32 */
 
+    DEBUG_printf(("cups_read: total=" CUPS_LLFMT "\n", CUPS_LLCAST total));
+
     if (total >= 0)
       break;
 
@@ -2159,8 +2235,8 @@ cups_write(cups_file_t *fp,               /* I - CUPS file */
   ssize_t      count;                  /* Count this time */
 
 
-  DEBUG_printf(("cups_write(fp=%p, buf=%p, bytes=%ld)\n", fp, buf,
-                (long)bytes));
+  DEBUG_printf(("cups_write(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")\n", fp, buf,
+                CUPS_LLCAST bytes));
 
  /*
   * Loop until all bytes are written...
@@ -2181,6 +2257,8 @@ cups_write(cups_file_t *fp,               /* I - CUPS file */
       count = write(fp->fd, buf, bytes);
 #endif /* WIN32 */
 
+    DEBUG_printf(("cups_write: count=" CUPS_LLFMT "\n", CUPS_LLCAST count));
+
     if (count < 0)
     {
      /*
@@ -2193,8 +2271,6 @@ cups_write(cups_file_t *fp,               /* I - CUPS file */
         return (-1);
     }
 
-    DEBUG_printf(("    count=%ld\n", (long)count));
-
    /*
     * Update the counts for the last write call...
     */
index f098b5cad1a06ff186a3db193600e9893798418c..15a79760e6b535c986233b9df4a52ef2da650734 100644 (file)
@@ -41,6 +41,7 @@
  * Local functions...
  */
 
+static int     random_tests(void);
 static int     read_write_tests(int compression);
 
 
@@ -76,6 +77,12 @@ main(int  argc,                              /* I - Number of command-line arguments */
     status += read_write_tests(1);
 #endif /* HAVE_LIBZ */
 
+   /*
+    * Do uncompressed random I/O tests...
+    */
+
+    status = random_tests();
+
    /*
     * Test fdopen and close without reading...
     */
@@ -83,7 +90,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
     pipe(fds);
     close(fds[1]);
 
-    fputs("cupsFileOpenFd(fd, \"r\"): ", stdout);
+    fputs("\ncupsFileOpenFd(fd, \"r\"): ", stdout);
     fflush(stdout);
 
     if ((fdfile = cupsFileOpenFd(fds[0], "r")) == NULL)
@@ -114,7 +121,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
     * Test path functions...
     */
 
-    fputs("cupsFileFind: ", stdout);
+    fputs("\ncupsFileFind: ", stdout);
 #ifdef WIN32
     if (cupsFileFind("notepad.exe", "C:/WINDOWS", 1, filename, sizeof(filename)) &&
        cupsFileFind("notepad.exe", "C:/WINDOWS;C:/WINDOWS/SYSTEM32", 1, filename, sizeof(filename)))
@@ -171,6 +178,190 @@ main(int  argc,                           /* I - Number of command-line arguments */
 }
 
 
+/*
+ * 'random_tests()' - Do random access tests.
+ */
+
+static int                             /* O - Status */
+random_tests(void)
+{
+  int          status,                 /* Status of tests */
+               pass,                   /* Current pass */
+               count,                  /* Number of records read */
+               record,                 /* Current record */
+               num_records;            /* Number of records */
+  ssize_t      pos,                    /* Position in file */
+               expected;               /* Expected position in file */
+  cups_file_t  *fp;                    /* File */
+  char         buffer[512];            /* Data buffer */
+
+
+ /*
+  * Run 4 passes, each time appending to a data file and then reopening the
+  * file for reading to validate random records in the file.
+  */
+
+  for (status = 0, pass = 0; pass < 4; pass ++)
+  {
+   /*
+    * cupsFileOpen(append)
+    */
+
+    printf("\ncupsFileOpen(append %d): ", pass);
+
+    if ((fp = cupsFileOpen("testfile.dat", "a")) == NULL)
+    {
+      printf("FAIL (%s)\n", strerror(errno));
+      status ++;
+      break;
+    }
+    else
+      puts("PASS");
+
+   /*
+    * cupsFileTell()
+    */
+
+    expected = 256 * sizeof(buffer) * pass;
+
+    fputs("cupsFileTell(): ", stdout);
+    if ((pos = cupsFileTell(fp)) != expected)
+    {
+      printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
+            CUPS_LLCAST pos, CUPS_LLCAST expected);
+      status ++;
+      break;
+    }
+    else
+      puts("PASS");
+
+   /*
+    * cupsFileWrite()
+    */
+
+    fputs("cupsFileWrite(256 512-byte records): ", stdout);
+    for (record = 0; record < 256; record ++)
+    {
+      memset(buffer, record, sizeof(buffer));
+      if (cupsFileWrite(fp, buffer, sizeof(buffer)) < sizeof(buffer))
+        break;
+    }
+
+    if (record < 256)
+    {
+      printf("FAIL (%d: %s)\n", record, strerror(errno));
+      status ++;
+      break;
+    }
+    else
+      puts("PASS");
+
+   /*
+    * cupsFileTell()
+    */
+
+    expected += 256 * sizeof(buffer);
+
+    fputs("cupsFileTell(): ", stdout);
+    if ((pos = cupsFileTell(fp)) != expected)
+    {
+      printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
+             CUPS_LLCAST pos, CUPS_LLCAST expected);
+      status ++;
+      break;
+    }
+    else
+      puts("PASS");
+
+    cupsFileClose(fp);
+
+   /*
+    * cupsFileOpen(read)
+    */
+
+    printf("\ncupsFileOpen(read %d): ", pass);
+
+    if ((fp = cupsFileOpen("testfile.dat", "r")) == NULL)
+    {
+      printf("FAIL (%s)\n", strerror(errno));
+      status ++;
+      break;
+    }
+    else
+      puts("PASS");
+
+   /*
+    * cupsFileSeek, cupsFileRead
+    */
+
+    fputs("cupsFileSeek(), cupsFileRead(): ", stdout);
+
+    for (num_records = (pass + 1) * 256, count = (pass + 1) * 256,
+             record = rand() % num_records;
+         count > 0;
+        count --, record = (record + (rand() & 31) - 16 + num_records) %
+                           num_records)
+    {
+     /*
+      * The last record is always the first...
+      */
+
+      if (count == 1)
+        record = 0;
+
+     /*
+      * Try reading the data for the specified record, and validate the
+      * contents...
+      */
+
+      expected = sizeof(buffer) * record;
+
+      if ((pos = cupsFileSeek(fp, expected)) != expected)
+      {
+        printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
+              CUPS_LLCAST pos, CUPS_LLCAST expected);
+        status ++;
+       break;
+      }
+      else
+      {
+       if (cupsFileRead(fp, buffer, sizeof(buffer)) != sizeof(buffer))
+       {
+         printf("FAIL (%s)\n", strerror(errno));
+         status ++;
+         break;
+       }
+       else if ((buffer[0] & 255) != (record & 255) ||
+                memcmp(buffer, buffer + 1, sizeof(buffer) - 1))
+       {
+         printf("FAIL (Bad Data - %d instead of %d)\n", buffer[0] & 255,
+                record & 255);
+         status ++;
+         break;
+       }
+      }
+    }
+
+    if (count == 0)
+      puts("PASS");
+
+    cupsFileClose(fp);
+  }
+
+ /*
+  * Remove the test file...
+  */
+
+  unlink("testfile.dat");
+                    
+ /*
+  * Return the test status...
+  */
+
+  return (status);
+}
+
+
 /*
  * 'read_write_tests()' - Perform read/write tests.
  */
@@ -179,7 +370,7 @@ static int                          /* O - Status */
 read_write_tests(int compression)      /* I - Use compression? */
 {
   int          i;                      /* Looping var */
-  cups_file_t  *fp;                    /* First file */
+  cups_file_t  *fp;                    /* File */
   int          status;                 /* Exit status */
   char         line[1024],             /* Line from file */
                *value;                 /* Directive value from line */
@@ -539,6 +730,12 @@ read_write_tests(int compression)  /* I - Use compression? */
     status ++;
   }
 
+ /*
+  * Remove the test file...
+  */
+
+  unlink(compression ? "testfile.dat.gz" : "testfile.dat");
+                    
  /*
   * Return the test status...
   */