diff --git a/libc/Makefile b/libc/Makefile index 0f2775b5..ece8baa4 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -92,6 +92,11 @@ op-new.o \ rewind.o \ setbuf.o \ setvbuf.o \ +sigaddset.o \ +sigdelset.o \ +sigfillset.o \ +sigemptyset.o \ +sigismember.o \ sort.o \ sprint.o \ sscanf.o \ diff --git a/libc/sigaddset.cpp b/libc/sigaddset.cpp new file mode 100644 index 00000000..8005fd88 --- /dev/null +++ b/libc/sigaddset.cpp @@ -0,0 +1,39 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + sigaddset.cpp + Add a signal to a signal set. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int sigaddset(sigset_t* set, int signum) +{ + int max_signals = sizeof(set->__val) * 8; + if ( max_signals <= signum ) + return errno = EINVAL, -1; + size_t which_byte = signum / 8; + size_t which_bit = signum % 8; + uint8_t* bytes = (uint8_t*) set->__val; + bytes[which_byte] |= 1 << which_bit; + return 0; +} diff --git a/libc/sigdelset.cpp b/libc/sigdelset.cpp new file mode 100644 index 00000000..d614b8b3 --- /dev/null +++ b/libc/sigdelset.cpp @@ -0,0 +1,39 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + sigdelset.cpp + Remove a signal from a signal set. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int sigdelset(sigset_t* set, int signum) +{ + int max_signals = sizeof(set->__val) * 8; + if ( max_signals <= signum ) + return errno = EINVAL, -1; + size_t which_byte = signum / 8; + size_t which_bit = signum % 8; + uint8_t* bytes = (uint8_t*) set->__val; + bytes[which_byte] &= ~(1 << which_bit); + return 0; +} diff --git a/libc/sigemptyset.cpp b/libc/sigemptyset.cpp new file mode 100644 index 00000000..74df4c61 --- /dev/null +++ b/libc/sigemptyset.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + sigemptyset.cpp + Removes all the signals from a signal set. + +*******************************************************************************/ + +#include +#include + +extern "C" int sigemptyset(sigset_t* set) +{ + memset(set, 0, sizeof(*set)); + return 0; +} diff --git a/libc/sigfillset.cpp b/libc/sigfillset.cpp new file mode 100644 index 00000000..72261d64 --- /dev/null +++ b/libc/sigfillset.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + sigfillset.cpp + Add all signals to a signal set. + +*******************************************************************************/ + +#include +#include + +extern "C" int sigfillset(sigset_t* set) +{ + memset(set, 255, sizeof(*set)); + return 0; +} diff --git a/libc/sigismember.cpp b/libc/sigismember.cpp new file mode 100644 index 00000000..9900743b --- /dev/null +++ b/libc/sigismember.cpp @@ -0,0 +1,38 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + sigismember.cpp + Test signal membership in a signal set. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int sigismember(const sigset_t* set, int signum) +{ + int max_signals = sizeof(set->__val) * 8; + if ( max_signals <= signum ) + return errno = EINVAL, -1; + size_t which_byte = signum / 8; + size_t which_bit = signum % 8; + const uint8_t* bytes = (const uint8_t*) set->__val; + return bytes[which_byte] & (1 << which_bit) ? 1 : 0; +} diff --git a/libc/signal.cpp b/libc/signal.cpp index 054913d9..a073af56 100644 --- a/libc/signal.cpp +++ b/libc/signal.cpp @@ -24,6 +24,7 @@ #include #include + #include const int MAX_SIGNALS = 128;