示例#1
0
        /// <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));
        }
示例#2
0
        /// <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);
        }