--- a/jdk/src/windows/demo/jvmti/hprof/hprof_md.c Sun Dec 02 16:37:31 2012 +0000
+++ b/jdk/src/windows/demo/jvmti/hprof/hprof_md.c Sun Dec 02 19:16:56 2012 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -367,28 +367,53 @@
return 0;
}
+static void dll_build_name(char* buffer, size_t buflen,
+ const char* pname, const char* fname) {
+ // Loosley based on os_windows.cpp
+
+ char *pathname = (char *)pname;
+ while (strlen(pathname) > 0) {
+ char *p = strchr(pathname, ';');
+ if (p == NULL) {
+ p = pathname + strlen(pathname);
+ }
+ /* check for NULL path */
+ if (p == pathname) {
+ continue;
+ }
+ if (*(p-1) == ':' || *(p-1) == '\\') {
+ (void)_snprintf(buffer, buflen, "%.*s%s.dll", (p - pathname),
+ pathname, fname);
+ } else {
+ (void)_snprintf(buffer, buflen, "%.*s\\%s.dll", (p - pathname),
+ pathname, fname);
+ }
+ if (_access(buffer, 0) == 0) {
+ break;
+ }
+ pathname = p + 1;
+ *buffer = '\0';
+ }
+}
+
/* Build a machine dependent library name out of a path and file name. */
void
md_build_library_name(char *holder, int holderlen, char *pname, char *fname)
{
int pnamelen;
- char c;
pnamelen = pname ? (int)strlen(pname) : 0;
- c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
+ *holder = '\0';
/* Quietly truncates on buffer overflow. Should be an error. */
if (pnamelen + strlen(fname) + 10 > (unsigned int)holderlen) {
- *holder = '\0';
return;
}
if (pnamelen == 0) {
sprintf(holder, "%s.dll", fname);
- } else if (c == ':' || c == '\\') {
- sprintf(holder, "%s%s.dll", pname, fname);
} else {
- sprintf(holder, "%s\\%s.dll", pname, fname);
+ dll_build_name(holder, holderlen, pname, fname);
}
}