/* * 从给定目录中搜索与指定版本最匹配的jre安装路径 */ static char *ProcessDir(manifest_info *info, char *dirname) { DIR *dirp; struct dirent *dp; char *best = NULL; int offset; int best_offset = 0; char *ret_str = NULL; char buffer[PATH_MAX]; printf("%s[%d] [tid: %lu]: 开始从目录[%]中搜索安装的最佳jre版本...\n", __FILE__, __LINE__, pthread_self(), dirname); if ((dirp = opendir(dirname)) == NULL) return (NULL); do { if ((dp = readdir(dirp)) != NULL) { offset = 0; if ((JLI_StrNCmp(dp->d_name, "jre", 3) == 0) || (JLI_StrNCmp(dp->d_name, "jdk", 3) == 0)) offset = 3; else if (JLI_StrNCmp(dp->d_name, "j2re", 4) == 0) offset = 4; else if (JLI_StrNCmp(dp->d_name, "j2sdk", 5) == 0) offset = 5; if (offset > 0) { if ((JLI_AcceptableRelease(dp->d_name + offset, info->jre_version)) && CheckSanity(dirname, dp->d_name)){ if ((best == NULL) || (JLI_ExactVersionId( dp->d_name + offset, best + best_offset) > 0)) { if (best != NULL) JLI_MemFree(best); best = JLI_StringDup(dp->d_name); best_offset = offset; } } } } } while (dp != NULL); (void) closedir(dirp); if (best == NULL){ printf("%s[%d] [tid: %lu]: 目录[%]中没有找到合适的jre版本...\n", __FILE__, __LINE__, pthread_self(), dirname); return (NULL); } else { ret_str = JLI_MemAlloc(JLI_StrLen(dirname) + JLI_StrLen(best) + 2); sprintf(ret_str, "%s/%s", dirname, best); JLI_MemFree(best); printf("%s[%d] [tid: %lu]: 搜索到最合适的jre版本: %s...\n", __FILE__, __LINE__, pthread_self(), ret_str); return (ret_str); } }
/* * Determine if there is an acceptable JRE in the registry directory top_key. * Upon locating the "best" one, return a fully qualified path to it. * "Best" is defined as the most advanced JRE meeting the constraints * contained in the manifest_info. If no JRE in this directory meets the * constraints, return NULL. * * It doesn't matter if we get an error reading the registry, or we just * don't find anything interesting in the directory. We just return NULL * in either case. */ static char * ProcessDir(manifest_info* info, HKEY top_key) { DWORD index = 0; HKEY ver_key; char name[MAXNAMELEN]; int len; char *best = NULL; /* * Enumerate "<top_key>/SOFTWARE/JavaSoft/Java Runtime Environment" * searching for the best available version. */ while (RegEnumKey(top_key, index, name, MAXNAMELEN) == ERROR_SUCCESS) { index++; if (JLI_AcceptableRelease(name, info->jre_version)) if ((best == NULL) || (JLI_ExactVersionId(name, best) > 0)) { if (best != NULL) JLI_MemFree(best); best = JLI_StringDup(name); } } /* * Extract "JavaHome" from the "best" registry directory and return * that path. If no appropriate version was located, or there is an * error in extracting the "JavaHome" string, return null. */ if (best == NULL) return (NULL); else { if (RegOpenKeyEx(top_key, best, 0, KEY_READ, &ver_key) != ERROR_SUCCESS) { JLI_MemFree(best); if (ver_key != NULL) RegCloseKey(ver_key); return (NULL); } JLI_MemFree(best); len = MAXNAMELEN; if (RegQueryValueEx(ver_key, "JavaHome", NULL, NULL, (LPBYTE)name, &len) != ERROR_SUCCESS) { if (ver_key != NULL) RegCloseKey(ver_key); return (NULL); } if (ver_key != NULL) RegCloseKey(ver_key); return (JLI_StringDup(name)); } }