Skip to content

Commit 5e4b72a

Browse files
committed
add support for -userdir cmdline arg to override the hardcoded userdir
1 parent f1bd6a3 commit 5e4b72a

File tree

4 files changed

+137
-9
lines changed

4 files changed

+137
-9
lines changed

engine/hexen2/server/sys_unix.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,12 +475,44 @@ static int Sys_GetBasedir (char *argv0, char *dst, size_t dstsize)
475475
}
476476

477477
#if DO_USERDIRS
478-
static int Sys_GetUserdir (char *dst, size_t dstsize)
478+
static qboolean Sys_GetUserdirArgs (int argc, char **argv, char *dst, size_t dstsize)
479+
{
480+
int i = 1;
481+
for (; i < argc - 1; ++i)
482+
{
483+
if (strcmp(argv[i], "-userdir") == 0)
484+
{
485+
char *p = dst;
486+
const char * arg = argv[i + 1];
487+
const int n = (int)strlen(arg);
488+
if (n < 1) Sys_Error("Bad argument to -userdir");
489+
if (q_strlcpy(dst, arg, dstsize) >= dstsize)
490+
Sys_Error ("Insufficient array size for userspace directory");
491+
if (dst[n - 1] == '/') dst[n - 1] = 0;
492+
if (*p == '/') p++;
493+
for (; *p; p++) {
494+
const char c = *p;
495+
if (c == '/') {
496+
*p = 0;
497+
Sys_mkdir (dst, true);
498+
*p = c;
499+
}
500+
}
501+
return true;
502+
}
503+
}
504+
return false;
505+
}
506+
507+
static int Sys_GetUserdir (int argc, char **argv, char *dst, size_t dstsize)
479508
{
480509
size_t n;
481510
const char *home_dir = NULL;
482511
struct passwd *pwent;
483512

513+
if (Sys_GetUserdirArgs(argc, argv, dst, dstsize))
514+
return 0;
515+
484516
pwent = getpwuid(getuid());
485517
if (pwent == NULL)
486518
perror("getpwuid");
@@ -593,7 +625,7 @@ int main (int argc, char **argv)
593625

594626
#if DO_USERDIRS
595627
memset (userdir, 0, sizeof(userdir));
596-
if (Sys_GetUserdir(userdir, sizeof(userdir)) != 0)
628+
if (Sys_GetUserdir(argc, argv, userdir, sizeof(userdir)) != 0)
597629
Sys_Error ("Couldn't determine userspace directory");
598630
Sys_mkdir(userdir, true);
599631
parms.userdir = userdir;

engine/hexen2/sys_unix.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,12 +552,44 @@ static int UNIX_GetBasedir (char *argv0, char *dst, size_t dstsize)
552552
#endif /* Sys_GetBasedir */
553553

554554
#if DO_USERDIRS
555-
static int Sys_GetUserdir (char *dst, size_t dstsize)
555+
static qboolean Sys_GetUserdirArgs (int argc, char **argv, char *dst, size_t dstsize)
556+
{
557+
int i = 1;
558+
for (; i < argc - 1; ++i)
559+
{
560+
if (strcmp(argv[i], "-userdir") == 0)
561+
{
562+
char *p = dst;
563+
const char * arg = argv[i + 1];
564+
const int n = (int)strlen(arg);
565+
if (n < 1) Sys_Error("Bad argument to -userdir");
566+
if (q_strlcpy(dst, arg, dstsize) >= dstsize)
567+
Sys_Error ("Insufficient array size for userspace directory");
568+
if (dst[n - 1] == '/') dst[n - 1] = 0;
569+
if (*p == '/') p++;
570+
for (; *p; p++) {
571+
const char c = *p;
572+
if (c == '/') {
573+
*p = 0;
574+
Sys_mkdir (dst, true);
575+
*p = c;
576+
}
577+
}
578+
return true;
579+
}
580+
}
581+
return false;
582+
}
583+
584+
static int Sys_GetUserdir (int argc, char **argv, char *dst, size_t dstsize)
556585
{
557586
size_t n;
558587
const char *home_dir = NULL;
559588
struct passwd *pwent;
560589

590+
if (Sys_GetUserdirArgs(argc, argv, dst, dstsize))
591+
return 0;
592+
561593
pwent = getpwuid(getuid());
562594
if (pwent == NULL)
563595
perror("getpwuid");
@@ -715,7 +747,7 @@ int main (int argc, char **argv)
715747

716748
#if DO_USERDIRS
717749
memset (userdir, 0, sizeof(userdir));
718-
if (Sys_GetUserdir(userdir, sizeof(userdir)) != 0)
750+
if (Sys_GetUserdir(argc, argv, userdir, sizeof(userdir)) != 0)
719751
Sys_Error ("Couldn't determine userspace directory");
720752
Sys_mkdir(userdir, true);
721753
parms.userdir = userdir;

engine/hexenworld/client/sys_unix.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,12 +480,44 @@ static int UNIX_GetBasedir (char *argv0, char *dst, size_t dstsize)
480480
#endif /* Sys_GetBasedir */
481481

482482
#if DO_USERDIRS
483-
static int Sys_GetUserdir (char *dst, size_t dstsize)
483+
static qboolean Sys_GetUserdirArgs (int argc, char **argv, char *dst, size_t dstsize)
484+
{
485+
int i = 1;
486+
for (; i < argc - 1; ++i)
487+
{
488+
if (strcmp(argv[i], "-userdir") == 0)
489+
{
490+
char *p = dst;
491+
const char * arg = argv[i + 1];
492+
const int n = (int)strlen(arg);
493+
if (n < 1) Sys_Error("Bad argument to -userdir");
494+
if (q_strlcpy(dst, arg, dstsize) >= dstsize)
495+
Sys_Error ("Insufficient array size for userspace directory");
496+
if (dst[n - 1] == '/') dst[n - 1] = 0;
497+
if (*p == '/') p++;
498+
for (; *p; p++) {
499+
const char c = *p;
500+
if (c == '/') {
501+
*p = 0;
502+
Sys_mkdir (dst, true);
503+
*p = c;
504+
}
505+
}
506+
return true;
507+
}
508+
}
509+
return false;
510+
}
511+
512+
static int Sys_GetUserdir (int argc, char **argv, char *dst, size_t dstsize)
484513
{
485514
size_t n;
486515
const char *home_dir = NULL;
487516
struct passwd *pwent;
488517

518+
if (Sys_GetUserdirArgs(argc, argv, dst, dstsize))
519+
return 0;
520+
489521
pwent = getpwuid(getuid());
490522
if (pwent == NULL)
491523
perror("getpwuid");
@@ -636,7 +668,7 @@ int main (int argc, char **argv)
636668

637669
#if DO_USERDIRS
638670
memset (userdir, 0, sizeof(userdir));
639-
if (Sys_GetUserdir(userdir, sizeof(userdir)) != 0)
671+
if (Sys_GetUserdir(argc, argv, userdir, sizeof(userdir)) != 0)
640672
Sys_Error ("Couldn't determine userspace directory");
641673
Sys_mkdir(userdir, true);
642674
parms.userdir = userdir;

engine/hexenworld/server/sys_unix.c

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
#define STD_MEM_ALLOC 0x1000000
4242

4343
cvar_t sys_nostdout = {"sys_nostdout", "0", CVAR_NONE};
44-
int devlog; /* log the Con_DPrintf and Sys_DPrintf content when !developer.integer */
44+
int devlog; /* log the Con_DPrintf / Sys_DPrintf content when not in developer mode. */
4545

4646
static double starttime;
4747
static qboolean first = true;
@@ -462,12 +462,44 @@ static int Sys_GetBasedir (char *argv0, char *dst, size_t dstsize)
462462
}
463463

464464
#if DO_USERDIRS
465-
static int Sys_GetUserdir (char *dst, size_t dstsize)
465+
static qboolean Sys_GetUserdirArgs (int argc, char **argv, char *dst, size_t dstsize)
466+
{
467+
int i = 1;
468+
for (; i < argc - 1; ++i)
469+
{
470+
if (strcmp(argv[i], "-userdir") == 0)
471+
{
472+
char *p = dst;
473+
const char * arg = argv[i + 1];
474+
const int n = (int)strlen(arg);
475+
if (n < 1) Sys_Error("Bad argument to -userdir");
476+
if (q_strlcpy(dst, arg, dstsize) >= dstsize)
477+
Sys_Error ("Insufficient array size for userspace directory");
478+
if (dst[n - 1] == '/') dst[n - 1] = 0;
479+
if (*p == '/') p++;
480+
for (; *p; p++) {
481+
const char c = *p;
482+
if (c == '/') {
483+
*p = 0;
484+
Sys_mkdir (dst, true);
485+
*p = c;
486+
}
487+
}
488+
return true;
489+
}
490+
}
491+
return false;
492+
}
493+
494+
static int Sys_GetUserdir (int argc, char **argv, char *dst, size_t dstsize)
466495
{
467496
size_t n;
468497
const char *home_dir = NULL;
469498
struct passwd *pwent;
470499

500+
if (Sys_GetUserdirArgs(argc, argv, dst, dstsize))
501+
return 0;
502+
471503
pwent = getpwuid(getuid());
472504
if (pwent == NULL)
473505
perror("getpwuid");
@@ -552,7 +584,7 @@ int main (int argc, char **argv)
552584

553585
#if DO_USERDIRS
554586
memset (userdir, 0, sizeof(userdir));
555-
if (Sys_GetUserdir(userdir, sizeof(userdir)) != 0)
587+
if (Sys_GetUserdir(argc, argv, userdir, sizeof(userdir)) != 0)
556588
Sys_Error ("Couldn't determine userspace directory");
557589
Sys_mkdir(userdir, true);
558590
parms.userdir = userdir;

0 commit comments

Comments
 (0)