mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
change the semantics of spawn_cb routine.
-- Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
729951f4c2
commit
4736debd01
@ -989,10 +989,12 @@ posix_open_null (int for_write)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
my_exec (const char *pgmname, const char *argv[],
|
my_exec (const char *pgmname, const char *argv[],
|
||||||
int fd_in, int fd_out, int fd_err, int ask_inherit)
|
int fd_in, int fd_out, int fd_err,
|
||||||
|
int (*spawn_cb) (void *), void *spawn_cb_arg)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int fds[3];
|
int fds[3];
|
||||||
|
int ask_inherit = 0;
|
||||||
|
|
||||||
fds[0] = fd_in;
|
fds[0] = fd_in;
|
||||||
fds[1] = fd_out;
|
fds[1] = fd_out;
|
||||||
@ -1013,6 +1015,9 @@ my_exec (const char *pgmname, const char *argv[],
|
|||||||
close (fds[i]);
|
close (fds[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (spawn_cb)
|
||||||
|
ask_inherit = (*spawn_cb) (spawn_cb_arg);
|
||||||
|
|
||||||
/* Close all other files. */
|
/* Close all other files. */
|
||||||
if (!ask_inherit)
|
if (!ask_inherit)
|
||||||
close_all_fds (3, NULL);
|
close_all_fds (3, NULL);
|
||||||
@ -1025,7 +1030,7 @@ my_exec (const char *pgmname, const char *argv[],
|
|||||||
static gpg_err_code_t
|
static gpg_err_code_t
|
||||||
spawn_detached (gnupg_process_t process,
|
spawn_detached (gnupg_process_t process,
|
||||||
const char *pgmname, const char *argv[],
|
const char *pgmname, const char *argv[],
|
||||||
int (*spawn_cb) (struct spawn_cb_arg *), void *spawn_cb_arg)
|
int (*spawn_cb) (void *), void *spawn_cb_arg)
|
||||||
{
|
{
|
||||||
gpg_err_code_t ec;
|
gpg_err_code_t ec;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@ -1061,14 +1066,6 @@ spawn_detached (gnupg_process_t process,
|
|||||||
if (!pid)
|
if (!pid)
|
||||||
{
|
{
|
||||||
pid_t pid2;
|
pid_t pid2;
|
||||||
struct spawn_cb_arg arg;
|
|
||||||
int ask_inherit = 0;
|
|
||||||
|
|
||||||
arg.std_fds[0] = arg.std_fds[1] = arg.std_fds[2] = -1;
|
|
||||||
arg.arg = spawn_cb_arg;
|
|
||||||
|
|
||||||
if (spawn_cb)
|
|
||||||
ask_inherit = (*spawn_cb) (&arg);
|
|
||||||
|
|
||||||
if (setsid() == -1 || chdir ("/"))
|
if (setsid() == -1 || chdir ("/"))
|
||||||
_exit (1);
|
_exit (1);
|
||||||
@ -1079,7 +1076,7 @@ spawn_detached (gnupg_process_t process,
|
|||||||
if (pid2)
|
if (pid2)
|
||||||
_exit (0); /* Let the parent exit immediately. */
|
_exit (0); /* Let the parent exit immediately. */
|
||||||
|
|
||||||
my_exec (pgmname, argv, -1, -1, -1, ask_inherit);
|
my_exec (pgmname, argv, -1, -1, -1, spawn_cb, spawn_cb_arg);
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1107,8 +1104,7 @@ spawn_detached (gnupg_process_t process,
|
|||||||
gpg_err_code_t
|
gpg_err_code_t
|
||||||
gnupg_process_spawn (const char *pgmname, const char *argv1[],
|
gnupg_process_spawn (const char *pgmname, const char *argv1[],
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
int (*spawn_cb) (struct spawn_cb_arg *),
|
int (*spawn_cb) (void *), void *spawn_cb_arg,
|
||||||
void *spawn_cb_arg,
|
|
||||||
gnupg_process_t *r_process)
|
gnupg_process_t *r_process)
|
||||||
{
|
{
|
||||||
gpg_err_code_t ec;
|
gpg_err_code_t ec;
|
||||||
@ -1281,14 +1277,6 @@ gnupg_process_spawn (const char *pgmname, const char *argv1[],
|
|||||||
|
|
||||||
if (!pid)
|
if (!pid)
|
||||||
{
|
{
|
||||||
struct spawn_cb_arg arg;
|
|
||||||
int ask_inherit = 0;
|
|
||||||
|
|
||||||
arg.std_fds[0] = fd_in[0];
|
|
||||||
arg.std_fds[1] = fd_out[1];
|
|
||||||
arg.std_fds[2] = fd_err[1];
|
|
||||||
arg.arg = spawn_cb_arg;
|
|
||||||
|
|
||||||
if (fd_in[1] >= 0)
|
if (fd_in[1] >= 0)
|
||||||
close (fd_in[1]);
|
close (fd_in[1]);
|
||||||
if (fd_out[0] >= 0)
|
if (fd_out[0] >= 0)
|
||||||
@ -1296,11 +1284,9 @@ gnupg_process_spawn (const char *pgmname, const char *argv1[],
|
|||||||
if (fd_err[0] >= 0)
|
if (fd_err[0] >= 0)
|
||||||
close (fd_err[0]);
|
close (fd_err[0]);
|
||||||
|
|
||||||
if (spawn_cb)
|
|
||||||
ask_inherit = (*spawn_cb) (&arg);
|
|
||||||
|
|
||||||
/* Run child. */
|
/* Run child. */
|
||||||
my_exec (pgmname, argv, fd_in[0], fd_out[1], fd_err[1], ask_inherit);
|
my_exec (pgmname, argv, fd_in[0], fd_out[1], fd_err[1],
|
||||||
|
spawn_cb, spawn_cb_arg);
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1094,7 +1094,7 @@ post_syscall (void)
|
|||||||
static gpg_err_code_t
|
static gpg_err_code_t
|
||||||
spawn_detached (gnupg_process_t process,
|
spawn_detached (gnupg_process_t process,
|
||||||
const char *pgmname, char *cmdline,
|
const char *pgmname, char *cmdline,
|
||||||
int (*spawn_cb) (struct spawn_cb_arg *), void *spawn_cb_arg)
|
int (*spawn_cb) (void *), void *spawn_cb_arg)
|
||||||
{
|
{
|
||||||
SECURITY_ATTRIBUTES sec_attr;
|
SECURITY_ATTRIBUTES sec_attr;
|
||||||
PROCESS_INFORMATION pi = { NULL, 0, 0, 0 };
|
PROCESS_INFORMATION pi = { NULL, 0, 0, 0 };
|
||||||
@ -1115,14 +1115,7 @@ spawn_detached (gnupg_process_t process,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (spawn_cb)
|
if (spawn_cb)
|
||||||
{
|
ask_inherit = (*spawn_cb) (spawn_cb_arg);
|
||||||
struct spawn_cb_arg arg;
|
|
||||||
|
|
||||||
arg.std_fds[0] = arg.std_fds[1] = arg.std_fds[2] = -1;
|
|
||||||
arg.arg = spawn_cb_arg;
|
|
||||||
|
|
||||||
ask_inherit = (*spawn_cb) (&arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare security attributes. */
|
/* Prepare security attributes. */
|
||||||
memset (&sec_attr, 0, sizeof sec_attr );
|
memset (&sec_attr, 0, sizeof sec_attr );
|
||||||
@ -1201,7 +1194,7 @@ spawn_detached (gnupg_process_t process,
|
|||||||
gpg_err_code_t
|
gpg_err_code_t
|
||||||
gnupg_process_spawn (const char *pgmname, const char *argv[],
|
gnupg_process_spawn (const char *pgmname, const char *argv[],
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
int (*spawn_cb) (struct spawn_cb_arg *),
|
int (*spawn_cb) (void *),
|
||||||
void *spawn_cb_arg,
|
void *spawn_cb_arg,
|
||||||
gnupg_process_t *r_process)
|
gnupg_process_t *r_process)
|
||||||
{
|
{
|
||||||
@ -1332,14 +1325,7 @@ gnupg_process_spawn (const char *pgmname, const char *argv[],
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (spawn_cb)
|
if (spawn_cb)
|
||||||
{
|
ask_inherit = (*spawn_cb) (spawn_cb_arg);
|
||||||
struct spawn_cb_arg arg;
|
|
||||||
|
|
||||||
arg.std_fds[0] = arg.std_fds[1] = arg.std_fds[2] = -1;
|
|
||||||
arg.arg = spawn_cb_arg;
|
|
||||||
|
|
||||||
ask_inherit = (*spawn_cb) (&arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare security attributes. */
|
/* Prepare security attributes. */
|
||||||
memset (&sec_attr, 0, sizeof sec_attr );
|
memset (&sec_attr, 0, sizeof sec_attr );
|
||||||
|
@ -210,10 +210,6 @@ gpg_error_t gnupg_spawn_process_detached (const char *pgmname,
|
|||||||
|
|
||||||
/* The opaque type for a subprocess. */
|
/* The opaque type for a subprocess. */
|
||||||
typedef struct gnupg_process *gnupg_process_t;
|
typedef struct gnupg_process *gnupg_process_t;
|
||||||
struct spawn_cb_arg {
|
|
||||||
int std_fds[3];
|
|
||||||
void *arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Internal flag to ihnerit file descriptor/handle */
|
/* Internal flag to ihnerit file descriptor/handle */
|
||||||
#define GNUPG_PROCESS_INHERIT_FILE (1 << 0)
|
#define GNUPG_PROCESS_INHERIT_FILE (1 << 0)
|
||||||
@ -240,7 +236,7 @@ struct spawn_cb_arg {
|
|||||||
/* Spawn PGMNAME. */
|
/* Spawn PGMNAME. */
|
||||||
gpg_err_code_t gnupg_process_spawn (const char *pgmname, const char *argv[],
|
gpg_err_code_t gnupg_process_spawn (const char *pgmname, const char *argv[],
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
int (*spawn_cb) (struct spawn_cb_arg *),
|
int (*spawn_cb) (void *),
|
||||||
void *spawn_cb_arg,
|
void *spawn_cb_arg,
|
||||||
gnupg_process_t *r_process);
|
gnupg_process_t *r_process);
|
||||||
|
|
||||||
|
@ -302,35 +302,11 @@ copy_buffer_flush (struct copy_buffer *c, estream_t sink)
|
|||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
close_all_except (struct spawn_cb_arg *arg)
|
close_all_except (void *arg)
|
||||||
{
|
{
|
||||||
int except[32];
|
int *exceptclose = arg;
|
||||||
int i = 0;
|
|
||||||
int fd_in = arg->std_fds[0];
|
|
||||||
int fd_out = arg->std_fds[1];
|
|
||||||
int fd_err = arg->std_fds[2];
|
|
||||||
int *exceptclose = arg->arg;
|
|
||||||
|
|
||||||
if (fd_in >= 0)
|
close_all_fds (3, exceptclose);
|
||||||
except[i++] = fd_in;
|
|
||||||
if (fd_out >= 0)
|
|
||||||
except[i++] = fd_out;
|
|
||||||
if (fd_err >= 0)
|
|
||||||
except[i++] = fd_err;
|
|
||||||
|
|
||||||
for (; i < 31; i++)
|
|
||||||
{
|
|
||||||
int fd = *exceptclose++;
|
|
||||||
|
|
||||||
if (fd < 0)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
except[i] = fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
except[i++] = -1;
|
|
||||||
|
|
||||||
close_all_fds (3, except);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user