Revision | 42df141c8934e1a50de185a22592ee4cf5f7bc7a (tree) |
---|---|
Zeit | 2013-12-27 17:37:16 |
Autor | zolgear <> |
Commiter | zolgear <> |
cyglaunch が 64bit Cygwin を検出した場合, cygterm64.exe を優先的に起動するようにした。
cyglaunch を立ち上げた時,カレントディレクトリから cygterm が起動するようにした。
cygwin 上から cyglaunch が起動できないのを修正
@@ -1,6 +1,7 @@ | ||
1 | 1 | # Makefile for CygTerm |
2 | 2 | |
3 | 3 | BINDIR = $(HOME)/bin |
4 | +ARCH = $(shell arch) | |
4 | 5 | |
5 | 6 | CC = gcc |
6 | 7 | CFLAGS = -O2 -fno-exceptions |
@@ -10,6 +11,11 @@ | ||
10 | 11 | LAUNCH = cyglaunch.exe |
11 | 12 | LAUNCH_SRC = cyglaunch.c |
12 | 13 | EXE = cygterm.exe |
14 | +ifeq ($(ARCH),x86_64) | |
15 | +OUT = $(EXE:.exe=64.exe) | |
16 | +else | |
17 | +OUT = $(EXE:.exe=.exe) | |
18 | +endif | |
13 | 19 | SRC = $(EXE:.exe=.cc) |
14 | 20 | CFG = $(EXE:.exe=.cfg) |
15 | 21 | RES = $(EXE:.exe=.res) |
@@ -23,11 +29,11 @@ | ||
23 | 29 | |
24 | 30 | $(EXE) : $(SRC) $(RES) |
25 | 31 | ifeq (0, $(shell nm /usr/lib/crt0.o | grep -c WinMainCRTStartup)) |
26 | - $(CC) $(CFLAGS) $(LDFLAGS) -DNO_WIN_MAIN -o $(EXE) $(SRC) $(RES) | |
32 | + $(CC) $(CFLAGS) $(LDFLAGS) -DNO_WIN_MAIN -o $(OUT) $(SRC) $(RES) | |
27 | 33 | else |
28 | - $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(SRC) $(RES) | |
34 | + $(CC) $(CFLAGS) $(LDFLAGS) -o $(OUT) $(SRC) $(RES) | |
29 | 35 | endif |
30 | - strip $(EXE) | |
36 | + strip $(OUT) | |
31 | 37 | |
32 | 38 | $(LAUNCH) : $(LAUNCH_SRC) $(RES) |
33 | 39 | @# gcc 4.3.2? or later doesn't support "-mno-cygwin" flag. |
@@ -51,16 +57,16 @@ | ||
51 | 57 | windres -O coff -o $(RES) $(RC) |
52 | 58 | |
53 | 59 | clean : |
54 | - rm -f $(EXE) $(RC) $(RES) $(LAUNCH) $(ARCHIVE) | |
60 | + rm -f $(EXE) $(OUT) $(RC) $(RES) $(LAUNCH) $(ARCHIVE) | |
55 | 61 | |
56 | 62 | install : $(EXE) |
57 | - @ install -v $(EXE) $(BINDIR)/$(EXE) | |
63 | + @ install -v $(OUT) $(BINDIR)/$(OUT) | |
58 | 64 | @ if [ ! -f $(BINDIR)/$(CFG) ]; then \ |
59 | 65 | install -v $(CFG) $(BINDIR)/$(CFG) \ |
60 | 66 | ; fi |
61 | 67 | |
62 | 68 | uninstall : |
63 | - rm -f $(BINDIR)/$(EXE) | |
69 | + rm -f $(BINDIR)/$(OUT) | |
64 | 70 | rm -f $(BINDIR)/$(CFG) |
65 | 71 | |
66 | 72 | $(ARCHIVE) : $(SRC) $(ICO) $(CFG) $(LAUNCH_SRC) README README-j Makefile |
@@ -266,6 +266,12 @@ | ||
266 | 266 | zsh 4.3.10 |
267 | 267 | |
268 | 268 | // C H A N G E S // |
269 | +v1.07_24.mod 2013/12/27 (by xax_jp) | |
270 | + * cygterm64.exe is launch preferentially the case where cyglaunch detected 64bit Cygwin. | |
271 | + * cygterm startup from a current directory by cyglaunch. | |
272 | + * fixed cyglaunch does not launch from on cygwin. | |
273 | + | |
274 | + | |
269 | 275 | v1.07_24 2013/08/15 (by maya) |
270 | 276 | * Support for 64bit Cygwin. |
271 | 277 |
@@ -278,6 +278,13 @@ | ||
278 | 278 | zsh 4.3.10 |
279 | 279 | |
280 | 280 | // 変 更 履 歴 // |
281 | +v1.07_24.mod 2013/12/27 (by xax_jp) | |
282 | + * cyglaunch が 64bit Cygwin を検出した場合, cygterm64.exe を | |
283 | + 優先的に起動するようにした。 | |
284 | + * cyglaunch を立ち上げた時,カレントディレクトリから cygterm が | |
285 | + 起動するようにした。 | |
286 | + * cygwin 上から cyglaunch が起動できないのを修正 | |
287 | + | |
281 | 288 | v1.07_24 2013/08/15 (by maya) |
282 | 289 | * 64bit Cygwin でも動作するようにした。 |
283 | 290 |
@@ -10,8 +10,14 @@ | ||
10 | 10 | // |
11 | 11 | |
12 | 12 | #include <windows.h> |
13 | +#include <winnt.h> | |
13 | 14 | #include <stdio.h> |
14 | 15 | #include <stdlib.h> |
16 | +#ifndef NO_WIN_MAIN | |
17 | +#include <unistd.h> | |
18 | +#else | |
19 | +#include <direct.h> | |
20 | +#endif | |
15 | 21 | |
16 | 22 | |
17 | 23 | #define Section "Tera Term" |
@@ -19,17 +25,58 @@ | ||
19 | 25 | |
20 | 26 | |
21 | 27 | // |
28 | +// Get Cygwin architecture | |
29 | +// | |
30 | +WORD GetCygwinArch(const char *CygDir) | |
31 | +{ | |
32 | + WORD result = IMAGE_FILE_MACHINE_UNKNOWN; | |
33 | + char cygdll[MAX_PATH]; | |
34 | + FILE *fp = NULL; | |
35 | + IMAGE_DOS_HEADER DosHeader; | |
36 | + IMAGE_NT_HEADERS32 Cygwin1DllHeader; | |
37 | + | |
38 | + strcpy(cygdll, CygDir); | |
39 | + strcat(cygdll, "\\bin\\cygwin1.dll"); | |
40 | + | |
41 | + // Get PE header | |
42 | + fp = fopen(cygdll, "r"); | |
43 | + if(fp == NULL) { | |
44 | + goto finally; | |
45 | + } | |
46 | + if(fread(&DosHeader, sizeof(DosHeader), 1, fp) < 1) { | |
47 | + goto finally; | |
48 | + } | |
49 | + if(fseek(fp, DosHeader.e_lfanew, SEEK_SET) != 0) { | |
50 | + goto finally; | |
51 | + } | |
52 | + if(fread(&Cygwin1DllHeader, sizeof(Cygwin1DllHeader), 1, fp) < 1) { | |
53 | + goto finally; | |
54 | + } | |
55 | + | |
56 | + // check architecture | |
57 | + result = Cygwin1DllHeader.FileHeader.Machine; | |
58 | + | |
59 | +finally: | |
60 | + if(fp != NULL) { | |
61 | + fclose(fp); | |
62 | + } | |
63 | + return result; | |
64 | +} | |
65 | + | |
66 | + | |
67 | +// | |
22 | 68 | // Connect to local cygwin |
23 | 69 | // |
24 | -void OnCygwinConnection(char *CygwinDirectory, char *cmdline) | |
70 | +void OnCygwinConnection(char *CygwinDirectory, char *cmdline, char *curdir) | |
25 | 71 | { |
26 | 72 | char file[MAX_PATH]; |
27 | 73 | char c, *envptr, *envbuff; |
28 | 74 | int envbufflen; |
29 | - char *exename = "cygterm.exe"; | |
75 | + char *exename[] = { "cygterm64.exe", "cygterm.exe" }; | |
30 | 76 | char cmd[1024]; |
31 | 77 | STARTUPINFO si; |
32 | 78 | PROCESS_INFORMATION pi; |
79 | + int i; | |
33 | 80 | |
34 | 81 | envptr = getenv("PATH"); |
35 | 82 | if (strstr(envptr, "cygwin\\bin") != NULL) { |
@@ -74,20 +121,29 @@ | ||
74 | 121 | |
75 | 122 | found_path:; |
76 | 123 | memset(&si, 0, sizeof(si)); |
77 | - GetStartupInfo(&si); | |
124 | + si.cb = sizeof(si); | |
78 | 125 | memset(&pi, 0, sizeof(pi)); |
79 | 126 | |
80 | - strcpy(cmd, exename); | |
81 | - strcat(cmd, " "); | |
82 | - strncat(cmd, cmdline, sizeof(cmd)-strlen(cmd)-1); | |
127 | + for(i = (GetCygwinArch(CygwinDirectory) == IMAGE_FILE_MACHINE_AMD64 ? 0 : 1); | |
128 | + i < _countof(exename); | |
129 | + i++) { | |
130 | + strcpy(cmd, exename[i]); | |
131 | + strcat(cmd, " "); | |
132 | + strncat(cmd, cmdline, sizeof(cmd)-strlen(cmd)-1); | |
83 | 133 | //printf("%s", cmd); |
84 | 134 | //MessageBox(NULL, cmd, "", MB_OK); |
85 | - if (CreateProcess( | |
86 | - NULL, | |
87 | - cmd, | |
88 | - NULL, NULL, FALSE, 0, | |
89 | - NULL, NULL, | |
90 | - &si, &pi) == 0) { | |
135 | + if (CreateProcess( | |
136 | + NULL, | |
137 | + cmd, | |
138 | + NULL, NULL, FALSE, 0, | |
139 | + NULL, curdir, | |
140 | + &si, &pi)) { | |
141 | + CloseHandle(pi.hProcess); | |
142 | + CloseHandle(pi.hThread); | |
143 | + break; | |
144 | + } | |
145 | + } | |
146 | + if (i >= _countof(exename)) { | |
91 | 147 | MessageBox(NULL, "Can't execute Cygterm.", "ERROR", MB_OK | MB_ICONWARNING); |
92 | 148 | } |
93 | 149 | } |
@@ -96,10 +152,13 @@ | ||
96 | 152 | int main(int argc, char** argv) |
97 | 153 | { |
98 | 154 | char Temp[256], CygwinDir[256], Cmdline[256]; |
155 | + char CurDir[MAX_PATH + 1]; | |
156 | + char *retdir; | |
99 | 157 | char *bs; |
100 | 158 | int i; |
101 | 159 | BOOL d_opt=FALSE; |
102 | 160 | |
161 | + retdir = _getcwd(CurDir, sizeof(CurDir)); | |
103 | 162 | if (GetModuleFileName(NULL, Temp, sizeof(Temp)) > 0 && |
104 | 163 | (bs = strrchr(Temp, '\\')) != NULL) { |
105 | 164 | *bs = 0; |
@@ -135,7 +194,14 @@ | ||
135 | 194 | } |
136 | 195 | //printf("%s\n", Cmdline); |
137 | 196 | |
138 | - OnCygwinConnection(CygwinDir, Cmdline); | |
197 | + OnCygwinConnection(CygwinDir, Cmdline, retdir); | |
139 | 198 | |
140 | 199 | return 0; |
141 | 200 | } |
201 | + | |
202 | +#ifdef NO_WIN_MAIN | |
203 | +// This program is an Win32 application but, start as Cygwin main(). | |
204 | +//------------------------------------------------------------------ | |
205 | +void mainCRTStartup(void); | |
206 | +void WinMainCRTStartup(void) { mainCRTStartup(); } | |
207 | +#endif |