comparison src/os/linux/vm/os_linux.cpp @ 691:956304450e80

6819213: revive sun.boot.library.path Summary: Support multiplex and mutable sun.boot.library.path Reviewed-by: acorn, dcubed, xlu
author phh
date Wed, 01 Apr 2009 16:38:01 -0400
parents 6bdd6923ba16
children 622212a69394
comparison
equal deleted inserted replaced
690:d142f1feeed5 691:956304450e80
1516 1516
1517 const char* os::dll_file_extension() { return ".so"; } 1517 const char* os::dll_file_extension() { return ".so"; }
1518 1518
1519 const char* os::get_temp_directory() { return "/tmp/"; } 1519 const char* os::get_temp_directory() { return "/tmp/"; }
1520 1520
1521 void os::dll_build_name( 1521 static bool file_exists(const char* filename) {
1522 char* buffer, size_t buflen, const char* pname, const char* fname) { 1522 struct stat statbuf;
1523 // copied from libhpi 1523 if (filename == NULL || strlen(filename) == 0) {
1524 return false;
1525 }
1526 return os::stat(filename, &statbuf) == 0;
1527 }
1528
1529 void os::dll_build_name(char* buffer, size_t buflen,
1530 const char* pname, const char* fname) {
1531 // Copied from libhpi
1524 const size_t pnamelen = pname ? strlen(pname) : 0; 1532 const size_t pnamelen = pname ? strlen(pname) : 0;
1525 1533
1526 /* Quietly truncate on buffer overflow. Should be an error. */ 1534 // Quietly truncate on buffer overflow. Should be an error.
1527 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { 1535 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1528 *buffer = '\0'; 1536 *buffer = '\0';
1529 return; 1537 return;
1530 } 1538 }
1531 1539
1532 if (pnamelen == 0) { 1540 if (pnamelen == 0) {
1533 sprintf(buffer, "lib%s.so", fname); 1541 snprintf(buffer, buflen, "lib%s.so", fname);
1542 } else if (strchr(pname, *os::path_separator()) != NULL) {
1543 int n;
1544 char** pelements = split_path(pname, &n);
1545 for (int i = 0 ; i < n ; i++) {
1546 // Really shouldn't be NULL, but check can't hurt
1547 if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
1548 continue; // skip the empty path values
1549 }
1550 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
1551 if (file_exists(buffer)) {
1552 break;
1553 }
1554 }
1555 // release the storage
1556 for (int i = 0 ; i < n ; i++) {
1557 if (pelements[i] != NULL) {
1558 FREE_C_HEAP_ARRAY(char, pelements[i]);
1559 }
1560 }
1561 if (pelements != NULL) {
1562 FREE_C_HEAP_ARRAY(char*, pelements);
1563 }
1534 } else { 1564 } else {
1535 sprintf(buffer, "%s/lib%s.so", pname, fname); 1565 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
1536 } 1566 }
1537 } 1567 }
1538 1568
1539 const char* os::get_current_directory(char *buf, int buflen) { 1569 const char* os::get_current_directory(char *buf, int buflen) {
1540 return getcwd(buf, buflen); 1570 return getcwd(buf, buflen);