2 * Copyright (c) 2004,2005 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@backplane.com>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 jf_warn(struct jfile
*jf
, const char *ctl
, ...)
42 fprintf(stderr
, "@0x%016jx ", (uintmax_t)jf
->jf_pos
);
44 vfprintf(stderr
, ctl
, va
);
46 fprintf(stderr
, "\n");
50 type_to_name(int16_t rectype
)
54 switch((u_int16_t
)rectype
& ~JMASK_LAST
) {
64 case JTYPE_DISASSOCIATE
:
88 case JTYPE_SETEXTATTR
:
169 case JLEAF_RESERVED_0F
:
172 case JLEAF_SYMLINKDATA
:
219 stringout(FILE *fp
, char c
, int exact
)
221 if ((c
>= 'a' && c
<= 'z') ||
222 (c
>= 'A' && c
<= 'Z') ||
223 (c
>= '0' && c
<= '9')
226 } else if (isprint((unsigned char)c
) && c
!= '\\' && c
!= '\"') {
228 } else if (exact
== 0) {
232 } else if (c
== '\n') {
235 fprintf(fp
, "\\x%02x", (int)(unsigned char)c
);
240 jattr_reset(struct jattr
*jattr
)
243 struct jattr_data
*data
;
256 free(jattr
->attrname
);
258 free(jattr
->pathref
);
259 if (jattr
->symlinkdata
)
260 free(jattr
->symlinkdata
);
261 while ((data
= jattr
->data
.next
) != NULL
) {
262 jattr
->data
.next
= data
->next
;
265 if ((undo
= jattr
->undo
) != NULL
)
266 jattr_reset(jattr
->undo
);
267 bzero(jattr
, sizeof(*jattr
));
269 jattr
->uid
= (uid_t
)-1;
270 jattr
->gid
= (gid_t
)-1;
271 jattr
->size
= (off_t
)-1;
278 buf_to_int64(const void *buf
, int bytes
)
284 v
= (int64_t)*(const u_int8_t
*)buf
;
287 v
= (int64_t)*(const u_int16_t
*)buf
;
290 v
= (int64_t)*(const u_int32_t
*)buf
;
293 v
= *(const int64_t *)buf
;
302 dupdatastr(const void *buf
, int bytes
)
306 res
= malloc(bytes
+ 1);
307 bcopy(buf
, res
, bytes
);
314 * Similar to dupdatastr() but contains sanity checks.
317 dupdatapath(const void *buf
, int bytes
)
322 res
= malloc(bytes
+ 1);
323 bcopy(buf
, res
, bytes
);
327 fprintf(stderr
, "Bad path: %s\n", res
);
333 if (scan
[0] == '.' && scan
[1] == '.' &&
334 (scan
[2] == 0 || scan
[2] == '/')
336 fprintf(stderr
, "Bad path: %s\n", res
);
340 if ((scan
= strchr(scan
, '/')) == NULL
)
348 get_transid_from_file(const char *path
, int64_t *transid
, int flags
)
355 if ((fd
= open(path
, O_RDONLY
)) >= 0) {
356 n
= read(fd
, buf
, sizeof(buf
) - 1);
359 *transid
= strtoull(buf
, NULL
, 16);