annotate src/system.c @ 4720:e759d01692db ss-2-1-53

[project @ 2004-01-23 04:13:37 by jwe]
author jwe
date Fri, 23 Jan 2004 04:13:37 +0000
parents 94fc53d82561
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3153
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
1 #if defined (__CYGWIN32__)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
2
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
3 #include <sys/types.h>
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
4 #include <sys/wait.h>
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
5 #include <errno.h>
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
6 #include <signal.h>
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
7 #include <unistd.h>
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
8 #include <stdio.h>
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
9
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
10 int
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
11 system (const char *cmd)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
12 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
13 pid_t pid;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
14
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
15 int status = 1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
16
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
17 struct sigaction ignore, saved_sigint, saved_sigquit;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
18
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
19 sigset_t child_mask, saved_mask;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
20
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
21 if (cmd)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
22 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
23 ignore.sa_handler = SIG_IGN;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
24
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
25 sigemptyset (&ignore.sa_mask);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
26
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
27 ignore.sa_flags = 0;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
28
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
29 if (sigaction (SIGINT, &ignore, &saved_sigint) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
30 return -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
31
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
32 if (sigaction (SIGQUIT, &ignore, &saved_sigquit) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
33 return -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
34
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
35 sigemptyset (&child_mask);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
36
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
37 sigaddset (&child_mask, SIGCHLD);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
38
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
39 if (sigprocmask (SIG_BLOCK, &child_mask, &saved_mask) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
40 return -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
41
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
42 if ((pid = fork ()) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
43 status = -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
44 else if (pid == 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
45 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
46 sigaction (SIGINT, &saved_sigint, 0);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
47 sigaction (SIGQUIT, &saved_sigquit, 0);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
48
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
49 sigprocmask (SIG_SETMASK, &saved_mask, 0);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
50
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
51 execl ("/bin/sh", "sh", "-c", cmd, 0);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
52
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
53 exit (127);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
54 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
55 else
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
56 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
57 while (waitpid (pid, &status, 0) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
58 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
59 if (errno != EINTR)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
60 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
61 status = -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
62 break;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
63 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
64 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
65 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
66
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
67 if (sigaction (SIGINT, &saved_sigint, 0) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
68 return -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
69
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
70 if (sigaction (SIGQUIT, &saved_sigquit, 0) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
71 return -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
72
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
73 if (sigprocmask (SIG_SETMASK, &saved_mask, 0) < 0)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
74 return -1;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
75 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
76
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
77 return status;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
78 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
79
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
80 #if defined (TEST)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
81 int
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
82 main (void)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
83 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
84 system ("info");
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
85 while (1)
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
86 {
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
87 printf ("foo-i-hithere\n");
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
88 sleep (1);
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
89 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
90 return 0;
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
91 }
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
92 #endif
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
93
94fc53d82561 [project @ 1998-02-13 04:08:17 by jwe]
jwe
parents:
diff changeset
94 #endif