jehanne/sys/src/lib/posix/internal.h

145 lines
4.3 KiB
C

/*
* This file is part of Jehanne.
*
* Copyright (C) 2017 Giacomo Tesio <giacomo@tesio.it>
*
* This is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, version 3 of the License.
*
* Jehanne 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 General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Jehanne. If not, see <http://www.gnu.org/licenses/>.
*/
#define __POSIX_SIGNAL_PREFIX_LEN (sizeof(__POSIX_SIGNAL_PREFIX)-1)
typedef struct WaitList WaitList;
struct WaitList
{
int pid;
int status;
WaitList *next;
};
typedef struct ChildList ChildList;
struct ChildList
{
int pid;
ChildList *next;
};
typedef struct SignalConf SignalConf;
struct SignalConf
{
void* handler;
PosixSignalMask mask : 56;
int sa_siginfo : 1;
int sa_resethand : 1;
int sa_restart : 1;
int sa_nochildwait : 1;
};
typedef struct PendingSignalList PendingSignalList;
struct PendingSignalList
{
PosixSignalInfo signal;
PendingSignalList* next;
};
extern int *__libposix_pid;
extern void __libposix_files_check_conf(void);
extern void __libposix_errors_check_conf(void);
extern void __libposix_processes_check_conf(void);
extern int __libposix_initialized(void);
extern int __libposix_get_errno(PosixError e);
extern void __libposix_setup_exec_environment(char * const *env);
extern int __libposix_translate_errstr(uintptr_t caller);
extern int __libposix_note_handler(void *ureg, char *note);
extern void __libposix_free_wait_list(void);
extern void __libposix_setup_new_process(void);
extern int __libposix_signal_to_note(const PosixSignalInfo *si, char *buf, int size);
extern int __libposix_note_to_signal(const char *note, PosixSignalInfo *siginfo);
extern int __libposix_is_child(int pid);
extern void __libposix_free_child_list(void);
extern void __libposix_forget_child(int pid);
extern int __libposix_send_control_msg(int pid, char *msg);
extern PosixError __libposix_notify_signal_to_process(int pid, PosixSignalInfo *siginfo);
extern PosixError __libposix_receive_signal(PosixSignalInfo *siginfo);
extern PosixError __libposix_dispatch_signal(int pid, PosixSignalInfo* siginfo);
extern int __libposix_restart_syscall(void);
extern int __libposix_signal_blocked(PosixSignalInfo *siginfo);
extern int __libposix_run_signal_handler(SignalConf *c, PosixSignalInfo *siginfo);
extern void __libposix_reset_pending_signals(void);
extern void __libposix_set_close_on_exec(int fd, int close);
extern int __libposix_should_close_on_exec(int fd);
extern void __libposix_close_on_exec(void);
extern void __libposix_init_signal_handlers(void);
#define SIGNAL_MASK(signal) (1ULL<<((signal)-1))
#define SIGNAL_RAW_ADD(bitmask, signal) (bitmask |= SIGNAL_MASK(signal))
#define SIGNAL_RAW_DEL(bitmask, signal) (bitmask &= ~SIGNAL_MASK(signal))
typedef enum {
PHProcessExited, /* WRITE, for nannies, the child might not be a libposix application */
PHCallingExec, /* WRITE */
PHSignalProcess, /* WRITE */
PHSignalGroup, /* WRITE */
PHSignalForeground, /* WRITE, for the controller process */
PHIgnoreSignal, /* WRITE */
PHEnableSignal, /* WRITE */
PHBlockSignals, /* WRITE */
PHWaitSignals, /* READ, may block */
PHGetSessionId, /* WRITE, ret contains the id */
PHGetProcessGroupId, /* WRITE, ret contains the id */
PHGetPendingSignals, /* WRITE, ret contains the mask */
PHGetProcMask, /* WRITE, ret contains the mask */
PHSetForegroundGroup, /* WRITE */
PHGetForegroundGroup, /* WRITE */
PHDetachSession, /* WRITE */
PHSetProcessGroup, /* WRITE */
} PosixHelperCommand;
typedef struct {
int target;
PosixHelperCommand command;
} PosixHelperRequest;
extern void __libposix_sighelper_open(void);
extern long __libposix_sighelper_cmd(PosixHelperCommand command, int target);
extern long __libposix_sighelper_set(PosixHelperCommand command, PosixSignalMask signal_set);
extern long __libposix_sighelper_signal(PosixHelperCommand command, int target, PosixSignalInfo *siginfo);
extern long __libposix_sighelper_wait(PosixSignalMask set, PosixSignalInfo *siginfo);
extern long __libposix_sighelper_set_pgid(int target, int group_id);