[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. ;-)