1*0f46bf65SKohei Tokunaga /* SPDX-License-Identifier: MIT */ 2*0f46bf65SKohei Tokunaga /* 3*0f46bf65SKohei Tokunaga * os-wasm.c 4*0f46bf65SKohei Tokunaga * Forked from os-posix.c, removing functions not working on Emscripten 5*0f46bf65SKohei Tokunaga * 6*0f46bf65SKohei Tokunaga * Copyright (c) 2003-2008 Fabrice Bellard 7*0f46bf65SKohei Tokunaga * Copyright (c) 2010 Red Hat, Inc. 8*0f46bf65SKohei Tokunaga * 9*0f46bf65SKohei Tokunaga * Permission is hereby granted, free of charge, to any person obtaining a copy 10*0f46bf65SKohei Tokunaga * of this software and associated documentation files (the "Software"), to deal 11*0f46bf65SKohei Tokunaga * in the Software without restriction, including without limitation the rights 12*0f46bf65SKohei Tokunaga * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13*0f46bf65SKohei Tokunaga * copies of the Software, and to permit persons to whom the Software is 14*0f46bf65SKohei Tokunaga * furnished to do so, subject to the following conditions: 15*0f46bf65SKohei Tokunaga * 16*0f46bf65SKohei Tokunaga * The above copyright notice and this permission notice shall be included in 17*0f46bf65SKohei Tokunaga * all copies or substantial portions of the Software. 18*0f46bf65SKohei Tokunaga * 19*0f46bf65SKohei Tokunaga * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20*0f46bf65SKohei Tokunaga * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21*0f46bf65SKohei Tokunaga * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22*0f46bf65SKohei Tokunaga * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23*0f46bf65SKohei Tokunaga * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24*0f46bf65SKohei Tokunaga * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25*0f46bf65SKohei Tokunaga * THE SOFTWARE. 26*0f46bf65SKohei Tokunaga */ 27*0f46bf65SKohei Tokunaga 28*0f46bf65SKohei Tokunaga #include "qemu/osdep.h" 29*0f46bf65SKohei Tokunaga #include <sys/resource.h> 30*0f46bf65SKohei Tokunaga #include <sys/wait.h> 31*0f46bf65SKohei Tokunaga #include <pwd.h> 32*0f46bf65SKohei Tokunaga #include <grp.h> 33*0f46bf65SKohei Tokunaga #include <libgen.h> 34*0f46bf65SKohei Tokunaga 35*0f46bf65SKohei Tokunaga #include "qemu/error-report.h" 36*0f46bf65SKohei Tokunaga #include "qemu/log.h" 37*0f46bf65SKohei Tokunaga #include "system/runstate.h" 38*0f46bf65SKohei Tokunaga #include "qemu/cutils.h" 39*0f46bf65SKohei Tokunaga 40*0f46bf65SKohei Tokunaga void os_setup_post(void){} 41*0f46bf65SKohei Tokunaga void os_set_line_buffering(void) 42*0f46bf65SKohei Tokunaga { 43*0f46bf65SKohei Tokunaga setvbuf(stdout, NULL, _IOLBF, 0); 44*0f46bf65SKohei Tokunaga } 45*0f46bf65SKohei Tokunaga void os_setup_early_signal_handling(void) 46*0f46bf65SKohei Tokunaga { 47*0f46bf65SKohei Tokunaga struct sigaction act; 48*0f46bf65SKohei Tokunaga sigfillset(&act.sa_mask); 49*0f46bf65SKohei Tokunaga act.sa_flags = 0; 50*0f46bf65SKohei Tokunaga act.sa_handler = SIG_IGN; 51*0f46bf65SKohei Tokunaga sigaction(SIGPIPE, &act, NULL); 52*0f46bf65SKohei Tokunaga } 53*0f46bf65SKohei Tokunaga void os_set_proc_name(const char *s) 54*0f46bf65SKohei Tokunaga { 55*0f46bf65SKohei Tokunaga error_report("Change of process name not supported by your OS"); 56*0f46bf65SKohei Tokunaga exit(1); 57*0f46bf65SKohei Tokunaga } 58*0f46bf65SKohei Tokunaga static void termsig_handler(int signal, siginfo_t *info, void *c) 59*0f46bf65SKohei Tokunaga { 60*0f46bf65SKohei Tokunaga qemu_system_killed(info->si_signo, info->si_pid); 61*0f46bf65SKohei Tokunaga } 62*0f46bf65SKohei Tokunaga 63*0f46bf65SKohei Tokunaga void os_setup_signal_handling(void) 64*0f46bf65SKohei Tokunaga { 65*0f46bf65SKohei Tokunaga struct sigaction act; 66*0f46bf65SKohei Tokunaga 67*0f46bf65SKohei Tokunaga memset(&act, 0, sizeof(act)); 68*0f46bf65SKohei Tokunaga act.sa_sigaction = termsig_handler; 69*0f46bf65SKohei Tokunaga act.sa_flags = SA_SIGINFO; 70*0f46bf65SKohei Tokunaga sigaction(SIGINT, &act, NULL); 71*0f46bf65SKohei Tokunaga sigaction(SIGHUP, &act, NULL); 72*0f46bf65SKohei Tokunaga sigaction(SIGTERM, &act, NULL); 73*0f46bf65SKohei Tokunaga } 74*0f46bf65SKohei Tokunaga void os_setup_limits(void) 75*0f46bf65SKohei Tokunaga { 76*0f46bf65SKohei Tokunaga struct rlimit nofile; 77*0f46bf65SKohei Tokunaga 78*0f46bf65SKohei Tokunaga if (getrlimit(RLIMIT_NOFILE, &nofile) < 0) { 79*0f46bf65SKohei Tokunaga warn_report("unable to query NOFILE limit: %s", strerror(errno)); 80*0f46bf65SKohei Tokunaga return; 81*0f46bf65SKohei Tokunaga } 82*0f46bf65SKohei Tokunaga 83*0f46bf65SKohei Tokunaga if (nofile.rlim_cur == nofile.rlim_max) { 84*0f46bf65SKohei Tokunaga return; 85*0f46bf65SKohei Tokunaga } 86*0f46bf65SKohei Tokunaga 87*0f46bf65SKohei Tokunaga nofile.rlim_cur = nofile.rlim_max; 88*0f46bf65SKohei Tokunaga 89*0f46bf65SKohei Tokunaga if (setrlimit(RLIMIT_NOFILE, &nofile) < 0) { 90*0f46bf65SKohei Tokunaga warn_report("unable to set NOFILE limit: %s", strerror(errno)); 91*0f46bf65SKohei Tokunaga return; 92*0f46bf65SKohei Tokunaga } 93*0f46bf65SKohei Tokunaga } 94*0f46bf65SKohei Tokunaga int os_mlock(bool on_fault) 95*0f46bf65SKohei Tokunaga { 96*0f46bf65SKohei Tokunaga #ifdef HAVE_MLOCKALL 97*0f46bf65SKohei Tokunaga int ret = 0; 98*0f46bf65SKohei Tokunaga int flags = MCL_CURRENT | MCL_FUTURE; 99*0f46bf65SKohei Tokunaga 100*0f46bf65SKohei Tokunaga if (on_fault) { 101*0f46bf65SKohei Tokunaga #ifdef HAVE_MLOCK_ONFAULT 102*0f46bf65SKohei Tokunaga flags |= MCL_ONFAULT; 103*0f46bf65SKohei Tokunaga #else 104*0f46bf65SKohei Tokunaga error_report("mlockall: on_fault not supported"); 105*0f46bf65SKohei Tokunaga return -EINVAL; 106*0f46bf65SKohei Tokunaga #endif 107*0f46bf65SKohei Tokunaga } 108*0f46bf65SKohei Tokunaga 109*0f46bf65SKohei Tokunaga ret = mlockall(flags); 110*0f46bf65SKohei Tokunaga if (ret < 0) { 111*0f46bf65SKohei Tokunaga error_report("mlockall: %s", strerror(errno)); 112*0f46bf65SKohei Tokunaga } 113*0f46bf65SKohei Tokunaga 114*0f46bf65SKohei Tokunaga return ret; 115*0f46bf65SKohei Tokunaga #else 116*0f46bf65SKohei Tokunaga (void)on_fault; 117*0f46bf65SKohei Tokunaga return -ENOSYS; 118*0f46bf65SKohei Tokunaga #endif 119*0f46bf65SKohei Tokunaga } 120