2 ===================================================================
3 --- src/filed/job.c (révision 4467)
4 +++ src/filed/job.c (copie de travail)
11 #if defined(WIN32_VSS)
15 Dmsg2(150, "Got replace %c, where=%s\n", replace, 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;
23 ===================================================================
24 --- src/jcr.h (révision 4466)
25 +++ src/jcr.h (copie de travail)
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)
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
46 LIBOBJS = attr.o base64.o berrno.o bsys.o bget_msg.o \
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
57 ===================================================================
58 --- src/lib/attr.c (révision 4466)
59 +++ src/lib/attr.c (copie de travail)
64 +#include "lib/breg.h"
69 ATTR *attr = (ATTR *)malloc(sizeof(ATTR));
71 * every filename if a prefix is supplied.
75 if (jcr->where[0] == 0) {
76 pm_strcpy(attr->ofname, attr->fname);
77 pm_strcpy(attr->olname, attr->lname);
79 + } else if (jcr->where_bregexp) {
81 + apply_bregexps(attr->fname, jcr->where_bregexp, &ret);
82 + pm_strcpy(attr->ofname, ret);
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
89 + if ((attr->type == FT_LNKSAVED || jcr->prefix_links)) {
90 + apply_bregexps(attr->lname, jcr->where_bregexp, &ret);
91 + pm_strcpy(attr->olname, ret);
94 + pm_strcpy(attr->olname, attr->lname);
100 int wherelen = strlen(jcr->where);
102 ===================================================================
103 --- src/lib/jcr.c (révision 4466)
104 +++ src/lib/jcr.c (copie de travail)
106 /* External variables we reference */
107 extern time_t watchdog_time;
109 +/* External referenced functions */
110 +void free_bregexps(alist *bregexps);
112 /* Forward referenced functions */
113 extern "C" void timeout_handler(int sig);
114 static void jcr_timeout_check(watchdog_t *self);
119 + if (jcr->where_bregexp) {
120 + free_bregexps(jcr->where_bregexp);
121 + delete jcr->where_bregexp;
122 + jcr->where_bregexp = NULL;
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)
135 - static int _start[RE_NREGS];
136 - static int _end[RE_NREGS];
138 self->result = get_pool_memory(PM_FNAME);
139 self->result[0] = '\0';
143 /* Apply all regexps to fname
145 -char *apply_bregexps(const char *fname, alist *bregexps)
146 +bool apply_bregexps(const char *fname, alist *bregexps, char **result)
151 char *ret = (char *) fname;
152 foreach_alist(elt, bregexps) {
153 ret = elt->replace(ret);
154 + ok = ok || elt->success;
156 Dmsg2(500, "bregexp: fname=%s ret=%s\n", fname, ret);
163 /* return an alist of BREGEXP or return NULL if it's not a
174 char *search = (char *) motif + 1;
175 int options = REG_EXTENDED | REG_NEWLINE;
177 - bool found_motif = false;
179 /* extract 1st part */
180 char *dest = expr = bstrdup(motif);
182 /* return regexp->result */
183 char *BREGEXP::replace(const char *fname)
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, ®s);
191 result = check_pool_memory_size(result, len);
192 edit_subst(fname, ®s);
195 Dmsg2(500, "bregexp: len = %i, result_len = %i\n", len, strlen(result));
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)
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);
211 Index: patches/testing/breg.h
212 ===================================================================
213 --- patches/testing/breg.h (révision 4472)
214 +++ patches/testing/breg.h (copie de travail)
218 POOLMEM *result; /* match result */
219 - char *replace(const char *fname);
220 + bool success; /* match is ok */
222 + char *replace(const char *fname); /* return this.result */
227 /* fill an alist with BREGEXP from where */
228 alist *get_bregexps(const char *where);
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);
234 /* foreach_alist free RUNSCRIPT */
235 void free_bregexps(alist *bregexps); /* you have to free alist */