use '/' consistently even on Windows

This commit is contained in:
Xiaoqiang Wang
2019-12-16 14:51:47 +01:00
parent e03b2591f2
commit 13da2aed06
2 changed files with 51 additions and 47 deletions
+46 -41
View File
@@ -127,12 +127,12 @@ int requireDebug;
size_t len = 0;
if (!buf) buf = malloc(PATH_MAX+1);
if (!buf) return NULL;
if (path[0] != OSI_PATH_SEPARATOR[0])
if (path[0] != '/')
{
getcwd(buf, PATH_MAX);
len = strlen(buf);
if (len && buf[len-1] != OSI_PATH_SEPARATOR[0])
buf[len++] = OSI_PATH_SEPARATOR[0];
if (len && buf[len-1] != '/')
buf[len++] = '/';
}
strcpy(buf+len, path);
return buf;
@@ -209,6 +209,7 @@ int requireDebug;
static char* realpath(const char* path, char* buffer)
{
int len = MAX_PATH;
char *p;
if (buffer == NULL)
{
len = GetFullPathName(path, 0, NULL, NULL);
@@ -217,6 +218,10 @@ int requireDebug;
if (buffer == NULL) return NULL;
}
GetFullPathName(path, len, buffer, NULL);
/* convert '\' to '/' */
p = buffer;
while ((p = strchr(p, '\\')) != NULL) *p = '/';
return buffer;
}
@@ -256,8 +261,8 @@ int requireDebug;
#endif
#define LIBDIR "lib" OSI_PATH_SEPARATOR
#define TEMPLATEDIR "db" OSI_PATH_SEPARATOR
#define LIBDIR "lib/"
#define TEMPLATEDIR "db/"
#define TOSTR(s) TOSTR2(s)
#define TOSTR2(s) #s
@@ -611,9 +616,9 @@ void registerModule(const char* module, const char* version, const char* locatio
if (!abslocation) abslocation = (char*)location;
ll = strlen(abslocation) + 1;
/* linux realpath removes trailing slash */
if (abslocation[ll-1-strlen(OSI_PATH_SEPARATOR)] != OSI_PATH_SEPARATOR[0])
if (abslocation[ll-2] != '/')
{
addSlash = strlen(OSI_PATH_SEPARATOR);
addSlash = 1;
}
}
m = (moduleitem*) malloc(sizeof(moduleitem) + lm + lv + ll + addSlash);
@@ -626,7 +631,7 @@ void registerModule(const char* module, const char* version, const char* locatio
strcpy (m->content, module);
strcpy (m->content+lm, version);
strcpy (m->content+lm+lv, abslocation ? abslocation : "");
if (addSlash) strcpy (m->content+lm+lv+ll-1, OSI_PATH_SEPARATOR);
if (addSlash) strcpy (m->content+lm+lv+ll-1, "/");
if (abslocation != location) free(abslocation);
for (pm = &loadedModules; *pm != NULL; pm = &(*pm)->next);
*pm = m;
@@ -649,7 +654,7 @@ void registerModule(const char* module, const char* version, const char* locatio
/* create a record with the version string */
mylocation = getenv("require_DIR");
if (mylocation == NULL) return;
if (asprintf(&abslocation, "%s" OSI_PATH_SEPARATOR "db" OSI_PATH_SEPARATOR "moduleversion.template", mylocation) < 0) return;
if (asprintf(&abslocation, "%s/db/moduleversion.template", mylocation) < 0) return;
if (asprintf(&argstring, "IOC=%.30s, MODULE=%.24s, VERSION=%.39s, MODULE_COUNT=%lu, BUFFER_SIZE=%lu",
getenv("IOC"), module, version, moduleCount,
moduleListBufferSize+maxModuleNameLength*moduleCount) < 0) return;
@@ -1301,7 +1306,7 @@ static int require_priv(const char* module, const char* version, const char* arg
dirname = getLibLocation(module);
if (requireDebug && dirname[0])
printf("require: library found in %s\n", dirname);
snprintf(filename, sizeof(filename), "%s%n.." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "use_exact_version",
snprintf(filename, sizeof(filename), "%s%n../../use_exact_version",
dirname, &releasediroffs);
if (fileExists(filename))
{
@@ -1309,7 +1314,7 @@ static int require_priv(const char* module, const char* version, const char* arg
}
else
{
snprintf(filename+releasediroffs, sizeof(filename)-releasediroffs, ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "use_exact_minor_version");
snprintf(filename+releasediroffs, sizeof(filename)-releasediroffs, "../../use_exact_minor_version");
if (fileExists(filename))
exactnessLevel = 1;
}
@@ -1352,7 +1357,7 @@ static int require_priv(const char* module, const char* version, const char* arg
DIR_ENTRY direntry;
end = strchr(dirname, OSI_PATH_LIST_SEPARATOR[0]);
if (end && end[1] == OSI_PATH_SEPARATOR[0] && end[2] == OSI_PATH_SEPARATOR[0]) /* "http://..." and friends */
if (end && end[1] == '/' && end[2] == '/') /* "http://..." and friends */
end = strchr(end+2, OSI_PATH_LIST_SEPARATOR[0]);
if (end) dirlen = (int)(end++ - dirname);
else dirlen = (int)strlen(dirname);
@@ -1360,13 +1365,13 @@ static int require_priv(const char* module, const char* version, const char* arg
if (dirlen == 0)
continue; /* ignore empty driverpath elements */
if (!TRY_FILE(0, "%.*s" OSI_PATH_SEPARATOR, dirlen, dirname))
if (!TRY_FILE(0, "%.*s/", dirlen, dirname))
continue; /* ignore non-existing driverpath elements */
dirlen += strlen(OSI_PATH_SEPARATOR);
dirlen += 1;
/* filename = "<dirname>/[dirlen]" */
snprintf(filename+dirlen, sizeof(filename)-dirlen, "%s" OSI_PATH_SEPARATOR "%n", module, &modulediroffs);
snprintf(filename+dirlen, sizeof(filename)-dirlen, "%s/%n", module, &modulediroffs);
modulediroffs += dirlen;
/* filename = "<dirname>/[dirlen]<module>/[modulediroffs]" */
@@ -1406,7 +1411,7 @@ static int require_priv(const char* module, const char* version, const char* arg
/* Even if it has no library, at least it has a dep file in the lib dir */
/* filename = "<dirname>/[dirlen]<module>/[modulediroffs]" */
if (!TRY_FILE(modulediroffs, "%s" OSI_PATH_SEPARATOR "R%s" OSI_PATH_SEPARATOR LIBDIR "%s" OSI_PATH_SEPARATOR,
if (!TRY_FILE(modulediroffs, "%s/R%s/" LIBDIR "%s/",
currentFilename, epicsRelease, targetArch))
/* filename = "<dirname>/[dirlen]<module>/[modulediroffs]<version>/R<epicsRelease>/lib/<targetArch>/" */
{
@@ -1520,12 +1525,12 @@ static int require_priv(const char* module, const char* version, const char* arg
versionstr = "";
/* founddir = "<dirname>/[dirlen]<module>/<version>" */
printf ("Module %s version %s found in %s" OSI_PATH_SEPARATOR "\n", module, found, founddir);
printf ("Module %s version %s found in %s/\n", module, found, founddir);
if (requireDebug)
printf("require: looking for dependency file\n");
if (!TRY_FILE(0, "%s" OSI_PATH_SEPARATOR "R%s" OSI_PATH_SEPARATOR "%n" LIBDIR "%s" OSI_PATH_SEPARATOR "%n%s.dep",
if (!TRY_FILE(0, "%s/R%s/%n" LIBDIR "%s/%n%s.dep",
founddir, epicsRelease, &releasediroffs, targetArch, &libdiroffs, module))
/* filename = "<dirname>/[dirlen]<module>/<version>/R<epicsRelease>/[releasediroffs]/lib/<targetArch>/[libdiroffs]/module.dep" */
{
@@ -1582,11 +1587,11 @@ loadlib:
}
/* load dbd file */
if (TRY_NONEMPTY_FILE(releasediroffs, "dbd" OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) ||
if (TRY_NONEMPTY_FILE(releasediroffs, "dbd/%s%s.dbd", module, versionstr) ||
TRY_NONEMPTY_FILE(releasediroffs, "%s%s.dbd", module, versionstr) ||
TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) ||
TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) ||
TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s.dbd", module)) /* org EPICSbase */
TRY_NONEMPTY_FILE(releasediroffs, "../dbd/%s%s.dbd", module, versionstr) ||
TRY_NONEMPTY_FILE(releasediroffs, "../%s%s.dbd", module, versionstr) ||
TRY_NONEMPTY_FILE(releasediroffs, "../../dbd/%s.dbd", module)) /* org EPICSbase */
{
printf("Loading dbd file %s\n", filename);
if (dbLoadDatabase(filename, NULL, NULL) != 0)
@@ -1632,7 +1637,7 @@ loadlib:
printf("require: looking for template directory\n");
/* filename = "<dirname>/<module>/<version>/R<epicsRelease>/[releasediroffs]..." */
if (!((TRY_FILE(releasediroffs, TEMPLATEDIR) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR TEMPLATEDIR)) && setupDbPath(module, filename) == 0))
TRY_FILE(releasediroffs, "../" TEMPLATEDIR)) && setupDbPath(module, filename) == 0))
{
/* if no template directory found, restore TEMPLATES to initial value */
char *t;
@@ -1648,41 +1653,41 @@ loadlib:
printf("require: looking for startup script\n");
/* filename = "<dirname>/<module>/<version>/R<epicsRelease>/[releasediroffs]db" */
if (TRY_FILE(releasediroffs, "%s-%s.iocsh", targetArch, epicsRelease) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", targetArch, epicsRelease) ||
TRY_FILE(releasediroffs, "../" "%s-%s.iocsh", targetArch, epicsRelease) ||
TRY_FILE(releasediroffs, "%s-%s.cmd", targetArch, epicsRelease) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", targetArch, epicsRelease) ||
TRY_FILE(releasediroffs, "../%s-%s.cmd", targetArch, epicsRelease) ||
TRY_FILE(releasediroffs, "%s-%s.iocsh", targetArch, epicsBasetype) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", targetArch, epicsBasetype) ||
TRY_FILE(releasediroffs, "../%s-%s.iocsh", targetArch, epicsBasetype) ||
TRY_FILE(releasediroffs, "%s-%s.cmd", targetArch, epicsBasetype) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", targetArch, epicsBasetype) ||
TRY_FILE(releasediroffs, "../%s-%s.cmd", targetArch, epicsBasetype) ||
TRY_FILE(releasediroffs, "%s-%s.iocsh", osClass, epicsRelease) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", osClass, epicsRelease) ||
TRY_FILE(releasediroffs, "../%s-%s.iocsh", osClass, epicsRelease) ||
TRY_FILE(releasediroffs, "%s-%s.cmd", osClass, epicsRelease) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", osClass, epicsRelease) ||
TRY_FILE(releasediroffs, "../%s-%s.cmd", osClass, epicsRelease) ||
TRY_FILE(releasediroffs, "%s-%s.iocsh", osClass, epicsBasetype) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", osClass, epicsBasetype) ||
TRY_FILE(releasediroffs, "../%s-%s.iocsh", osClass, epicsBasetype) ||
TRY_FILE(releasediroffs, "%s-%s.cmd", osClass, epicsBasetype) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", osClass, epicsBasetype) ||
TRY_FILE(releasediroffs, "../%s-%s.cmd", osClass, epicsBasetype) ||
TRY_FILE(releasediroffs, "startup-%s.iocsh", epicsRelease) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.iocsh", epicsRelease) ||
TRY_FILE(releasediroffs, "../startup-%s.iocsh", epicsRelease) ||
TRY_FILE(releasediroffs, "startup-%s.cmd", epicsRelease) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.cmd", epicsRelease) ||
TRY_FILE(releasediroffs, "../startup-%s.cmd", epicsRelease) ||
TRY_FILE(releasediroffs, "startup-%s.iocsh", epicsBasetype) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.iocsh", epicsBasetype) ||
TRY_FILE(releasediroffs, "../startup-%s.iocsh", epicsBasetype) ||
TRY_FILE(releasediroffs, "startup-%s.cmd", epicsBasetype) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.cmd", epicsBasetype) ||
TRY_FILE(releasediroffs, "../startup-%s.cmd", epicsBasetype) ||
TRY_FILE(releasediroffs, "%s.iocsh", targetArch) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.iocsh", targetArch) ||
TRY_FILE(releasediroffs, "../%s.iocsh", targetArch) ||
TRY_FILE(releasediroffs, "%s.cmd", targetArch) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.cmd", targetArch) ||
TRY_FILE(releasediroffs, "../%s.cmd", targetArch) ||
TRY_FILE(releasediroffs, "%s.iocsh", osClass) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.iocsh", osClass) ||
TRY_FILE(releasediroffs, "../%s.iocsh", osClass) ||
TRY_FILE(releasediroffs, "%s.cmd", osClass) ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.cmd", osClass) ||
TRY_FILE(releasediroffs, "../%s.cmd", osClass) ||
TRY_FILE(releasediroffs, "startup.iocsh") ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup.iocsh") ||
TRY_FILE(releasediroffs, "../startup.iocsh") ||
TRY_FILE(releasediroffs, "startup.cmd") ||
TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup.cmd")
TRY_FILE(releasediroffs, "../startup.cmd")
)
{
if (args)
+5 -6
View File
@@ -34,7 +34,6 @@
#if (EPICSVER<31400)
extern char** ppGlobalEnviron;
#define OSI_PATH_SEPARATOR "/"
#define OSI_PATH_LIST_SEPARATOR ":"
extern volatile int interruptAccept;
@@ -61,13 +60,13 @@ int isAbsPath(const char* filename)
return 1;
/* driver letter, e.g. "C:\Temp" */
else if (strlen(filename) > 3
&& ((filename[0]>='a'&&filename[0]<='z') || (filename[0]>='A'&&filename[0]<='Z'))
&& isalpha(filename[0])
&& filename[1] == ':')
return 1;
else
return 0;
#else
return filename[0] == OSI_PATH_SEPARATOR[0] ? 1 : 0;
return filename[0] == '/' ? 1 : 0;
#endif
}
@@ -165,13 +164,13 @@ int runScript(const char* filename, const char* args)
for (dirname = path; dirname != NULL; dirname = end)
{
end = strchr(dirname, OSI_PATH_LIST_SEPARATOR[0]);
if (end && end[1] == OSI_PATH_SEPARATOR[0] && end[2] == OSI_PATH_SEPARATOR[0]) /* "http://..." and friends */
if (end && end[1] == '/' && end[2] == '/') /* "http://..." and friends */
end = strchr(end+2, OSI_PATH_LIST_SEPARATOR[0]);
if (end) dirlen = (int)(end++ - dirname);
else dirlen = (int)strlen(dirname);
if (dirlen == 0) continue; /* ignore empty path elements */
if (dirname[dirlen-1] == OSI_PATH_SEPARATOR[0]) dirlen--;
asprintf(&fullname, "%.*s" OSI_PATH_SEPARATOR "%s",
if (dirname[dirlen-1] == '/') dirlen--;
asprintf(&fullname, "%.*s/%s",
dirlen, dirname, filename);
if (runScriptDebug)
printf("runScript: trying %s\n", fullname);