📄 list.c
字号:
*stdp = 1; if (wantug) {#ifdef NONAMES st->st_uid = from_oct(8, header->header.uid); st->st_gid = from_oct(8, header->header.gid);#else st->st_uid = finduid(header->header.uname); st->st_gid = findgid(header->header.gname);#endif } switch (header->header.linkflag) { case LF_BLK: case LF_CHR: st->st_rdev = makedev(from_oct(8, header->header.devmajor), from_oct(8, header->header.devminor)); } } else { /* Old fashioned tar archive */ *stdp = 0; st->st_uid = from_oct(8, header->header.uid); st->st_gid = from_oct(8, header->header.gid); st->st_rdev = 0; }}/* * Quick and dirty octal conversion. * * Result is -1 if the field is invalid (all blank, or nonoctal). */longfrom_oct(digs, where) register int digs; register char *where;{ register long value; while (isspace(*where)) { /* Skip spaces */ where++; if (--digs <= 0) return -1; /* All blank field */ } value = 0; while (digs > 0 && isodigit(*where)) { /* Scan til nonoctal */ value = (value << 3) | (*where++ - '0'); --digs; } if (digs > 0 && *where && !isspace(*where)) return -1; /* Ended on non-space/nul */ return value;}/* * Actually print it. * * Plain and fancy file header block logging. * Non-verbose just prints the name, e.g. for "tar t" or "tar x". * This should just contain file names, so it can be fed back into tar * with xargs or the "-T" option. The verbose option can give a bunch * of info, one line per file. I doubt anybody tries to parse its * format, or if they do, they shouldn't. Unix tar is pretty random here * anyway. * * Note that print_header uses the globals <head>, <hstat>, and * <head_standard>, which must be set up in advance. This is not very clean * and should be cleaned up. FIXME. */#define UGSWIDTH 11 /* min width of User, group, size */#define DATEWIDTH 19 /* Last mod date */static int ugswidth = UGSWIDTH; /* Max width encountered so far */voidprint_header(){ char modes[11]; char *timestamp; char uform[11], gform[11]; /* These hold formatted ints */ char *user, *group; char size[24]; /* Holds a formatted long or maj, min */ long longie; /* To make ctime() call portable */ int pad; char *name; extern long baserec; if(f_sayblock) fprintf(msg_file,"rec %10d: ",baserec + (ar_record - ar_block)); /* annofile(msg_file, (char *)NULL); */ if (f_verbose <= 1) { /* Just the fax, mam. */ char *name; name=quote_copy_string(head->header.name); if(name==0) name=head->header.name; fprintf(msg_file, "%s\n", name); if(name!=head->header.name) free(name); } else { /* File type and modes */ modes[0] = '?'; switch (head->header.linkflag) { case LF_VOLHDR: modes[0]='V'; break; case LF_MULTIVOL: modes[0]='M'; break; case LF_SPARSE: case LF_NORMAL: case LF_OLDNORMAL: case LF_LINK: modes[0] = '-'; if ('/' == head->header.name[strlen(head->header.name)-1]) modes[0] = 'd'; break; case LF_DUMPDIR:modes[0] = 'd'; break; case LF_DIR: modes[0] = 'd'; break; case LF_SYMLINK:modes[0] = 'l'; break; case LF_BLK: modes[0] = 'b'; break; case LF_CHR: modes[0] = 'c'; break; case LF_FIFO: modes[0] = 'p'; break; case LF_CONTIG: modes[0] = 'C'; break; } demode((unsigned)hstat.st_mode, modes+1); /* Timestamp */ longie = hstat.st_mtime; timestamp = ctime(&longie); timestamp[16] = '\0'; timestamp[24] = '\0'; /* User and group names */ if (*head->header.uname && head_standard) { user = head->header.uname; } else { user = uform; (void)sprintf(uform, "%d", (int)hstat.st_uid); } if (*head->header.gname && head_standard) { group = head->header.gname; } else { group = gform; (void)sprintf(gform, "%d", (int)hstat.st_gid); } /* Format the file size or major/minor device numbers */ switch (head->header.linkflag) { case LF_CHR: case LF_BLK: (void)sprintf(size, "%d,%d", major(hstat.st_rdev), minor(hstat.st_rdev)); break; case LF_SPARSE: (void)sprintf(size, "%ld", from_oct(1+12, head->header.realsize)); break; default: (void)sprintf(size, "%ld", (long)hstat.st_size); } /* Figure out padding and print the whole line. */ pad = strlen(user) + strlen(group) + strlen(size) + 1; if (pad > ugswidth) ugswidth = pad; name = quote_copy_string(head->header.name); if(!name) name=head->header.name; fprintf(msg_file, "%s %s/%s %*s%s %s %s %.*s", modes, user, group, ugswidth - pad, "", size, timestamp+4, timestamp+20, sizeof(head->header.name), name); if(name!=head->header.name) free(name); switch (head->header.linkflag) { case LF_SYMLINK: name=quote_copy_string(head->header.linkname); if(!name) name=head->header.linkname; fprintf(msg_file, " -> %s\n", name); if(name!=head->header.linkname) free(name); break; case LF_LINK: name=quote_copy_string(head->header.linkname); if(!name) name=head->header.linkname; fprintf(msg_file, " link to %s\n", head->header.linkname); if(name!=head->header.linkname) free(name); break; default: fprintf(msg_file, " unknown file type '%c'\n", head->header.linkflag); break; case LF_OLDNORMAL: case LF_NORMAL: case LF_SPARSE: case LF_CHR: case LF_BLK: case LF_DIR: case LF_FIFO: case LF_CONTIG: case LF_DUMPDIR: putc('\n', msg_file); break; case LF_VOLHDR: fprintf(msg_file, "--Volume Header--\n"); break; case LF_MULTIVOL: fprintf(msg_file, "--Continued at byte %ld--\n",from_oct(1+12,head->header.offset)); break; } } fflush(msg_file);}/* * Print a similar line when we make a directory automatically. */voidpr_mkdir(pathname, length, mode) char *pathname; int length; int mode;{ char modes[11]; char *name; extern long baserec; if (f_verbose > 1) { /* File type and modes */ modes[0] = 'd'; demode((unsigned)mode, modes+1); if(f_sayblock) fprintf(msg_file,"rec %10d: ",baserec + (ar_record - ar_block)); /* annofile(msg_file, (char *)NULL); */ name=quote_copy_string(pathname); if(!name) name=pathname; fprintf(msg_file, "%s %*s %.*s\n", modes, ugswidth+DATEWIDTH, "Creating directory:", length, pathname); if(name!=pathname) free(name); }}/* * Skip over <size> bytes of data in records in the archive. */voidskip_file(size) register long size;{ union record *x; extern long save_totsize; extern long save_sizeleft; if(f_multivol) { save_totsize=size; save_sizeleft=size; } while (size > 0) { x = findrec(); if (x == NULL) { /* Check it... */ msg("Unexpected EOF on archive file"); exit(EX_BADARCH); } userec(x); size -= RECORDSIZE; if(f_multivol) save_sizeleft-=RECORDSIZE; }}voidskip_extended_headers(){ register union record *exhdr; for (;;) { exhdr = findrec(); if (!exhdr->ext_hdr.isextended) { userec(exhdr); break; } } userec(exhdr);}/* * Decode the mode string from a stat entry into a 9-char string and a null. */voiddemode(mode, string) register unsigned mode; register char *string;{ register unsigned mask; register char *rwx = "rwxrwxrwx"; for (mask = 0400; mask != 0; mask >>= 1) { if (mode & mask) *string++ = *rwx++; else { *string++ = '-'; rwx++; } } if (mode & S_ISUID) if (string[-7] == 'x') string[-7] = 's'; else string[-7] = 'S'; if (mode & S_ISGID) if (string[-4] == 'x') string[-4] = 's'; else string[-4] = 'S'; if (mode & S_ISVTX) if (string[-1] == 'x') string[-1] = 't'; else string[-1] = 'T'; *string = '\0';}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -