diff options
| author | Eli Zaretskii | 1997-01-16 12:50:00 +0000 |
|---|---|---|
| committer | Eli Zaretskii | 1997-01-16 12:50:00 +0000 |
| commit | 417a04bb0406f9fb5f2bba9f294bf380de64fa41 (patch) | |
| tree | d59a55b9efe697b6a7f731bc1cea5b244fe27c2e /src/msdos.c | |
| parent | bf8360aed29c9011653cfb65c61addcc3fa092ac (diff) | |
| download | emacs-417a04bb0406f9fb5f2bba9f294bf380de64fa41.tar.gz emacs-417a04bb0406f9fb5f2bba9f294bf380de64fa41.zip | |
* (sigprocmask, sig_suspender): New functions, implement
signal blocking on MSDOS.
Diffstat (limited to 'src/msdos.c')
| -rw-r--r-- | src/msdos.c | 112 |
1 files changed, 111 insertions, 1 deletions
diff --git a/src/msdos.c b/src/msdos.c index c961be34656..864a18d4b83 100644 --- a/src/msdos.c +++ b/src/msdos.c | |||
| @@ -69,6 +69,7 @@ Boston, MA 02111-1307, USA. */ | |||
| 69 | #if __DJGPP__ > 1 | 69 | #if __DJGPP__ > 1 |
| 70 | 70 | ||
| 71 | #include <signal.h> | 71 | #include <signal.h> |
| 72 | #include "syssignal.h" | ||
| 72 | 73 | ||
| 73 | #ifndef SYSTEM_MALLOC | 74 | #ifndef SYSTEM_MALLOC |
| 74 | 75 | ||
| @@ -3144,14 +3145,123 @@ int kill (x, y) int x, y; { return -1; } | |||
| 3144 | nice (p) int p; {} | 3145 | nice (p) int p; {} |
| 3145 | void volatile pause () {} | 3146 | void volatile pause () {} |
| 3146 | sigsetmask (x) int x; { return 0; } | 3147 | sigsetmask (x) int x; { return 0; } |
| 3148 | sigblock (mask) int mask; { return 0; } | ||
| 3147 | #endif | 3149 | #endif |
| 3148 | 3150 | ||
| 3149 | request_sigio () {} | 3151 | request_sigio () {} |
| 3150 | setpgrp () {return 0; } | 3152 | setpgrp () {return 0; } |
| 3151 | setpriority (x,y,z) int x,y,z; { return 0; } | 3153 | setpriority (x,y,z) int x,y,z; { return 0; } |
| 3152 | sigblock (mask) int mask; { return 0; } | ||
| 3153 | unrequest_sigio () {} | 3154 | unrequest_sigio () {} |
| 3154 | 3155 | ||
| 3156 | #if __DJGPP__ > 1 | ||
| 3157 | |||
| 3158 | #ifdef POSIX_SIGNALS | ||
| 3159 | |||
| 3160 | /* Augment DJGPP library POSIX signal functions. This is needed | ||
| 3161 | as of DJGPP v2.01, but might be in the library in later releases. */ | ||
| 3162 | |||
| 3163 | #include <libc/bss.h> | ||
| 3164 | |||
| 3165 | /* A counter to know when to re-initialize the static sets. */ | ||
| 3166 | static int sigprocmask_count = -1; | ||
| 3167 | |||
| 3168 | /* Which signals are currently blocked (initially none). */ | ||
| 3169 | static sigset_t current_mask; | ||
| 3170 | |||
| 3171 | /* Which signals are pending (initially none). */ | ||
| 3172 | static sigset_t pending_signals; | ||
| 3173 | |||
| 3174 | /* Previous handlers to restore when the blocked signals are unblocked. */ | ||
| 3175 | typedef void (*sighandler_t)(int); | ||
| 3176 | static sighandler_t prev_handlers[320]; | ||
| 3177 | |||
| 3178 | /* A signal handler which just records that a signal occured | ||
| 3179 | (it will be raised later, if and when the signal is unblocked). */ | ||
| 3180 | static void | ||
| 3181 | sig_suspender (signo) | ||
| 3182 | int signo; | ||
| 3183 | { | ||
| 3184 | sigaddset (&pending_signals, signo); | ||
| 3185 | } | ||
| 3186 | |||
| 3187 | int | ||
| 3188 | sigprocmask (how, new_set, old_set) | ||
| 3189 | int how; | ||
| 3190 | const sigset_t *new_set; | ||
| 3191 | sigset_t *old_set; | ||
| 3192 | { | ||
| 3193 | int signo; | ||
| 3194 | sigset_t new_mask; | ||
| 3195 | |||
| 3196 | /* If called for the first time, initialize. */ | ||
| 3197 | if (sigprocmask_count != __bss_count) | ||
| 3198 | { | ||
| 3199 | sigprocmask_count = __bss_count; | ||
| 3200 | sigemptyset (&pending_signals); | ||
| 3201 | sigemptyset (¤t_mask); | ||
| 3202 | for (signo = 0; signo < 320; signo++) | ||
| 3203 | prev_handlers[signo] = SIG_ERR; | ||
| 3204 | } | ||
| 3205 | |||
| 3206 | if (old_set) | ||
| 3207 | *old_set = current_mask; | ||
| 3208 | |||
| 3209 | if (new_set == 0) | ||
| 3210 | return 0; | ||
| 3211 | |||
| 3212 | if (how != SIG_BLOCK && how != SIG_UNBLOCK && how != SIG_SETMASK) | ||
| 3213 | { | ||
| 3214 | errno = EINVAL; | ||
| 3215 | return -1; | ||
| 3216 | } | ||
| 3217 | |||
| 3218 | sigemptyset (&new_mask); | ||
| 3219 | |||
| 3220 | /* DJGPP supports upto 320 signals. */ | ||
| 3221 | for (signo = 0; signo < 320; signo++) | ||
| 3222 | { | ||
| 3223 | if (sigismember (¤t_mask, signo)) | ||
| 3224 | sigaddset (&new_mask, signo); | ||
| 3225 | else if (sigismember (new_set, signo) && how != SIG_UNBLOCK) | ||
| 3226 | { | ||
| 3227 | sigaddset (&new_mask, signo); | ||
| 3228 | |||
| 3229 | /* SIGKILL is silently ignored, as on other platforms. */ | ||
| 3230 | if (signo != SIGKILL && prev_handlers[signo] == SIG_ERR) | ||
| 3231 | prev_handlers[signo] = signal (signo, sig_suspender); | ||
| 3232 | } | ||
| 3233 | if (( how == SIG_UNBLOCK | ||
| 3234 | && sigismember (&new_mask, signo) | ||
| 3235 | && sigismember (new_set, signo)) | ||
| 3236 | || (how == SIG_SETMASK | ||
| 3237 | && sigismember (&new_mask, signo) | ||
| 3238 | && !sigismember (new_set, signo))) | ||
| 3239 | { | ||
| 3240 | sigdelset (&new_mask, signo); | ||
| 3241 | if (prev_handlers[signo] != SIG_ERR) | ||
| 3242 | { | ||
| 3243 | signal (signo, prev_handlers[signo]); | ||
| 3244 | prev_handlers[signo] = SIG_ERR; | ||
| 3245 | } | ||
| 3246 | if (sigismember (&pending_signals, signo)) | ||
| 3247 | { | ||
| 3248 | sigdelset (&pending_signals, signo); | ||
| 3249 | raise (signo); | ||
| 3250 | } | ||
| 3251 | } | ||
| 3252 | } | ||
| 3253 | current_mask = new_mask; | ||
| 3254 | return 0; | ||
| 3255 | } | ||
| 3256 | |||
| 3257 | #else /* not POSIX_SIGNALS */ | ||
| 3258 | |||
| 3259 | sigsetmask (x) int x; { return 0; } | ||
| 3260 | sigblock (mask) int mask; { return 0; } | ||
| 3261 | |||
| 3262 | #endif /* not POSIX_SIGNALS */ | ||
| 3263 | #endif /* __DJGPP__ > 1 */ | ||
| 3264 | |||
| 3155 | #ifndef HAVE_SELECT | 3265 | #ifndef HAVE_SELECT |
| 3156 | #include "sysselect.h" | 3266 | #include "sysselect.h" |
| 3157 | 3267 | ||