(handle_iconv_error): Turn diagnostics into warnings
[gnupg.git] / util / iobuf.c
index b00188b..2cbde7f 100644 (file)
@@ -130,8 +130,28 @@ static int special_names_enabled;
 static int underflow(IOBUF a);
 static int translate_file_handle ( int fd, int for_write );
 
+
+\f
 #ifndef FILE_FILTER_USES_STDIO
 
+/* This is a replacement for strcmp.  Under W32 it does not
+   distinguish between backslash and slash.  */
+static int
+fd_cache_strcmp (const char *a, const char *b)
+{
+#ifdef HAVE_DOSISH_SYSTEM
+  for (; *a && *b; a++, b++)
+    {
+      if (*a != *b && !((*a == '/' && *b == '\\') 
+                        || (*a == '\\' && *b == '/')) )
+        break;
+    }
+  return *(const unsigned char *)a - *(const unsigned char *)b;
+#else
+  return strcmp (a, b);
+#endif
+}
+
 /*
  * Invalidate (i.e. close) a cached iobuf
  */
@@ -145,7 +165,7 @@ fd_cache_invalidate (const char *fname)
         log_debug ("fd_cache_invalidate (%s)\n", fname);
 
     for (cc=close_cache; cc; cc = cc->next ) {
-        if ( cc->fp != INVALID_FP && !strcmp (cc->fname, fname) ) {
+        if ( cc->fp != INVALID_FP && !fd_cache_strcmp (cc->fname, fname) ) {
             if( DBG_IOBUF )
                 log_debug ("                did (%s)\n", cc->fname);
 #ifdef HAVE_DOSISH_SYSTEM
@@ -253,7 +273,7 @@ fd_cache_close (const char *fname, FILEP_OR_FD fp)
     }
     /* try to reuse a slot */
     for (cc=close_cache; cc; cc = cc->next ) {
-        if ( cc->fp == INVALID_FP && !strcmp (cc->fname, fname) ) {
+        if ( cc->fp == INVALID_FP && !fd_cache_strcmp (cc->fname, fname) ) {
             cc->fp = fp;
             if( DBG_IOBUF )
                 log_debug ("fd_cache_close (%s) used existing slot\n", fname);
@@ -280,15 +300,15 @@ fd_cache_open (const char *fname, const char *mode)
 
     assert (fname);
     for (cc=close_cache; cc; cc = cc->next ) {
-        if ( cc->fp != INVALID_FP && !strcmp (cc->fname, fname) ) {
+        if ( cc->fp != INVALID_FP && !fd_cache_strcmp (cc->fname, fname) ) {
             FILEP_OR_FD fp = cc->fp;
             cc->fp = INVALID_FP;
             if( DBG_IOBUF )
                 log_debug ("fd_cache_open (%s) using cached fp\n", fname);
 #ifdef HAVE_DOSISH_SYSTEM
             if (SetFilePointer (fp, 0, NULL, FILE_BEGIN) == 0xffffffff ) {
-                log_error ("rewind file failed on handle %p: ec=%d\n",
-                           fp, (int)GetLastError () );
+                log_error ("rewind file failed on handle %p: %s\n",
+                           fp, w32_strerror (errno));
                 fp = INVALID_FP;
             }
 #else
@@ -404,9 +424,9 @@ file_filter(void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len)
 
             nbytes = 0;
             if ( !ReadFile ( f, buf, size, &nread, NULL ) ) {
-                int ec = (int)GetLastError ();
-                if ( ec != ERROR_BROKEN_PIPE ) {
-                    log_error("%s: read error: ec=%d\n", a->fname, ec);
+                if ((int)GetLastError () != ERROR_BROKEN_PIPE) {
+                    log_error ("%s: read error: %s\n", a->fname,
+                               w32_strerror (0));
                     rc = G10ERR_READ_FILE;
                 }
             }
@@ -452,9 +472,9 @@ file_filter(void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len)
 
             nbytes = size;
             do {
-                if ( size && !WriteFile ( f,  p, nbytes, &n, NULL) ) {
-                    int ec = (int)GetLastError ();
-                    log_error("%s: write error: ec=%d\n", a->fname, ec);
+                if (size && !WriteFile (f,  p, nbytes, &n, NULL)) {
+                    log_error ("%s: write error: %s\n", a->fname,
+                               w32_strerror (0));
                     rc = G10ERR_WRITE_FILE;
                     break;
                 }
@@ -1005,6 +1025,16 @@ check_special_filename ( const char *fname )
     return -1;
 }
 
+/* This fucntion returns true if FNAME indicates a PIPE (stdout or
+   stderr) or a special file name if those are enabled. */
+int
+iobuf_is_pipe_filename (const char *fname)
+{
+  if (!fname || (*fname=='-' && !fname[1]) )
+    return 1;
+  return check_special_filename (fname) != -1;
+}
+
 /****************
  * Create a head iobuf for reading from a file
  * returns: NULL if an error occures and sets errno
@@ -1354,7 +1384,7 @@ iobuf_push_filter2( IOBUF a,
 /****************
  * Remove an i/o filter.
  */
-int
+static int
 pop_filter( IOBUF a, int (*f)(void *opaque, int control,
                      IOBUF chain, byte *buf, size_t *len), void *ov )
 {
@@ -1825,10 +1855,10 @@ iobuf_get_filelength( IOBUF a )
 #if defined(HAVE_DOSISH_SYSTEM) && !defined(FILE_FILTER_USES_STDIO)
             ulong size;
 
-            if ( (size=GetFileSize (fp, NULL)) != 0xffffffff ) 
+            if  ((size=GetFileSize (fp, NULL)) != 0xffffffff)
                 return size;
-            log_error ("GetFileSize for handle %p failed: ec=%d\n",
-                       fp, (int)GetLastError () );
+            log_error ("GetFileSize for handle %p failed: %s\n",
+                       fp, w32_strerror (0));
 #else
             if( !fstat(my_fileno(fp), &st) )
                return st.st_size;
@@ -1840,6 +1870,28 @@ iobuf_get_filelength( IOBUF a )
     return 0;
 }
 
+
+/* Return the file descriptor of the underlying file or -1 if it is
+   not available.  */
+int 
+iobuf_get_fd (IOBUF a)
+{
+  if (a->directfp)
+    return fileno ( (FILE*)a->directfp );
+
+  for ( ; a; a = a->chain )
+    if (!a->chain && a->filter == file_filter)
+      {
+        file_filter_ctx_t *b = a->filter_ov;
+        FILEP_OR_FD fp = b->fp;
+
+        return my_fileno (fp);
+      }
+
+  return -1;
+}
+
+
 /****************
  * Tell the file position, where the next read will take place
  */
@@ -1913,8 +1965,8 @@ iobuf_seek( IOBUF a, off_t newpos )
 #else
 #ifdef HAVE_DOSISH_SYSTEM
        if (SetFilePointer (b->fp, newpos, NULL, FILE_BEGIN) == 0xffffffff ) {
-           log_error ("SetFilePointer failed on handle %p: ec=%d\n",
-                      b->fp, (int)GetLastError () );
+           log_error ("SetFilePointer failed on handle %p: %s\n",
+                      b->fp, w32_strerror (0));
            return -1;
        }
 #else
@@ -2111,8 +2163,8 @@ translate_file_handle ( int fd, int for_write )
             x = fd;
 
         if (x == -1)
-            log_debug ("GetStdHandle(%d) failed: ec=%d\n",
-                       fd, (int)GetLastError () );
+            log_debug ("GetStdHandle(%d) failed: %s\n",
+                       fd, w32_strerror (0));
 
         fd = x;
     }