about summary refs log tree commit homepage
path: root/mgmt_fn.c
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2012-03-26 09:07:36 +0000
committerEric Wong <normalperson@yhbt.net>2012-03-26 09:30:55 +0000
commitebe4812faf8e7a8f33b677e3b618e5b1bbe987b2 (patch)
treec4afa70cc2d92d3d985a6bba0757201e703d2556 /mgmt_fn.c
parent10c75b0d61b7f57b9b00b7fd811c77d60a131540 (diff)
downloadcmogstored-ebe4812faf8e7a8f33b677e3b618e5b1bbe987b2.tar.gz
SHA-1 performance is acceptable on modern systems nowadays, and
some users may have existing SHA-1 checksums from existing
systems (e.g. git) that make it possible to import existing
checksums into the database.
Diffstat (limited to 'mgmt_fn.c')
-rw-r--r--mgmt_fn.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/mgmt_fn.c b/mgmt_fn.c
index 9cee2a0..db0c4f7 100644
--- a/mgmt_fn.c
+++ b/mgmt_fn.c
@@ -48,11 +48,20 @@ void mog_mgmt_fn_digest(struct mog_mgmt *mgmt, char *buf)
 
                 mog_fadv_noreuse(mgmt->forward->fd, 0, 0 /* ALL */);
                 mog_fadv_sequential(mgmt->forward->fd, 0, 0 /* ALL */);
-                mog_digest_init(&file->digest, GC_MD5);
+                mog_digest_init(&file->digest, mgmt->alg);
                 file->pathlen = iov[0].iov_len;
                 file->path = path;
         } else {
-                IOV_STR(&iov[1], " MD5=-1\r\n");
+                switch (mgmt->alg) {
+                case GC_MD5:
+                        IOV_STR(&iov[1], " MD5=-1\r\n");
+                        break;
+                case GC_SHA1:
+                        IOV_STR(&iov[1], " SHA-1=-1\r\n");
+                        break;
+                default:
+                        die("BUG: unhandled algorithm: %d\n", mgmt->alg);
+                }
                 mog_mgmt_writev(mgmt, iov, 2);
                 free(path);
         }
@@ -60,7 +69,6 @@ void mog_mgmt_fn_digest(struct mog_mgmt *mgmt, char *buf)
 
 /* finishes the MD5 request */
 #define CLEN(s) (sizeof(s)-1)
-#define PFX " MD5="
 
 void mog_mgmt_fn_digest_err(struct mog_mgmt *mgmt)
 {
@@ -85,21 +93,35 @@ void mog_mgmt_fn_digest_err(struct mog_mgmt *mgmt)
 void mog_mgmt_fn_digest_emit(struct mog_mgmt *mgmt)
 {
         struct iovec iov[2];
-        char buf[CLEN(PFX) + 32 + CLEN("\r\n")];
-        char *b;
+        char buf[CLEN(" SHA-1=") + 40 + CLEN("\r\n")];
+        char *b = buf;
         struct mog_fd *mfd = mgmt->forward;
         struct mog_file *file = &mfd->as.file;
+        size_t len;
 
         iov[0].iov_base = file->path;
         iov[0].iov_len = file->pathlen;
 
-        iov[1].iov_base = buf;
-        iov[1].iov_len = sizeof(buf);
+        /* ugh, clean this up... */
+        switch (mgmt->alg) {
+        case GC_MD5:
+                b = mempcpy(b, " MD5=", CLEN(" MD5="));
+                len = 32;
+                iov[1].iov_len = CLEN(" MD5=") + 32 + CLEN("\r\n");
+                break;
+        case GC_SHA1:
+                b = mempcpy(b, " SHA-1=", CLEN(" SHA-1="));
+                len = 40;
+                iov[1].iov_len = sizeof(buf);
+                break;
+        default:
+                die("BUG: unhandled algorithm: %d\n", mgmt->alg);
+        }
 
-        b = mempcpy(buf, PFX, CLEN(PFX));
-        mog_digest_hex(&file->digest, b, 32);
-        b[32] = '\r';
-        b[33] = '\n';
+        mog_digest_hex(&file->digest, b, len);
+        b[len] = '\r';
+        b[len + 1] = '\n';
+        iov[1].iov_base = buf;
         mog_mgmt_writev(mgmt, iov, 2);
 }