29 # define mkdir(dirname,mode) _mkdir(dirname)
31 # define access(path,mode) _access(path,mode)
32 # define chmod(path,mode) _chmod(path,mode)
33 # define strdup(str) _strdup(str)
54 #define GNUTYPE_DUMPDIR 'D'
55 #define GNUTYPE_LONGLINK 'K'
56 #define GNUTYPE_LONGNAME 'L'
57 #define GNUTYPE_MULTIVOL 'M'
58 #define GNUTYPE_NAMES 'N'
59 #define GNUTYPE_SPARSE 'S'
60 #define GNUTYPE_VOLHDR 'V'
66 #define SHORTNAMESIZE 100
123 int main OF((
int,
char **));
127 const char *
TGZsuffix[] = {
"\0",
".tar",
".tar.gz",
".taz",
".tgz", NULL };
180 if (c < '0' || c >
'7')
196 local = localtime(t);
197 sprintf(
result,
"%4d/%02d/%02d %02d:%02d:%02d",
209 static int isWinNT = -1;
211 FILETIME locft, modft;
216 loctm = localtime(&ftime);
220 st.wYear = (WORD)loctm->tm_year + 1900;
221 st.wMonth = (WORD)loctm->tm_mon + 1;
222 st.wDayOfWeek = (WORD)loctm->tm_wday;
223 st.wDay = (WORD)loctm->tm_mday;
224 st.wHour = (WORD)loctm->tm_hour;
225 st.wMinute = (WORD)loctm->tm_min;
226 st.wSecond = (WORD)loctm->tm_sec;
227 st.wMilliseconds = 0;
228 if (!SystemTimeToFileTime(&st, &locft) ||
229 !LocalFileTimeToFileTime(&locft, &modft))
233 isWinNT = (
GetVersion() < 0x80000000) ? 1 : 0;
234 hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
235 (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0),
239 result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1;
243 struct utimbuf settime;
245 settime.actime = settime.modtime = ftime;
246 return utime(fname,&settime);
259 error(
"Out of memory");
274 for (item = *list; item != NULL; )
288 #define ISSPECIAL(c) (((c) == '*') || ((c) == '/'))
298 if (*
string !=
'\\' && *
string !=
'/')
302 else if (*expr ==
'*')
306 while (*++
string != *expr)
313 if (*
string != *expr)
341 if (mkdir(
buffer, 0755) == 0)
352 while(*
p && *
p !=
'\\' && *
p !=
'/')
356 if ((mkdir(
buffer, 0755) == -1) && (errno == ENOENT))
400 printf(
" date time size file\n"
401 " ---------- -------- --------- -------------------------------------\n");
427 if (
len == 0 ||
buffer.header.name[0] == 0)
432 if (tarmode == -1 || tartime == (time_t)-1)
434 buffer.header.name[0] = 0;
450 error(
"bad long name");
457 switch (
buffer.header.typeflag)
485 char *
p = strrchr(
fname,
'/');
506 if (remaining < 0 || remaining >=
BLOCKSIZE)
536 "%s: Error writing %s -- skipping\n",
prog,
fname);
562 error(
"broken archive");
573 error(
"failed gzclose");
583 printf(
"untgz version 0.2.1\n"
584 " using zlib version %s\n\n",
586 printf(
"Usage: untgz file.tgz extract all files\n"
587 " untgz file.tgz fname ... extract selected files\n"
588 " untgz -l file.tgz list archive contents\n"
589 " untgz -h display this help\n");
602 #if defined(WIN32) && defined(__GNUC__)
613 prog = strrchr(argv[0],
'\\');
616 prog = strrchr(argv[0],
'/');
619 prog = strrchr(argv[0],
':');
634 if (strcmp(argv[
arg],
"-l") == 0)
640 else if (strcmp(argv[
arg],
"-h") == 0)
662 fprintf(
stderr,
"%s: Couldn't gzopen %s\n",
prog,TGZfile);
669 error(
"Unknown option");