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