/* ** 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 ** Campus Information Technologies and Educational Services ** University of Illinois at Urbana-Champaign */ #include #include #include #include #include #ifdef STDC_HEADERS # include #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; struct passwd *pw; pw = getpwnam(t->th_buf.uname); if (pw != NULL) return pw->pw_uid; /* if the password entry doesn't exist */ sscanf(t->th_buf.uid, "%o", &uid); return uid; } gid_t th_get_gid(TAR *t) { int gid; struct group *gr; gr = getgrnam(t->th_buf.gname); if (gr != NULL) return gr->gr_gid; /* if the group entry doesn't exist */ 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) { case SYMTYPE: mode |= S_IFLNK; break; case CHRTYPE: mode |= S_IFCHR; break; case BLKTYPE: mode |= S_IFBLK; break; case DIRTYPE: mode |= S_IFDIR; break; case FIFOTYPE: mode |= S_IFIFO; break; 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; }