Skip to content

Commit 35499f8

Browse files
committed
pakx: Add support for extracting directories using a trailing slash
1 parent 1b90cbf commit 35499f8

1 file changed

Lines changed: 21 additions & 23 deletions

File tree

‎utils/pak/pakx.c‎

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,49 +33,47 @@
3333

3434
static int ExtractFile (pack_t *pak, const char *filename, const char *destdir)
3535
{
36-
char dest[1024], *dptr;
37-
int i;
36+
char dest[MAX_OSPATH], *dptr;
37+
size_t filenamelen = 0;
38+
int fileisdir = 0, i;
3839

39-
if (!destdir || !*destdir)
40+
if (filename)
4041
{
41-
dptr = dest;
42+
filenamelen = strlen(filename);
43+
if (filenamelen)
44+
fileisdir = filename[filenamelen - 1] == '/';
4245
}
46+
47+
if (!destdir || !*destdir)
48+
dptr = dest;
49+
4350
else
4451
{
4552
strcpy (dest, destdir);
46-
i = strlen (destdir);
47-
if (!IS_DIR_SEPARATOR(dest[i - 1]))
48-
{
49-
dest[i] = DIR_SEPARATOR_CHAR;
50-
dest[i + 1] = '\0';
51-
}
5253
dptr = strchr(dest, '\0');
54+
if (!IS_DIR_SEPARATOR(*(dptr - 1)))
55+
*dptr++ = DIR_SEPARATOR_CHAR;
5356
}
5457

58+
*dptr = '\0';
59+
5560
for (i = 0; i < pak->numfiles; i++)
5661
{
57-
if (!filename)
62+
if (!filename || (!strncmp (pak->files[i].name, filename, filenamelen) &&
63+
(fileisdir || pak->files[i].name[filenamelen] == '\0')))
5864
{
5965
fseek (pak->handle, pak->files[i].filepos, SEEK_SET);
6066
strcpy (dptr, pak->files[i].name);
6167
dest[sizeof(dest) - 1] = '\0';
6268
printf ("%s --> %s\n", pak->files[i].name, dest);
6369
if (Q_WriteFileFromHandle(pak->handle, dest, pak->files[i].filelen) != 0)
6470
COM_Error ("I/O errors during copy.");
65-
continue;
66-
}
67-
if (!strcmp (pak->files[i].name, filename))
68-
{
69-
fseek (pak->handle, pak->files[i].filepos, SEEK_SET);
70-
strcpy (dptr, pak->files[i].name);
71-
dest[sizeof(dest) - 1] = '\0';
72-
printf ("%s --> %s\n", pak->files[i].name, dest);
73-
if (Q_WriteFileFromHandle(pak->handle, dest, pak->files[i].filelen) != 0)
74-
COM_Error ("I/O errors during copy.");
75-
break;
71+
72+
if (filename && !fileisdir)
73+
break;
7674
}
7775
}
78-
if (filename != NULL && i == pak->numfiles)
76+
if (filename && *dptr == '\0')
7977
{
8078
fprintf (stderr, "** %s not in %s\n", filename, pak->filename);
8179
return 1;

0 commit comments

Comments
 (0)