w32: Fix build problem with dirmngr.
[gnupg.git] / common / dotlock.c
index 58a3d0f..c5520db 100644 (file)
@@ -52,7 +52,7 @@
  *    products derived from this software without specific prior
  *    written permission.
  *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 
 #ifdef GNUPG_MAJOR_VERSION
 # include "libjnlib-config.h"
+# include "stringhelp.h"  /* For stpcpy and w32_strerror. */
 #endif
 #ifdef HAVE_W32CE_SYSTEM
 # include "utf8conv.h"  /* WindowsCE requires filename conversion.  */
@@ -497,7 +498,7 @@ read_lockfile (dotlock_t h, int *same_node )
   if ( (fd = open (h->lockname, O_RDONLY)) == -1 )
     {
       int e = errno;
-      my_info_2 ("error opening lockfile `%s': %s\n",
+      my_info_2 ("error opening lockfile '%s': %s\n",
                  h->lockname, strerror(errno) );
       if (buffer != buffer_space)
         jnlib_free (buffer);
@@ -514,7 +515,7 @@ read_lockfile (dotlock_t h, int *same_node )
         continue;
       if (res < 0)
         {
-          my_info_1 ("error reading lockfile `%s'\n", h->lockname );
+          my_info_1 ("error reading lockfile '%s'\n", h->lockname );
           close (fd);
           if (buffer != buffer_space)
             jnlib_free (buffer);
@@ -529,7 +530,7 @@ read_lockfile (dotlock_t h, int *same_node )
 
   if (nread < 11)
     {
-      my_info_1 ("invalid size of lockfile `%s'\n", h->lockname);
+      my_info_1 ("invalid size of lockfile '%s'\n", h->lockname);
       if (buffer != buffer_space)
         jnlib_free (buffer);
       jnlib_set_errno (0); /* Better don't return an inappropriate ERRNO. */
@@ -540,7 +541,7 @@ read_lockfile (dotlock_t h, int *same_node )
       || (buffer[10] = 0, pid = atoi (buffer)) == -1
       || !pid )
     {
-      my_error_2 ("invalid pid %d in lockfile `%s'\n", pid, h->lockname);
+      my_error_2 ("invalid pid %d in lockfile '%s'\n", pid, h->lockname);
       if (buffer != buffer_space)
         jnlib_free (buffer);
       jnlib_set_errno (0);
@@ -583,21 +584,17 @@ use_hardlinks_p (const char *tname)
   strcpy (lname, tname);
   strcat (lname, "x");
 
-  res = link (tname, lname);
-  if (res < 0)
-    res = -1;
-  else
-    {
-      if (stat (tname, &sb))
-       res = -1;  /* Ooops.  */
-      else if (sb.st_nlink == nlink + 1)
-       res = 0;   /* Yeah, hardlinks are supported.  */
-      else
-       res = 1;   /* No hardlink support.  */
+  /* We ignore the return value of link() because it is unreliable.  */
+  (void) link (tname, lname);
 
-      unlink (lname);
-    }
+  if (stat (tname, &sb))
+    res = -1;  /* Ooops.  */
+  else if (sb.st_nlink == nlink + 1)
+    res = 0;   /* Yeah, hardlinks are supported.  */
+  else
+    res = 1;   /* No hardlink support.  */
 
+  unlink (lname);
   jnlib_free (lname);
   return res;
 }
@@ -670,7 +667,7 @@ dotlock_create_unix (dotlock_t h, const char *file_to_lock)
     {
       all_lockfiles = h->next;
       UNLOCK_all_lockfiles ();
-      my_error_2 (_("failed to create temporary file `%s': %s\n"),
+      my_error_2 (_("failed to create temporary file '%s': %s\n"),
                   h->tname, strerror(errno));
       jnlib_free (h->tname);
       jnlib_free (h);
@@ -695,7 +692,7 @@ dotlock_create_unix (dotlock_t h, const char *file_to_lock)
       h->use_o_excl = 1;
       break;
     default:
-      my_error_2 ("can't check whether hardlinks are supported for `%s': %s\n",
+      my_error_2 ("can't check whether hardlinks are supported for '%s': %s\n",
                   h->tname, strerror(errno));
       goto write_failed;
     }
@@ -713,14 +710,14 @@ dotlock_create_unix (dotlock_t h, const char *file_to_lock)
   strcpy (stpcpy (h->lockname, file_to_lock), EXTSEP_S "lock");
   UNLOCK_all_lockfiles ();
   if (h->use_o_excl)
-    my_debug_1 ("locking for `%s' done via O_EXCL\n", h->lockname);
+    my_debug_1 ("locking for '%s' done via O_EXCL\n", h->lockname);
 
   return h;
 
  write_failed:
   all_lockfiles = h->next;
   UNLOCK_all_lockfiles ();
-  my_error_2 (_("error writing to `%s': %s\n"), h->tname, strerror (errno));
+  my_error_2 (_("error writing to '%s': %s\n"), h->tname, strerror (errno));
   close (fd);
   unlink (h->tname);
   jnlib_free (h->tname);
@@ -784,7 +781,7 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock)
     {
       all_lockfiles = h->next;
       UNLOCK_all_lockfiles ();
-      my_error_2 (_("can't create `%s': %s\n"), h->lockname, w32_strerror (-1));
+      my_error_2 (_("can't create '%s': %s\n"), h->lockname, w32_strerror (-1));
       jnlib_free (h->lockname);
       jnlib_free (h);
       return NULL;
@@ -953,7 +950,6 @@ dotlock_destroy (dotlock_t h)
 static int
 dotlock_take_unix (dotlock_t h, long timeout)
 {
-  int res;
   int wtime = 0;
   int sumtime = 0;
   int pid;
@@ -980,7 +976,7 @@ dotlock_take_unix (dotlock_t h, long timeout)
         ; /* Lock held by another process.  */
       else if (fd == -1)
         {
-          my_error_2 ("lock not made: open(O_EXCL) of `%s' failed: %s\n",
+          my_error_2 ("lock not made: open(O_EXCL) of '%s' failed: %s\n",
                       h->lockname, strerror (errno));
           return -1;
         }
@@ -999,7 +995,7 @@ dotlock_take_unix (dotlock_t h, long timeout)
               return 0;
             }
           /* Write error.  */
-          my_error_2 ("lock not made: writing to `%s' failed: %s\n",
+          my_error_2 ("lock not made: writing to '%s' failed: %s\n",
                       h->lockname, strerror (errno));
           close (fd);
           unlink (h->lockname);
@@ -1010,13 +1006,8 @@ dotlock_take_unix (dotlock_t h, long timeout)
     {
       struct stat sb;
 
-      res = link (h->tname, h->lockname);
-      if (res < 0)
-       {
-          my_error_1 ("lock not made: Oops: link of tmp file failed: %s\n",
-                      strerror (errno));
-         return -1;
-       }
+      /* We ignore the return value of link() because it is unreliable.  */
+      (void) link (h->tname, h->lockname);
 
       if (stat (h->tname, &sb))
         {
@@ -1133,7 +1124,7 @@ dotlock_take_w32 (dotlock_t h, long timeout)
   w32err = GetLastError ();
   if (w32err != ERROR_LOCK_VIOLATION)
     {
-      my_error_2 (_("lock `%s' not made: %s\n"),
+      my_error_2 (_("lock '%s' not made: %s\n"),
                   h->lockname, w32_strerror (w32err));
       return -1;
     }
@@ -1183,7 +1174,7 @@ dotlock_take (dotlock_t h, long timeout)
 
   if ( h->locked )
     {
-      my_debug_1 ("Oops, `%s' is already locked\n", h->lockname);
+      my_debug_1 ("Oops, '%s' is already locked\n", h->lockname);
       return 0;
     }
 
@@ -1219,7 +1210,7 @@ dotlock_release_unix (dotlock_t h)
 
   if ( unlink( h->lockname ) )
     {
-      my_error_1 ("release_dotlock: error removing lockfile `%s'\n",
+      my_error_1 ("release_dotlock: error removing lockfile '%s'\n",
                   h->lockname);
       return -1;
     }
@@ -1240,7 +1231,7 @@ dotlock_release_w32 (dotlock_t h)
   memset (&ovl, 0, sizeof ovl);
   if (!UnlockFileEx (h->lockhd, 0, 1, 0, &ovl))
     {
-      my_error_2 ("release_dotlock: error removing lockfile `%s': %s\n",
+      my_error_2 ("release_dotlock: error removing lockfile '%s': %s\n",
                   h->lockname, w32_strerror (-1));
       return -1;
     }
@@ -1271,7 +1262,7 @@ dotlock_release (dotlock_t h)
 
   if ( !h->locked )
     {
-      my_debug_1 ("Oops, `%s' is not locked\n", h->lockname);
+      my_debug_1 ("Oops, '%s' is not locked\n", h->lockname);
       return 0;
     }