• [^] # Re: Et l'exemple qmail ?

    Posté par . En réponse à la dépêche Exec Shield: protection contre les débordements de tampons. Évalué à 4.

    > Les signaux sont asyncrhones, lorsqu'un SIGHUP est delivre le handler de ce signal est appele, le signal SIGHUP est bloque, par contre si ce handler mets du temps a s'executer, et qu'un autre signal arrive, l'autre handler va etre execute.

    man sigaction :
    "sa_mask gives a mask of signals which should be blocked during execution of the signal handler. In addition, the signal which triggered the handler will be blocked, unless the SA_NODEFER or SA_NOMASK flags are used."

    > plutot que l'infame methode utilisee par rotatelogs...

    C'est ton avis. J'aime bien logrotate.

    > le programme htpasswd fait usage de tmpnam(). D'apres son man elle n'est pas vraiment recommandee ...

    info libc :
    "Temporary Files
    ===============

    If you need to use a temporary file in your program, you can use the `tmpfile' function to open it. Or you can use the `tmpnam' (better: `tmpnam_r') function to provide a name for a temporary file and then you can open it in the usual way with `fopen'. "

    man tmpnam :
    "If the argument s is NULL this name is generated in an internal static buffer and may be overwritten by the next call to tmpnam(). If s is not NULL, the name is copied to the character array (of length at least L_tmpnam) pointed at by s and the value s is returned in case of success."

    Le problème c'est d'utiliser tmpnam(NULL).

    de /usr/include/stdio.h :
    "/* This is the reentrant variant of `tmpnam'. The only difference is
    that it does not allow S to be NULL. */
    extern char *tmpnam_r (char *__s) __THROW;"

    > Pourquoi donc ce n'est pas la panacee ?

    Parce qu'il faut réécrire un système pour loguer. Car il faut mettre en place un système pour communiquer avec le nouveau système pour loguer. Car par rapport à un système qui écrit directement dans un descripteur de fichier, c'est moins performant.

    > Ensuite les pipe sous linux c'est PIPE_BUF: 4096 atomiquement.

    Si les processus sont frères et/ou que les processus clients peuvent "mourrir" tu ne peux pas utiliser de pipe (ou alors il faut utiliser des pipes nommés).

    > Les ipc permettent le 'privilege separation' qui _doit_ etre utilise tout le temps que c'est possible.

    ?

    > Quid de la rotation de logs ? (cf premier message)

    Tu passe par syslog, puis tout les journaux de syslog sont "rotationné" par logrotate toute les nuits. Aucun problème.

    > Quid du format du timestamp ? (cf premier message)

    Oui. Mais c'est pas un drame. De plus il ne doit pas être difficile de corriger ça si c'est indispensable.

    > Quid des personnes ne sachant pas utiliser les formats ? (cf premier message)

    Si c'est pour des logs apache (/var/log/httpd/access_log par exemple), le format est sous le contrôle d'apache. Si tu passes par syslog, rien ne d'interdit d'ajouter la date dans le format qui te plais.

    > Syslog est a bannir.

    Je me marre. Fait un "man syslogd" et "man syslog.conf".

    exemple :
    "Named Pipes
    This version of syslogd(8) has support for logging output to named pipes (fifos)."
    "Terminal and Console"
    "Remote Machine
    This syslogd(8) provides full remote logging, i.e. is able to send messages to a remote host running syslogd(8) and to receive messages from remote hosts. The remote host won’t forward the message again, it will just log them locally. To forward messages to another host, prepend the hostname with the at sign (‘‘@’’).

    Using this feature you’re able to control all syslog messages on one host, if all other machines will log remotely to that. This tears down administration needs."

    Avec pipe, rien ne t'empêche de faire un programme qui écoute le pipe (sur une autre machine si tu veux) et de logguer les messages dans une base de donnée et jamais d'utilisation de logrotate et en même temps d'avoir les logs en directe pour les consoles sous toto. Le possibilités sont nombreuses. Mais si tu veux coder un autre syslog, te gène pas.

    > par exemple funlink() utilisant un fd au lieu d'une chaine. Pour eviter les problemes de 'race condition' que l'on trouve avec toutes les fonctions basees sur le nom.

    Quels sont les problèmes ?
    Aucun. La chaine passée à unlink n'est pas interprété. C'est totalement différent de system() par exemple. Puis pourquoi pas virer toutes les fonctions qui attende un char * (open() ?). Utilise dmalloc si tu as "peur". Mais attention, les performances vont en prendre un sérieu coup...