/*                                                                                                               * safe_printf - async-signal-safe wrapper for printf                                                           
 *
 * Note: if you use this in a handler, then you must use it everywhere
 * in your program, on the off chance that vsnprintf is not reentrant.
 */
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>

#define MAXS 1024
void safe_printf(const char *format, ...)
{
    char buf[MAXS];
    va_list args;
    sigset_t mask, prev_mask;

    sigfillset(&mask);
    sigprocmask(SIG_BLOCK, &mask, &prev_mask);

    va_start(args, format);
    vsnprintf(buf, sizeof(buf), format, args);
    va_end(args);
    write(1, buf, strlen(buf)); 

    sigprocmask(SIG_SETMASK, &prev_mask, NULL);
}

