2 * Copyright (c) 2001, Jan Nieuwenhuizen.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
13 * Jan Nieuwenhuizen <janneke@gnu.org>
17 /* The purpose of this file is to provide functions for the invocation
18 of install scripts. */
21 static const char *cvsid
=
30 #include "filemanip.h"
32 #include "io_stream.h"
34 static String sh
= String();
35 static const char *cmd
= 0;
36 static OSVERSIONINFO verinfo
;
38 static const char *shells
[] = {
49 for (int i
= 0; shells
[i
]; i
++)
51 sh
= backslash (cygpath (shells
[i
]));
52 if (_access (sh
.cstr_oneuse(), 0) == 0)
57 char old_path
[_MAX_PATH
];
58 GetEnvironmentVariable ("PATH", old_path
, sizeof (old_path
));
59 SetEnvironmentVariable ("PATH", backslash (cygpath ("/bin") + ";" +
60 cygpath ("/usr/bin") + ";" +
61 old_path
).cstr_oneuse());
62 SetEnvironmentVariable ("CYGWINROOT", get_root_dir ().cstr_oneuse());
64 verinfo
.dwOSVersionInfoSize
= sizeof (verinfo
);
65 GetVersionEx (&verinfo
);
67 switch (verinfo
.dwPlatformId
)
69 case VER_PLATFORM_WIN32_NT
:
72 case VER_PLATFORM_WIN32_WINDOWS
:
82 run (const char *sh
, const char *args
, const char *file
)
85 char cmdline
[_MAX_PATH
];
87 PROCESS_INFORMATION pi
;
89 sprintf (cmdline
, "%s %s %s", sh
, args
, file
);
90 memset (&pi
, 0, sizeof (pi
));
91 memset (&si
, 0, sizeof (si
));
93 si
.lpTitle
= (char *) "Cygwin Setup Post-Install Script";
94 si
.dwFlags
= STARTF_USEPOSITION
;
96 b
= CreateProcess (0, cmdline
, 0, 0, 0,
97 CREATE_NEW_CONSOLE
, 0, get_root_dir ().cstr_oneuse(), &si
, &pi
);
100 WaitForSingleObject (pi
.hProcess
, INFINITE
);
104 run_script (String
const &dir
, String
const &fname
)
106 char *ext
= strrchr (fname
.cstr_oneuse(), '.');
110 if (sh
.size() && strcmp (ext
, ".sh") == 0)
112 String f2
= dir
+ fname
;
113 log (LOG_PLAIN
, String ("running: ") + sh
+ " -c " + f2
);
114 run (sh
.cstr_oneuse(), "-c", f2
.cstr_oneuse());
116 else if (cmd
&& strcmp (ext
, ".bat") == 0)
118 String f2
= backslash (cygpath (dir
+ fname
));
119 log (LOG_PLAIN
, String ("running: ") + cmd
+ " /c " + f2
);
120 run (cmd
, "/c", f2
.cstr_oneuse());
125 /* if file exists then delete it otherwise just ignore no file error */
126 io_stream::remove (String ("cygfile://") + dir
+ fname
+ ".done");
128 io_stream::move (String ("cygfile://") + dir
+ fname
,
129 String ("cygfile://") + dir
+ fname
+ ".done");
133 try_run_script (String
const &dir
, String
const &fname
)
135 if (io_stream::exists (String ("cygfile://")+ dir
+ fname
+ ".sh"))
136 run_script (dir
.cstr_oneuse(), (fname
+ ".sh").cstr_oneuse());
137 if (io_stream::exists (String ("cygfile://")+ dir
+ fname
+ ".bat"))
138 run_script (dir
.cstr_oneuse(), (fname
+ ".bat").cstr_oneuse());