Chris@18: #!@prefix@/bin/php -Cq Chris@18: 1) { Chris@18: usage("Only one of -c, -t and -x can be specified at once!"); Chris@18: } Chris@18: Chris@18: if ($op_create + $op_list + $op_extract == 0) { Chris@18: usage("Please specify either -c, -t or -x!"); Chris@18: } Chris@18: Chris@18: if (empty($file)) { Chris@18: if ($op_create) { Chris@18: $file = "php://stdout"; Chris@18: } else { Chris@18: $file = "php://stdin"; Chris@18: } Chris@18: } Chris@18: Chris@18: // }}} Chris@18: Chris@18: $tar = new Archive_Tar($file, $use_gzip); Chris@18: $tar->setErrorHandling(PEAR_ERROR_DIE, "$progname error: %s\n"); Chris@18: Chris@18: if ($op_create) { Chris@18: do_create($tar, $options[1]); Chris@18: $tar->create($options[1]); Chris@18: } elseif ($op_list) { Chris@18: do_list($tar, $verbose); Chris@18: } elseif ($op_extract) { Chris@18: do_extract($tar); Chris@18: } Chris@18: Chris@18: // {{{ getrwx() Chris@18: Chris@18: function getrwx($bits) { Chris@18: $str = ''; Chris@18: $str .= ($bits & 4) ? 'r' : '-'; Chris@18: $str .= ($bits & 2) ? 'w' : '-'; Chris@18: $str .= ($bits & 1) ? 'x' : '-'; Chris@18: return $str; Chris@18: } Chris@18: Chris@18: // }}} Chris@18: // {{{ getfiletype() Chris@18: Chris@18: function getfiletype($bits) { Chris@18: static $map = array( Chris@18: '-' => S_IFREG, Chris@18: 'd' => S_IFDIR, Chris@18: 'l' => S_IFLNK, Chris@18: 'c' => S_IFCHR, Chris@18: 'b' => S_IFBLK, Chris@18: 'p' => S_IFIFO, Chris@18: 's' => S_IFSOCK, Chris@18: ); Chris@18: foreach ($map as $char => $mask) { Chris@18: if ($bits & $mask) { Chris@18: return $char; Chris@18: } Chris@18: } Chris@18: } Chris@18: Chris@18: // }}} Chris@18: // {{{ getuser() Chris@18: Chris@18: function getuser($uid) { Chris@18: static $cache = array(); Chris@18: if (isset($cache[$uid])) { Chris@18: return $cache[$uid]; Chris@18: } Chris@18: if (function_exists("posix_getpwuid")) { Chris@18: if (is_array($user = @posix_getpwuid($uid))) { Chris@18: $cache[$uid] = $user['name']; Chris@18: return $user['name']; Chris@18: } Chris@18: } Chris@18: $cache[$uid] = $uid; Chris@18: return $uid; Chris@18: } Chris@18: Chris@18: // }}} Chris@18: // {{{ getgroup() Chris@18: Chris@18: function getgroup($gid) { Chris@18: static $cache = array(); Chris@18: if (isset($cache[$gid])) { Chris@18: return $cache[$gid]; Chris@18: } Chris@18: if (function_exists("posix_getgrgid")) { Chris@18: if (is_array($group = @posix_getgrgid($gid))) { Chris@18: $cache[$gid] = $group['name']; Chris@18: return $group['name']; Chris@18: } Chris@18: } Chris@18: $cache[$gid] = $gid; Chris@18: return $gid; Chris@18: } Chris@18: Chris@18: // }}} Chris@18: // {{{ do_create() Chris@18: Chris@18: function do_create(&$tar, &$files) Chris@18: { Chris@18: $tar->create($files); Chris@18: } Chris@18: Chris@18: // }}} Chris@18: // {{{ do_list() Chris@18: Chris@18: function do_list(&$tar, $verbose) Chris@18: { Chris@18: static $rwx = array(4 => 'r', 2 => 'w', 1 => 'x'); Chris@18: $files = $tar->listContent(); Chris@18: if (is_array($files) && sizeof($files) > 0) { Chris@18: foreach ($files as $file) { Chris@18: if ($verbose) { Chris@18: $fm = (int)$file['mode']; Chris@18: $mode = sprintf('%s%s%s%s', getfiletype($fm), Chris@18: getrwx(($fm >> 6) & 7), getrwx(($fm >> 3) & 7), Chris@18: getrwx($fm & 7)); Chris@18: $owner = getuser($file['uid']) . '/' . getgroup($file['gid']); Chris@18: printf("%10s %-11s %7d %s %s\n", $mode, $owner, $file['size'], Chris@18: date('Y-m-d H:i:s', $file['mtime']), $file['filename']); Chris@18: } else { Chris@18: printf("%s\n", $file['filename']); Chris@18: } Chris@18: } Chris@18: } Chris@18: } Chris@18: Chris@18: // }}} Chris@18: // {{{ do_extract() Chris@18: Chris@18: function do_extract(&$tar, $destdir = ".") Chris@18: { Chris@18: $tar->extract($destdir); Chris@18: } Chris@18: Chris@18: // }}} Chris@18: // {{{ usage() Chris@18: Chris@18: function usage($errormsg = '') Chris@18: { Chris@18: global $progname; Chris@18: $fp = fopen("php://stderr", "w"); Chris@18: if ($errormsg) { Chris@18: if (PEAR::isError($errormsg)) { Chris@18: fwrite($fp, $errormsg->getMessage() . "\n"); Chris@18: } else { Chris@18: fwrite($fp, "$errormsg\n"); Chris@18: } Chris@18: } Chris@18: fwrite($fp, "$progname [-h|-?] {-c|-t|-x} [-z] [-v] [-f file] [file(s)...] Chris@18: Options: Chris@18: -h, -? Show this screen Chris@18: -c Create archive Chris@18: -t List archive Chris@18: -x Extract archive Chris@18: -z Run input/output through gzip Chris@18: -f file Use as input or output (default is stdin/stdout) Chris@18: Chris@18: "); Chris@18: fclose($fp); Chris@18: exit; Chris@18: } Chris@18: Chris@18: // }}} Chris@18: Chris@18: ?>