Add URI-style escaping of filename characters.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Sat, 21 Apr 2007 18:05:28 +0000 (11:05 -0700)
committerMichael Vrable <mvrable@turin.ucsd.edu>
Sat, 21 Apr 2007 18:05:28 +0000 (11:05 -0700)
Makefile
format.cc [new file with mode: 0644]
format.h [new file with mode: 0644]
scandir.cc
tarstore.cc

index eb83a3d..b71e37b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ CXXFLAGS=-O -Wall -D_FILE_OFFSET_BITS=64 -g -pg \
         `pkg-config --cflags $(PACKAGES)`
 LDFLAGS=-g -pg -ltar `pkg-config --libs $(PACKAGES)`
 
-SRCS=scandir.cc sha1.cc store.cc tarstore.cc
+SRCS=format.cc scandir.cc sha1.cc store.cc tarstore.cc
 OBJS=$(SRCS:.cc=.o)
 
 scandir : $(OBJS)
diff --git a/format.cc b/format.cc
new file mode 100644 (file)
index 0000000..e6e11bc
--- /dev/null
+++ b/format.cc
@@ -0,0 +1,36 @@
+/* LBS: An LFS-inspired filesystem backup system
+ * Copyright (C) 2007  Michael Vrable
+ *
+ * Utility functions for converting various datatypes to text format (and
+ * later, for parsing them back, perhaps).
+ */
+
+#include <stdio.h>
+#include <uuid/uuid.h>
+
+#include <string>
+#include <sstream>
+
+using std::string;
+
+/* Perform URI-style escaping of a string.  Bytes which cannot be represented
+ * directly are encoded in the form %xx (where "xx" is a string of two
+ * hexadecimal digits). */
+string uri_encode(const string &in)
+{
+    string out;
+
+    for (size_t i = 0; i < in.length(); i++) {
+        unsigned char c = in[i];
+
+        if (c > '%' && c <= 0x7f) {
+            out += c;
+        } else {
+            char buf[4];
+            sprintf(buf, "%%%02x", c);
+            out += buf;
+        }
+    }
+
+    return out;
+}
diff --git a/format.h b/format.h
new file mode 100644 (file)
index 0000000..6e6784b
--- /dev/null
+++ b/format.h
@@ -0,0 +1,15 @@
+/* LBS: An LFS-inspired filesystem backup system
+ * Copyright (C) 2006  Michael Vrable
+ *
+ * Utility functions for converting various datatypes to text format (and
+ * later, for parsing them back, perhaps).
+ */
+
+#ifndef _LBS_FORMAT_H
+#define _LBS_FORMAT_H
+
+#include <string>
+
+std::string uri_encode(const std::string &in);
+
+#endif // _LBS_TARSTORE_H
index 2559dc1..c1bedeb 100644 (file)
@@ -16,6 +16,7 @@
 #include <iostream>
 #include <sstream>
 
+#include "format.h"
 #include "store.h"
 #include "tarstore.h"
 #include "sha1.h"
@@ -140,7 +141,7 @@ void scanfile(const string& path, ostream &metadata)
 
     printf("%s\n", path.c_str());
 
-    metadata << "name: " << path << "\n";
+    metadata << "name: " << uri_encode(path) << "\n";
     metadata << "mode: " << (stat_buf.st_mode & 07777) << "\n";
     metadata << "atime: " << stat_buf.st_atime << "\n";
     metadata << "ctime: " << stat_buf.st_ctime << "\n";
index 2c2f523..6511074 100644 (file)
@@ -1,5 +1,5 @@
 /* LBS: An LFS-inspired filesystem backup system
- * Copyright (C) 2006  Michael Vrable
+ * Copyright (C) 2007  Michael Vrable
  *
  * Backup data is stored in a collection of objects, which are grouped together
  * into segments for storage purposes.  This implementation of the object store