This is lhlist.c in view mode; [Download] [Up]
/* ------------------------------------------------------------------------ */
/* LHa for UNIX */
/* lhlist.c -- LHarc list */
/* */
/* Copyright (C) MCMLXXXIX Yooichi.Tagawa */
/* Modified Nobutaka Watazaki */
/* */
/* Ver. 0.00 Original 1988.05.23 Y.Tagawa */
/* Ver. 1.00 Fixed 1989.09.22 Y.Tagawa */
/* Ver. 1.01 Bug Fix for month name 1989.12.25 Y.Tagawa */
/* Ver. 1.10 Changed list format 1993.10.01 N.Watazaki */
/* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
/* ------------------------------------------------------------------------ */
#include "lha.h"
/* ------------------------------------------------------------------------ */
static long packed_size_total;
static long original_size_total;
static int list_files;
/* ------------------------------------------------------------------------ */
/* Print Stuff */
/* ------------------------------------------------------------------------ */
/* need 14 or 22 (when verbose_listing is TRUE) column spaces */
static void
print_size(packed_size, original_size)
long packed_size, original_size;
{
if (verbose_listing)
printf("%7d ", packed_size);
printf("%7d ", original_size);
if (original_size == 0L)
printf("******");
else /* Changed N.Watazaki */
printf("%5.1f%%", packed_size * 100.0 / original_size);
}
/* ------------------------------------------------------------------------ */
/* need 12 or 17 (when verbose_listing is TRUE) column spaces */
static void
print_stamp(t)
time_t t;
{
static boolean got_now = FALSE;
static time_t now;
static unsigned int threshold;
static char t_month[12 * 3 + 1] = "JanFebMarAprMayJunJulAugSepOctNovDec";
struct tm *p;
if (t == 0) {
printf(" "); /* 12 spaces */
return;
}
if (!got_now) {
now = time((time_t *) 0);
p = localtime(&now);
threshold = p->tm_year * 12 + p->tm_mon - 6;
got_now = TRUE;
}
p = localtime(&t);
if (p->tm_year * 12 + p->tm_mon > threshold)
printf("%.3s %2d %02d:%02d",
&t_month[p->tm_mon * 3], p->tm_mday, p->tm_hour, p->tm_min);
else
printf("%.3s %2d %04d",
&t_month[p->tm_mon * 3], p->tm_mday, p->tm_year + 1900);
}
/* ------------------------------------------------------------------------ */
static void
print_bar()
{
char *p, *q;
/* 17+1+(0 or 7+1)+7+1+6+1+(0 or 1+4)+(12 or 17)+1+20 */
/* 12345678901234567_ 1234567_123456 _123456789012 1234 */
if (verbose_listing) {
p = "- ------ ---------- ";
q = " -------------";
}
else {
p = " ";
q = " --------------------";
}
if (verbose)
q = "";
printf("---------- ----------- ------- ------%s------------%s\n", p, q);
}
/* ------------------------------------------------------------------------ */
/* */
/* ------------------------------------------------------------------------ */
static void
list_header()
{
char *p, *q;
if (verbose_listing) {
p = "PACKED SIZE RATIO CRC ";
q = " NAME";
}
else {
p = " SIZE RATIO";
q = " NAME";
}
if (verbose)
q = "";
printf(" PERMSSN UID GID %s STAMP%s\n", p, q);
#if 0
printf(" PERMSSN UID GID %s SIZE RATIO%s %s STAMP%s%s\n",
verbose_listing ? " PACKED " : "", /* 8,0 */
verbose_listing ? " CRC" : "", /* 5,0 */
verbose_listing ? " " : "", /* 2,0 */
verbose_listing ? " " : " ", /* 6,3 */
verbose ? "" : " NAME");
#endif
print_bar();
}
/* ------------------------------------------------------------------------ */
static void
list_one(hdr)
register LzHeader *hdr;
{
register int mode;
register char *p;
char method[6];
char modebits[11];
if (verbose)
printf("%s\n", hdr->name);
strncpy(method, hdr->method, 5);
method[5] = '\0';
switch (mode = hdr->extend_type) {
case EXTEND_UNIX:
mode = hdr->unix_mode;
if (mode & UNIX_FILE_DIRECTORY)
modebits[0] = 'd';
else if ((mode & UNIX_FILE_SYMLINK) == UNIX_FILE_SYMLINK)
modebits[0] = 'l';
else
modebits[0] = '-';
modebits[1] = ((mode & UNIX_OWNER_READ_PERM) ? 'r' : '-');
modebits[2] = ((mode & UNIX_OWNER_WRITE_PERM) ? 'w' : '-');
modebits[3] = (mode & UNIX_SETUID) ? 's' :
((mode & UNIX_OWNER_EXEC_PERM) ? 'x' : '-');
modebits[4] = ((mode & UNIX_GROUP_READ_PERM) ? 'r' : '-');
modebits[5] = ((mode & UNIX_GROUP_WRITE_PERM) ? 'w' : '-');
modebits[6] = (mode & UNIX_SETGID) ? 's' :
((mode & UNIX_GROUP_EXEC_PERM) ? 'x' : '-');
modebits[7] = ((mode & UNIX_OTHER_READ_PERM) ? 'r' : '-');
modebits[8] = ((mode & UNIX_OTHER_WRITE_PERM) ? 'w' : '-');
modebits[9] = (mode & UNIX_STYCKYBIT) ? 't' :
((mode & UNIX_OTHER_EXEC_PERM) ? 'x' : '-');
modebits[10] = 0;
printf("%s %5d/%-5d ", modebits,
hdr->unix_uid, hdr->unix_gid);
break;
case EXTEND_OS68K:
/**/ case EXTEND_XOSK:/**/
mode = hdr->unix_mode;
printf("%c%c%c%c%c%c%c%c %5d/%-5d",
((mode & OSK_DIRECTORY_PERM) ? 'd' : '-'),
((mode & OSK_SHARED_PERM) ? 's' : '-'),
((mode & OSK_OTHER_EXEC_PERM) ? 'e' : '-'),
((mode & OSK_OTHER_WRITE_PERM) ? 'w' : '-'),
((mode & OSK_OTHER_READ_PERM) ? 'r' : '-'),
((mode & OSK_OWNER_EXEC_PERM) ? 'e' : '-'),
((mode & OSK_OWNER_WRITE_PERM) ? 'w' : '-'),
((mode & OSK_OWNER_READ_PERM) ? 'r' : '-'),
hdr->unix_uid, hdr->unix_gid);
break;
default:
switch (hdr->extend_type) { /* max 18 characters */
case EXTEND_GENERIC:
p = "[generic]";
break;
case EXTEND_CPM:
p = "[CP/M]";
break;
case EXTEND_FLEX:
p = "[FLEX]";
break;
case EXTEND_OS9:
p = "[OS-9]";
break;
case EXTEND_OS68K:
p = "[OS-9/68K]";
break;
case EXTEND_MSDOS:
p = "[MS-DOS]";
break;
case EXTEND_MACOS:
p = "[Mac OS]";
break;
case EXTEND_OS2:
p = "[OS/2]";
break;
case EXTEND_HUMAN:
p = "[Human68K]";
break;
case EXTEND_OS386:
p = "[OS-386]";
break;
case EXTEND_RUNSER:
p = "[Runser]";
break;
#ifdef EXTEND_TOWNSOS
/* This ID isn't fixed */
case EXTEND_TOWNSOS:
p = "[TownsOS]";
break;
#endif
/* Ouch! Please customize it's ID. */
default:
p = "[unknown]";
break;
}
printf("%-23.23s", p);
break;
}
print_size(hdr->packed_size, hdr->original_size);
if (verbose_listing)
if (hdr->has_crc)
printf(" %s %04x", method, hdr->crc);
else
printf(" %s ****", method);
printf(" ");
print_stamp(hdr->unix_last_modified_stamp);
if (!verbose)
if ((mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
printf(" %s", hdr->name);
else {
char buf[256], *b1, *b2;
strcpy(buf, hdr->name);
b1 = strtok(buf, "|");
b2 = strtok(NULL, "|");
printf(" %s -> %s", b1, b2);
}
printf("\n");
}
/* ------------------------------------------------------------------------ */
static void
list_tailer()
{
struct stat stbuf;
print_bar();
printf(" Total %9d file%c ",
list_files, (list_files == 1) ? ' ' : 's');
print_size(packed_size_total, original_size_total);
printf(" ");
if (verbose_listing)
printf(" ");
if (stat(archive_name, &stbuf) < 0)
print_stamp((time_t) 0);
else
print_stamp(stbuf.st_mtime);
printf("\n");
}
/* ------------------------------------------------------------------------ */
/* LIST COMMAND MAIN */
/* ------------------------------------------------------------------------ */
void
cmd_list()
{
FILE *afp;
LzHeader hdr;
int i;
/* initialize total count */
packed_size_total = 0L;
original_size_total = 0L;
list_files = 0;
/* open archive file */
if ((afp = open_old_archive()) == NULL)
fatal_error(archive_name);
if (archive_is_msdos_sfx1(archive_name))
skip_msdos_sfx1_code(afp);
/* print header message */
if (!quiet)
list_header();
/* print each file information */
while (get_header(afp, &hdr)) {
if (need_file(hdr.name)) {
list_one(&hdr);
list_files++;
packed_size_total += hdr.packed_size;
original_size_total += hdr.original_size;
}
if (afp != stdin)
fseek(afp, hdr.packed_size, SEEK_CUR);
else {
i = hdr.packed_size;
while (i--)
fgetc(afp);
}
}
/* close archive file */
fclose(afp);
/* print tailer message */
if (!quiet)
list_tailer();
return;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.