RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: xar/src/ xar.c

From: Anders F. Björklund <afb@rpm5.org>
Date: Sat 15 Sep 2007 - 09:16:34 CEST
Message-Id: <20070915071634.4649534845C@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Anders F. Björklund
  Root:   /v/rpm/cvs                       Email:  afb@rpm5.org
  Module: xar                              Date:   15-Sep-2007 09:16:34
  Branch: HEAD                             Handle: 2007091508163400

  Modified files:
    xar/src                 xar.c

  Log:
    more tar-like verbose display (from upstream)

  Summary:
    Revision    Changes     Path
    1.4         +85 -3      xar/src/xar.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: xar/src/xar.c
  ============================================================================
  $ cvs diff -u -r1.3 -r1.4 xar.c
  --- xar/src/xar.c	14 Sep 2007 12:37:06 -0000	1.3
  +++ xar/src/xar.c	15 Sep 2007 07:16:34 -0000	1.4
  @@ -48,6 +48,7 @@
   #include <getopt.h>
   #include <regex.h>
   #include <errno.h>
  +#include <time.h>
   #include "xar.h"
   #include "config.h"
   
  @@ -100,16 +101,97 @@
   	return strdup(size);
   }
   
  +char *xar_get_mode(xar_file_t f) {
  +	const char *mode = NULL;
  +	char *type = NULL;
  +	char *ret;
  +	mode_t m;
  +	xar_prop_get(f, "mode", &mode);
  +	if( mode == NULL )
  +		return "??????????";
  +	errno = 0;
  +	m = strtoll(mode, 0, 8);
  +	if( errno )
  +		return "??????????";
  +
  +	ret = calloc(11,1);
  +	memset(ret, '-', 10);
  +	ret[0] = '-';
  +	if( m & S_IXOTH ) ret[9] = 'x';
  +	if( m & S_IWOTH ) ret[8] = 'w';
  +	if( m & S_IROTH ) ret[7] = 'r';
  +	
  +	if( m & S_IXGRP ) ret[6] = 'x';
  +	if( m & S_IWGRP ) ret[5] = 'w';
  +	if( m & S_IRGRP ) ret[4] = 'r';
  +	if( m & S_ISGID ) ret[6] = 's';
  +
  +	if( m & S_IXUSR ) ret[3] = 'x';
  +	if( m & S_IWUSR ) ret[2] = 'w';
  +	if( m & S_IRUSR ) ret[1] = 'r';
  +	if( m & S_ISUID ) ret[3] = 's';
  +
  +	type = xar_get_type(f);
  +	if( !type )
  +		return ret;
  +
  +	if( strcmp(type, "directory") == 0 ) ret[0] = 'd';
  +	if( strcmp(type, "symlink") == 0 )   ret[0] = 'l';
  +	free(type);
  +
  +	return ret;
  +}
  +
  +char *xar_get_owner(xar_file_t f) {
  +	const char *user = NULL;
  +
  +	xar_prop_get(f, "user", &user);
  +	if( !user )
  +		return strdup("unknown");
  +	return strdup(user);
  +}
  +
  +char *xar_get_group(xar_file_t f) {
  +	const char *group = NULL;
  +
  +	xar_prop_get(f, "group", &group);
  +	if( !group )
  +		return strdup("unknown");
  +	return strdup(group);
  +}
  +
  +char *xar_get_mtime(xar_file_t f) {
  +	const char *mtime = NULL;
  +	char *tmp;
  +	struct tm tm;
  +
  +	xar_prop_get(f, "mtime", &mtime);
  +	if( !mtime )
  +		mtime = "1970-01-01T00:00:00Z";
  +
  +	strptime(mtime, "%FT%T", &tm);
  +	tmp = calloc(128,1);
  +	strftime(tmp, 127, "%F %T", &tm);
  +	return tmp;
  +}
  +
   static void print_file(xar_file_t f) {
  -	if( List && (Verbose > 1) ) {
  +	if( List && Verbose ) {
   		char *path = xar_get_path(f);
   		char *type = xar_get_type(f);
   		char *size = xar_get_size(f);
  -		printf("%-20s %-10s %s\n", path, type, size);
  +		char *mode = xar_get_mode(f);
  +		char *user = xar_get_owner(f);
  +		char *group = xar_get_group(f);
  +		char *mtime = xar_get_mtime(f);
  +		printf("%s %8s/%-8s %10s %s %s\n", mode, user, group, size, mtime, path);
   		free(size);
   		free(type);
   		free(path);
  -
  +		free(mode);
  +		free(user);
  +		free(group);
  +		free(mtime);
   	} else if( List || Verbose ) {
   		char *path = xar_get_path(f);
   		printf("%s\n", path);
  @@ .
Received on Sat Sep 15 09:16:34 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.