Lines Matching +full:tf +full:- +full:a

1 /*- 
2 * Copyright (c) 2007-2014, Juniper Networks, Inc.
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
126 static int cache_data(struct tarfile *tf, int);
132 struct tarfile *tf, *tfn; in pkgfs_cleanup() local
135 inflateEnd(&package->pkg_zs); in pkgfs_cleanup()
136 close(package->pkg_fd); in pkgfs_cleanup()
138 tf = package->pkg_first; in pkgfs_cleanup()
139 while (tf != NULL) { in pkgfs_cleanup()
140 tfn = tf->tf_next; in pkgfs_cleanup()
141 if (tf->tf_cachesz > 0) in pkgfs_cleanup()
142 free(tf->tf_cache); in pkgfs_cleanup()
143 free(tf); in pkgfs_cleanup()
144 tf = tfn; in pkgfs_cleanup()
147 chain = package->pkg_chain; in pkgfs_cleanup()
169 DEBUG_PRINTF(0, ("%s(%s: '%s') -> %d (error=%d)\n", __func__, in pkgfs_init()
170 proto->fs_name, pkgname, fd, errno)); in pkgfs_init()
172 if (fd == -1) in pkgfs_init()
184 pkg->pkg_chain = package; in pkgfs_init()
198 struct tarfile *tf; in pkg_open_follow() local
207 * We can only read from a package, so reject request to open in pkg_open_follow()
208 * for write-only or read-write. in pkg_open_follow()
210 if (f->f_flags != F_READ) in pkg_open_follow()
216 * a package within a package. We assume we have all the files in pkg_open_follow()
217 * we need up-front and without having to dig within nested in pkg_open_follow()
230 f->f_fsdata = NULL; in pkg_open_follow()
234 tf = scan_tarfile(package, NULL); in pkg_open_follow()
235 while (tf != NULL) { in pkg_open_follow()
236 if (strcmp(fn, tf->tf_hdr.ut_name) == 0) { in pkg_open_follow()
237 f->f_fsdata = tf; in pkg_open_follow()
238 tf->tf_fp = 0; /* Reset the file pointer. */ in pkg_open_follow()
240 fn, tf->tf_hdr.ut_typeflag[0])); in pkg_open_follow()
241 if (tf->tf_hdr.ut_typeflag[0] == '2') { in pkg_open_follow()
242 /* we have a symlink in pkg_open_follow()
247 return pkg_open_follow(tf->tf_hdr.ut_linkname, in pkg_open_follow()
252 tf = scan_tarfile(package, tf); in pkg_open_follow()
266 struct tarfile *tf; in pkg_close() local
268 tf = (struct tarfile *)f->f_fsdata; in pkg_close()
269 if (tf == NULL) in pkg_close()
275 DEBUG_PRINTF(1, ("%s(%s)\n", __func__, tf->tf_hdr.ut_name)); in pkg_close()
276 if (tf->tf_fp == tf->tf_size && tf->tf_cachesz > 0) { in pkg_close()
277 free(tf->tf_cache); in pkg_close()
278 tf->tf_cachesz = 0; in pkg_close()
286 struct tarfile *tf; in pkg_read() local
291 tf = (struct tarfile *)f->f_fsdata; in pkg_read()
292 if (tf == NULL) { in pkg_read()
298 DEBUG_PRINTF(4, ("%s(%s,%zd)\n", __func__, tf->tf_hdr.ut_name, size)); in pkg_read()
300 if (tf->tf_cachesz == 0) in pkg_read()
301 cache_data(tf, 1); in pkg_read()
303 fp = tf->tf_fp; in pkg_read()
307 sz = tf->tf_size - fp; in pkg_read()
308 if (fp < tf->tf_cachesz && tf->tf_cachesz < tf->tf_size) in pkg_read()
309 sz = tf->tf_cachesz - fp; in pkg_read()
315 if (fp < tf->tf_cachesz) { in pkg_read()
317 memcpy(p, tf->tf_cache + fp, sz); in pkg_read()
320 size -= sz; in pkg_read()
324 if (get_zipped(tf->tf_pkg, p, sz) == -1) { in pkg_read()
325 sz = -1; in pkg_read()
331 size -= sz; in pkg_read()
334 tf->tf_fp = fp; in pkg_read()
337 DEBUG_PRINTF(4, ("%s(%s) res=%zd\n", __func__, tf->tf_hdr.ut_name, in pkg_read()
338 (ssize_t)(tf->tf_size - tf->tf_fp))); in pkg_read()
339 return ((sz == -1) ? errno : 0); in pkg_read()
346 struct tarfile *tf; in pkg_seek() local
352 tf = (struct tarfile *)f->f_fsdata; in pkg_seek()
353 if (tf == NULL) { in pkg_seek()
355 return (-1); in pkg_seek()
360 delta = ofs - tf->tf_fp; in pkg_seek()
366 delta = tf->tf_size - tf->tf_fp + ofs; in pkg_seek()
370 return (-1); in pkg_seek()
374 /* seeking backwards - ok if within cache */ in pkg_seek()
375 if (tf->tf_cachesz > 0 && tf->tf_fp <= tf->tf_cachesz) { in pkg_seek()
376 nofs = tf->tf_fp + delta; in pkg_seek()
378 tf->tf_fp = nofs; in pkg_seek()
379 return (tf->tf_fp); in pkg_seek()
385 return (-1); in pkg_seek()
388 while (delta > 0 && tf->tf_fp < tf->tf_size) { in pkg_seek()
393 return (-1); in pkg_seek()
395 delta -= sz - res; in pkg_seek()
398 return (tf->tf_fp); in pkg_seek()
404 struct tarfile *tf; in pkg_stat() local
406 tf = (struct tarfile *)f->f_fsdata; in pkg_stat()
407 if (tf == NULL) in pkg_stat()
410 sb->st_mode = get_mode(tf); in pkg_stat()
411 if ((sb->st_mode & S_IFMT) == 0) { in pkg_stat()
412 /* tar file bug - assume regular file */ in pkg_stat()
413 sb->st_mode |= S_IFREG; in pkg_stat()
415 sb->st_size = tf->tf_size; in pkg_stat()
416 sb->st_blocks = (tf->tf_size + 511) / 512; in pkg_stat()
417 sb->st_mtime = pkg_atol(tf->tf_hdr.ut_mtime, 12); in pkg_stat()
418 sb->st_dev = (off_t)((uintptr_t)tf->tf_pkg); in pkg_stat()
419 sb->st_ino = tf->tf_ofs; /* unique per tf_pkg */ in pkg_stat()
426 struct tarfile *tf; in pkg_readdir() local
428 tf = (struct tarfile *)f->f_fsdata; in pkg_readdir()
429 if (tf != NULL) in pkg_readdir()
432 tf = scan_tarfile(package, NULL); in pkg_readdir()
433 if (tf == NULL) in pkg_readdir()
436 d->d_fileno = 0; in pkg_readdir()
437 d->d_reclen = sizeof(*d); in pkg_readdir()
438 d->d_type = DT_REG; in pkg_readdir()
439 memcpy(d->d_name, tf->tf_hdr.ut_name, sizeof(d->d_name)); in pkg_readdir()
444 * Low-level support functions.
452 if (pkg->pkg_zs.avail_in == 0) { in get_byte()
453 c = read(pkg->pkg_fd, pkg->pkg_buf, PKG_BUFSIZE); in get_byte()
455 return (-1); in get_byte()
456 pkg->pkg_zs.avail_in = c; in get_byte()
457 pkg->pkg_zs.next_in = pkg->pkg_buf; in get_byte()
460 c = *pkg->pkg_zs.next_in; in get_byte()
461 pkg->pkg_zs.next_in++; in get_byte()
462 pkg->pkg_zs.avail_in--; in get_byte()
472 pkg->pkg_zs.next_out = buf; in get_zipped()
473 pkg->pkg_zs.avail_out = bufsz; in get_zipped()
475 while (pkg->pkg_zs.avail_out) { in get_zipped()
476 if (pkg->pkg_zs.avail_in == 0) { in get_zipped()
477 c = read(pkg->pkg_fd, pkg->pkg_buf, PKG_BUFSIZE); in get_zipped()
480 return (-1); in get_zipped()
482 pkg->pkg_zs.avail_in = c; in get_zipped()
483 pkg->pkg_zs.next_in = pkg->pkg_buf; in get_zipped()
486 c = inflate(&pkg->pkg_zs, Z_SYNC_FLUSH); in get_zipped()
489 return (-1); in get_zipped()
493 pkg->pkg_ofs += bufsz; in get_zipped()
499 * cache data of a tarfile
501 * @param[in] tf
507 * @return 0, -1 (errno set to error value)
510 cache_data(struct tarfile *tf, int force) in cache_data() argument
515 if (tf == NULL) { in cache_data()
519 return (-1); in cache_data()
522 pkg = tf->tf_pkg; in cache_data()
527 return (-1); in cache_data()
530 if (tf->tf_cachesz > 0) { in cache_data()
533 return (-1); in cache_data()
536 if (tf->tf_ofs != pkg->pkg_ofs) { in cache_data()
538 __func__, tf->tf_hdr.ut_name)); in cache_data()
540 return (-1); in cache_data()
544 if (tf->tf_size > PKG_MAXCACHESZ && !force) { in cache_data()
546 return (-1); in cache_data()
549 sz = tf->tf_size < PKG_MAXCACHESZ ? tf->tf_size : PKG_MAXCACHESZ; in cache_data()
550 /* All files are padded to a multiple of 512 bytes. */ in cache_data()
553 tf->tf_cache = malloc(sz); in cache_data()
554 if (tf->tf_cache == NULL) { in cache_data()
558 return (-1); in cache_data()
561 tf->tf_cachesz = sz; in cache_data()
562 return (get_zipped(pkg, tf->tf_cache, sz)); in cache_data()
582 if (*p == '-') { in pkg_atol8()
583 sign = -1; in pkg_atol8()
589 digit = *p - '0'; in pkg_atol8()
590 while (digit >= 0 && digit < base && char_cnt-- > 0) { in pkg_atol8()
596 digit = *++p - '0'; in pkg_atol8()
598 return (sign < 0) ? -l : l; in pkg_atol8()
602 * Parse a base-256 integer. This is just a straight signed binary
603 * value in big-endian order, except that the high-order bit is
607 * twos-complement arithmetic, though.
620 l = (int64_t)-1; in pkg_atol256()
624 while (--char_cnt > 0) { in pkg_atol256()
641 * Technically, GNU pkg considers a field to be in base-256 in pkg_atol()
650 get_mode(struct tarfile *tf) in get_mode() argument
652 return (pkg_atol(tf->tf_hdr.ut_mode, sizeof(tf->tf_hdr.ut_mode))); in get_mode()
675 pkg->pkg_fd = fd; in new_package()
696 if (get_byte(pkg, &ofs) == -1) in new_package()
704 while (i-- > 0) { in new_package()
705 if (get_byte(pkg, &ofs) == -1) in new_package()
714 } while (i != 0 && i != -1); in new_package()
715 if (i == -1) in new_package()
723 if (i == -1) in new_package()
733 if (get_byte(pkg, &ofs) == -1) in new_package()
735 if (get_byte(pkg, &ofs) == -1) in new_package()
742 error = inflateInit2(&pkg->pkg_zs, -15); in new_package()
762 cur = (last != NULL) ? last->tf_next : pkg->pkg_first; in scan_tarfile()
764 ofs = (last != NULL) ? last->tf_ofs + last->tf_size : in scan_tarfile()
765 pkg->pkg_ofs; in scan_tarfile()
769 if (ofs < pkg->pkg_ofs) { in scan_tarfile()
774 if (ofs != pkg->pkg_ofs) { in scan_tarfile()
775 if (last != NULL && pkg->pkg_ofs == last->tf_ofs) { in scan_tarfile()
776 if (cache_data(last, 0) == -1) in scan_tarfile()
779 sz = ofs - pkg->pkg_ofs; in scan_tarfile()
783 if (get_zipped(pkg, buf, sz) == -1) in scan_tarfile()
785 sz = ofs - pkg->pkg_ofs; in scan_tarfile()
794 cur->tf_pkg = pkg; in scan_tarfile()
797 if (get_zipped(pkg, &cur->tf_hdr, in scan_tarfile()
798 sizeof(cur->tf_hdr)) == -1) { in scan_tarfile()
805 * a PKG. It marks the end of the archive. in scan_tarfile()
807 if (strncmp(cur->tf_hdr.ut_magic, "ustar", 5) != 0) { in scan_tarfile()
813 cur->tf_ofs = pkg->pkg_ofs; in scan_tarfile()
814 cur->tf_size = pkg_atol(cur->tf_hdr.ut_size, in scan_tarfile()
815 sizeof(cur->tf_hdr.ut_size)); in scan_tarfile()
817 if (cur->tf_hdr.ut_name[0] != '+') in scan_tarfile()
821 * Skip package meta-files. in scan_tarfile()
823 ofs = cur->tf_ofs + cur->tf_size; in scan_tarfile()
825 while (pkg->pkg_ofs < ofs) { in scan_tarfile()
826 if (get_zipped(pkg, buf, sizeof(buf)) == -1) { in scan_tarfile()
834 last->tf_next = cur; in scan_tarfile()
836 pkg->pkg_first = cur; in scan_tarfile()
837 pkg->pkg_last = cur; in scan_tarfile()