[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [tyndur-devel] [PATCH 1/5] libc: POSIX: sigaction
Am Samstag, 25. April 2009 18:12 schrieb Antoine Kaufmann:
> On Wed, Apr 22 20:18, Kevin Wolf wrote:
> > + libc: POSIX: Signale von reinen Handler auf sigactions umgestellt (die
> > aber alles ausser dem Handler ignorieren). sigaction() hinzugefuegt.
> > ---
> > diff --git a/src/modules/lib/posix/signal.c
> > b/src/modules/lib/posix/signal.c index 4d70a61..03cfb56 100644
> > --- a/src/modules/lib/posix/signal.c
> > +++ b/src/modules/lib/posix/signal.c
> > @@ -37,7 +37,7 @@
> > #include <sleep.h>
> >
> > /// Array mit Pointern auf die Signal-Handler
> > -static sighandler_t signal_handlers [_SIGNO_MAX];
> > +static struct sigaction sigactions[_SIGNO_MAX];
> > static bool initialized = FALSE;
> >
> > /**
> > @@ -46,8 +46,9 @@ static bool initialized = FALSE;
> > static void init_signals(void)
> > {
> > int i;
> > + memset(sigactions, 0, sizeof(sigactions));
> > for (i = 0; i < _SIGNO_MAX; i++) {
> > - signal_handlers[i] = SIG_DFL;
> > + sigactions[i].sa_handler = SIG_DFL;
> > }
> >
> > initialized = TRUE;
> > @@ -73,7 +74,7 @@ int raise(int signum)
> > return -1;
> > }
> >
> > - sighandler_t handler = signal_handlers[signum];
> > + sighandler_t handler = sigactions[signum].sa_handler;
> > if (handler != NULL) {
> > handler(signum);
> > }
> > @@ -150,14 +151,50 @@ sighandler_t signal(int signum, sighandler_t
> > handler) }
> >
> > // Alter Handler Speichern, weil er zurueck gegeben wird
> > - sighandler_t old_handler = signal_handlers[signum];
> > + sighandler_t old_handler = sigactions[signum].sa_handler;
> >
> > // Neuer setzen
> > - signal_handlers[signum] = handler;
> > + sigactions[signum].sa_handler = handler;
> >
> > return old_handler;
> > }
> >
> > +/**
> > + * Aendert die auszufuehrende Aktion fuer ein Signal und gibt die alte
> > Aktion + * zurueck.
> > + * TODO Momentan nur Handler, POSIX sieht da mehr vor
> > + *
> > + * @param sig Nummer des Signals, fuer das die Aktion geaendert wird
> > + * @param action Neue Aktion. Wenn NULL, wird nur die aktuelle Aktion
> > + * zurueckgegeben, aber keine Aenderung vorgenommen
> > + * @param old Wenn nicht NULL, wird hier die alte Aktion gespeichert
> > + */
> > +int sigaction(int sig, const struct sigaction* action, struct sigaction*
> > old) +{
> > + // Initialisieren falls das noch nicht gemacht ist
> > + if (initialized == FALSE) {
> > + init_signals();
> > + }
> > +
> > + // Ungueltige Signale und SIGKILL koennen nicht gesetzt werden
> > + if ((sig >= _SIGNO_MAX) || (sig == SIGKILL)) {
> > + errno = EINVAL;
> > + return -1;
> > + }
> > +
> > + // Alte Werte zurueckgeben
> > + if (old != NULL) {
> > + memcpy(old, &sigactions[sig], sizeof(*old));
> > + }
> > +
> > + // Neue Werte setzen
> > + if (action != NULL) {
> > + memcpy(&sigactions[sig], action, sizeof(*action));
> > + }
>
> Hier wäre jeweils auch kein memcpy nötig, oder irre ich mich?
Du meinst sigactions[sig] = *action? Könnte man wohl auch machen, am Ende
packt dann halt gcc das memcpy rein. ;-)