dedup

data deduplication program
git clone git://git.2f30.org/dedup.git
Log | Files | Refs | README | LICENSE

dinit.c (2059B)


      1 #include <sys/types.h>
      2 #include <sys/stat.h>
      3 #include <sys/file.h>
      4 
      5 #include <err.h>
      6 #include <fcntl.h>
      7 #include <stdio.h>
      8 #include <stdint.h>
      9 #include <stdlib.h>
     10 #include <string.h>
     11 #include <unistd.h>
     12 
     13 #include "arg.h"
     14 #include "blake2.h"
     15 #include "dedup.h"
     16 
     17 static struct snap_hdr snap_hdr;
     18 static struct blk_hdr blk_hdr;
     19 static int ifd;
     20 static int sfd;
     21 static int hash_algo = HASH_BLAKE2B;
     22 static int compr_algo = COMPR_LZ4;
     23 
     24 int verbose;
     25 char *argv0;
     26 
     27 static void
     28 init(void)
     29 {
     30 	int flags;
     31 
     32 	flags = O_RDWR | O_CREAT | O_EXCL;
     33 	ifd = open(SNAPSF, flags, 0600);
     34 	if (ifd < 0)
     35 		err(1, "open %s", SNAPSF);
     36 
     37 	sfd = open(STOREF, flags, 0600);
     38 	if (sfd < 0)
     39 		err(1, "open %s", STOREF);
     40 
     41 	if (flock(ifd, LOCK_NB | LOCK_EX) < 0 ||
     42 	    flock(sfd, LOCK_NB | LOCK_EX) < 0)
     43 		err(1, "flock");
     44 
     45 	init_snap_hdr(&snap_hdr);
     46 	init_blk_hdr(&blk_hdr, compr_algo, hash_algo);
     47 }
     48 
     49 static void
     50 term(void)
     51 {
     52 	xlseek(ifd, 0, SEEK_SET);
     53 	write_snap_hdr(ifd, &snap_hdr);
     54 	xlseek(sfd, 0, SEEK_SET);
     55 	write_blk_hdr(sfd, &blk_hdr);
     56 
     57 	fsync(ifd);
     58 	fsync(sfd);
     59 
     60 	close(ifd);
     61 	close(sfd);
     62 }
     63 
     64 static void
     65 usage(void)
     66 {
     67 	fprintf(stderr, "usage: %s [-v] [-H hash] [-Z compressor] [repo]\n", argv0);
     68 	exit(1);
     69 }
     70 
     71 int
     72 main(int argc, char *argv[])
     73 {
     74 	char *hash_name = NULL, *compr_name = NULL;
     75 	char *repo;
     76 
     77 	ARGBEGIN {
     78 	case 'H':
     79 		hash_name = EARGF(usage());
     80 		if (strcmp(hash_name, "?") == 0) {
     81 			hash_list(STDERR_FILENO);
     82 			return 0;
     83 		}
     84 		hash_algo = hash_name2type(hash_name);
     85 		if (hash_algo < 0)
     86 			errx(1, "unknown hash: %s", hash_name);
     87 		break;
     88 	case 'Z':
     89 		compr_name = EARGF(usage());
     90 		if (strcmp(compr_name, "?") == 0) {
     91 			compr_list(STDERR_FILENO);
     92 			return 0;
     93 		}
     94 		compr_algo = compr_name2type(compr_name);
     95 		if (compr_algo < 0)
     96 			errx(1, "unknown compressor: %s", compr_name);
     97 		break;
     98 	case 'v':
     99 		verbose++;
    100 		break;
    101 	default:
    102 		usage();
    103 	} ARGEND
    104 
    105 	switch (argc) {
    106 	case 0:
    107 		repo = ".";
    108 		break;
    109 	case 1:
    110 		repo = argv[0];
    111 		break;
    112 	default:
    113 		usage();
    114 	};
    115 
    116 	mkdir(repo, 0700);
    117 	if (chdir(repo) < 0)
    118 		err(1, "chdir: %s", repo);
    119 
    120 	init();
    121 	term();
    122 	return 0;
    123 }