]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/file_relocation.patch
ebl first working cup of tea
[bacula/bacula] / bacula / patches / testing / file_relocation.patch
1 Index: src/filed/job.c
2 ===================================================================
3 --- src/filed/job.c     (révision 4467)
4 +++ src/filed/job.c     (copie de travail)
5 @@ -37,6 +37,8 @@
6  #include "bacula.h"
7  #include "filed.h"
8  
9 +#include "lib/breg.h"
10 +
11  #if defined(WIN32_VSS)
12  #include "vss.h"
13  
14 @@ -1601,6 +1603,7 @@
15     Dmsg2(150, "Got replace %c, where=%s\n", replace, where);
16     unbash_spaces(where);
17     jcr->where = bstrdup(where);
18 +   jcr->where_bregexp = get_bregexps(where);
19     free_pool_memory(where);
20     jcr->replace = replace;
21     jcr->prefix_links = prefix_links;
22 Index: src/jcr.h
23 ===================================================================
24 --- src/jcr.h   (révision 4466)
25 +++ src/jcr.h   (copie de travail)
26 @@ -173,6 +173,7 @@
27     MSGS *jcr_msgs;                    /* Copy of message resource -- actually used */
28     uint32_t ClientId;                 /* Client associated with Job */
29     char *where;                       /* prefix to restore files to */
30 +   alist *where_bregexp;              /* BREGEXP alist for path manipulation */
31     int cached_pnl;                    /* cached path length */
32     POOLMEM *cached_path;              /* cached path */
33     bool prefix_links;                 /* Prefix links with Where path */
34 Index: src/lib/Makefile.in
35 ===================================================================
36 --- src/lib/Makefile.in (révision 4466)
37 +++ src/lib/Makefile.in (copie de travail)
38 @@ -32,7 +32,7 @@
39           res.c rwlock.c scan.c serial.c sha1.c \
40           signal.c smartall.c rblist.c tls.c tree.c \
41           util.c var.c watchdog.c workq.c btimers.c \
42 -         address_conf.c pythonlib.c
43 +         address_conf.c pythonlib.c breg.c
44  
45  
46  LIBOBJS = attr.o base64.o berrno.o bsys.o bget_msg.o \
47 @@ -45,7 +45,7 @@
48           res.o rwlock.o scan.o serial.o sha1.o \
49           signal.o smartall.o rblist.o tls.o tree.o \
50           util.o var.o watchdog.o workq.o btimers.o \
51 -         address_conf.o pythonlib.o
52 +         address_conf.o pythonlib.o breg.o
53  
54  
55  EXTRAOBJS = @OBJLIST@
56 Index: src/lib/attr.c
57 ===================================================================
58 --- src/lib/attr.c      (révision 4466)
59 +++ src/lib/attr.c      (copie de travail)
60 @@ -35,8 +35,8 @@
61  
62  #include "bacula.h"
63  #include "jcr.h"
64 +#include "lib/breg.h"
65  
66 -
67  ATTR *new_attr()
68  {
69     ATTR *attr = (ATTR *)malloc(sizeof(ATTR));
70 @@ -148,9 +148,30 @@
71      *   every filename if a prefix is supplied.
72      *
73      */
74 +
75     if (jcr->where[0] == 0) {
76        pm_strcpy(attr->ofname, attr->fname);
77        pm_strcpy(attr->olname, attr->lname);
78 +
79 +   } else if (jcr->where_bregexp) { 
80 +      char *ret;
81 +      apply_bregexps(attr->fname, jcr->where_bregexp, &ret);
82 +      pm_strcpy(attr->ofname, ret);
83 +
84 +      if (attr->type == FT_LNKSAVED || attr->type == FT_LNK) {
85 +         /* Always add prefix to hard links (FT_LNKSAVED) and
86 +          *  on user request to soft links
87 +          */
88 +
89 +        if ((attr->type == FT_LNKSAVED || jcr->prefix_links)) {
90 +           apply_bregexps(attr->lname, jcr->where_bregexp, &ret);
91 +           pm_strcpy(attr->olname, ret);
92 +
93 +        } else {
94 +           pm_strcpy(attr->olname, attr->lname);
95 +        }
96 +      }
97 +      
98     } else {
99        const char *fn;
100        int wherelen = strlen(jcr->where);
101 Index: src/lib/jcr.c
102 ===================================================================
103 --- src/lib/jcr.c       (révision 4466)
104 +++ src/lib/jcr.c       (copie de travail)
105 @@ -56,6 +56,9 @@
106  /* External variables we reference */
107  extern time_t watchdog_time;
108  
109 +/* External referenced functions */
110 +void free_bregexps(alist *bregexps);
111 +
112  /* Forward referenced functions */
113  extern "C" void timeout_handler(int sig);
114  static void jcr_timeout_check(watchdog_t *self);
115 @@ -381,6 +384,11 @@
116        free(jcr->where);
117        jcr->where = NULL;
118     }
119 +   if (jcr->where_bregexp) {
120 +      free_bregexps(jcr->where_bregexp);
121 +      delete jcr->where_bregexp;
122 +      jcr->where_bregexp = NULL;
123 +   }
124     if (jcr->cached_path) {
125        free_pool_memory(jcr->cached_path);
126        jcr->cached_path = NULL;
127 Index: patches/testing/breg.c
128 ===================================================================
129 --- patches/testing/breg.c      (révision 4483)
130 +++ patches/testing/breg.c      (copie de travail)
131 @@ -52,9 +52,6 @@
132        return NULL;
133     }
134  
135 -   static int _start[RE_NREGS];
136 -   static int _end[RE_NREGS];
137 -
138     self->result = get_pool_memory(PM_FNAME);
139     self->result[0] = '\0';
140  
141 @@ -102,15 +99,20 @@
142  
143  /* Apply all regexps to fname
144   */
145 -char *apply_bregexps(const char *fname, alist *bregexps)
146 +bool apply_bregexps(const char *fname, alist *bregexps, char **result)
147  {
148     BREGEXP *elt;
149 +   bool ok=false;
150 +
151     char *ret = (char *) fname;
152     foreach_alist(elt, bregexps) {
153        ret = elt->replace(ret);
154 +      ok = ok || elt->success;
155     }
156     Dmsg2(500, "bregexp: fname=%s ret=%s\n", fname, ret);
157 -   return ret;
158 +
159 +   *result = ret;
160 +   return ok;
161  }
162  
163  /* return an alist of BREGEXP or return NULL if it's not a 
164 @@ -149,7 +151,7 @@
165     if (!(sep == '!' || 
166          sep == ':' || 
167          sep == ';' || 
168 -        sep == '§' || 
169 +        sep == '|' || 
170          sep == ',' || 
171          sep == '&' || 
172          sep == '%' || 
173 @@ -163,7 +165,6 @@
174     char *search = (char *) motif + 1;
175     int options = REG_EXTENDED | REG_NEWLINE;
176     bool ok = false;
177 -   bool found_motif = false;
178  
179     /* extract 1st part */
180     char *dest = expr = bstrdup(motif);
181 @@ -234,6 +235,7 @@
182  /* return regexp->result */
183  char *BREGEXP::replace(const char *fname)
184  {
185 +   success = false;            /* use this.success to known if it's ok */
186     int flen = strlen(fname);
187     int rc = re_search(&preg, (BREGEX_CAST char*) fname, flen, 0, flen, &regs);
188  
189 @@ -247,7 +249,7 @@
190     if (len) {
191        result = check_pool_memory_size(result, len);
192        edit_subst(fname, &regs);
193 -
194 +      success = true;
195        Dmsg2(500, "bregexp: len = %i, result_len = %i\n", len, strlen(result));
196  
197     } else {                    /* error in substitution */
198 Index: patches/testing/bregtest.c
199 ===================================================================
200 --- patches/testing/bregtest.c  (révision 4472)
201 +++ patches/testing/bregtest.c  (copie de travail)
202 @@ -135,7 +135,7 @@
203  
204     while (fgets(data, sizeof(data)-1, fd)) {
205        strip_trailing_newline(data);
206 -      p = apply_bregexps(data, list);
207 +      apply_bregexps(data, list, &p);
208        printf("%s => %s\n", data, p);
209     }
210     fclose(fd);
211 Index: patches/testing/breg.h
212 ===================================================================
213 --- patches/testing/breg.h      (révision 4472)
214 +++ patches/testing/breg.h      (copie de travail)
215 @@ -60,7 +60,9 @@
216  class BREGEXP {
217  public:
218     POOLMEM *result;            /* match result */
219 -   char *replace(const char *fname);
220 +   bool success;               /* match is ok */
221 +
222 +   char *replace(const char *fname); /* return this.result */
223     void debug();
224  
225     /* private */
226 @@ -90,7 +92,8 @@
227  /* fill an alist with BREGEXP from where */
228  alist *get_bregexps(const char *where);
229  
230 -char *apply_bregexps(const char *fname, alist *bregexps);
231 +/* apply every regexps from the alist */
232 +bool apply_bregexps(const char *fname, alist *bregexps, char **result);
233  
234  /* foreach_alist free RUNSCRIPT */
235  void free_bregexps(alist *bregexps); /* you have to free alist */