Line data Source code
1 : #include "../../burp.h"
2 : #include "../../alloc.h"
3 : #include "../../cmd.h"
4 : #include "../../conf.h"
5 : #include "../../log.h"
6 : #include "../../prepend.h"
7 : #include "dpth.h"
8 :
9 11 : char *dpth_protocol1_mk(struct dpth *dpth, int compression, enum cmd cmd)
10 : {
11 : static char path[32];
12 : // File data.
13 : snprintf(path, sizeof(path), "%04X/%04X/%04X%s",
14 33 : dpth->comp[0], dpth->comp[1], dpth->comp[2],
15 : // Because of the way EFS works, it cannot be compressed.
16 44 : (compression && cmd!=CMD_EFS_FILE)?".gz":"");
17 11 : return path;
18 : }
19 :
20 14 : static char *dpth_mk_prim(struct dpth *dpth)
21 : {
22 : static char path[5];
23 14 : snprintf(path, sizeof(path), "%04X", dpth->comp[0]);
24 14 : return path;
25 : }
26 :
27 14 : static char *dpth_mk_seco(struct dpth *dpth)
28 : {
29 : static char path[10];
30 14 : snprintf(path, sizeof(path), "%04X/%04X", dpth->comp[0], dpth->comp[1]);
31 14 : return path;
32 : }
33 :
34 42 : static void get_highest_entry(const char *path, uint16_t *max)
35 : {
36 42 : int ent=0;
37 42 : DIR *d=NULL;
38 42 : struct dirent *dp=NULL;
39 :
40 42 : *max=0;
41 84 : if(!(d=opendir(path))) return;
42 105 : while((dp=readdir(d)))
43 : {
44 63 : if(!dp->d_ino
45 63 : || !strcmp(dp->d_name, ".")
46 42 : || !strcmp(dp->d_name, ".."))
47 42 : continue;
48 21 : ent=strtol(dp->d_name, NULL, 16);
49 21 : if(ent>*max) *max=ent;
50 : }
51 21 : closedir(d);
52 : }
53 :
54 42 : static int get_next_comp(const char *currentdata,
55 : const char *path, uint16_t *comp)
56 : {
57 42 : int ret=-1;
58 42 : char *tmp=NULL;
59 42 : if(path)
60 28 : tmp=prepend_s(currentdata, path);
61 : else
62 14 : tmp=strdup_w(currentdata, __func__);
63 42 : if(!tmp) goto end;
64 :
65 42 : get_highest_entry(tmp, comp);
66 42 : ret=0;
67 : end:
68 42 : free_w(&tmp);
69 42 : return ret;
70 : }
71 :
72 14 : int dpth_protocol1_init(struct dpth *dpth, const char *basepath,
73 : int max_storage_subdirs)
74 : {
75 14 : int ret=0;
76 14 : dpth->savepath=0;
77 14 : dpth->max_storage_subdirs=max_storage_subdirs;
78 :
79 14 : if((ret=get_next_comp(basepath,
80 14 : NULL, &dpth->comp[0]))) goto end;
81 :
82 14 : if((ret=get_next_comp(basepath,
83 14 : dpth_mk_prim(dpth), &dpth->comp[1]))) goto end;
84 :
85 14 : if((ret=get_next_comp(basepath,
86 14 : dpth_mk_seco(dpth), &dpth->comp[2]))) goto end;
87 :
88 : // At this point, we have the latest data file. Increment to get the
89 : // next free one.
90 14 : ret=dpth_incr(dpth);
91 :
92 : end:
93 14 : switch(ret)
94 : {
95 1 : case -1: return -1;
96 13 : default: return 0;
97 : }
98 : }
99 :
100 12 : int dpth_protocol1_set_from_string(struct dpth *dpth, const char *datapath)
101 : {
102 12 : unsigned int a=0;
103 12 : unsigned int b=0;
104 12 : unsigned int c=0;
105 :
106 12 : if(!datapath
107 12 : || *datapath=='t') // The path used the tree style structure.
108 1 : return 0;
109 :
110 11 : if((sscanf(datapath, "%04X/%04X/%04X", &a, &b, &c))!=3)
111 2 : return -1;
112 9 : if(dpth->comp[0]==(int)a
113 4 : && dpth->comp[1]==(int)b
114 2 : && dpth->comp[2] > (int)c)
115 1 : return 0;
116 8 : if(dpth->comp[0]==(int)a
117 3 : && dpth->comp[1] > (int)b)
118 1 : return 0;
119 7 : if(dpth->comp[0] > (int)a)
120 3 : return 0;
121 :
122 4 : dpth->comp[0]=a;
123 4 : dpth->comp[1]=b;
124 4 : dpth->comp[2]=c;
125 4 : return 0;
126 : }
|