| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- ** Copyright 1998-2003 University of Illinois Board of Trustees
- ** Copyright 1998-2003 Mark D. Roth
- ** All rights reserved.
- **
- ** decode.c - libtar code to decode tar header blocks
- **
- ** Mark D. Roth <[email protected]>
- ** Campus Information Technologies and Educational Services
- ** University of Illinois at Urbana-Champaign
- */
- #include <libtarint/internal.h>
- #include <stdio.h>
- #ifndef _MSC_VER
- #include <sys/param.h>
- #else
- #include <compat.h>
- #endif
- #ifndef WIN32
- #include <pwd.h>
- #include <grp.h>
- #endif
- #ifdef STDC_HEADERS
- # include <string.h>
- #endif
- /* determine full path name */
- char *
- th_get_pathname(TAR *t)
- {
- char filename[MAXPATHLEN];
- if (t->th_buf.gnu_longname)
- return t->th_buf.gnu_longname;
- if (t->th_buf.prefix[0] != '\0')
- {
- snprintf(filename, sizeof(filename), "%.155s/%.100s",
- t->th_buf.prefix, t->th_buf.name);
- return strdup(filename);
- }
- snprintf(filename, sizeof(filename), "%.100s", t->th_buf.name);
- return strdup(filename);
- }
- uid_t
- th_get_uid(TAR *t)
- {
- int uid;
- #ifndef WIN32
- struct passwd *pw;
- pw = getpwnam(t->th_buf.uname);
- if (pw != NULL)
- return pw->pw_uid;
- /* if the password entry doesn't exist */
- #endif
- sscanf(t->th_buf.uid, "%o", &uid);
- return uid;
- }
- gid_t
- th_get_gid(TAR *t)
- {
- int gid;
- #ifndef WIN32
- struct group *gr;
- gr = getgrnam(t->th_buf.gname);
- if (gr != NULL)
- return gr->gr_gid;
- /* if the group entry doesn't exist */
- #endif
- sscanf(t->th_buf.gid, "%o", &gid);
- return gid;
- }
- mode_t
- th_get_mode(TAR *t)
- {
- mode_t mode;
- mode = (mode_t)oct_to_int(t->th_buf.mode);
- if (! (mode & S_IFMT))
- {
- switch (t->th_buf.typeflag)
- {
- #ifndef WIN32
- case SYMTYPE:
- mode |= S_IFLNK;
- break;
- #endif
- case CHRTYPE:
- mode |= S_IFCHR;
- break;
- case BLKTYPE:
- mode |= S_IFBLK;
- break;
- case DIRTYPE:
- mode |= S_IFDIR;
- break;
- #ifndef WIN32
- case FIFOTYPE:
- mode |= S_IFIFO;
- break;
- #endif
- case AREGTYPE:
- if (t->th_buf.name[strlen(t->th_buf.name) - 1] == '/')
- {
- mode |= S_IFDIR;
- break;
- }
- /* FALLTHROUGH */
- case LNKTYPE:
- case REGTYPE:
- default:
- mode |= S_IFREG;
- }
- }
- return mode;
- }
|