diff -Nru rpm-4.1/lib/rpmrc.c rpm-4.1.new/lib/rpmrc.c --- rpm-4.1/lib/rpmrc.c Tue Aug 20 16:53:44 2002 +++ rpm-4.1.new/lib/rpmrc.c Tue Mar 11 18:41:48 2003 @@ -1756,27 +1756,40 @@ /* Expand ~/ to $HOME/ */ fn[0] = '\0'; if (r[0] == '~' && r[1] == '/') { + const char * config_dir = getenv("CONFIG_DIR"); const char * home = getenv("HOME"); - if (home == NULL) { + if (config_dir) { + if (strlen(config_dir) > (sizeof(fn) - strlen(r))) { + rpmError(RPMERR_RPMRC, _("Cannot read %s, CONFIG_DIR is too large.\n"),r); + rc = 1; + break; + } + strcpy(fn, config_dir); + strncat(fn, "/", sizeof(fn) - strlen(fn)); + r+=2; + + if (r[0] == '.') r++; + } else { + if (home == NULL) { /* XXX Only /usr/lib/rpm/rpmrc must exist in default rcfiles list */ - if (rcfiles == defrcfiles && myrcfiles != r) - continue; - rpmError(RPMERR_RPMRC, _("Cannot expand %s\n"), r); - rc = 1; - break; - } - if (strlen(home) > (sizeof(fn) - strlen(r))) { - rpmError(RPMERR_RPMRC, _("Cannot read %s, HOME is too large.\n"), + if (rcfiles == defrcfiles && myrcfiles != r) + continue; + rpmError(RPMERR_RPMRC, _("Cannot expand %s\n"), r); + rc = 1; + break; + } + if (strlen(home) > (sizeof(fn) - strlen(r))) { + rpmError(RPMERR_RPMRC, _("Cannot read %s, HOME is too large.\n"), r); - rc = 1; - break; - } - strcpy(fn, home); - r++; - } - strncat(fn, r, sizeof(fn) - (strlen(fn) + 1)); - fn[sizeof(fn)-1] = '\0'; - + rc = 1; + break; + } + strcpy(fn, home); + r++; + } + } + strncat(fn, r, sizeof(fn) - (strlen(fn) + 1)); + fn[sizeof(fn)-1] = '\0'; /* Read another rcfile */ fd = Fopen(fn, "r.fpio"); if (fd == NULL || Ferror(fd)) { diff -Nru rpm-4.1/rpmio/macro.c rpm-4.1.new/rpmio/macro.c --- rpm-4.1/rpmio/macro.c Tue Sep 17 14:58:23 2002 +++ rpm-4.1.new/rpmio/macro.c Tue Mar 11 18:21:59 2003 @@ -1614,15 +1614,23 @@ buf[0] = '\0'; if (mfile[0] == '~' && mfile[1] == '/') { char *home; - if ((home = getenv("HOME")) != NULL) { - mfile += 2; - strncpy(buf, home, sizeof(buf)); - strncat(buf, "/", sizeof(buf) - strlen(buf)); + char *config_dir = getenv("CONFIG_DIR"); + + if (config_dir) { + mfile += 2; + if (mfile[0] == '.') mfile++; + strncpy(buf, config_dir, sizeof(buf)); + strncat(buf, "/", sizeof(buf) - strlen(buf)); + } else { + if ((home = getenv("HOME")) != NULL) { + mfile += 2; + strncpy(buf, home, sizeof(buf)); + strncat(buf, "/", sizeof(buf) - strlen(buf)); } + } } strncat(buf, mfile, sizeof(buf) - strlen(buf)); buf[sizeof(buf)-1] = '\0'; - fd = Fopen(buf, "r.fpio"); if (fd == NULL || Ferror(fd)) { if (fd) (void) Fclose(fd);