core-extra/netns/vnode_io.c

185 lines
3 KiB
C

/*
* CORE
* Copyright (c)2010-2012 the Boeing Company.
* See the LICENSE file included in this distribution.
*
* author: Tom Goff <thomas.goff@boeing.com>
*
* vnode_io.c
*
*/
#include <unistd.h>
#include <stdint.h>
#include <errno.h>
/* #define _XOPEN_SOURCE */
#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#include <stdlib.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include "myerr.h"
#include "vnode_chnl.h"
#include "vnode_io.h"
int set_nonblock(int fd)
{
int fl, r = 0;
if ((fl = fcntl(fd, F_GETFL)) == -1)
{
fl = 0;
r = -1;
}
if (fcntl(fd, F_SETFL, fl | O_NONBLOCK))
r = -1;
return r;
}
int clear_nonblock(int fd)
{
int fl, r = 0;
if ((fl = fcntl(fd, F_GETFL)) == -1)
{
fl = 0;
r = -1;
}
if (fcntl(fd, F_SETFL, fl & ~O_NONBLOCK))
r = -1;
return r;
}
int set_cloexec(int fd)
{
int fdflags;
if ((fdflags = fcntl(fd, F_GETFD)) == -1)
fdflags = 0;
if (fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC) == -1)
return -1;
return 0;
}
int open_stdio_pty(stdio_pty_t *stdiopty)
{
int masterfd, slavefd;
INIT_STDIO_PTY(stdiopty);
if ((masterfd = posix_openpt(O_RDWR | O_NOCTTY)) < 0)
{
WARN("posix_openpt() failed");
return -1;
}
if (grantpt(masterfd))
{
WARN("grantpt() failed");
close(masterfd);
return -1;
}
if (unlockpt(masterfd))
{
WARN("unlockpt() failed");
close(masterfd);
return -1;
}
if ((slavefd = open(ptsname(masterfd), O_RDWR | O_NOCTTY)) < 0)
{
WARN("open() failed");
close(masterfd);
return -1;
}
stdiopty->masterfd = masterfd;
stdiopty->slavefd = slavefd;
return 0;
}
void close_stdio_pty(stdio_pty_t *stdiopty)
{
if (stdiopty->masterfd >= 0)
close(stdiopty->masterfd);
if (stdiopty->slavefd >= 0)
close(stdiopty->slavefd);
INIT_STDIO_PTY(stdiopty);
return;
}
int open_stdio_pipe(stdio_pipe_t *stdiopipe)
{
int infd[2], outfd[2], errfd[2];
INIT_STDIO_PIPE(stdiopipe);
if (pipe(infd) < 0)
{
WARN("pipe() failed");
return -1;
}
if (pipe(outfd) < 0)
{
WARN("pipe() failed");
close(infd[0]);
close(infd[1]);
return -1;
}
if (pipe(errfd) < 0)
{
WARN("pipe() failed");
close(infd[0]);
close(infd[1]);
close(outfd[0]);
close(outfd[1]);
return -1;
}
stdiopipe->infd[0] = infd[0];
stdiopipe->infd[1] = infd[1];
stdiopipe->outfd[0] = outfd[0];
stdiopipe->outfd[1] = outfd[1];
stdiopipe->errfd[0] = errfd[0];
stdiopipe->errfd[1] = errfd[1];
return 0;
}
void close_stdio_pipe(stdio_pipe_t *stdiopipe)
{
if (stdiopipe->infd[0] >= 0)
close(stdiopipe->infd[0]);
if (stdiopipe->infd[1] >= 0)
close(stdiopipe->infd[1]);
if (stdiopipe->outfd[0] >= 0)
close(stdiopipe->outfd[0]);
if (stdiopipe->outfd[1] >= 0)
close(stdiopipe->outfd[1]);
if (stdiopipe->errfd[0] >= 0)
close(stdiopipe->errfd[0]);
if (stdiopipe->errfd[1] >= 0)
close(stdiopipe->errfd[1]);
INIT_STDIO_PIPE(stdiopipe);
return;
}