/// <summary> /// Sets a signal handler /// </summary> /// <param name="sig">The signal number</param> /// <param name="handler">The handler</param> /// <returns>The errorcode</returns> public static unsafe ErrorCode SetSigHandler(Signal sig, SignalAction.SigAction *newact, SignalAction.SigAction *oldact) { if (sig == Signal.SIGKILL || sig == Signal.SIGSTOP) { return(ErrorCode.EINVAL); } if (newact == null) { return(ErrorCode.EFAULT); } return(Tasking.CurrentTask.SetSignalHandler(sig, newact, oldact)); }
/// <summary> /// Sets the signal handler of a signal /// </summary> /// <param name="signal">The signal</param> /// <param name="newact">The new action</param> /// <param name="oldact">The old action</param> /// <returns>The errorcode</returns> public unsafe ErrorCode SetSignalHandler(Signal signal, SignalAction.SigAction *newact, SignalAction.SigAction *oldact) { if (signal <= 0 || (int)signal >= Signals.NSIG) { return(ErrorCode.EINVAL); } SignalAction action = m_signalActions[(int)signal]; // If the handler is NULL, remove this action if (newact->Handler == null) { m_signalActions[(int)signal] = null; if (action != null) { Heap.Free(action); } return(ErrorCode.SUCCESS); } // If the action is NULL, allocate new signal action if (action == null) { m_signalActions[(int)signal] = action = new SignalAction((int)signal); } // Copy to old action if (oldact != null) { fixed(SignalAction.SigAction *ptr = &action.Sigaction) Memory.Memcpy(oldact, ptr, sizeof(SignalAction.SigAction)); } // Set new action fixed(SignalAction.SigAction *ptr = &action.Sigaction) Memory.Memcpy(ptr, newact, sizeof(SignalAction.SigAction)); return(ErrorCode.SUCCESS); }