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
34 * $DragonFly: src/sbin/jscan/subs.c,v 1.8 2005/09/07 19:10:09 dillon Exp $
40 jf_warn(struct jfile
*jf
, const char *ctl
, ...)
44 fprintf(stderr
, "@0x%016jx ", (uintmax_t)jf
->jf_pos
);
46 vfprintf(stderr
, ctl
, va
);
48 fprintf(stderr
, "\n");
52 type_to_name(int16_t rectype
)
56 switch((u_int16_t
)rectype
& ~JMASK_LAST
) {
66 case JTYPE_DISASSOCIATE
:
90 case JTYPE_SETEXTATTR
:
171 case JLEAF_RESERVED_0F
:
174 case JLEAF_SYMLINKDATA
:
221 stringout(FILE *fp
, char c
, int exact
)
223 if ((c
>= 'a' && c
<= 'z') ||
224 (c
>= 'A' && c
<= 'Z') ||
225 (c
>= '0' && c
<= '9')
228 } else if (isprint((unsigned char)c
) && c
!= '\\' && c
!= '\"') {
230 } else if (exact
== 0) {
234 } else if (c
== '\n') {
237 fprintf(fp
, "\\x%02x", (int)(unsigned char)c
);
242 jattr_reset(struct jattr
*jattr
)
245 struct jattr_data
*data
;
258 free(jattr
->attrname
);
260 free(jattr
->pathref
);
261 if (jattr
->symlinkdata
)
262 free(jattr
->symlinkdata
);
263 while ((data
= jattr
->data
.next
) != NULL
) {
264 jattr
->data
.next
= data
->next
;
267 if ((undo
= jattr
->undo
) != NULL
)
268 jattr_reset(jattr
->undo
);
269 bzero(jattr
, sizeof(*jattr
));
271 jattr
->uid
= (uid_t
)-1;
272 jattr
->gid
= (gid_t
)-1;
273 jattr
->size
= (off_t
)-1;
280 buf_to_int64(const void *buf
, int bytes
)
286 v
= (int64_t)*(const u_int8_t
*)buf
;
289 v
= (int64_t)*(const u_int16_t
*)buf
;
292 v
= (int64_t)*(const u_int32_t
*)buf
;
295 v
= *(const int64_t *)buf
;
304 dupdata(const void *buf
, int bytes
)
309 bcopy(buf
, res
, bytes
);
315 dupdatastr(const void *buf
, int bytes
)
319 res
= malloc(bytes
+ 1);
320 bcopy(buf
, res
, bytes
);
327 * Similar to dupdatastr() but contains sanity checks.
330 dupdatapath(const void *buf
, int bytes
)
335 res
= malloc(bytes
+ 1);
336 bcopy(buf
, res
, bytes
);
340 fprintf(stderr
, "Bad path: %s\n", res
);
346 if (scan
[0] == '.' && scan
[1] == '.' &&
347 (scan
[2] == 0 || scan
[2] == '/')
349 fprintf(stderr
, "Bad path: %s\n", res
);
353 if ((scan
= strchr(scan
, '/')) == NULL
)
361 get_transid_from_file(const char *path
, int64_t *transid
, int flags
)
368 if ((fd
= open(path
, O_RDONLY
)) >= 0) {
369 n
= read(fd
, buf
, sizeof(buf
) - 1);
372 *transid
= strtoull(buf
, NULL
, 16);