本文整理汇总了C++中xmove_fd函数的典型用法代码示例。如果您正苦于以下问题:C++ xmove_fd函数的具体用法?C++ xmove_fd怎么用?C++ xmove_fd使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了xmove_fd函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: launch_helper
void FAST_FUNC launch_helper(const char **argv)
{
// setup vanilla unidirectional pipes interchange
int i;
int pipes[4];
xpipe(pipes);
xpipe(pipes + 2);
// NB: handler must be installed before vfork
bb_signals(0
+ (1 << SIGCHLD)
+ (1 << SIGALRM)
, signal_handler);
G.helper_pid = xvfork();
i = (!G.helper_pid) * 2; // for parent:0, for child:2
close(pipes[i + 1]); // 1 or 3 - closing one write end
close(pipes[2 - i]); // 2 or 0 - closing one read end
xmove_fd(pipes[i], STDIN_FILENO); // 0 or 2 - using other read end
xmove_fd(pipes[3 - i], STDOUT_FILENO); // 3 or 1 - other write end
if (!G.helper_pid) {
// child: try to execute connection helper
// NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec
BB_EXECVP_or_die((char**)argv);
}
// parent
// check whether child is alive
//redundant:signal_handler(SIGCHLD);
// child seems OK -> parent goes on
atexit(kill_helper);
}
示例2: eject_main
int eject_main(int argc UNUSED_PARAM, char **argv)
{
unsigned flags;
const char *device;
opt_complementary = "?1:t--T:T--t";
flags = getopt32(argv, "tT" IF_FEATURE_EJECT_SCSI("s"));
device = argv[optind] ? argv[optind] : "/dev/cdrom";
/* We used to do "umount <device>" here, but it was buggy
if something was mounted OVER cdrom and
if cdrom is mounted many times.
This works equally well (or better):
#!/bin/sh
umount /dev/cdrom
eject /dev/cdrom
*/
xmove_fd(xopen_nonblocking(device), dev_fd);
if (ENABLE_FEATURE_EJECT_SCSI && (flags & FLAG_SCSI))
eject_scsi(device);
else
eject_cdrom(flags, device);
if (ENABLE_FEATURE_CLEAN_UP)
close(dev_fd);
return EXIT_SUCCESS;
}
示例3: create_icmp_socket
create_icmp_socket(void)
#define create_icmp_socket(lsa) create_icmp_socket()
#endif
{
int sock;
#if ENABLE_PING6
if (lsa->u.sa.sa_family == AF_INET6)
sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
else
#endif
sock = socket(AF_INET, SOCK_RAW, 1); /* 1 == ICMP */
if (sock < 0) {
if (errno != EPERM)
bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket);
#if defined(__linux__) || defined(__APPLE__)
/* We don't have root privileges. Try SOCK_DGRAM instead.
* Linux needs net.ipv4.ping_group_range for this to work.
* MacOSX allows ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ
*/
#if ENABLE_PING6
if (lsa->u.sa.sa_family == AF_INET6)
sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6);
else
#endif
sock = socket(AF_INET, SOCK_DGRAM, 1); /* 1 == ICMP */
if (sock < 0)
#endif
bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
}
xmove_fd(sock, pingsock);
}
示例4: reopen_logfile_to_stderr
static void reopen_logfile_to_stderr(void)
{
if (G.log_filename) {
int logfd = open_or_warn(G.log_filename, O_WRONLY | O_CREAT | O_APPEND);
if (logfd >= 0)
xmove_fd(logfd, STDERR_FILENO);
}
}
示例5: open_transformer
void FAST_FUNC open_transformer(int fd, const char *transform_prog)
#endif
{
struct fd_pair fd_pipe;
int pid;
xpiped_pair(fd_pipe);
pid = BB_MMU ? xfork() : xvfork();
if (pid == 0) {
/* Child */
close(fd_pipe.rd); /* we don't want to read from the parent */
// FIXME: error check?
#if BB_MMU
{
transformer_aux_data_t aux;
init_transformer_aux_data(&aux);
aux.check_signature = check_signature;
transformer(&aux, fd, fd_pipe.wr);
if (ENABLE_FEATURE_CLEAN_UP) {
close(fd_pipe.wr); /* send EOF */
close(fd);
}
/* must be _exit! bug was actually seen here */
_exit(EXIT_SUCCESS);
}
#else
{
char *argv[4];
xmove_fd(fd, 0);
xmove_fd(fd_pipe.wr, 1);
argv[0] = (char*)transform_prog;
argv[1] = (char*)"-cf";
argv[2] = (char*)"-";
argv[3] = NULL;
BB_EXECVP(transform_prog, argv);
bb_perror_msg_and_die("can't execute '%s'", transform_prog);
}
#endif
/* notreached */
}
/* parent process */
close(fd_pipe.wr); /* don't want to write to the child */
xmove_fd(fd_pipe.rd, fd);
}
示例6: server_socket_cb
/* Callback called by glib main loop when a client connects to ABRT's socket. */
static gboolean server_socket_cb(GIOChannel *source, GIOCondition condition, gpointer ptr_unused)
{
kill_idle_timeout();
load_abrt_conf();
int socket = accept(g_io_channel_unix_get_fd(source), NULL, NULL);
if (socket == -1)
{
perror_msg("accept");
goto server_socket_finitio;
}
log_notice("New client connected");
fflush(NULL); /* paranoia */
int pipefd[2];
xpipe(pipefd);
pid_t pid = fork();
if (pid < 0)
{
perror_msg("fork");
close(socket);
close(pipefd[0]);
close(pipefd[1]);
goto server_socket_finitio;
}
if (pid == 0) /* child */
{
xdup2(socket, STDIN_FILENO);
xdup2(socket, STDOUT_FILENO);
close(socket);
close(pipefd[0]);
xmove_fd(pipefd[1], STDERR_FILENO);
char *argv[3]; /* abrt-server [-s] NULL */
char **pp = argv;
*pp++ = (char*)"abrt-server";
if (logmode & LOGMODE_JOURNAL)
*pp++ = (char*)"-s";
*pp = NULL;
execvp(argv[0], argv);
perror_msg_and_die("Can't execute '%s'", argv[0]);
}
/* parent */
close(socket);
close(pipefd[1]);
add_abrt_server_proc(pid, pipefd[0]);
server_socket_finitio:
start_idle_timeout();
return TRUE;
}
示例7: open_to_or_warn
static
int open_to_or_warn(int to_fd, const char *filename, int flags, int mode)
{
int fd = open3_or_warn(filename, flags, mode);
if (fd < 0) {
return 1;
}
xmove_fd(fd, to_fd);
return 0;
}
示例8: cryptpw_main
int cryptpw_main(int argc UNUSED_PARAM, char **argv)
{
/* Supports: cryptpw -m sha256 PASS 'rounds=999999999$SALT' */
char salt[MAX_PW_SALT_LEN + sizeof("rounds=999999999$")];
char *salt_ptr;
char *password;
const char *opt_m, *opt_S;
int fd;
#if ENABLE_LONG_OPTS
static const char mkpasswd_longopts[] ALIGN1 =
"stdin\0" No_argument "s"
"password-fd\0" Required_argument "P"
"salt\0" Required_argument "S"
"method\0" Required_argument "m"
;
applet_long_options = mkpasswd_longopts;
#endif
fd = STDIN_FILENO;
opt_m = CONFIG_FEATURE_DEFAULT_PASSWD_ALGO;
opt_S = NULL;
/* at most two non-option arguments; -P NUM */
opt_complementary = "?2";
getopt32(argv, "sP:+S:m:a:", &fd, &opt_S, &opt_m, &opt_m);
argv += optind;
/* have no idea how to handle -s... */
if (argv[0] && !opt_S)
opt_S = argv[1];
salt_ptr = crypt_make_pw_salt(salt, opt_m);
if (opt_S)
/* put user's data after the "$N$" prefix */
safe_strncpy(salt_ptr, opt_S, sizeof(salt) - (sizeof("$N$")-1));
xmove_fd(fd, STDIN_FILENO);
password = argv[0];
if (!password) {
/* Only mkpasswd, and only from tty, prompts.
* Otherwise it is a plain read. */
password = (ENABLE_MKPASSWD && isatty(STDIN_FILENO) && applet_name[0] == 'm')
? bb_ask_stdin("Password: ")
: xmalloc_fgetline(stdin)
;
/* may still be NULL on EOF/error */
}
if (password)
puts(pw_encrypt(password, salt, 1));
return EXIT_SUCCESS;
}
示例9: start_logging
static void start_logging(void)
{
/* Open stdin to /dev/null */
xmove_fd(xopen("/dev/null", O_RDWR), STDIN_FILENO);
/* We must not leave fds 0,1,2 closed.
* Otherwise fprintf(stderr) dumps messages into random fds, etc. */
xdup2(STDIN_FILENO, STDOUT_FILENO);
xdup2(STDIN_FILENO, STDERR_FILENO);
logmode = LOGMODE_JOURNAL;
putenv((char*)"ABRT_SYSLOG=1");
}
示例10: launch_helper
void FAST_FUNC launch_helper(const char **argv)
{
// setup vanilla unidirectional pipes interchange
int i;
int pipes[4];
xpipe(pipes);
xpipe(pipes + 2);
// NB: handler must be installed before vfork
bb_signals(0
+ (1 << SIGCHLD)
+ (1 << SIGALRM)
, signal_handler);
G.helper_pid = xvfork();
i = (!G.helper_pid) * 2; // for parent:0, for child:2
close(pipes[i + 1]); // 1 or 3 - closing one write end
close(pipes[2 - i]); // 2 or 0 - closing one read end
xmove_fd(pipes[i], STDIN_FILENO); // 0 or 2 - using other read end
xmove_fd(pipes[3 - i], STDOUT_FILENO); // 3 or 1 - using other write end
// End result:
// parent stdout [3] -> child stdin [2]
// child stdout [1] -> parent stdin [0]
if (!G.helper_pid) {
// child
// if parent dies, get SIGTERM
prctl(PR_SET_PDEATHSIG, SIGTERM, 0, 0, 0);
// try to execute connection helper
// NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec
BB_EXECVP_or_die((char**)argv);
}
// parent goes on
}
示例11: open_file_and_read_lines
static void open_file_and_read_lines(void)
{
if (filename) {
xmove_fd(xopen(filename, O_RDONLY), STDIN_FILENO);
} else {
/* "less" with no arguments in argv[] */
/* For status line only */
filename = xstrdup(bb_msg_standard_input);
}
readpos = 0;
readeof = 0;
last_line_pos = 0;
terminated = 1;
read_lines();
}
示例12: cryptpw_main
int cryptpw_main(int argc UNUSED_PARAM, char **argv)
{
char salt[MAX_PW_SALT_LEN];
char *salt_ptr;
const char *opt_m, *opt_S;
int fd;
#if ENABLE_LONG_OPTS
static const char mkpasswd_longopts[] ALIGN1 =
"stdin\0" No_argument "s"
"password-fd\0" Required_argument "P"
"salt\0" Required_argument "S"
"method\0" Required_argument "m"
;
applet_long_options = mkpasswd_longopts;
#endif
fd = STDIN_FILENO;
opt_m = "d";
opt_S = NULL;
/* at most two non-option arguments; -P NUM */
opt_complementary = "?2:P+";
getopt32(argv, "sP:S:m:a:", &fd, &opt_S, &opt_m, &opt_m);
argv += optind;
/* have no idea how to handle -s... */
if (argv[0] && !opt_S)
opt_S = argv[1];
salt_ptr = crypt_make_pw_salt(salt, opt_m);
if (opt_S)
safe_strncpy(salt_ptr, opt_S, sizeof(salt) - (sizeof("$N$")-1));
xmove_fd(fd, STDIN_FILENO);
puts(pw_encrypt(
argv[0] ? argv[0] : (
/* Only mkpasswd, and only from tty, prompts.
* Otherwise it is a plain read. */
(isatty(STDIN_FILENO) && applet_name[0] == 'm')
? bb_ask_stdin("Password: ")
: xmalloc_fgetline(stdin)
),
salt, 1));
return EXIT_SUCCESS;
}
示例13: watchdog_main
int watchdog_main(int argc, char **argv)
{
unsigned opts;
unsigned timer_duration = 30000; /* Userspace timer duration, in milliseconds */
char *t_arg;
opt_complementary = "=1"; /* must have 1 argument */
opts = getopt32(argv, "Ft:", &t_arg);
if (opts & OPT_TIMER) {
static const struct suffix_mult suffixes[] = {
{ "ms", 1 },
{ "", 1000 },
{ }
};
timer_duration = xatou_sfx(t_arg, suffixes);
}
if (!(opts & OPT_FOREGROUND)) {
bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
}
bb_signals(BB_FATAL_SIGS, watchdog_shutdown);
/* Use known fd # - avoid needing global 'int fd' */
xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3);
// TODO?
// if (!(opts & OPT_TIMER)) {
// if (ioctl(fd, WDIOC_GETTIMEOUT, &timer_duration) == 0)
// timer_duration *= 500;
// else
// timer_duration = 30000;
// }
while (1) {
/*
* Make sure we clear the counter before sleeping, as the counter value
* is undefined at this point -- PFM
*/
write(3, "", 1); /* write zero byte */
usleep(timer_duration * 1000L);
}
return EXIT_SUCCESS; /* - not reached, but gcc 4.2.1 is too dumb! */
}
示例14: rpm2cpio_main
int rpm2cpio_main(int argc UNUSED_PARAM, char **argv)
{
struct rpm_lead lead;
unsigned pos;
if (argv[1]) {
xmove_fd(xopen(argv[1], O_RDONLY), rpm_fd);
}
xread(rpm_fd, &lead, sizeof(lead));
/* Just check the magic, the rest is irrelevant */
if (lead.magic != htonl(RPM_LEAD_MAGIC)) {
bb_error_msg_and_die("invalid RPM magic");
}
/* Skip the signature header, align to 8 bytes */
pos = skip_header();
seek_by_jump(rpm_fd, (-(int)pos) & 7);
/* Skip the main header */
skip_header();
//if (SEAMLESS_COMPRESSION)
// /* We need to know whether child (gzip/bzip/etc) exits abnormally */
// signal(SIGCHLD, check_errors_in_children);
/* This works, but doesn't report uncompress errors (they happen in child) */
setup_unzip_on_fd(rpm_fd, /*fail_if_not_compressed:*/ 1);
if (bb_copyfd_eof(rpm_fd, STDOUT_FILENO) < 0)
bb_error_msg_and_die("error unpacking");
if (ENABLE_FEATURE_CLEAN_UP) {
close(rpm_fd);
}
if (SEAMLESS_COMPRESSION) {
check_errors_in_children(0);
return bb_got_signal;
}
return EXIT_SUCCESS;
}
示例15: crondlog
static void crondlog(const char *ctl, ...)
{
va_list va;
int level = (ctl[0] & 0x1f);
va_start(va, ctl);
if (level >= (int)LogLevel) {
/* Debug mode: all to (non-redirected) stderr, */
/* Syslog mode: all to syslog (logmode = LOGMODE_SYSLOG), */
if (!DebugOpt && LogFile) {
/* Otherwise (log to file): we reopen log file at every write: */
int logfd = open3_or_warn(LogFile, O_WRONLY | O_CREAT | O_APPEND, 0600);
if (logfd >= 0)
xmove_fd(logfd, STDERR_FILENO);
}
// TODO: ERR -> error, WARN -> warning, LVL -> info
bb_verror_msg(ctl + 1, va, /* strerr: */ NULL);
}
va_end(va);
if (ctl[0] & 0x80)
exit(20);
}