⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paths.cpp

📁 RESIN 3.2 最新源码
💻 CPP
字号:
/* * Copyright (c) 1999-2006 Caucho Technology.  All rights reserved. * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */#include <windows.h>#include <stdio.h>#include "process.h"#include "stdlib.h"#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <stdarg.h>#include <io.h>#include <fcntl.h>#include "common.h"#define HKEY_JRE "Software\\JavaSoft\\Java Runtime Environment"#define HKEY_JDK "Software\\JavaSoft\\Java Development Kit"#define HKEY_VERSION "CurrentVersion"#define HKEY_11 "1.1"#define HKEY_12 "1.2"#define HKEY_JAVA_HOME "JavaHome"#define HKEY_RESIN_OLD "Software\\Caucho Technology\\Resin\\1.1"#define HKEY_RESIN "Software\\Caucho Technology\\Resin\\CurrentVersion"#define HKEY_RESIN_HOME "Resin Home"#define BUF_SIZE (32 * 1024)extern void install_service(char *name);extern void remove_service(char *name);static int g_is_dead = 0;static int g_keepalive_fd = -1;FILE *out = stdout;FILE *err = stderr;voidlog(char *fmt, ...){#ifdef DEBUG	va_list arg;	va_start(arg, fmt);	if (0 && err) {		if (fmt)			vfprintf(err, fmt, arg);		fflush(err);	}	else {		FILE *file = fopen("e:/temp/foo.log", "a+");		if (file && fmt) {			vfprintf(file, fmt, arg);			fclose(file);		}	}	va_end(arg);#endif}char *rsprintf(char *buf, char *fmt, ...){	va_list args;		va_start(args, fmt);	vsprintf(buf, fmt, args);	va_end(args);	return buf;}static char *canonicalize(char *a){	if (! a)		return 0;	char *buf = (char *) malloc(strlen(a) + 1);	char *result = buf;	for (; *a; a++) {		if (*a == '/')			*buf++ = '\\';		else			*buf++ = *a;	}	*buf = 0;	if (*result && result[strlen(result) - 1] == '\\')		result[strlen(result) - 1] = 0;	return result;}char *concat(char *a, char *b){	char *buf = (char *) malloc(strlen(a) + strlen(b) + 1);	strcpy(buf, a);	strcat(buf, b);	return buf;}static char *find_path(char *exe){	char buf[BUF_SIZE];	char *path = getenv("PATH");	struct stat info;	if (! path)		return 0;	int head = 0;	while (path[head]) {		int i = 0;		int tail;		for (tail = head; path[tail] && path[tail] != ';'; tail++) {			buf[i++] = path[tail];		}		buf[i] = 0;		strcat(buf, "\\");		strcat(buf, exe);		if (! stat(buf, &info)) {			return strdup(buf);		}		head = path[tail] == ';' ? tail + 1 : tail;	}	return 0;}static char *get_canonical_path(char *path){	char buf[8192];	GetCurrentDirectory(sizeof buf, buf);	if (path[0] == '/' || path[0] == '\\') {		buf[2] = 0;		strcat(buf, path);	} else if ((path[0] >= 'a' && path[0] <= 'z' ||				path[0] >= 'A' && path[0] <= 'Z') && path[1] == ':') {		strcpy(buf, path);	} else {		strcat(buf, "\\");		strcat(buf, path);	}	for (int i = 0; buf[i]; i++) {		if (buf[i] == '/')			buf[i] = '\\';		// Collapse /./		if (buf[i] == '\\' && buf[i + 1] == '.' &&			(buf[i + 2] == 0 || buf[i + 2] == '/' || buf[i + 2] == '\\')) {			int j;			for (j = 0; buf[i + j + 2]; j++)				buf[i + j] = buf[i + j + 2];			buf[i + j] = 0;			i--;		} // Collapse /../ 		else if (buf[i] == '\\' && buf[i + 1] == '.' && buf[i + 2] == '.' &&			(buf[i + 3] == 0 || buf[i + 3] == '/' || buf[i + 3] == '\\')) {		    int j, k;			for (j = i - 1; j >= 0 && j != '\\'; j--) {			}			for (k = 0; buf[i + k + 3]; k++)				buf[j + k] = buf[i + k + 3];			buf[j + k] = 0;			i = j - 1;		}	}	return strdup(buf);}static char *get_parent(char *path){	char buf[BUF_SIZE];	int i;	strcpy(buf, path);	for (i = strlen(path) - 1; i >= 0 && buf[i] != '\\'; i--) {	}	buf[i] = 0;	return strdup(buf);}static char *reg_query_string(HKEY key, char *subkey, char *value){	char buf[BUF_SIZE];	DWORD len = sizeof buf;	DWORD type;	int rc = RegQueryValueEx(key, subkey, 0, &type, (LPBYTE) buf, &len);	if (rc != ERROR_SUCCESS || type != REG_SZ)		return 0;	strcpy(value, buf);	return value;}static HKEYreg_lookup(HKEY hkey, char *path){	HKEY newKey;	DWORD rc;	rc = RegOpenKeyEx(hkey, path, 0, KEY_QUERY_VALUE, &newKey);	if (rc != ERROR_SUCCESS)		return 0;	return newKey;}static char *find_jdk_registry(char *jdk){	HKEY hKeyJdk;	char buf[BUF_SIZE];	HKEY hKeyVersion = 0;		if (! (hKeyJdk = reg_lookup(HKEY_LOCAL_MACHINE, jdk)))		return 0;	if (reg_query_string(hKeyJdk, HKEY_VERSION, buf)) {		hKeyVersion = reg_lookup(hKeyJdk, buf);	}	else if ((hKeyVersion = reg_lookup(hKeyJdk, HKEY_12))) {	}	else if ((hKeyVersion = reg_lookup(hKeyJdk, HKEY_11))) {	}	if (! hKeyVersion)		return 0;	if (! reg_query_string(hKeyVersion, HKEY_JAVA_HOME, buf))		return 0;	return strdup(buf);}char *add_classpath(char *cp, char *path){  if (*path == '"')    path++;    if (! cp)    cp = strdup(path);  else {    char *buf = (char *) malloc(strlen(cp) + strlen(path) + 5);    strcpy(buf, cp);    strcat(buf, ";");    strcat(buf, path);    free(cp);    cp = buf;  }  if (cp[strlen(cp) - 1] == '"')    cp[strlen(cp) - 1] = 0;  return cp;}char *get_java_home(char *resin_home, char *java_home){	char buf[BUF_SIZE];	struct stat info;	char *path;	if (java_home) {	}	else if (getenv("JAVA_HOME")) {		java_home = canonicalize(getenv("JAVA_HOME"));	}	else if ((java_home = find_jdk_registry(HKEY_JDK))) {	}	else if ((java_home = find_jdk_registry(HKEY_JRE))) {	}	else if (! stat(rsprintf(buf, "%s\\jre\\bin\\java.exe", resin_home), &info)) {		java_home = strdup(rsprintf(buf, "%s\\jre", resin_home));	}	else if ((path = find_path("java.exe"))) {		path = get_canonical_path(path);		path = get_parent(get_parent(path));		if (! stat(rsprintf(buf, "%s\\bin\\java.exe", path), &info))			java_home = path;	}	else if ((path = find_path("jre.exe"))) {		path = get_canonical_path(path);		path = get_parent(get_parent(path));		if (! stat(rsprintf(buf, "%s\\bin\\jre.exe", path), &info))			java_home = path;	}	if (! java_home && ! stat("\\java\\lib", &info)) {		java_home = "\\java";	}	if (! java_home && ! stat("\\jre\\lib", &info)) {		java_home = "\\jre";	}	if (! java_home) {		WIN32_FIND_DATA dir;		HANDLE hSearch;		hSearch = FindFirstFile("\\jdk*", &dir);		if (hSearch != INVALID_HANDLE_VALUE) {			do {				if (! stat(rsprintf(buf, "\\%s\\bin\\java.exe", dir.cFileName), &info)) {					char *test_dir = concat("\\", dir.cFileName);					if (! java_home || strcmp(java_home, test_dir) < 0)						java_home = test_dir;				}			} while (FindNextFile(hSearch, &dir));		}		hSearch = FindFirstFile("\\program files\\java\\jdk*", &dir);		if (hSearch != INVALID_HANDLE_VALUE) {			do {				if (! stat(rsprintf(buf, "\\%s\\bin\\java.exe", dir.cFileName), &info)) {					char *test_dir = concat("\\", dir.cFileName);					if (! java_home || strcmp(java_home, test_dir) < 0)						java_home = test_dir;				}			} while (FindNextFile(hSearch, &dir));		}	}	if (! java_home) {		WIN32_FIND_DATA dir;		HANDLE hSearch;		hSearch = FindFirstFile("\\jre*", &dir);		if (hSearch != INVALID_HANDLE_VALUE) {			do {				if (! stat(rsprintf(buf, "\\%s\\bin\\jre.exe", dir.cFileName), &info)) {					char *test_dir = concat("\\", dir.cFileName);					if (! java_home || strcmp(java_home, test_dir) < 0)						java_home = test_dir;				}			} while (FindNextFile(hSearch, &dir));		}	}	return java_home;}static char *find_resin_registry(){	HKEY hKeyResin;	char buf[BUF_SIZE];		if (! (hKeyResin = reg_lookup(HKEY_LOCAL_MACHINE, HKEY_RESIN))) {		LOG(("can't find resin %s\n", HKEY_RESIN));		return 0;	}	if (reg_query_string(hKeyResin, HKEY_RESIN_HOME, buf)) {		LOG(("resin home %s\n", buf));		return strdup(buf);	}	else {		LOG(("can't find resin home\n"));		return 0;	}}char *get_resin_home(char *resin_home, char *path){	char *program = path;	char root[1024];	char buf[BUF_SIZE];	struct stat info;	if (resin_home)		return resin_home;	GetCurrentDirectory(sizeof(root), root);	root[2] = 0;	if (getenv("RESIN_HOME"))		return canonicalize(getenv("RESIN_HOME"));	path = get_canonical_path(path);	path = get_parent(path);	/*	 * These files must come first so starting Resin from its	 * directory will take precedence.	 */	if (! stat(rsprintf(buf, "%s\\lib\\resin.jar", path), &info))		return canonicalize(path);	path = get_parent(path);	/*	 * These files must come first so starting Resin from its	 * directory will take precedence.	 */	if (! stat(rsprintf(buf, "%s\\lib\\resin.jar", path), &info))		return canonicalize(path);	/*	 * XXX: This caused isapi_srun.dll to look at c:\resin	 * in preference to the value in the registry.	 *	 * if (! stat(wsprintf(buf, "%s\\resin\\conf\\resin.conf", root), &info))	 *	return canonicalize(wsprintf(buf, "%s\\resin", root));	 */	if ((resin_home = find_resin_registry()))		return canonicalize(resin_home);	WIN32_FIND_DATA dir;	HANDLE hSearch;	char *found_path = 0;	// Returns the last, i.e. most recent, version of Resin	hSearch = FindFirstFile(rsprintf(buf, "%s\\resin*", root), &dir);	if (hSearch != INVALID_HANDLE_VALUE) {		do {			if (! stat(rsprintf(buf, "%s\\%s\\lib\\resin.jar", root, dir.cFileName), &info)) {				found_path = canonicalize(rsprintf(buf, "%s\\%s", root, dir.cFileName));			}		} while (FindNextFile(hSearch, &dir));	}	if (found_path)		return found_path;	else		return canonicalize(resin_home);}char *set_classpath(char *cp, char *resin_home, char *java_home, char *env_classpath){	WIN32_FIND_DATA scanDir;	HANDLE hSearch;	char buf[BUF_SIZE];	struct stat info;	if (env_classpath)		cp = add_classpath(cp, env_classpath);	cp = add_classpath(cp, rsprintf(buf, "%s\\classes", resin_home));	cp = add_classpath(cp, rsprintf(buf, "%s\\lib\\resin.jar", resin_home));	if (java_home) {		if (! stat(rsprintf(buf, "%s\\lib\\classes.zip", java_home), &info))			cp = add_classpath(cp, rsprintf(buf, "%s\\lib\\classes.zip", java_home));		if (! stat(rsprintf(buf, "%s\\lib\\tools.jar", java_home), &info))			cp = add_classpath(cp, rsprintf(buf, "%s\\lib\\tools.jar", java_home));		if (! stat(rsprintf(buf, "%s\\jre\\lib\\rt.jar", java_home), &info))			cp = add_classpath(cp, rsprintf(buf, "%s\\jre\\lib\\rt.jar", java_home));		if (! stat(rsprintf(buf, "%s\\jre\\lib\\i18n.jar", java_home), &info))			cp = add_classpath(cp, rsprintf(buf, "%s\\jre\\lib\\i18n.jar", java_home));	}	hSearch = FindFirstFile(rsprintf(buf, "%s\\lib\\*.jar", resin_home), &scanDir);	if (hSearch != INVALID_HANDLE_VALUE) {		do {			if (strcmp(scanDir.cFileName, "resin.jar") &&			    strcmp(scanDir.cFileName, "jdk12.jar") &&			    strcmp(scanDir.cFileName, "servlet.jar") &&                            strcmp(scanDir.cFileName, "jsdk.jar"))				cp = add_classpath(cp, rsprintf(buf, "%s\\lib\\%s", resin_home, scanDir.cFileName));		} while (FindNextFile(hSearch, &scanDir));	}	hSearch = FindFirstFile(rsprintf(buf, "%s\\lib\\*.zip", resin_home), &scanDir);	if (hSearch != INVALID_HANDLE_VALUE) {		do {			cp = add_classpath(cp, rsprintf(buf, "%s\\lib\\%s", resin_home, scanDir.cFileName));		} while (FindNextFile(hSearch, &scanDir));	}	if (env_classpath)		cp = add_classpath(cp, env_classpath);        char *tail = cp + strlen(cp);        if (*cp && tail[-1] == '\\')          tail[-1] = 0;	return cp;}char *get_java_exe(char *java_home){	char buf[BUF_SIZE];	struct stat info;	if (! java_home)		return "jview.exe";	else if (! stat(rsprintf(buf, "%s\\bin\\java.exe", java_home), &info))		return concat(java_home, "\\bin\\java.exe");	else if (! stat(rsprintf(buf, "%s\\bin\\jre.exe", java_home), &info))		return concat(java_home, "\\bin\\jre.exe");	else if (! stat(rsprintf(buf, "%s\\jrockit.exe", java_home), &info))		return concat(java_home, "\\jrockit.exe");	else {		log("Can't find java executable in %s\n", java_home);		return 0;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -