Fix memory leak in th_get_pathname
[libtar.git] / lib / decode.c
blob104b256e03232869028385637c081b8e1c346b37
1 /*
2 ** Copyright 1998-2003 University of Illinois Board of Trustees
3 ** Copyright 1998-2003 Mark D. Roth
4 ** All rights reserved.
5 **
6 ** decode.c - libtar code to decode tar header blocks
7 **
8 ** Mark D. Roth <roth@uiuc.edu>
9 ** Campus Information Technologies and Educational Services
10 ** University of Illinois at Urbana-Champaign
13 #include <internal.h>
15 #include <stdio.h>
16 #include <sys/param.h>
17 #include <pwd.h>
18 #include <grp.h>
20 #ifdef STDC_HEADERS
21 # include <string.h>
22 #endif
25 /* determine full path name */
26 char *
27 th_get_pathname(TAR *t)
29 static char filename[MAXPATHLEN];
31 if (t->th_buf.gnu_longname)
32 return t->th_buf.gnu_longname;
34 if (t->th_buf.prefix[0] != '\0')
36 snprintf(filename, sizeof(filename), "%.155s/%.100s",
37 t->th_buf.prefix, t->th_buf.name);
38 return filename;
41 snprintf(filename, sizeof(filename), "%.100s", t->th_buf.name);
42 return filename;
46 uid_t
47 th_get_uid(TAR *t)
49 int uid;
50 struct passwd *pw;
52 pw = getpwnam(t->th_buf.uname);
53 if (pw != NULL)
54 return pw->pw_uid;
56 /* if the password entry doesn't exist */
57 sscanf(t->th_buf.uid, "%o", &uid);
58 return uid;
62 gid_t
63 th_get_gid(TAR *t)
65 int gid;
66 struct group *gr;
68 gr = getgrnam(t->th_buf.gname);
69 if (gr != NULL)
70 return gr->gr_gid;
72 /* if the group entry doesn't exist */
73 sscanf(t->th_buf.gid, "%o", &gid);
74 return gid;
78 mode_t
79 th_get_mode(TAR *t)
81 mode_t mode;
83 mode = (mode_t)oct_to_int(t->th_buf.mode);
84 if (! (mode & S_IFMT))
86 switch (t->th_buf.typeflag)
88 case SYMTYPE:
89 mode |= S_IFLNK;
90 break;
91 case CHRTYPE:
92 mode |= S_IFCHR;
93 break;
94 case BLKTYPE:
95 mode |= S_IFBLK;
96 break;
97 case DIRTYPE:
98 mode |= S_IFDIR;
99 break;
100 case FIFOTYPE:
101 mode |= S_IFIFO;
102 break;
103 case AREGTYPE:
104 if (t->th_buf.name[strlen(t->th_buf.name) - 1] == '/')
106 mode |= S_IFDIR;
107 break;
109 /* FALLTHROUGH */
110 case LNKTYPE:
111 case REGTYPE:
112 default:
113 mode |= S_IFREG;
117 return mode;