X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Flib%2Fgetvservervdir.c;h=8ac43fdbf165ffddb1dcca62cd055f9f07b27b46;hb=38fe8b4a2dd28aebf52787c5b65cc79490fa53d3;hp=1476525b674fd11b2d28d04f76b502cdce315b06;hpb=971b26a5d8c2519576191e77db8d547ee3d1898d;p=util-vserver.git diff --git a/util-vserver/lib/getvservervdir.c b/util-vserver/lib/getvservervdir.c index 1476525..8ac43fd 100644 --- a/util-vserver/lib/getvservervdir.c +++ b/util-vserver/lib/getvservervdir.c @@ -21,16 +21,41 @@ #endif #include "vserver.h" +#include "internal.h" #include "pathconfig.h" #include -#include -#include -#include #include +#include +#include + +static char * +getDir(char *dir, bool physical) +{ + int fd; + char tmp[PATH_MAX]; + + if (!physical) return strdup(dir); + fd = open(".", O_RDONLY); + if (fd==-1) return 0; + + if (chdir(dir)!=-1 && + getcwd(tmp, sizeof tmp)!=0) + dir = strdup(tmp); + else + dir = 0; + + if (fchdir(fd)==-1) { + write(2, "FATAL error: failed to restore directory\n", 41); + abort(); + } + close(fd); + return dir; +} + char * -vc_getVserverVdir(char const *id, vcCfgStyle style) +vc_getVserverVdir(char const *id, vcCfgStyle style, bool physical) { size_t l1 = strlen(id); char *res = 0; @@ -47,7 +72,7 @@ vc_getVserverVdir(char const *id, vcCfgStyle style) strcpy(buf, DEFAULT_VSERVERDIR "/"); strcpy(buf+sizeof(DEFAULT_VSERVERDIR "/") - 1, id); - res = strdup(buf); + res = getDir(buf, physical); break; } @@ -59,7 +84,7 @@ vc_getVserverVdir(char const *id, vcCfgStyle style) strcpy(buf+sizeof(CONFDIR "/") - 1, id); strcpy(buf+sizeof(CONFDIR "/")+l1 - 1, "/vdir"); - res = strdup(buf); + res = getDir(buf, physical); break; } @@ -70,14 +95,16 @@ vc_getVserverVdir(char const *id, vcCfgStyle style) strcpy(buf, id); strcpy(buf+l1, "/vdir"); - res = strdup(buf); + res = getDir(buf, physical); break; } default : return 0; } - if (access(res, X_OK)==-1) { + // ignore physical-case; we went into the directory while determining + // the physical path so the directory exists + if (!physical && !utilvserver_isDirectory(res, true)) { free(res); res = 0; }