• R/O
  • SSH

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revision42df141c8934e1a50de185a22592ee4cf5f7bc7a (tree)
Zeit2013-12-27 17:37:16
Autorzolgear <>
Commiterzolgear <>

Log Message

cyglaunch が 64bit Cygwin を検出した場合, cygterm64.exe を優先的に起動するようにした。
cyglaunch を立ち上げた時,カレントディレクトリから cygterm が起動するようにした。
cygwin 上から cyglaunch が起動できないのを修正

Ändern Zusammenfassung

Diff

diff -r d3fd0dd5980f -r 42df141c8934 Makefile
--- a/Makefile Fri Dec 27 17:34:32 2013 +0900
+++ b/Makefile Fri Dec 27 17:37:16 2013 +0900
@@ -1,6 +1,7 @@
11 # Makefile for CygTerm
22
33 BINDIR = $(HOME)/bin
4+ARCH = $(shell arch)
45
56 CC = gcc
67 CFLAGS = -O2 -fno-exceptions
@@ -10,6 +11,11 @@
1011 LAUNCH = cyglaunch.exe
1112 LAUNCH_SRC = cyglaunch.c
1213 EXE = cygterm.exe
14+ifeq ($(ARCH),x86_64)
15+OUT = $(EXE:.exe=64.exe)
16+else
17+OUT = $(EXE:.exe=.exe)
18+endif
1319 SRC = $(EXE:.exe=.cc)
1420 CFG = $(EXE:.exe=.cfg)
1521 RES = $(EXE:.exe=.res)
@@ -23,11 +29,11 @@
2329
2430 $(EXE) : $(SRC) $(RES)
2531 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)
2733 else
28- $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(SRC) $(RES)
34+ $(CC) $(CFLAGS) $(LDFLAGS) -o $(OUT) $(SRC) $(RES)
2935 endif
30- strip $(EXE)
36+ strip $(OUT)
3137
3238 $(LAUNCH) : $(LAUNCH_SRC) $(RES)
3339 @# gcc 4.3.2? or later doesn't support "-mno-cygwin" flag.
@@ -51,16 +57,16 @@
5157 windres -O coff -o $(RES) $(RC)
5258
5359 clean :
54- rm -f $(EXE) $(RC) $(RES) $(LAUNCH) $(ARCHIVE)
60+ rm -f $(EXE) $(OUT) $(RC) $(RES) $(LAUNCH) $(ARCHIVE)
5561
5662 install : $(EXE)
57- @ install -v $(EXE) $(BINDIR)/$(EXE)
63+ @ install -v $(OUT) $(BINDIR)/$(OUT)
5864 @ if [ ! -f $(BINDIR)/$(CFG) ]; then \
5965 install -v $(CFG) $(BINDIR)/$(CFG) \
6066 ; fi
6167
6268 uninstall :
63- rm -f $(BINDIR)/$(EXE)
69+ rm -f $(BINDIR)/$(OUT)
6470 rm -f $(BINDIR)/$(CFG)
6571
6672 $(ARCHIVE) : $(SRC) $(ICO) $(CFG) $(LAUNCH_SRC) README README-j Makefile
diff -r d3fd0dd5980f -r 42df141c8934 README
--- a/README Fri Dec 27 17:34:32 2013 +0900
+++ b/README Fri Dec 27 17:37:16 2013 +0900
@@ -266,6 +266,12 @@
266266 zsh 4.3.10
267267
268268 // 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+
269275 v1.07_24 2013/08/15 (by maya)
270276 * Support for 64bit Cygwin.
271277
diff -r d3fd0dd5980f -r 42df141c8934 README-j
--- a/README-j Fri Dec 27 17:34:32 2013 +0900
+++ b/README-j Fri Dec 27 17:37:16 2013 +0900
@@ -278,6 +278,13 @@
278278 zsh 4.3.10
279279
280280 // 変 更 履 歴 //
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+
281288 v1.07_24 2013/08/15 (by maya)
282289 * 64bit Cygwin でも動作するようにした。
283290
diff -r d3fd0dd5980f -r 42df141c8934 cyglaunch.c
--- a/cyglaunch.c Fri Dec 27 17:34:32 2013 +0900
+++ b/cyglaunch.c Fri Dec 27 17:37:16 2013 +0900
@@ -10,8 +10,14 @@
1010 //
1111
1212 #include <windows.h>
13+#include <winnt.h>
1314 #include <stdio.h>
1415 #include <stdlib.h>
16+#ifndef NO_WIN_MAIN
17+#include <unistd.h>
18+#else
19+#include <direct.h>
20+#endif
1521
1622
1723 #define Section "Tera Term"
@@ -19,17 +25,58 @@
1925
2026
2127 //
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+//
2268 // Connect to local cygwin
2369 //
24-void OnCygwinConnection(char *CygwinDirectory, char *cmdline)
70+void OnCygwinConnection(char *CygwinDirectory, char *cmdline, char *curdir)
2571 {
2672 char file[MAX_PATH];
2773 char c, *envptr, *envbuff;
2874 int envbufflen;
29- char *exename = "cygterm.exe";
75+ char *exename[] = { "cygterm64.exe", "cygterm.exe" };
3076 char cmd[1024];
3177 STARTUPINFO si;
3278 PROCESS_INFORMATION pi;
79+ int i;
3380
3481 envptr = getenv("PATH");
3582 if (strstr(envptr, "cygwin\\bin") != NULL) {
@@ -74,20 +121,29 @@
74121
75122 found_path:;
76123 memset(&si, 0, sizeof(si));
77- GetStartupInfo(&si);
124+ si.cb = sizeof(si);
78125 memset(&pi, 0, sizeof(pi));
79126
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);
83133 //printf("%s", cmd);
84134 //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)) {
91147 MessageBox(NULL, "Can't execute Cygterm.", "ERROR", MB_OK | MB_ICONWARNING);
92148 }
93149 }
@@ -96,10 +152,13 @@
96152 int main(int argc, char** argv)
97153 {
98154 char Temp[256], CygwinDir[256], Cmdline[256];
155+ char CurDir[MAX_PATH + 1];
156+ char *retdir;
99157 char *bs;
100158 int i;
101159 BOOL d_opt=FALSE;
102160
161+ retdir = _getcwd(CurDir, sizeof(CurDir));
103162 if (GetModuleFileName(NULL, Temp, sizeof(Temp)) > 0 &&
104163 (bs = strrchr(Temp, '\\')) != NULL) {
105164 *bs = 0;
@@ -135,7 +194,14 @@
135194 }
136195 //printf("%s\n", Cmdline);
137196
138- OnCygwinConnection(CygwinDir, Cmdline);
197+ OnCygwinConnection(CygwinDir, Cmdline, retdir);
139198
140199 return 0;
141200 }
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