Skip to content

Commit

Permalink
mock my_execvp
Browse files Browse the repository at this point in the history
Signed-off-by: Yury V. Zaytsev <[email protected]>
  • Loading branch information
zyv committed Oct 3, 2024
1 parent 9527c41 commit 01c4b9b
Show file tree
Hide file tree
Showing 18 changed files with 120 additions and 50 deletions.
3 changes: 2 additions & 1 deletion lib/tty/tty-ncurses.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@

#include "lib/global.h"
#include "lib/strutil.h" /* str_term_form */
#include "lib/util.h"

#ifndef WANT_TERM_H
#define WANT_TERM_H
Expand Down Expand Up @@ -102,7 +103,7 @@ tty_setup_sigwinch (void (*handler) (int))
#ifdef SA_RESTART
act.sa_flags = SA_RESTART;
#endif /* SA_RESTART */
sigaction (SIGWINCH, &act, &oact);
my_sigaction (SIGWINCH, &act, &oact);
#endif /* SIGWINCH */

tty_create_winch_pipe ();
Expand Down
7 changes: 4 additions & 3 deletions lib/tty/tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@

#include "lib/global.h"
#include "lib/strutil.h"
#include "lib/util.h"

#include "tty.h"
#include "tty-internal.h"
Expand Down Expand Up @@ -146,7 +147,7 @@ tty_start_interrupt_key (void)
#ifdef SA_RESTART
act.sa_flags = SA_RESTART;
#endif /* SA_RESTART */
sigaction (SIGINT, &act, NULL);
my_sigaction (SIGINT, &act, NULL);
}

/* --------------------------------------------------------------------------------------------- */
Expand All @@ -159,7 +160,7 @@ tty_enable_interrupt_key (void)
memset (&act, 0, sizeof (act));
act.sa_handler = sigintr_handler;
sigemptyset (&act.sa_mask);
sigaction (SIGINT, &act, NULL);
my_sigaction (SIGINT, &act, NULL);
got_interrupt = 0;
}

Expand All @@ -173,7 +174,7 @@ tty_disable_interrupt_key (void)
memset (&act, 0, sizeof (act));
act.sa_handler = SIG_IGN;
sigemptyset (&act.sa_mask);
sigaction (SIGINT, &act, NULL);
my_sigaction (SIGINT, &act, NULL);
}

/* --------------------------------------------------------------------------------------------- */
Expand Down
13 changes: 13 additions & 0 deletions lib/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,11 @@ typedef struct
mc_pipe_stream_t err;
} mc_pipe_t;

/* sighandler_t is GNU extension */
#ifndef HAVE_SIGHANDLER_T
typedef void (*sighandler_t) (int);
#endif

/*** structures declarations (and typedefs of structures)*****************************************/

/*** global variables defined in .c file *********************************************************/
Expand Down Expand Up @@ -200,6 +205,14 @@ const char *get_owner (uid_t uid);
/* Returns a copy of *s until a \n is found and is below top */
const char *extract_line (const char *s, const char *top);

/* System call wrappers */
sighandler_t my_signal (int signum, sighandler_t handler) __attribute__((weak));
int my_sigaction (int signum, const struct sigaction *act, struct sigaction *oldact)
__attribute__((weak));
pid_t my_fork (void) __attribute__((weak));
int my_execvp (const char *file, char *const argv[]) __attribute__((weak));
char *my_get_current_dir (void) __attribute__((weak));

/* Process spawning */
int my_system (int flags, const char *shell, const char *command);
int my_systeml (int flags, const char *shell, ...);
Expand Down
87 changes: 71 additions & 16 deletions lib/utilunix.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,11 @@ i_cache_add (int id, int_cache *cache, int size, char *text, int *last)
/* --------------------------------------------------------------------------------------------- */

static my_fork_state_t
my_fork (void)
my_fork_state (void)
{
pid_t pid;

pid = fork ();
pid = my_fork ();

if (pid < 0)
{
Expand Down Expand Up @@ -176,22 +176,22 @@ my_system__save_sigaction_handlers (my_system_sigactions_t *sigactions)
ignore.sa_handler = SIG_IGN;
sigemptyset (&ignore.sa_mask);

sigaction (SIGINT, &ignore, &sigactions->intr);
sigaction (SIGQUIT, &ignore, &sigactions->quit);
my_sigaction (SIGINT, &ignore, &sigactions->intr);
my_sigaction (SIGQUIT, &ignore, &sigactions->quit);

/* Restore the original SIGTSTP handler, we don't want ncurses' */
/* handler messing the screen after the SIGCONT */
sigaction (SIGTSTP, &startup_handler, &sigactions->stop);
my_sigaction (SIGTSTP, &startup_handler, &sigactions->stop);
}

/* --------------------------------------------------------------------------------------------- */

static void
my_system__restore_sigaction_handlers (my_system_sigactions_t *sigactions)
{
sigaction (SIGINT, &sigactions->intr, NULL);
sigaction (SIGQUIT, &sigactions->quit, NULL);
sigaction (SIGTSTP, &sigactions->stop, NULL);
my_sigaction (SIGINT, &sigactions->intr, NULL);
my_sigaction (SIGQUIT, &sigactions->quit, NULL);
my_sigaction (SIGTSTP, &sigactions->stop, NULL);
}

/* --------------------------------------------------------------------------------------------- */
Expand Down Expand Up @@ -330,7 +330,7 @@ get_group (gid_t gid)
void
save_stop_handler (void)
{
sigaction (SIGTSTP, NULL, &startup_handler);
my_sigaction (SIGTSTP, NULL, &startup_handler);
}

/* --------------------------------------------------------------------------------------------- */
Expand All @@ -349,6 +349,61 @@ my_exit (int status)
_exit (status);
}

