]> cygwin.com Git - cygwin-apps/setup.git/blob - script.cc
2002-07-15 Robert Collins <rbtcollins@hotmail.com>
[cygwin-apps/setup.git] / script.cc
1 /*
2 * Copyright (c) 2001, Jan Nieuwenhuizen.
3 *
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.
8 *
9 * A copy of the GNU General Public License can be found at
10 * http://www.gnu.org/
11 *
12 * Written by DJ Delorie <dj@cygnus.com>
13 * Jan Nieuwenhuizen <janneke@gnu.org>
14 *
15 */
16
17 /* The purpose of this file is to provide functions for the invocation
18 of install scripts. */
19
20 #if 0
21 static const char *cvsid =
22 "\n%%% $Id$\n";
23 #endif
24
25 #include "win32.h"
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <stdio.h>
29 #include "log.h"
30 #include "filemanip.h"
31 #include "mount.h"
32 #include "io_stream.h"
33
34 static String sh = String();
35 static const char *cmd = 0;
36 static OSVERSIONINFO verinfo;
37
38 static const char *shells[] = {
39 "/bin/sh.exe",
40 "/usr/bin/sh.exe",
41 "/bin/bash.exe",
42 "/usr/bin/bash.exe",
43 0
44 };
45
46 void
47 init_run_script ()
48 {
49 for (int i = 0; shells[i]; i++)
50 {
51 sh = backslash (cygpath (shells[i]));
52 if (_access (sh.cstr_oneuse(), 0) == 0)
53 break;
54 sh = String();
55 }
56
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());
63
64 verinfo.dwOSVersionInfoSize = sizeof (verinfo);
65 GetVersionEx (&verinfo);
66
67 switch (verinfo.dwPlatformId)
68 {
69 case VER_PLATFORM_WIN32_NT:
70 cmd = "cmd.exe";
71 break;
72 case VER_PLATFORM_WIN32_WINDOWS:
73 cmd = "command.com";
74 break;
75 default:
76 cmd = "command.com";
77 break;
78 }
79 }
80
81 static void
82 run (const char *sh, const char *args, const char *file)
83 {
84 BOOL b;
85 char cmdline[_MAX_PATH];
86 STARTUPINFO si;
87 PROCESS_INFORMATION pi;
88
89 sprintf (cmdline, "%s %s %s", sh, args, file);
90 memset (&pi, 0, sizeof (pi));
91 memset (&si, 0, sizeof (si));
92 si.cb = sizeof (si);
93 si.lpTitle = (char *) "Cygwin Setup Post-Install Script";
94 si.dwFlags = STARTF_USEPOSITION;
95
96 b = CreateProcess (0, cmdline, 0, 0, 0,
97 CREATE_NEW_CONSOLE, 0, get_root_dir ().cstr_oneuse(), &si, &pi);
98
99 if (b)
100 WaitForSingleObject (pi.hProcess, INFINITE);
101 }
102
103 void
104 run_script (String const &dir, String const &fname)
105 {
106 char *ext = strrchr (fname.cstr_oneuse(), '.');
107 if (!ext)
108 return;
109
110 if (sh.size() && strcmp (ext, ".sh") == 0)
111 {
112 String f2 = dir + fname;
113 log (LOG_PLAIN, String ("running: ") + sh + " -c " + f2);
114 run (sh.cstr_oneuse(), "-c", f2.cstr_oneuse());
115 }
116 else if (cmd && strcmp (ext, ".bat") == 0)
117 {
118 String f2 = backslash (cygpath (dir + fname));
119 log (LOG_PLAIN, String ("running: ") + cmd + " /c " + f2);
120 run (cmd, "/c", f2.cstr_oneuse());
121 }
122 else
123 return;
124
125 /* if file exists then delete it otherwise just ignore no file error */
126 io_stream::remove (String ("cygfile://") + dir + fname + ".done");
127
128 io_stream::move (String ("cygfile://") + dir + fname,
129 String ("cygfile://") + dir + fname+ ".done");
130 }
131
132 void
133 try_run_script (String const &dir, String const &fname)
134 {
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());
139 }
140
This page took 0.041334 seconds and 5 git commands to generate.