windows-nt/Source/XPSP1/NT/base/subsys/posix/client/stubs.c
2020-09-26 16:20:57 +08:00

196 lines
2.8 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
stubs.c
Abstract:
TEMPORARY - stubs for unimplemented functions
Author:
Ellen Aycock-Wright (ellena) 15-Jul-1991
Revision History:
--*/
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <setjmpex.h>
#include <termios.h>
#include <sys/stat.h>
#include "psxdll.h"
char *
__cdecl
ctermid(char *s)
{
static char returnspace[L_ctermid];
if (NULL == s) {
return strcpy(returnspace, "");
}
return strcpy(s, "");
}
int
__cdecl
setgid(gid_t gid)
{
if (gid == getgid()) {
return 0;
}
errno = EPERM;
return -1;
}
int
__cdecl
setuid(uid_t uid)
{
if (uid == getuid()) {
return 0;
}
errno = EPERM;
return -1;
}
char *
__cdecl
ttyname(int fildes)
{
static char s[7];
s[0] = 0;
return NULL;
}
_JBTYPE * __cdecl
_sigjmp_store_mask(sigjmp_buf env, int save)
{
if (save) {
env[_JBLEN] = 1;
sigprocmask(SIG_SETMASK, 0, (void *)&env[_JBLEN + 1]);
} else {
env[_JBLEN] = 0;
}
return env;
}
void
__cdecl
siglongjmp(sigjmp_buf j, int val)
{
if (j[_JBLEN]) {
(void)sigprocmask(SIG_SETMASK, (PVOID)&j[_JBLEN + 1], NULL);
}
longjmp((void *)&j[0], val);
//NOTREACHED
}
int
__cdecl
cfsetispeed(struct termios *termios_p, speed_t speed)
{
termios_p->c_ispeed = speed;
return 0;
}
int
__cdecl
cfsetospeed(struct termios *termios_p, speed_t speed)
{
termios_p->c_ospeed = speed;
return 0;
}
speed_t
__cdecl
cfgetispeed(const struct termios *termios_p)
{
return termios_p->c_ispeed;
}
speed_t
__cdecl
cfgetospeed(const struct termios *termios_p)
{
return termios_p->c_ospeed;
}
int
__cdecl
system(const char *command)
{
pid_t pid;
int status;
char *shell;
sigset_t saveblock;
struct sigaction sa, saveintr, savequit;
if (NULL == command) {
return 0;
}
// XXX.mjb: should use an absolute path to sh, if there
// was one, instead of $SHELL.
shell = getenv("SHELL");
if (NULL == shell) {
return 0;
}
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, &saveintr);
sigaction(SIGQUIT, &sa, &savequit);
sigaddset(&sa.sa_mask, SIGCHLD);
sigprocmask(SIG_BLOCK, &sa.sa_mask, &saveblock);
pid = fork();
if (-1 == pid) {
return -1;
}
if (0 == pid) {
sigaction(SIGINT, &saveintr, NULL);
sigaction(SIGQUIT, &savequit, NULL);
sigprocmask(SIG_SETMASK, &saveblock, NULL);
execl(shell, "sh", "-c", command, NULL);
_exit(127);
}
if (-1 == waitpid(pid, &status, 0))
status = -1;
sigaction(SIGINT, &saveintr, NULL);
sigaction(SIGQUIT, &savequit, NULL);
sigprocmask(SIG_SETMASK, &saveblock, NULL);
return status;
}
int __cdecl
remove(const char *path)
{
struct stat st_buf;
if (-1 == stat(path, &st_buf))
return unlink(path);
if (S_ISDIR(st_buf.st_mode)) {
return rmdir(path);
}
return unlink(path);
}