hotspot/src/os/windows/vm/os_windows.cpp
changeset 47089 27050b653624
parent 47086 2b35673f6297
child 47106 bed18a111b90
equal deleted inserted replaced
47087:2279556f90ec 47089:27050b653624
  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) {