/* --------------------------------------------------------------------------------------------- */
/**
* Wrapper for signal() system call.
*/

sighandler_t
my_signal (int signum, sighandler_t handler)
{
return signal (signum, handler);
}

/* --------------------------------------------------------------------------------------------- */
/**
* Wrapper for sigaction() system call.
*/

int
my_sigaction (int signum, const struct sigaction *act, struct sigaction *oldact)
{
return sigaction (signum, act, oldact);
}

/* --------------------------------------------------------------------------------------------- */
/**
* Wrapper for fork() system call.
*/

pid_t
my_fork (void)
{
return fork ();
}

/* --------------------------------------------------------------------------------------------- */
/**
* Wrapper for execvp() system call.
*/

int
my_execvp (const char *file, char *const argv[])
{
return execvp (file, argv);
}

/* --------------------------------------------------------------------------------------------- */
/**
* Wrapper for g_get_current_dir() library function.
*/

char *
my_get_current_dir (void)
{
return g_get_current_dir ();
}

/* --------------------------------------------------------------------------------------------- */
/**
* Call external programs.
Expand Down Expand Up @@ -423,20 +478,20 @@ my_systemv (const char *command, char *const argv[])

my_system__save_sigaction_handlers (&sigactions);

fork_state = my_fork ();
fork_state = my_fork_state ();
switch (fork_state)
{
case FORK_ERROR:
status = -1;
break;
case FORK_CHILD:
{
signal (SIGINT, SIG_DFL);
signal (SIGQUIT, SIG_DFL);
signal (SIGTSTP, SIG_DFL);
signal (SIGCHLD, SIG_DFL);
my_signal (SIGINT, SIG_DFL);
my_signal (SIGQUIT, SIG_DFL);
my_signal (SIGTSTP, SIG_DFL);
my_signal (SIGCHLD, SIG_DFL);

execvp (command, argv);
my_execvp (command, argv);
my_exit (127); /* Exec error */
}
MC_FALLTHROUGH;
Expand Down Expand Up @@ -1037,7 +1092,7 @@ mc_realpath (const char *path, char *resolved_path)
/* If it's a relative pathname use getwd for starters. */
if (!IS_PATH_SEP (*path))
{
new_path = g_get_current_dir ();
new_path = my_get_current_dir ();
if (new_path == NULL)
strcpy (got_path, "");
else
Expand Down
3 changes: 2 additions & 1 deletion lib/vfs/netutil.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <string.h> /* memset() */

#include "lib/global.h"
#include "lib/util.h"

#include "netutil.h"

Expand Down Expand Up @@ -75,7 +76,7 @@ tcp_init (void)
memset (&sa, 0, sizeof (sa));
sa.sa_handler = sig_pipe;
sigemptyset (&sa.sa_mask);
sigaction (SIGPIPE, &sa, NULL);
my_sigaction (SIGPIPE, &sa, NULL);

initialized = TRUE;
}
Expand Down
12 changes: 6 additions & 6 deletions lib/vfs/vfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,10 @@ extern vfs_class *current_vfs;

/*** global variables ****************************************************************************/

struct vfs_dirent *mc_readdir_result = NULL;
GPtrArray *vfs__classes_list = NULL;
GString *vfs_str_buffer = NULL;
vfs_class *current_vfs = NULL;
struct vfs_dirent __attribute__((weak)) * mc_readdir_result = NULL;
GPtrArray __attribute__((weak)) * vfs__classes_list = NULL;
GString __attribute__((weak)) * vfs_str_buffer = NULL;
vfs_class __attribute__((weak)) * current_vfs = NULL;

/*** file scope macro definitions ****************************************************************/

Expand Down Expand Up @@ -642,7 +642,7 @@ vfs_setup_cwd (void)

