mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
Fix --ftrace on Windows
This commit is contained in:
parent
b02d13ccde
commit
9e6faa5256
3 changed files with 78 additions and 4 deletions
|
@ -26,11 +26,11 @@
|
||||||
#include "libc/elf/def.h"
|
#include "libc/elf/def.h"
|
||||||
#include "libc/elf/tinyelf.internal.h"
|
#include "libc/elf/tinyelf.internal.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/serialize.h"
|
|
||||||
#include "libc/intrin/directmap.internal.h"
|
#include "libc/intrin/directmap.internal.h"
|
||||||
#include "libc/nt/memory.h"
|
#include "libc/nt/memory.h"
|
||||||
#include "libc/nt/runtime.h"
|
#include "libc/nt/runtime.h"
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
|
#include "libc/serialize.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#include "libc/sysv/consts/map.h"
|
#include "libc/sysv/consts/map.h"
|
||||||
#include "libc/sysv/consts/o.h"
|
#include "libc/sysv/consts/o.h"
|
||||||
|
@ -80,8 +80,9 @@ static bool IsMyDebugBinary(const char *path) {
|
||||||
// contains the same number of bytes of code as our .com executable
|
// contains the same number of bytes of code as our .com executable
|
||||||
// which is currently running in memory.
|
// which is currently running in memory.
|
||||||
if ((size = lseek(fd, 0, SEEK_END)) != -1 &&
|
if ((size = lseek(fd, 0, SEEK_END)) != -1 &&
|
||||||
(dm = sys_mmap(0, size, PROT_READ, MAP_SHARED, fd, 0)).addr !=
|
(dm = sys_mmap((void *)0x12345000000, size, PROT_READ, MAP_SHARED, fd,
|
||||||
MAP_FAILED) {
|
0))
|
||||||
|
.addr != MAP_FAILED) {
|
||||||
if (READ32LE((char *)dm.addr) == READ32LE("\177ELF") &&
|
if (READ32LE((char *)dm.addr) == READ32LE("\177ELF") &&
|
||||||
((Elf64_Ehdr *)dm.addr)->e_machine == GetElfMachine() &&
|
((Elf64_Ehdr *)dm.addr)->e_machine == GetElfMachine() &&
|
||||||
GetElfSymbolValue(dm.addr, "_etext", &value)) {
|
GetElfSymbolValue(dm.addr, "_etext", &value)) {
|
||||||
|
|
74
test/posix/sa_resethand2_test.c
Normal file
74
test/posix/sa_resethand2_test.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||||
|
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||||
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||||
|
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||||
|
│ │
|
||||||
|
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||||
|
│ any purpose with or without fee is hereby granted, provided that the │
|
||||||
|
│ above copyright notice and this permission notice appear in all copies. │
|
||||||
|
│ │
|
||||||
|
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||||
|
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||||
|
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||||
|
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||||
|
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||||
|
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||||
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
|
#include "libc/calls/calls.h"
|
||||||
|
#include "libc/calls/struct/sigaction.h"
|
||||||
|
#include "libc/calls/struct/sigset.h"
|
||||||
|
#include "libc/dce.h"
|
||||||
|
#include "libc/sysv/consts/sa.h"
|
||||||
|
#include "libc/sysv/consts/sig.h"
|
||||||
|
|
||||||
|
volatile int handler_invoked;
|
||||||
|
|
||||||
|
void signal_handler(int signum) {
|
||||||
|
handler_invoked = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
sigset_t mask, oldmask;
|
||||||
|
struct sigaction sa, current_sa;
|
||||||
|
|
||||||
|
if (IsWindows()) {
|
||||||
|
// TODO(jart): support non-fatal signals between processes
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sa.sa_handler = signal_handler;
|
||||||
|
sa.sa_flags = SA_RESETHAND;
|
||||||
|
sigemptyset(&sa.sa_mask);
|
||||||
|
|
||||||
|
if (sigaction(SIGINT, &sa, 0) == -1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sigemptyset(&mask);
|
||||||
|
sigaddset(&mask, SIGINT);
|
||||||
|
if (sigprocmask(SIG_BLOCK, &mask, &oldmask) == -1) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pid = fork();
|
||||||
|
if (pid == -1) {
|
||||||
|
return 3;
|
||||||
|
} else if (pid == 0) {
|
||||||
|
kill(getppid(), SIGINT);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
sigsuspend(&oldmask);
|
||||||
|
if (!handler_invoked) {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
if (sigaction(SIGINT, 0, ¤t_sa) == -1) {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
if (current_sa.sa_handler != SIG_DFL) {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
1
third_party/readline/signals.c
vendored
1
third_party/readline/signals.c
vendored
|
@ -59,7 +59,6 @@ typedef struct sigaction sighandler_cxt;
|
||||||
# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh)
|
# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh)
|
||||||
#else
|
#else
|
||||||
typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt;
|
typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt;
|
||||||
# define sigemptyset(m)
|
|
||||||
#endif /* !HAVE_POSIX_SIGNALS */
|
#endif /* !HAVE_POSIX_SIGNALS */
|
||||||
|
|
||||||
#ifndef SA_RESTART
|
#ifndef SA_RESTART
|
||||||
|
|
Loading…
Reference in a new issue