/
niceSOFT
/
shadow
Обзор
Документация
Войти
/
niceSOFT
/
shadow
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
lib/spawn.c
65 строк
1 KB
Alejandro Colomar
lib/, tests/: Use fprinte() instead of its pattern
17 июл 2026, 16:48
17 июл 2026, 16:48
f7c712c
Код
Авторство
О чём код?
/* * SPDX-FileCopyrightText: 2011 , Jonathan Nieder * * SPDX-License-Identifier: BSD-3-Clause */ #include "config.h" #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <errno.h> #include <string.h> #include "exitcodes.h" #include "io/fprintf.h" #include "prototypes.h" #include "shadowlog.h" int run_command(const char *cmd, const char *argv[], /*@null@*/const char *envp[], int *restrict status) { pid_t pid, wpid; if (NULL == envp) { envp = (const char **)environ; } (void) fflush (stdout); (void) fflush (log_get_logfd()); pid = fork (); if (0 == pid) { (void) execve (cmd, (char * const *) argv, (char * const *) envp); if (ENOENT == errno) { _exit (E_CMD_NOTFOUND); } fprinte(log_get_logfd(), "%s: cannot execute %s", log_get_progname(), cmd); _exit (E_CMD_NOEXEC); } else if ((pid_t)-1 == pid) { fprinte(log_get_logfd(), "%s: cannot execute %s", log_get_progname(), cmd); return -1; } do { wpid = waitpid (pid, status, 0); if ((pid_t)-1 == wpid && errno == ECHILD) break; } while ( ((pid_t)-1 == wpid && errno == EINTR) || ((pid_t)-1 != wpid && wpid != pid)); if ((pid_t)-1 == wpid) { fprinte(log_get_logfd(), "%s: waitpid (status: %d)", log_get_progname(), *status); return -1; } return 0; }