if (vfs_get_raw_current_dir () == NULL)
{
current_dir = g_get_current_dir ();
current_dir = my_get_current_dir ();
vfs_set_raw_current_dir (vfs_path_from_str (current_dir));
g_free (current_dir);

Expand All @@ -661,7 +661,7 @@ vfs_setup_cwd (void)
me = vfs_path_get_last_path_vfs (vfs_get_raw_current_dir ());
if ((me->flags & VFSF_LOCAL) != 0)
{
current_dir = g_get_current_dir ();
current_dir = my_get_current_dir ();
tmp_vpath = vfs_path_from_str (current_dir);
g_free (current_dir);

Expand Down
3 changes: 2 additions & 1 deletion src/background.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "lib/tty/key.h" /* add_select_channel(), delete_select_channel() */
#include "lib/widget.h" /* message() */
#include "lib/event-types.h"
#include "lib/util.h" /* my_fork() */

#include "filemanager/fileopctx.h" /* file_op_context_t */

Expand Down Expand Up @@ -535,7 +536,7 @@ do_background (file_op_context_t *ctx, char *info)
return (-1);
}

pid = fork ();
pid = my_fork ();
if (pid == -1)
{
int saved_errno = errno;
Expand Down
2 changes: 1 addition & 1 deletion src/cons.handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ handle_console_linux (console_action_t action)
break;
}
/* Get the console saver running */
cons_saver_pid = fork ();
cons_saver_pid = my_fork ();
if (cons_saver_pid < 0)
{
/* Cannot fork */
Expand Down
2 changes: 1 addition & 1 deletion src/editor/etags.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ edit_get_match_keyword_cmd (WEdit *edit)
for (i = 0; i < word_len; i++)
g_string_append_c (match_expr, edit_buffer_get_byte (&edit->buffer, word_start + i));

ptr = g_get_current_dir ();
ptr = my_get_current_dir ();
path = g_strconcat (ptr, PATH_SEP_STR, (char *) NULL);
g_free (ptr);

Expand Down
4 changes: 2 additions & 2 deletions src/execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,12 +160,12 @@ do_suspend_cmd (void)
/* Make sure that the SIGTSTP below will suspend us directly,
without calling ncurses' SIGTSTP handler; we *don't* want
ncurses to redraw the screen immediately after the SIGCONT */
sigaction (SIGTSTP, &startup_handler, &sigtstp_action);
my_sigaction (SIGTSTP, &startup_handler, &sigtstp_action);

kill (getpid (), SIGTSTP);

/* Restore previous SIGTSTP action */
sigaction (SIGTSTP, &sigtstp_action, NULL);
my_sigaction (SIGTSTP, &sigtstp_action, NULL);
}
#endif /* SIGTSTP */

Expand Down
4 changes: 2 additions & 2 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ init_sigchld (void)
sigchld_action.sa_flags = SA_RESTART;
#endif /* !SA_RESTART */

if (sigaction (SIGCHLD, &sigchld_action, NULL) == -1)
if (my_sigaction (SIGCHLD, &sigchld_action, NULL) == -1)
{
#ifdef ENABLE_SUBSHELL
/*
Expand Down Expand Up @@ -499,7 +499,7 @@ main (int argc, char *argv[])
if (mc_global.tty.alternate_plus_minus)
numeric_keypad_mode ();

(void) signal (SIGCHLD, SIG_DFL); /* Disable the SIGCHLD handler */
(void) my_signal (SIGCHLD, SIG_DFL); /* Disable the SIGCHLD handler */

if (mc_global.tty.console_flag != '\0')
handle_console (CONSOLE_DONE);
Expand Down
2 changes: 1 addition & 1 deletion src/subshell/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -1403,7 +1403,7 @@ init_subshell (void)

subshell_alive = TRUE;
subshell_stopped = FALSE;
subshell_pid = fork ();
subshell_pid = my_fork ();

if (subshell_pid == -1)
{
Expand Down
4 changes: 2 additions & 2 deletions src/vfs/shell/shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ shell_pipeopen (struct vfs_s_super *super, const char *path, const char *argv[])
if ((pipe (fileset1) < 0) || (pipe (fileset2) < 0))
vfs_die ("Cannot pipe(): %m.");

res = fork ();
res = my_fork ();

if (res != 0)
{
Expand All @@ -449,7 +449,7 @@ shell_pipeopen (struct vfs_s_super *super, const char *path, const char *argv[])
res = open ("/dev/null", O_WRONLY);
close (fileset2[0]);
close (fileset2[1]);
execvp (path, (char **) argv);
my_execvp (path, (char **) argv);
my_exit (3);
}
}
Expand Down
2 changes: 1 addition & 1 deletion tests/lib/mc_realpath.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ main (void)
tc_core = tcase_create ("Core");

/* writable directory where check creates temporary files */
cwd = g_get_current_dir ();
cwd = my_get_current_dir ();
g_setenv ("TEMP", cwd, TRUE);
g_free (cwd);

Expand Down
Loading

0 comments on commit 01c4b9b

Please sign in to comment.