1173 return path_buf; |
1173 return path_buf; |
1174 } else { |
1174 } else { |
1175 path_buf[0] = '\0'; |
1175 path_buf[0] = '\0'; |
1176 return path_buf; |
1176 return path_buf; |
1177 } |
1177 } |
1178 } |
|
1179 |
|
1180 static bool file_exists(const char* filename) { |
|
1181 if (filename == NULL || strlen(filename) == 0) { |
|
1182 return false; |
|
1183 } |
|
1184 return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; |
|
1185 } |
|
1186 |
|
1187 bool os::dll_build_name(char *buffer, size_t buflen, |
|
1188 const char* pname, const char* fname) { |
|
1189 bool retval = false; |
|
1190 const size_t pnamelen = pname ? strlen(pname) : 0; |
|
1191 const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0; |
|
1192 |
|
1193 // Return error on buffer overflow. |
|
1194 if (pnamelen + strlen(fname) + 10 > buflen) { |
|
1195 return retval; |
|
1196 } |
|
1197 |
|
1198 if (pnamelen == 0) { |
|
1199 jio_snprintf(buffer, buflen, "%s.dll", fname); |
|
1200 retval = true; |
|
1201 } else if (c == ':' || c == '\\') { |
|
1202 jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname); |
|
1203 retval = true; |
|
1204 } else if (strchr(pname, *os::path_separator()) != NULL) { |
|
1205 int n; |
|
1206 char** pelements = split_path(pname, &n); |
|
1207 if (pelements == NULL) { |
|
1208 return false; |
|
1209 } |
|
1210 for (int i = 0; i < n; i++) { |
|
1211 char* path = pelements[i]; |
|
1212 // Really shouldn't be NULL, but check can't hurt |
|
1213 size_t plen = (path == NULL) ? 0 : strlen(path); |
|
1214 if (plen == 0) { |
|
1215 continue; // skip the empty path values |
|
1216 } |
|
1217 const char lastchar = path[plen - 1]; |
|
1218 if (lastchar == ':' || lastchar == '\\') { |
|
1219 jio_snprintf(buffer, buflen, "%s%s.dll", path, fname); |
|
1220 } else { |
|
1221 jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname); |
|
1222 } |
|
1223 if (file_exists(buffer)) { |
|
1224 retval = true; |
|
1225 break; |
|
1226 } |
|
1227 } |
|
1228 // release the storage |
|
1229 for (int i = 0; i < n; i++) { |
|
1230 if (pelements[i] != NULL) { |
|
1231 FREE_C_HEAP_ARRAY(char, pelements[i]); |
|
1232 } |
|
1233 } |
|
1234 if (pelements != NULL) { |
|
1235 FREE_C_HEAP_ARRAY(char*, pelements); |
|
1236 } |
|
1237 } else { |
|
1238 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname); |
|
1239 retval = true; |
|
1240 } |
|
1241 return retval; |
|
1242 } |
1178 } |
1243 |
1179 |
1244 // Needs to be in os specific directory because windows requires another |
1180 // Needs to be in os specific directory because windows requires another |
1245 // header file <direct.h> |
1181 // header file <direct.h> |
1246 const char* os::get_current_directory(char *buf, size_t buflen) { |
1182 const char* os::get_current_directory(char *buf, size_t buflen) { |