]> sjero.net Git - wget/commitdiff
vms: support --backups
authorSteven M. Schweda <sms@antinode.info>
Mon, 8 Jul 2013 21:23:51 +0000 (23:23 +0200)
committerGiuseppe Scrivano <gscrivano@gnu.org>
Sat, 13 Jul 2013 11:36:54 +0000 (13:36 +0200)
src/ChangeLog
src/retr.c

index e11af614aa65dcc039dde1a52148d5c20e90ed27..90d8637701e3261b6cfa954ee4d01f5a40be471f 100644 (file)
@@ -1,3 +1,7 @@
+2013-07-08  Steven M. Schweda <sms@antinode.info>
+
+       * retr.c (rotate_backups): Support for VMS files.
+
 2013-07-12  Giuseppe Scrivano  <gscrivano@gnu.org>
 
        * http.c (digest_authentication_encode): Set default value of
 2013-07-12  Giuseppe Scrivano  <gscrivano@gnu.org>
 
        * http.c (digest_authentication_encode): Set default value of
index 3d51ef9315d5355c7750e5b287d4b655b3c51810..683c8117fcb131c71eb9f2b9d1732e4847a2ac6c 100644 (file)
@@ -37,6 +37,9 @@ as that of the covered work.  */
 #include <errno.h>
 #include <string.h>
 #include <assert.h>
 #include <errno.h>
 #include <string.h>
 #include <assert.h>
+#ifdef VMS
+# include <unixio.h>            /* For delete(). */
+#endif
 
 #include "exits.h"
 #include "utils.h"
 
 #include "exits.h"
 #include "utils.h"
@@ -1182,7 +1185,16 @@ free_urlpos (struct urlpos *l)
 void
 rotate_backups(const char *fname)
 {
 void
 rotate_backups(const char *fname)
 {
-  int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
+#ifdef __VMS
+# define SEP "_"
+# define AVS ";*"                       /* All-version suffix. */
+# define AVSL (sizeof (AVS) - 1)
+#else
+# define SEP "."
+# define AVSL 0
+#endif
+
+  int maxlen = strlen (fname) + sizeof (SEP) + numdigit (opt.backups) + AVSL;
   char *from = (char *)alloca (maxlen);
   char *to = (char *)alloca (maxlen);
   struct_stat sb;
   char *from = (char *)alloca (maxlen);
   char *to = (char *)alloca (maxlen);
   struct_stat sb;
@@ -1194,12 +1206,24 @@ rotate_backups(const char *fname)
 
   for (i = opt.backups; i > 1; i--)
     {
 
   for (i = opt.backups; i > 1; i--)
     {
-      sprintf (from, "%s.%d", fname, i - 1);
-      sprintf (to, "%s.%d", fname, i);
+#ifdef VMS
+      /* Delete (all versions of) any existing max-suffix file, to avoid
+       * creating multiple versions of it.  (On VMS, rename() will
+       * create a new version of an existing destination file, not
+       * destroy/overwrite it.)
+       */
+      if (i == opt.backups)
+        {
+          sprintf (to, "%s%s%d%s", fname, SEP, i, AVS);
+          delete (to);
+        }
+#endif
+      sprintf (to, "%s%s%d", fname, SEP, i);
+      sprintf (from, "%s%s%d", fname, SEP, i - 1);
       rename (from, to);
     }
 
       rename (from, to);
     }
 
-  sprintf (to, "%s.%d", fname, 1);
+  sprintf (to, "%s%s%d", fname, SEP, 1);
   rename(fname, to);
 }
 
   rename(fname, to);
 }