]>
Commit | Line | Data |
---|---|---|
e83c5163 LT |
1 | #ifndef CACHE_H |
2 | #define CACHE_H | |
3 | ||
4 | #include <stdio.h> | |
5 | #include <sys/stat.h> | |
6 | #include <fcntl.h> | |
7 | #include <stddef.h> | |
8 | #include <stdlib.h> | |
9 | #include <stdarg.h> | |
bf0c6e83 | 10 | #include <string.h> |
e83c5163 LT |
11 | #include <errno.h> |
12 | #include <sys/mman.h> | |
13 | ||
14 | #include <openssl/sha.h> | |
15 | #include <zlib.h> | |
16 | ||
17 | /* | |
18 | * Basic data structures for the directory cache | |
19 | * | |
20 | * NOTE NOTE NOTE! This is all in the native CPU byte format. It's | |
21 | * not even trying to be portable. It's trying to be efficient. It's | |
22 | * just a cache, after all. | |
23 | */ | |
24 | ||
25 | #define CACHE_SIGNATURE 0x44495243 /* "DIRC" */ | |
26 | struct cache_header { | |
27 | unsigned int signature; | |
28 | unsigned int version; | |
29 | unsigned int entries; | |
30 | unsigned char sha1[20]; | |
31 | }; | |
32 | ||
33 | /* | |
34 | * The "cache_time" is just the low 32 bits of the | |
35 | * time. It doesn't matter if it overflows - we only | |
36 | * check it for equality in the 32 bits we save. | |
37 | */ | |
38 | struct cache_time { | |
39 | unsigned int sec; | |
40 | unsigned int nsec; | |
41 | }; | |
42 | ||
43 | /* | |
44 | * dev/ino/uid/gid/size are also just tracked to the low 32 bits | |
45 | * Again - this is just a (very strong in practice) heuristic that | |
46 | * the inode hasn't changed. | |
47 | */ | |
48 | struct cache_entry { | |
49 | struct cache_time ctime; | |
50 | struct cache_time mtime; | |
51 | unsigned int st_dev; | |
52 | unsigned int st_ino; | |
53 | unsigned int st_mode; | |
54 | unsigned int st_uid; | |
55 | unsigned int st_gid; | |
56 | unsigned int st_size; | |
57 | unsigned char sha1[20]; | |
58 | unsigned short namelen; | |
59c1e249 | 59 | char name[0]; |
e83c5163 LT |
60 | }; |
61 | ||
62 | const char *sha1_file_directory; | |
63 | struct cache_entry **active_cache; | |
64 | unsigned int active_nr, active_alloc; | |
65 | ||
66 | #define DB_ENVIRONMENT "SHA1_FILE_DIRECTORY" | |
67 | #define DEFAULT_DB_ENVIRONMENT ".dircache/objects" | |
68 | ||
69 | #define cache_entry_size(len) ((offsetof(struct cache_entry,name) + (len) + 8) & ~7) | |
70 | #define ce_size(ce) cache_entry_size((ce)->namelen) | |
71 | ||
72 | #define alloc_nr(x) (((x)+16)*3/2) | |
73 | ||
734aab75 | 74 | /* Initialize and use the cache information */ |
e83c5163 | 75 | extern int read_cache(void); |
197ee8c9 | 76 | extern int write_cache(int newfd, struct cache_entry **cache, int entries); |
eb38c22f | 77 | extern int cache_name_pos(const char *name, int namelen); |
197ee8c9 LT |
78 | extern int add_cache_entry(struct cache_entry *ce); |
79 | extern int remove_file_from_cache(char *path); | |
734aab75 LT |
80 | extern int cache_match_stat(struct cache_entry *ce, struct stat *st); |
81 | ||
82 | #define MTIME_CHANGED 0x0001 | |
83 | #define CTIME_CHANGED 0x0002 | |
84 | #define OWNER_CHANGED 0x0004 | |
85 | #define MODE_CHANGED 0x0008 | |
86 | #define INODE_CHANGED 0x0010 | |
87 | #define DATA_CHANGED 0x0020 | |
e83c5163 LT |
88 | |
89 | /* Return a statically allocated filename matching the sha1 signature */ | |
90 | extern char *sha1_file_name(unsigned char *sha1); | |
91 | ||
92 | /* Write a memory buffer out to the sha file */ | |
93 | extern int write_sha1_buffer(unsigned char *sha1, void *buf, unsigned int size); | |
94 | ||
95 | /* Read and unpack a sha1 file into memory, write memory to a sha1 file */ | |
24778e33 | 96 | extern void * map_sha1_file(unsigned char *sha1, unsigned long *size); |
2ade9340 | 97 | extern void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned long *size); |
e83c5163 LT |
98 | extern void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size); |
99 | extern int write_sha1_file(char *buf, unsigned len); | |
24778e33 | 100 | extern int check_sha1_signature(unsigned char *sha1, void *buf, unsigned long size); |
e83c5163 LT |
101 | |
102 | /* Convert to/from hex/sha1 representation */ | |
197ee8c9 LT |
103 | extern int get_sha1_hex(const char *hex, unsigned char *sha1); |
104 | extern char *sha1_to_hex(const unsigned char *sha1); /* static buffer result! */ | |
e83c5163 LT |
105 | |
106 | /* General helper functions */ | |
107 | extern void usage(const char *err); | |
108 | ||
109 | #endif /* CACHE_H */ |