mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|