Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2258 lines
58 KiB

/*
posixdbg.c
POSIX debugging for those of us without debugging gear
*/
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdarg.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/utsname.h>
#include <time.h>
#include <sys/times.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <utime.h>
#include <termios.h>
#include <setjmp.h>
#include <grp.h>
#include <pwd.h>
#define NARGS 16 /* maximum number of arguments for execl* calls (for display purposes) */
#define NENVS 32 /* maximum number of environment variables for execle call (for display purposes) */
struct sigmap {
int signum;
const char *signame;
};
struct howmap {
int hownum;
const char *howname;
};
struct scnamemap {
int scnamenum;
const char *scnamename;
};
struct pcnamemap {
int pcnamenum;
const char *pcnamename;
};
struct cmdmap {
int cmdnum;
const char *cmdname;
};
struct whencemap {
int whencenum;
const char *whencename;
};
struct speedmap {
speed_t speednum;
const char *speedname;
};
struct optactmap {
int optactnum;
const char *optactname;
};
struct queuemap {
int queuenum;
const char *queuename;
};
struct actionmap {
int actionnum;
const char *actionname;
};
static const char *canonical_string (const char *string)
{
static const char null[] = "NULL";
static char buf[BUFSIZ];
const char *ret;
if (string == NULL)
ret = null;
else
{
(void) sprintf(buf, "\"%s\"", string);
ret = (const char *) buf;
}
return ret;
}
char *options_string (int waitpid_options)
{
static const char bitwise_or[] = "|";
static char buf[BUFSIZ];
char integer_string[11];
*buf = '\0';
if (waitpid_options & WNOHANG)
{
(void) strcat(buf, "WNOHANG");
waitpid_options &= ~WNOHANG;
}
if (waitpid_options & WUNTRACED)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "WUNTRACED");
waitpid_options &= ~WUNTRACED;
}
if (waitpid_options)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) sprintf(integer_string, "%#08X", (unsigned int) waitpid_options);
(void) strcat(buf, integer_string);
}
return buf;
}
char *signum_string (int function_signum)
{
static const struct sigmap sigtable[] = {
{ SIGABRT, "SIGABRT" }, { SIGALRM, "SIGALRM" }, { SIGFPE, "SIGFPE" }, { SIGHUP, "SIGHUP" },
{ SIGILL, "SIGILL" }, { SIGINT, "SIGINT" }, { SIGKILL, "SIGKILL" }, { SIGPIPE, "SIGPIPE" },
{ SIGQUIT, "SIGQUIT" }, { SIGSEGV, "SIGSEGV" }, { SIGTERM, "SIGTERM" }, { SIGUSR1, "SIGUSR1" },
{ SIGUSR2, "SIGUSR2" }, { SIGCHLD, "SIGCHLD" }, { SIGCONT, "SIGCONT" }, { SIGSTOP, "SIGSTOP" },
{ SIGTSTP, "SIGTSTP" }, { SIGTTIN, "SIGTTIN" }, { SIGTTOU, "SIGTTOU" }, { 0, NULL }
};
static char buf[BUFSIZ];
const struct sigmap *sigtblptr;
for (sigtblptr = sigtable; sigtblptr->signum != 0; ++sigtblptr)
if (sigtblptr->signum == function_signum)
break;
if (sigtblptr->signum == 0)
(void) sprintf(buf, "%d", function_signum);
else
(void) strcpy(buf, sigtblptr->signame);
return buf;
}
char *how_string (int sigprocmask_how)
{
static const struct howmap howtable[] = {
{ SIG_BLOCK, "SIG_BLOCK" }, { SIG_UNBLOCK, "SIG_UNBLOCK" }, { SIG_SETMASK, "SIG_SETMASK" },
{ 0, NULL }
};
static char buf[BUFSIZ];
const struct howmap *howtblptr;
for (howtblptr = howtable; howtblptr->hownum != 0; ++howtblptr)
if (howtblptr->hownum == sigprocmask_how)
break;
if (howtblptr->hownum == 0)
(void) sprintf(buf, "%d", sigprocmask_how);
else
(void) strcpy(buf, howtblptr->howname);
return buf;
}
char *scname_string (int sysconf_name)
{
static const struct scnamemap scnametable[] = {
{ _SC_ARG_MAX, "_SC_ARG_MAX" }, { _SC_CHILD_MAX, "_SC_CHILD_MAX" },
{ _SC_CLK_TCK, "_SC_CLK_TCK" }, { _SC_NGROUPS_MAX, "_SC_NGROUPS_MAX" },
{ _SC_OPEN_MAX, "_SC_OPEN_MAX" }, { _SC_STREAM_MAX, "_SC_STREAM_MAX" },
{ _SC_TZNAME_MAX, "_SC_TZNAME_MAX" }, { _SC_JOB_CONTROL, "_SC_JOB_CONTROL" },
{ _SC_SAVED_IDS, "_SC_SAVED_IDS" }, { _SC_VERSION, "_SC_VERSION" },
{ 0, NULL }
};
static char buf[BUFSIZ];
const struct scnamemap *scnametblptr;
for (scnametblptr = scnametable; scnametblptr->scnamenum != 0; ++scnametblptr)
if (scnametblptr->scnamenum == sysconf_name)
break;
if (scnametblptr->scnamenum == 0)
(void) sprintf(buf, "%d", sysconf_name);
else
(void) strcpy(buf, scnametblptr->scnamename);
return buf;
}
char *oflag_string (int open_oflag)
{
static const char bitwise_or[] = "|";
static char buf[BUFSIZ];
char integer_string[11];
*buf = '\0';
if ((open_oflag & O_ACCMODE) == O_RDONLY)
{
(void) strcat(buf, "O_RDONLY");
open_oflag &= ~O_ACCMODE;
}
else if ((open_oflag & O_ACCMODE) == O_WRONLY)
{
(void) strcat(buf, "O_WRONLY");
open_oflag &= ~O_ACCMODE;
}
else if ((open_oflag & O_ACCMODE) == O_RDWR)
{
(void) strcat(buf, "O_RDWR");
open_oflag &= ~O_ACCMODE;
}
if (open_oflag & O_APPEND)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "O_APPEND");
open_oflag &= ~O_APPEND;
}
if (open_oflag & O_CREAT)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "O_CREAT");
open_oflag &= ~O_CREAT;
}
if (open_oflag & O_EXCL)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "O_EXCL");
open_oflag &= ~O_EXCL;
}
if (open_oflag & O_NOCTTY)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "O_NOCTTY");
open_oflag &= ~O_NOCTTY;
}
if (open_oflag & O_NONBLOCK)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "O_NONBLOCK");
open_oflag &= ~O_NONBLOCK;
}
if (open_oflag & O_TRUNC)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "O_TRUNC");
open_oflag &= ~O_TRUNC;
}
if (open_oflag)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) sprintf(integer_string, "%#08X", (unsigned int) open_oflag);
(void) strcat(buf, integer_string);
}
return buf;
}
char *mode_string (mode_t function_mode)
{
static const char bitwise_or[] = "|";
static char buf[BUFSIZ];
char mode_t_string[13];
*buf = '\0';
if (function_mode & S_IRUSR)
{
(void) strcat(buf, "S_IRUSR");
function_mode &= ~S_IRUSR;
}
if (function_mode & S_IWUSR)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IWUSR");
function_mode &= ~S_IWUSR;
}
if (function_mode & S_IXUSR)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IXUSR");
function_mode &= ~S_IXUSR;
}
if (function_mode & S_IRGRP)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IRGRP");
function_mode &= ~S_IRGRP;
}
if (function_mode & S_IWGRP)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IWGRP");
function_mode &= ~S_IWGRP;
}
if (function_mode & S_IXGRP)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IXGRP");
function_mode &= ~S_IXGRP;
}
if (function_mode & S_IROTH)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IROTH");
function_mode &= ~S_IROTH;
}
if (function_mode & S_IWOTH)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IWOTH");
function_mode &= ~S_IWOTH;
}
if (function_mode & S_IXOTH)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_IXOTH");
function_mode &= ~S_IXOTH;
}
if (function_mode & S_ISUID)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_ISUID");
function_mode &= ~S_ISUID;
}
if (function_mode & S_ISGID)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "S_ISGID");
function_mode &= ~S_ISGID;
}
if (function_mode)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) sprintf(mode_t_string, "%#11lo", (unsigned long) function_mode);
(void) strcat(buf, mode_t_string);
}
return buf;
}
char *amode_string (int access_amode)
{
static const char bitwise_or[] = "|";
static char buf[BUFSIZ];
char integer_string[11];
*buf = '\0';
if (access_amode == F_OK)
{
(void) strcat(buf, "F_OK");
access_amode &= ~F_OK;
}
else
{
if (access_amode & R_OK)
{
(void) strcat(buf, "R_OK");
access_amode &= ~R_OK;
}
if (access_amode & W_OK)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "W_OK");
access_amode &= ~W_OK;
}
if (access_amode & X_OK)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) strcat(buf, "X_OK");
access_amode &= ~X_OK;
}
}
if (access_amode)
{
if (*buf != '\0')
(void) strcat(buf, bitwise_or);
(void) sprintf(integer_string, "%#08X", (unsigned int) access_amode);
(void) strcat(buf, integer_string);
}
return buf;
}
char *pcname_string (int function_name)
{
static const struct pcnamemap pcnametable[] = {
{ _PC_LINK_MAX, "_PC_LINK_MAX" }, { _PC_MAX_CANON, "_PC_MAX_CANON" },
{ _PC_MAX_INPUT, "_PC_MAX_INPUT" }, { _PC_NAME_MAX, "_PC_NAME_MAX" },
{ _PC_PATH_MAX, "_PC_PATH_MAX" }, { _PC_PIPE_BUF, "_PC_PIPE_BUF" },
{ _PC_CHOWN_RESTRICTED, "_PC_CHOWN_RESTRICTED" }, { _PC_NO_TRUNC, "_PC_NO_TRUNC" },
{ _PC_VDISABLE, "_PC_VDISABLE" }, { 0, NULL }
};
static char buf[BUFSIZ];
const struct pcnamemap *pcnametblptr;
for (pcnametblptr = pcnametable; pcnametblptr->pcnamenum != 0; ++pcnametblptr)
if (pcnametblptr->pcnamenum == function_name)
break;
if (pcnametblptr->pcnamenum == 0)
(void) sprintf(buf, "%d", function_name);
else
(void) strcpy(buf, pcnametblptr->pcnamename);
return buf;
}
char *cmd_string (int fcntl_cmd)
{
static const struct cmdmap cmdtable[] = {
{ F_DUPFD, "F_DUPFD" }, { F_GETFD, "F_GETFD" }, { F_SETFD, "F_SETFD" }, { F_GETFL, "F_GETFL" },
{ F_SETFL, "F_SETFL" }, { F_GETLK, "F_GETLK" }, { F_SETLK, "F_SETLK" }, { F_SETLKW, "F_SETLKW" },
{ 0, NULL }
};
static char buf[BUFSIZ];
const struct cmdmap *cmdtblptr;
for (cmdtblptr = cmdtable; cmdtblptr->cmdnum != 0; ++cmdtblptr)
if (cmdtblptr->cmdnum == fcntl_cmd)
break;
if (cmdtblptr->cmdnum == 0)
(void) sprintf(buf, "%d", fcntl_cmd);
else
(void) strcpy(buf, cmdtblptr->cmdname);
return buf;
}
char *whence_string (int lseek_whence)
{
static const struct whencemap whencetable[] = {
{ SEEK_SET, "SEEK_SET" }, { SEEK_CUR, "SEEK_CUR" }, { SEEK_END, "SEEK_END" }, { 0, NULL }
};
static char buf[BUFSIZ];
const struct whencemap *whencetblptr;
for (whencetblptr = whencetable; whencetblptr->whencenum != 0; ++whencetblptr)
if (whencetblptr->whencenum == lseek_whence)
break;
if (whencetblptr->whencenum == 0)
(void) sprintf(buf, "%d", lseek_whence);
else
(void) strcpy(buf, whencetblptr->whencename);
return buf;
}
char *speed_string (speed_t function_speed)
{
static const struct speedmap speedtable[] = {
{ B0, "B0" }, { B50, "B50" }, { B75, "B75" }, { B110, "B110" }, { B134, "B134" },
{ B150, "B150" }, { B200, "B200" }, { B300, "B300" }, { B600, "B600" }, { B1200, "B1200" },
{ B1800, "B1800" }, { B2400, "B2400" }, { B4800, "B4800" }, { B9600, "B9600" }, { B19200, "B19200" },
{ B38400, "B38400" }, { 0, NULL }
};
static char buf[BUFSIZ];
const struct speedmap *speedtblptr;
for (speedtblptr = speedtable; speedtblptr->speednum != 0; ++speedtblptr)
if (speedtblptr->speednum == function_speed)
break;
if (speedtblptr->speednum == 0)
(void) sprintf(buf, "%d", function_speed);
else
(void) strcpy(buf, speedtblptr->speedname);
return buf;
}
char *optact_string (int tcsetattr_optact)
{
static const struct optactmap optacttable[] = {
{ TCSANOW, "TCSANOW" }, { TCSADRAIN, "TCSADRAIN" }, { TCSAFLUSH, "TCSAFLUSH" }, { 0, NULL }
};
static char buf[BUFSIZ];
const struct optactmap *optacttblptr;
for (optacttblptr = optacttable; optacttblptr->optactnum != 0; ++optacttblptr)
if (optacttblptr->optactnum == tcsetattr_optact)
break;
if (optacttblptr->optactnum == 0)
(void) sprintf(buf, "%d", tcsetattr_optact);
else
(void) strcpy(buf, optacttblptr->optactname);
return buf;
}
char *queue_string (int tcflush_queue)
{
static const struct queuemap queuetable[] = {
{ TCIFLUSH, "TCIFLUSH" }, { TCOFLUSH, "TCOFLUSH" }, { TCIOFLUSH, "TCIOFLUSH" }, { 0, NULL }
};
static char buf[BUFSIZ];
const struct queuemap *queuetblptr;
for (queuetblptr = queuetable; queuetblptr->queuenum != 0; ++queuetblptr)
if (queuetblptr->queuenum == tcflush_queue)
break;
if (queuetblptr->queuenum == 0)
(void) sprintf(buf, "%d", tcflush_queue);
else
(void) strcpy(buf, queuetblptr->queuename);
return buf;
}
char *action_string (int tcflow_action)
{
static const struct actionmap actiontable[] = {
{ TCOOFF, "TCOOFF" }, { TCOON, "TCOON" }, { TCIOFF, "TCIOFF" }, { TCION, "TCION" }, { 0, NULL }
};
static char buf[BUFSIZ];
const struct actionmap *actiontblptr;
for (actiontblptr = actiontable; actiontblptr->actionnum != 0; ++actiontblptr)
if (actiontblptr->actionnum == tcflow_action)
break;
if (actiontblptr->actionnum == 0)
(void) sprintf(buf, "%d", tcflow_action);
else
(void) strcpy(buf, actiontblptr->actionname);
return buf;
}
/* Section 3: Process Primitives */
pid_t posix_debug_fork (void)
{
pid_t ret;
int err;
(void) fprintf(stderr, "entering fork()\n");
(void) fflush(stderr);
ret = fork();
err = errno;
(void) fprintf(stderr, "exiting fork with %ld", (long) ret);
if (ret == (pid_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_execl (const char *path, const char *arg, ...)
{
va_list va;
int ret, err, i;
const char *args[NARGS];
va_start(va, arg);
(void) fprintf(stderr, "entering execl(%s, %s", canonical_string(path), canonical_string(arg));
for (i = 0; i < NARGS; ++i)
{
args[i] = va_arg(va, const char *);
(void) fprintf(stderr, ", %s", canonical_string(args[i]));
if (args[i] == NULL)
break;
}
va_end(va);
if (i == NARGS)
(void) fprintf(stderr, ", ..., NULL");
(void) fprintf(stderr, ")\n");
(void) fflush(stderr);
if (i == 0)
ret = execl(path, arg, NULL);
else if (i == 1)
ret = execl(path, arg, args[0], NULL);
else if (i == 2)
ret = execl(path, arg, args[0], args[1], NULL);
else if (i == 3)
ret = execl(path, arg, args[0], args[1], args[2], NULL);
else if (i == 4)
ret = execl(path, arg, args[0], args[1], args[2], args[3], NULL);
else if (i == 5)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], NULL);
else if (i == 6)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], NULL);
else if (i == 7)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], NULL);
else if (i == 8)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], NULL);
else if (i == 9)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], NULL);
else if (i == 10)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
NULL);
else if (i == 11)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], NULL);
else if (i == 12)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], NULL);
else if (i == 13)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], NULL);
else if (i == 14)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], NULL);
else if (i == 15)
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], args[14], NULL);
else
ret = execl(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], args[14], args[15], NULL);
/*
If NARGS changes from its original value of 16, add or subtract "if" cases according to this pattern.
*/
err = errno;
(void) fprintf(stderr, "exiting execl with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_execv (const char *path, char * const argv[])
{
int ret, err;
(void) fprintf(stderr, "entering execv(%s, %p)\n", canonical_string(path), argv);
(void) fflush(stderr);
ret = execv(path, argv);
err = errno;
(void) fprintf(stderr, "exiting execv with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_execle (const char *path, const char *arg, ...)
{
va_list va;
int ret, err, i, j;
const char *args[NARGS];
const char *envp[NENVS]; /* POSIX says it should be char * const [], but that's unassignable! */
(void) fprintf(stderr, "entering execle(%s, %s", canonical_string(path), canonical_string(arg));
for (i = 0; i < NARGS; ++i)
{
args[i] = va_arg(va, const char *);
(void) fprintf(stderr, ", %s", canonical_string(args[i]));
if (args[i] == NULL)
break;
}
if (i == NARGS)
{
while (va_arg(va, const char *) != NULL)
;
(void) fprintf(stderr, ", ..., NULL");
}
for (j = 0; j < NENVS; ++j)
{
envp[j] = va_arg(va, char * const);
(void) fprintf(stderr, ", %s", canonical_string(envp[j]));
if (envp[j] == NULL)
break;
}
if (j == NENVS)
{
envp[NENVS - 1] = NULL;
(void) fprintf(stderr, ", ..., NULL");
}
va_end(va);
(void) fprintf(stderr, ")\n");
(void) fflush(stderr);
if (i == 0)
ret = execle(path, arg, NULL, envp);
else if (i == 1)
ret = execle(path, arg, args[0], NULL, envp);
else if (i == 2)
ret = execle(path, arg, args[0], args[1], NULL, envp);
else if (i == 3)
ret = execle(path, arg, args[0], args[1], args[2], NULL, envp);
else if (i == 4)
ret = execle(path, arg, args[0], args[1], args[2], args[3], NULL, envp);
else if (i == 5)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], NULL, envp);
else if (i == 6)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], NULL, envp);
else if (i == 7)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], NULL, envp);
else if (i == 8)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], NULL, envp);
else if (i == 9)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], NULL,
envp);
else if (i == 10)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
NULL, envp);
else if (i == 11)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], NULL, envp);
else if (i == 12)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], NULL, envp);
else if (i == 13)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], NULL, envp);
else if (i == 14)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], NULL, envp);
else if (i == 15)
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], args[14], NULL, envp);
else
ret = execle(path, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], args[14], args[15], NULL, envp);
/*
If NARGS changes from its original value of 16, add or subtract "if" cases according to this pattern.
*/
err = errno;
(void) fprintf(stderr, "exiting execle with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_execve (const char *path, char * const argv[], char * const envp[])
{
int ret, err;
(void) fprintf(stderr, "entering execve(%s, %p, %p)\n", canonical_string(path), argv, envp);
(void) fflush(stderr);
ret = execve(path, argv, envp);
err = errno;
(void) fprintf(stderr, "exiting execve with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_execlp (const char *file, const char *arg, ...)
{
va_list va;
int ret, err, i;
const char *args[NARGS];
va_start(va, arg);
(void) fprintf(stderr, "entering execlp(%s, %s", canonical_string(file), canonical_string(arg));
for (i = 0; i < NARGS; ++i)
{
args[i] = va_arg(va, const char *);
(void) fprintf(stderr, ", %s", canonical_string(args[i]));
if (args[i] == NULL)
break;
}
va_end(va);
if (i == NARGS)
(void) fprintf(stderr, ", ..., NULL");
(void) fprintf(stderr, ")\n");
(void) fflush(stderr);
if (i == 0)
ret = execlp(file, arg, NULL);
else if (i == 1)
ret = execlp(file, arg, args[0], NULL);
else if (i == 2)
ret = execlp(file, arg, args[0], args[1], NULL);
else if (i == 3)
ret = execlp(file, arg, args[0], args[1], args[2], NULL);
else if (i == 4)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], NULL);
else if (i == 5)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], NULL);
else if (i == 6)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], NULL);
else if (i == 7)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], NULL);
else if (i == 8)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], NULL);
else if (i == 9)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], NULL);
else if (i == 10)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
NULL);
else if (i == 11)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], NULL);
else if (i == 12)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], NULL);
else if (i == 13)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], NULL);
else if (i == 14)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], NULL);
else if (i == 15)
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], args[14], NULL);
else
ret = execlp(file, arg, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9],
args[10], args[11], args[12], args[13], args[14], args[15], NULL);
/*
If NARGS changes from its original value of 16, add or subtract "if" cases according to this pattern.
*/
err = errno;
(void) fprintf(stderr, "exiting execlp with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_execvp (const char *file, char * const argv[])
{
int ret, err;
(void) fprintf(stderr, "entering execvp(%s, %p)\n", canonical_string(file), argv);
(void) fflush(stderr);
ret = execvp(file, argv);
err = errno;
(void) fprintf(stderr, "exiting execvp with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
pid_t posix_debug_wait (int *statloc)
{
pid_t ret;
int err;
(void) fprintf(stderr, "entering wait(%p)\n", statloc);
(void) fflush(stderr);
ret = wait(statloc);
err = errno;
(void) fprintf(stderr, "exiting wait with %ld", (long) ret);
if (ret == (pid_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
pid_t posix_debug_waitpid (pid_t pid, int *statloc, int options)
{
pid_t ret;
int err;
(void) fprintf(stderr, "entering waitpid(%ld, %p, %s)\n", (long) pid, statloc, options_string(options));
(void) fflush(stderr);
ret = waitpid(pid, statloc, options);
err = errno;
(void) fprintf(stderr, "exiting waitpid with %ld", (long) ret);
if (ret == (pid_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
void posix_debug__exit (int status)
{
int err, saved_errno;
(void) fprintf(stderr, "entering _exit(%d)\n", status);
(void) fflush(stderr);
saved_errno = errno;
_exit(status);
err = errno;
(void) fprintf(stderr, "exiting _exit");
if (saved_errno != err)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
}
int posix_debug_kill (pid_t pid, int sig)
{
int ret, err;
(void) fprintf(stderr, "entering kill(%ld, %s)\n", (long) pid, signum_string(sig));
(void) fflush(stderr);
ret = kill(pid, sig);
err = errno;
(void) fprintf(stderr, "exiting kill with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigemptyset (sigset_t *set)
{
int ret, err;
(void) fprintf(stderr, "entering sigemptyset(%p)\n", set);
(void) fflush(stderr);
ret = sigemptyset(set);
err = errno;
(void) fprintf(stderr, "exiting sigemptyset with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigfillset (sigset_t *set)
{
int ret, err;
(void) fprintf(stderr, "entering sigfillset(%p)\n", set);
(void) fflush(stderr);
ret = sigfillset(set);
err = errno;
(void) fprintf(stderr, "exiting sigfillset with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigaddset (sigset_t *set, int signo)
{
int ret, err;
(void) fprintf(stderr, "entering sigaddset(%p, %s)\n", set, signum_string(signo));
(void) fflush(stderr);
ret = sigaddset(set, signo);
err = errno;
(void) fprintf(stderr, "exiting sigaddset with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigdelset (sigset_t *set, int signo)
{
int ret, err;
(void) fprintf(stderr, "entering sigdelset(%p, %s)\n", set, signum_string(signo));
(void) fflush(stderr);
ret = sigdelset(set, signo);
err = errno;
(void) fprintf(stderr, "exiting sigdelset with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigismember (const sigset_t *set, int signo)
{
int ret, err;
(void) fprintf(stderr, "entering sigismember(%p, %s)\n", set, signum_string(signo));
(void) fflush(stderr);
ret = sigismember(set, signo);
err = errno;
(void) fprintf(stderr, "exiting sigismember with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
{
int ret, err;
(void) fprintf(stderr, "entering sigaction(%s, %p, %p)\n", signum_string(sig), act, oact);
(void) fflush(stderr);
ret = sigaction(sig, act, oact);
err = errno;
(void) fprintf(stderr, "exiting sigaction with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigprocmask (int how, const sigset_t *set, sigset_t *oset)
{
int ret, err;
(void) fprintf(stderr, "entering sigprocmask(%s, %p, %p)\n", how_string(how), set, oset);
(void) fflush(stderr);
ret = sigprocmask(how, set, oset);
err = errno;
(void) fprintf(stderr, "exiting sigprocmask with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigpending (sigset_t *set)
{
int ret, err;
(void) fprintf(stderr, "entering sigpending(%p)\n", set);
(void) fflush(stderr);
ret = sigpending(set);
err = errno;
(void) fprintf(stderr, "exiting sigpending with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_sigsuspend (const sigset_t *sigmask)
{
int ret, err;
(void) fprintf(stderr, "entering sigsuspend(%p)\n", sigmask);
(void) fflush(stderr);
ret = sigsuspend(sigmask);
err = errno;
(void) fprintf(stderr, "exiting sigsuspend with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
unsigned int posix_debug_alarm (unsigned int seconds)
{
unsigned int ret;
(void) fprintf(stderr, "entering alarm(%u)\n", seconds);
(void) fflush(stderr);
ret = alarm(seconds);
(void) fprintf(stderr, "exiting alarm with %u\n", ret);
(void) fflush(stderr);
return ret;
}
int posix_debug_pause (void)
{
int ret, err;
(void) fprintf(stderr, "entering pause()\n");
(void) fflush(stderr);
ret = pause();
err = errno;
(void) fprintf(stderr, "exiting pause with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
unsigned int posix_debug_sleep (unsigned int seconds)
{
unsigned int ret;
(void) fprintf(stderr, "entering sleep(%u)\n", seconds);
(void) fflush(stderr);
ret = sleep(seconds);
(void) fprintf(stderr, "exiting sleep with %u\n", ret);
(void) fflush(stderr);
return ret;
}
/* Section 4: Process Environment */
pid_t posix_debug_getpid (void)
{
pid_t ret;
(void) fprintf(stderr, "entering getpid()\n");
(void) fflush(stderr);
ret = getpid();
(void) fprintf(stderr, "exiting getpid with %ld\n", (long) ret);
(void) fflush(stderr);
return ret;
}
pid_t posix_debug_getppid (void)
{
pid_t ret;
(void) fprintf(stderr, "entering getppid()\n");
(void) fflush(stderr);
ret = getppid();
(void) fprintf(stderr, "exiting getppid with %ld\n", (long) ret);
(void) fflush(stderr);
return ret;
}
uid_t posix_debug_getuid (void)
{
uid_t ret;
(void) fprintf(stderr, "entering getuid()\n");
(void) fflush(stderr);
ret = getuid();
(void) fprintf(stderr, "exiting getuid with %lu\n", (unsigned long) ret);
(void) fflush(stderr);
return ret;
}
uid_t posix_debug_geteuid (void)
{
uid_t ret;
(void) fprintf(stderr, "entering geteuid()\n");
(void) fflush(stderr);
ret = geteuid();
(void) fprintf(stderr, "exiting geteuid with %lu\n", (unsigned long) ret);
(void) fflush(stderr);
return ret;
}
gid_t posix_debug_getgid (void)
{
gid_t ret;
(void) fprintf(stderr, "entering getgid()\n");
(void) fflush(stderr);
ret = getgid();
(void) fprintf(stderr, "exiting getgid with %lu\n", (unsigned long) ret);
(void) fflush(stderr);
return ret;
}
gid_t posix_debug_getegid (void)
{
gid_t ret;
(void) fprintf(stderr, "entering getegid()\n");
(void) fflush(stderr);
ret = getegid();
(void) fprintf(stderr, "exiting getegid with %lu\n", (unsigned long) ret);
(void) fflush(stderr);
return ret;
}
int posix_debug_setuid (uid_t uid)
{
int ret, err;
(void) fprintf(stderr, "entering setuid(%lu)\n", (unsigned long) uid);
(void) fflush(stderr);
ret = setuid(uid);
err = errno;
(void) fprintf(stderr, "exiting setuid with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_setgid (gid_t gid)
{
int ret, err;
(void) fprintf(stderr, "entering setgid(%lu)\n", (unsigned long) gid);
(void) fflush(stderr);
ret = setgid(gid);
err = errno;
(void) fprintf(stderr, "exiting setgid with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_getgroups (int gidsetsize, gid_t grouplist[])
{
int ret, err;
(void) fprintf(stderr, "entering getgroups(%d, %p)\n", gidsetsize, grouplist);
(void) fflush(stderr);
ret = getgroups(gidsetsize, grouplist);
err = errno;
(void) fprintf(stderr, "exiting getgroups with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
char *posix_debug_getlogin (void)
{
char *ret;
(void) fprintf(stderr, "entering getlogin()\n");
(void) fflush(stderr);
ret = getlogin();
(void) fprintf(stderr, "exiting getlogin with %s\n", canonical_string(ret));
(void) fflush(stderr);
return ret;
}
pid_t posix_debug_getpgrp (void)
{
pid_t ret;
(void) fprintf(stderr, "entering getpgrp()\n");
(void) fflush(stderr);
ret = getpgrp();
(void) fprintf(stderr, "exiting getpgrp with %ld\n", (long) ret);
(void) fflush(stderr);
return ret;
}
pid_t posix_debug_setsid (void)
{
pid_t ret;
int err;
(void) fprintf(stderr, "entering setsid()\n");
(void) fflush(stderr);
ret = setsid();
err = errno;
(void) fprintf(stderr, "exiting setsid with %ld", (long) ret);
if (ret == (pid_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_setpgid (pid_t pid, pid_t pgid)
{
int ret, err;
(void) fprintf(stderr, "entering setpgid(%ld, %ld)\n", (long) pid, (long) pgid);
(void) fflush(stderr);
ret = setpgid(pid, pgid);
err = errno;
(void) fprintf(stderr, "exiting setpgid with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_uname (struct utsname *name)
{
int ret, err;
(void) fprintf(stderr, "entering uname(%p)\n", name);
(void) fflush(stderr);
ret = uname(name);
err = errno;
(void) fprintf(stderr, "exiting uname with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
time_t posix_debug_time (time_t *tloc)
{
time_t ret;
int err;
(void) fprintf(stderr, "entering time(%p)\n", tloc);
(void) fflush(stderr);
ret = time(tloc);
err = errno;
(void) fprintf(stderr, "exiting time with %ld", (long) ret);
if (ret == (time_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
clock_t posix_debug_times (struct tms *buffer)
{
clock_t ret;
int err;
(void) fprintf(stderr, "entering times(%p)\n", buffer);
(void) fflush(stderr);
ret = times(buffer);
err = errno;
(void) fprintf(stderr, "exiting times with %ld", (long) ret);
if (ret == (clock_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
char *posix_debug_getenv (const char *name)
{
char *ret;
(void) fprintf(stderr, "entering getenv(%s)\n", canonical_string(name));
(void) fflush(stderr);
ret = getenv(name);
(void) fprintf(stderr, "exiting getenv with %s\n", canonical_string(ret));
(void) fflush(stderr);
return ret;
}
char *posix_debug_ctermid (char *s)
{
char *ret;
(void) fprintf(stderr, "entering ctermid(%s)\n", canonical_string(s));
(void) fflush(stderr);
ret = ctermid(s);
(void) fprintf(stderr, "exiting ctermid with %s\n", canonical_string(ret));
(void) fflush(stderr);
return ret;
}
char *posix_debug_ttyname (int fildes)
{
char *ret;
(void) fprintf(stderr, "entering ttyname(%d)\n", fildes);
(void) fflush(stderr);
ret = ttyname(fildes);
(void) fprintf(stderr, "exiting ttyname with %s\n", canonical_string(ret));
(void) fflush(stderr);
return ret;
}
int posix_debug_isatty (int fildes)
{
int ret;
(void) fprintf(stderr, "entering isatty(%d)\n", fildes);
(void) fflush(stderr);
ret = isatty(fildes);
(void) fprintf(stderr, "exiting isatty with %d\n", ret);
(void) fflush(stderr);
return ret;
}
long posix_debug_sysconf (int name)
{
long ret;
int err, saved_errno;
(void) fprintf(stderr, "entering sysconf(%s)\n", scname_string(name));
(void) fflush(stderr);
saved_errno = errno;
ret = sysconf(name);
err = errno;
(void) fprintf(stderr, "exiting sysconf with %ld", (long) ret);
if (ret == (long) -1 && saved_errno != err)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
/* Section 5: Files and Directories */
DIR *posix_debug_opendir (const char *dirname)
{
DIR *ret;
int err;
(void) fprintf(stderr, "entering opendir(%s)\n", canonical_string(dirname));
(void) fflush(stderr);
ret = opendir(dirname);
err = errno;
(void) fprintf(stderr, "exiting opendir with %p", ret);
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
struct dirent *posix_debug_readdir (DIR *dirp)
{
struct dirent *ret;
int err;
(void) fprintf(stderr, "entering readdir(%p)\n", dirp);
(void) fflush(stderr);
ret = readdir(dirp);
err = errno;
(void) fprintf(stderr, "exiting readdir with %p", ret);
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
void posix_debug_rewinddir (DIR *dirp)
{
int err, saved_errno;
(void) fprintf(stderr, "entering rewinddir(%p)\n", dirp);
(void) fflush(stderr);
saved_errno = errno;
rewinddir(dirp);
err = errno;
(void) fprintf(stderr, "exiting rewinddir");
if (saved_errno != err)
(void) fprintf(stderr, "; errno: %d\n", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
}
int posix_debug_closedir (DIR *dirp)
{
int ret, err;
(void) fprintf(stderr, "entering closedir(%p)\n", dirp);
(void) fflush(stderr);
ret = closedir(dirp);
err = errno;
(void) fprintf(stderr, "exiting closedir with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_chdir (const char *path)
{
int ret, err;
(void) fprintf(stderr, "entering chdir(%s)\n", canonical_string(path));
(void) fflush(stderr);
ret = chdir(path);
err = errno;
(void) fprintf(stderr, "exiting chdir with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
char *posix_debug_getcwd (char *buf, size_t size)
{
char *ret;
int err;
(void) fprintf(stderr, "entering getcwd(%p, %lu)\n", buf, (unsigned long) size);
(void) fflush(stderr);
ret = getcwd(buf, size);
err = errno;
(void) fprintf(stderr, "exiting getcwd with %s", canonical_string(ret));
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_open (const char *path, int oflag, ...)
{
va_list va;
int ret, err;
mode_t mode;
va_start(va, oflag);
(void) fprintf(stderr, "entering open(%s, %s", canonical_string(path), oflag_string(oflag));
if (oflag & O_CREAT)
{
mode = va_arg(va, mode_t);
(void) fprintf(stderr, ", %s", mode_string(mode));
}
va_end(va);
(void) fprintf(stderr, ")\n");
(void) fflush(stderr);
if (oflag & O_CREAT)
ret = open(path, oflag, mode);
else
ret = open(path, oflag);
err = errno;
(void) fprintf(stderr, "exiting open with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_creat (const char *path, mode_t mode)
{
int ret, err;
(void) fprintf(stderr, "entering creat(%s, %s)\n", canonical_string(path), mode_string(mode));
(void) fflush(stderr);
ret = creat(path, mode);
err = errno;
(void) fprintf(stderr, "exiting creat with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
mode_t posix_debug_umask (mode_t cmask)
{
mode_t ret;
(void) fprintf(stderr, "entering umask(%s)\n", mode_string(cmask));
(void) fflush(stderr);
ret = umask(cmask);
(void) fprintf(stderr, "exiting umask with %s\n", mode_string(ret));
(void) fflush(stderr);
return ret;
}
int posix_debug_link (const char *existing, const char *new)
{
int ret, err;
(void) fprintf(stderr, "entering link(%s, %s)\n", canonical_string(existing), canonical_string(new));
(void) fflush(stderr);
ret = link(existing, new);
err = errno;
(void) fprintf(stderr, "exiting link with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_mkdir (const char *path, mode_t mode)
{
int ret, err;
(void) fprintf(stderr, "entering mkdir(%s, %s)\n", canonical_string(path), mode_string(mode));
(void) fflush(stderr);
ret = mkdir(path, mode);
err = errno;
(void) fprintf(stderr, "exiting mkdir with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_mkfifo (const char *path, mode_t mode)
{
int ret, err;
(void) fprintf(stderr, "entering mkfifo(%s, %s)\n", canonical_string(path), mode_string(mode));
(void) fflush(stderr);
ret = mkfifo(path, mode);
err = errno;
(void) fprintf(stderr, "exiting mkfifo with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_unlink (const char *path)
{
int ret, err;
(void) fprintf(stderr, "entering unlink(%s)\n", canonical_string(path));
(void) fflush(stderr);
ret = unlink(path);
err = errno;
(void) fprintf(stderr, "exiting unlink with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_rmdir (const char *path)
{
int ret, err;
(void) fprintf(stderr, "entering rmdir(%s)\n", canonical_string(path));
(void) fflush(stderr);
ret = rmdir(path);
err = errno;
(void) fprintf(stderr, "exiting rmdir with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_rename (const char *old, const char *new)
{
int ret, err;
(void) fprintf(stderr, "entering rename(%s, %s)\n", canonical_string(old), canonical_string(new));
(void) fflush(stderr);
ret = rename(old, new);
err = errno;
(void) fprintf(stderr, "exiting rename with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_stat (const char *path, struct stat *buf)
{
int ret, err;
(void) fprintf(stderr, "entering stat(%s, %p)\n", canonical_string(path), buf);
(void) fflush(stderr);
ret = stat(path, buf);
err = errno;
(void) fprintf(stderr, "exiting stat with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_fstat (int fildes, struct stat *buf)
{
int ret, err;
(void) fprintf(stderr, "entering fstat(%d, %p)\n", fildes, buf);
(void) fflush(stderr);
ret = fstat(fildes, buf);
err = errno;
(void) fprintf(stderr, "exiting fstat with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_access (const char *path, int amode)
{
int ret, err;
(void) fprintf(stderr, "entering access(%s, %s)\n", canonical_string(path), amode_string(amode));
(void) fflush(stderr);
ret = access(path, amode);
err = errno;
(void) fprintf(stderr, "exiting access with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_chmod (const char *path, mode_t mode)
{
int ret, err;
(void) fprintf(stderr, "entering chmod(%s, %s)\n", canonical_string(path), mode_string(mode));
(void) fflush(stderr);
ret = chmod(path, mode);
err = errno;
(void) fprintf(stderr, "exiting chmod with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_chown (const char *path, uid_t owner, gid_t group)
{
int ret, err;
(void) fprintf(stderr, "entering chown(%s, %lu, %lu)\n",
canonical_string(path), (unsigned long) owner, (unsigned long) group);
(void) fflush(stderr);
ret = chown(path, owner, group);
err = errno;
(void) fprintf(stderr, "exiting chown with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_utime (const char *path, const struct utimbuf *times)
{
int ret, err;
(void) fprintf(stderr, "entering utime(%s, %p)\n", canonical_string(path), times);
(void) fflush(stderr);
ret = utime(path, times);
err = errno;
(void) fprintf(stderr, "exiting utime with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
long posix_debug_pathconf (const char *path, int name)
{
long ret;
int err, saved_errno;
(void) fprintf(stderr, "entering pathconf(%s, %s)\n", canonical_string(path), pcname_string(name));
(void) fflush(stderr);
saved_errno = errno;
ret = pathconf(path, name);
err = errno;
(void) fprintf(stderr, "exiting pathconf with %ld", (long) ret);
if (ret == (long) -1 && saved_errno != err)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
long posix_debug_fpathconf (int fildes, int name)
{
long ret;
int err, saved_errno;
(void) fprintf(stderr, "entering fpathconf(%d, %s)\n", fildes, pcname_string(name));
(void) fflush(stderr);
saved_errno = errno;
ret = fpathconf(fildes, name);
err = errno;
(void) fprintf(stderr, "exiting fpathconf with %ld", (long) ret);
if (ret == (long) -1 && saved_errno != err)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
/* Section 6: Input and Output Primitives */
int posix_debug_pipe (int fildes[2])
{
int ret, err;
(void) fprintf(stderr, "entering pipe(%p)\n", fildes);
(void) fflush(stderr);
ret = pipe(fildes);
err = errno;
(void) fprintf(stderr, "exiting pipe with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_dup (int fildes)
{
int ret, err;
(void) fprintf(stderr, "entering dup(%d)\n", fildes);
(void) fflush(stderr);
ret = dup(fildes);
err = errno;
(void) fprintf(stderr, "exiting dup with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_dup2 (int fildes, int fildes2)
{
int ret, err;
(void) fprintf(stderr, "entering dup2(%d, %d)\n", fildes, fildes2);
(void) fflush(stderr);
ret = dup2(fildes, fildes2);
err = errno;
(void) fprintf(stderr, "exiting dup2 with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_close (int fildes)
{
int ret, err;
(void) fprintf(stderr, "entering close(%d)\n", fildes);
(void) fflush(stderr);
ret = close(fildes);
err = errno;
(void) fprintf(stderr, "exiting close with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
ssize_t posix_debug_read (int fildes, void *buf, size_t nbyte)
{
ssize_t ret;
int err;
(void) fprintf(stderr, "entering read(%d, %p, %lu)\n", fildes, buf, (unsigned long) nbyte);
(void) fflush(stderr);
ret = read(fildes, buf, nbyte);
err = errno;
(void) fprintf(stderr, "exiting read with %ld", (long) ret);
if (ret == (ssize_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
ssize_t posix_debug_write (int fildes, const void *buf, size_t nbyte)
{
ssize_t ret;
int err;
(void) fprintf(stderr, "entering write(%d, %p, %lu)\n", fildes, buf, (unsigned long) nbyte);
(void) fflush(stderr);
ret = write(fildes, buf, nbyte);
err = errno;
(void) fprintf(stderr, "exiting write with %ld", (long) ret);
if (ret == (ssize_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_fcntl (int fildes, int cmd, ...)
{
va_list va;
int ret, err, iarg;
struct flock *farg;
va_start(va, cmd);
(void) fprintf(stderr, "entering fcntl(%d, %s", fildes, cmd_string(cmd));
if (cmd == F_DUPFD || cmd == F_SETFD || cmd == F_SETFL)
{
iarg = va_arg(va, int);
(void) fprintf(stderr, ", %d", iarg);
}
else if (cmd == F_GETLK || cmd == F_SETLK || cmd == F_SETLKW)
{
farg = va_arg(va, struct flock *);
(void) fprintf(stderr, ", %p", farg);
}
va_end(va);
(void) fprintf(stderr, ")\n");
(void) fflush(stderr);
if (cmd == F_DUPFD || cmd == F_SETFD || cmd == F_SETFL)
ret = fcntl(fildes, cmd, iarg);
else if (cmd == F_GETLK || cmd == F_SETLK || cmd == F_SETLKW)
ret = fcntl(fildes, cmd, farg);
else
ret = fcntl(fildes, cmd);
err = errno;
(void) fprintf(stderr, "exiting fcntl with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
off_t posix_debug_lseek (int fildes, off_t offset, int whence)
{
off_t ret;
int err;
(void) fprintf(stderr, "entering lseek(%d, %ld, %s)\n", fildes, (long) offset, whence_string(whence));
(void) fflush(stderr);
ret = lseek(fildes, offset, whence);
err = errno;
(void) fprintf(stderr, "exiting lseek with %ld", (long) ret);
if (ret == (off_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
/* Section 7: Device- and Class-Specific Functions */
speed_t posix_debug_cfgetospeed (const struct termios *termios_p)
{
speed_t ret;
int err, saved_errno;
(void) fprintf(stderr, "entering cfgetospeed(%p)\n", termios_p);
(void) fflush(stderr);
saved_errno = errno;
ret = cfgetospeed(termios_p);
err = errno;
(void) fprintf(stderr, "exiting cfgetospeed with %s", speed_string(ret));
if (saved_errno != err)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_cfsetospeed (struct termios *termios_p, speed_t speed)
{
int ret, err;
(void) fprintf(stderr, "entering cfsetospeed(%p, %s)\n", termios_p, speed_string(speed));
(void) fflush(stderr);
ret = cfsetospeed(termios_p, speed);
err = errno;
(void) fprintf(stderr, "exiting cfsetospeed with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
speed_t posix_debug_cfgetispeed (const struct termios *termios_p)
{
speed_t ret;
int err, saved_errno;
(void) fprintf(stderr, "entering cfgetispeed(%p)\n", termios_p);
(void) fflush(stderr);
saved_errno = errno;
ret = cfgetispeed(termios_p);
err = errno;
(void) fprintf(stderr, "exiting cfgetispeed with %s", speed_string(ret));
if (saved_errno != err)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_cfsetispeed (struct termios *termios_p, speed_t speed)
{
int ret, err;
(void) fprintf(stderr, "entering cfsetispeed(%p, %s)\n", termios_p, speed_string(speed));
(void) fflush(stderr);
ret = cfsetispeed(termios_p, speed);
err = errno;
(void) fprintf(stderr, "exiting cfsetispeed with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_tcgetattr (int fildes, struct termios *termios_p)
{
int ret, err;
(void) fprintf(stderr, "entering tcgetattr(%d, %p)\n", fildes, termios_p);
(void) fflush(stderr);
ret = tcgetattr(fildes, termios_p);
err = errno;
(void) fprintf(stderr, "exiting tcgetattr with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_tcsetattr (int fildes, int optional_actions, const struct termios *termios_p)
{
int ret, err;
(void) fprintf(stderr, "entering tcsetattr(%d, %s, %p)\n", fildes, optact_string(optional_actions), termios_p);
(void) fflush(stderr);
ret = tcsetattr(fildes, optional_actions, termios_p);
err = errno;
(void) fprintf(stderr, "exiting tcsetattr with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_tcsendbreak (int fildes, int duration)
{
int ret, err;
(void) fprintf(stderr, "entering tcsendbreak(%d, %d)\n", fildes, duration);
(void) fflush(stderr);
ret = tcsendbreak(fildes, duration);
err = errno;
(void) fprintf(stderr, "exiting tcsendbreak with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_tcdrain (int fildes)
{
int ret, err;
(void) fprintf(stderr, "entering tcdrain(%d)\n", fildes);
(void) fflush(stderr);
ret = tcdrain(fildes);
err = errno;
(void) fprintf(stderr, "exiting tcdrain with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_tcflush (int fildes, int queue_selector)
{
int ret, err;
(void) fprintf(stderr, "entering tcflush(%d, %s)\n", fildes, queue_string(queue_selector));
(void) fflush(stderr);
ret = tcflush(fildes, queue_selector);
err = errno;
(void) fprintf(stderr, "exiting tcflush with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_tcflow (int fildes, int action)
{
int ret, err;
(void) fprintf(stderr, "entering tcflow(%d, %s)\n", fildes, action_string(action));
(void) fflush(stderr);
ret = tcflow(fildes, action);
err = errno;
(void) fprintf(stderr, "exiting tcflow with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
pid_t posix_debug_tcgetpgrp (int fildes)
{
pid_t ret;
int err;
(void) fprintf(stderr, "entering tcgetpgrp(%d)\n", fildes);
(void) fflush(stderr);
ret = tcgetpgrp(fildes);
err = errno;
(void) fprintf(stderr, "exiting tcgetpgrp with %ld", (long) ret);
if (ret == (pid_t) -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
int posix_debug_tcsetpgrp (int fildes, pid_t pgrp_id)
{
int ret, err;
(void) fprintf(stderr, "entering tcsetpgrp(%d, %ld)\n", fildes, (long) pgrp_id);
(void) fflush(stderr);
ret = tcsetpgrp(fildes, pgrp_id);
err = errno;
(void) fprintf(stderr, "exiting tcsetpgrp with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
/* Section 8.2: C Language Input/Output Functions */
int posix_debug_fileno (FILE *stream)
{
int ret, err;
(void) fprintf(stderr, "entering fileno(%p)\n", stream);
(void) fflush(stderr);
ret = fileno(stream);
err = errno;
(void) fprintf(stderr, "exiting fileno with %d", ret);
if (ret == -1)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
FILE *posix_debug_fdopen (int fildes, const char *type)
{
FILE *ret;
int err;
(void) fprintf(stderr, "entering fdopen(%d, %s)\n", fildes, canonical_string(type));
(void) fflush(stderr);
ret = fdopen(fildes, type);
err = errno;
(void) fprintf(stderr, "exiting fdopen with %p", ret);
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
/* Section 8.3: Other C Language Functions */
void posix_debug_siglongjmp (sigjmp_buf env, int val)
{
int err, saved_errno;
(void) fprintf(stderr, "entering siglongjmp(%p, %d)\n", env, val);
(void) fflush(stderr);
saved_errno = errno;
siglongjmp(env, val);
err = errno;
(void) fprintf(stderr, "exiting siglongjmp");
if (saved_errno != err)
(void) fprintf(stderr, "; errno: %d\n", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
}
void posix_debug_tzset (void)
{
int err, saved_errno;
(void) fprintf(stderr, "entering tzset()\n");
(void) fflush(stderr);
saved_errno = errno;
tzset();
err = errno;
(void) fprintf(stderr, "exiting tzset");
if (saved_errno != err)
(void) fprintf(stderr, "; errno: %d\n", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
}
/* Section 9: System Databases */
struct group *posix_debug_getgrgid (gid_t gid)
{
struct group *ret;
int err;
(void) fprintf(stderr, "entering getgrgid(%lu)\n", (unsigned long) gid);
(void) fflush(stderr);
ret = getgrgid(gid);
err = errno;
(void) fprintf(stderr, "exiting getgrgid with %p", ret);
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
struct group *posix_debug_getgrnam (const char *name)
{
struct group *ret;
int err;
(void) fprintf(stderr, "entering getgrnam(%s)\n", canonical_string(name));
(void) fflush(stderr);
ret = getgrnam(name);
err = errno;
(void) fprintf(stderr, "exiting getgrnam with %p", ret);
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
struct passwd *posix_debug_getpwuid (uid_t uid)
{
struct passwd *ret;
int err;
(void) fprintf(stderr, "entering getpwuid(%lu)\n", (unsigned long) uid);
(void) fflush(stderr);
ret = getpwuid(uid);
err = errno;
(void) fprintf(stderr, "exiting getpwuid with %p", ret);
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}
struct passwd *posix_debug_getpwnam (const char *name)
{
struct passwd *ret;
int err;
(void) fprintf(stderr, "entering getpwnam(%s)\n", canonical_string(name));
(void) fflush(stderr);
ret = getpwnam(name);
err = errno;
(void) fprintf(stderr, "exiting getpwnam with %p", ret);
if (ret == NULL)
(void) fprintf(stderr, "; errno: %d", err);
(void) fprintf(stderr, "\n");
(void) fflush(stderr);
return ret;
}