本文整理汇总了C++中errExit函数的典型用法代码示例。如果您正苦于以下问题:C++ errExit函数的具体用法?C++ errExit怎么用?C++ errExit使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了errExit函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: main
int
main(int argc, char *argv[])
{
struct sigevent sev;
mqd_t mqd;
struct mq_attr attr;
void *buffer;
ssize_t numRead;
sigset_t blockMask;
siginfo_t si;
if (argc != 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s mq-name\n", argv[0]);
mqd = mq_open(argv[1], O_RDONLY | O_NONBLOCK);
if (mqd == (mqd_t) -1)
errExit("mq_open");
/* Determine mq_msgsize for message queue, and allocate an input buffer
of that size */
if (mq_getattr(mqd, &attr) == -1)
errExit("mq_getattr");
buffer = malloc(attr.mq_msgsize);
if (buffer == NULL)
errExit("malloc");
/* Block the signal that we'll accept using sigwaitinfo() */
sigemptyset(&blockMask);
sigaddset(&blockMask, NOTIFY_SIG);
if (sigprocmask(SIG_BLOCK, &blockMask, NULL) == -1)
errExit("sigprocmask");
/* Set up message notification using the signal NOTIFY_SIG */
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = NOTIFY_SIG;
sev.sigev_value.sival_ptr = &mqd;
/* This allows us to obtain a pointer to 'mqd' in the
siginfo_t structure returned by sigwaitinfo() */
if (mq_notify(mqd, &sev) == -1)
errExit("mq_notify");
for (;;) {
/* Wait for a signal; when it is received, display associated
information */
if (sigwaitinfo(&blockMask, &si) == -1)errExit("sigwaitinfo");
printf("Accepted signal:\n");
printf(" si_signo = %d\n", si.si_signo);
printf(" si_pid = %ld\n", (long) si.si_pid);
printf(" si_uid = %ld\n", (long) si.si_uid);
printf(" si_code = %d (%s)\n", si.si_code,
(si.si_code == SI_MESGQ) ? "SI_MESGQ" : "???");
printf(" *sival_ptr = %p\n\n", si.si_value.sival_ptr);
/* Reestablish message notification */
if (mq_notify(mqd, &sev) == -1)
errExit("mq_notify");
/* Although only one signal might have been queued (if NOTIFY_SIG
is a standard signal) we might have received multiple messages,
so use nonblocking mq_receive() calls inside a loop to read
as many messages as possible. */
while ((numRead = mq_receive(mqd, buffer, attr.mq_msgsize, NULL)) >= 0)
printf("Read %ld bytes\n", (long) numRead);
if (errno != EAGAIN) /* Unexpected error */
errExit("mq_receive");
}
}
开发者ID:nipra,项目名称:see,代码行数:77,代码来源:mq_notify_sigwaitinfo.c
示例2: main
int
main(int argc, char *argv[])
{
sigset_t pending, blocked;
const int numSecs = 5;
struct sigaction sa;
/* Set up a handler for SIGINT */
printf("Setting up handler for SIGINT\n");
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = handler;
if (sigaction(SIGINT, &sa, NULL) == -1)
errExit("sigaction");
/* Block SIGINT for a while */
sigemptyset(&blocked);
sigaddset(&blocked, SIGINT);
if (sigprocmask(SIG_SETMASK, &blocked, NULL) == -1)
errExit("sigprocmask");
printf("BLOCKING SIGINT for %d seconds\n", numSecs);
sleep(numSecs);
/* Display mask of pending signals */
if (sigpending(&pending) == -1)
errExit("sigpending");
printf("PENDING signals are: \n");
printSigset(stdout, "\t\t", &pending);
/* Now ignore SIGINT */
sleep(2);
printf("Ignoring SIGINT\n");
if (signal(SIGINT, SIG_IGN) == SIG_ERR) errExit("signal");
/* Redisplay mask of pending signals */
if (sigpending(&pending) == -1)
errExit("sigpending");
if (sigismember(&pending, SIGINT)) {
printf("SIGINT is now pending\n");
} else {
printf("PENDING signals are: \n");
printSigset(stdout, "\t\t", &pending);
}
sleep(2);
/* Reestablish SIGINT handler */
printf("Reestablishing handler for SIGINT\n");
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = handler;
if (sigaction(SIGINT, &sa, NULL) == -1)
errExit("sigaction");
sleep(2);
/* And unblock SIGINT */
printf("UNBLOCKING SIGINT\n");
sigemptyset(&blocked);
if (sigprocmask(SIG_SETMASK, &blocked, NULL) == -1)
errExit("sigprocmask");
exit(EXIT_SUCCESS);
}
开发者ID:fjrti,项目名称:snippets,代码行数:71,代码来源:ignore_pending_sig.c
示例3: main
int
main(int argc, char *argv[])
{
struct utmpx ut;
char *devName;
if (argc < 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s username [sleep-time]\n", argv[0]);
/* Initialize login record for utmp and wtmp files */
memset(&ut, 0, sizeof(struct utmpx));
ut.ut_type = USER_PROCESS; /* This is a user login */
strncpy(ut.ut_user, argv[1], sizeof(ut.ut_user));
if (time((time_t *) &ut.ut_tv.tv_sec) == -1)
errExit("time"); /* Stamp with current time */
ut.ut_pid = getpid();
/* Set ut_line and ut_id based on the terminal associated with
'stdin'. This code assumes terminals named "/dev/[pt]t[sy]*".
The "/dev/" dirname is 5 characters; the "[pt]t[sy]" filename
prefix is 3 characters (making 8 characters in all). */
devName = ttyname(STDIN_FILENO);
if (devName == NULL)
errExit("ttyname");
if (strlen(devName) <= 8) /* Should never happen */
fatal("Terminal name is too short: %s", devName);
strncpy(ut.ut_line, devName + 5, sizeof(ut.ut_line));
strncpy(ut.ut_id, devName + 8, sizeof(ut.ut_id));
printf("Creating login entries in utmp and wtmp\n");
printf(" using pid %ld, line %.*s, id %.*s\n",
(long) ut.ut_pid, (int) sizeof(ut.ut_line), ut.ut_line,
(int) sizeof(ut.ut_id), ut.ut_id);
setutxent(); /* Rewind to start of utmp file */
if (pututxline(&ut) == NULL) /* Write login record to utmp */
errExit("pututxline");
updwtmpx(_PATH_WTMP, &ut); /* Append login record to wtmp */
/* Sleep a while, so we can examine utmp and wtmp files */
sleep((argc > 2) ? getInt(argv[2], GN_NONNEG, "sleep-time") : 15);
/* Now do a "logout"; use values from previously initialized 'ut',
except for changes below */
ut.ut_type = DEAD_PROCESS; /* Required for logout record */
time((time_t *) &ut.ut_tv.tv_sec); /* Stamp with logout time */
memset(&ut.ut_user, 0, sizeof(ut.ut_user));
/* Logout record has null username */
printf("Creating logout entries in utmp and wtmp\n");
setutxent(); /* Rewind to start of utmp file */
if (pututxline(&ut) == NULL) /* Overwrite previous utmp record */
errExit("pututxline");
updwtmpx(_PATH_WTMP, &ut); /* Append logout record to wtmp */
endutxent();
exit(EXIT_SUCCESS);
}
开发者ID:benolee,项目名称:linux-programming-interface-book,代码行数:63,代码来源:utmpx_login.c
示例4: pid_read
// mon_pid: pid of sandbox to be monitored, 0 if all sandboxes are included
void pid_read(pid_t mon_pid) {
if (pids == NULL) {
FILE *fp = fopen("/proc/sys/kernel/pid_max", "r");
if (fp) {
int val;
if (fscanf(fp, "%d", &val) == 1) {
if (val >= max_pids)
max_pids = val + 1;
}
fclose(fp);
}
pids = malloc(sizeof(Process) * max_pids);
if (pids == NULL)
errExit("malloc");
}
memset(pids, 0, sizeof(Process) * max_pids);
pid_t mypid = getpid();
DIR *dir;
if (!(dir = opendir("/proc"))) {
// sleep 2 seconds and try again
sleep(2);
if (!(dir = opendir("/proc"))) {
fprintf(stderr, "Error: cannot open /proc directory\n");
exit(1);
}
}
pid_t child = -1;
struct dirent *entry;
char *end;
while (child < 0 && (entry = readdir(dir))) {
pid_t pid = strtol(entry->d_name, &end, 10);
pid %= max_pids;
if (end == entry->d_name || *end)
continue;
if (pid == mypid)
continue;
// open stat file
char *file;
if (asprintf(&file, "/proc/%u/status", pid) == -1) {
perror("asprintf");
exit(1);
}
FILE *fp = fopen(file, "r");
if (!fp) {
free(file);
continue;
}
// look for firejail executable name
char buf[PIDS_BUFLEN];
while (fgets(buf, PIDS_BUFLEN - 1, fp)) {
if (strncmp(buf, "Name:", 5) == 0) {
char *ptr = buf + 5;
while (*ptr != '\0' && (*ptr == ' ' || *ptr == '\t')) {
ptr++;
}
if (*ptr == '\0') {
fprintf(stderr, "Error: cannot read /proc file\n");
exit(1);
}
if (mon_pid == 0 && strncmp(ptr, "firejail", 8) == 0) {
pids[pid].level = 1;
}
else if (mon_pid == pid && strncmp(ptr, "firejail", 8) == 0) {
pids[pid].level = 1;
}
// else if (mon_pid == 0 && strncmp(ptr, "lxc-execute", 11) == 0) {
// pids[pid].level = 1;
// }
// else if (mon_pid == pid && strncmp(ptr, "lxc-execute", 11) == 0) {
// pids[pid].level = 1;
// }
else
pids[pid].level = -1;
}
if (strncmp(buf, "State:", 6) == 0) {
if (strstr(buf, "(zombie)"))
pids[pid].zombie = 1;
}
else if (strncmp(buf, "PPid:", 5) == 0) {
char *ptr = buf + 5;
while (*ptr != '\0' && (*ptr == ' ' || *ptr == '\t')) {
ptr++;
}
if (*ptr == '\0') {
fprintf(stderr, "Error: cannot read /proc file\n");
exit(1);
}
unsigned parent = atoi(ptr);
parent %= max_pids;
if (pids[parent].level > 0) {
pids[pid].level = pids[parent].level + 1;
}
pids[pid].parent = parent;
}
//.........这里部分代码省略.........
开发者ID:andrew160,项目名称:firejail,代码行数:101,代码来源:pid.c
示例5: main
int main(int argc,char *argv[])
{
char cmd[CMD_SIZE];
pid_t childPid;
sigset_t blockMask,emptyMask;
struct sigaction sa;
setbuf(stdout,NULL); /* Disable buffering of stdout */
memset(cmd,0,CMD_SIZE);
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = sigHandler;
if (sigaction(SIGCHLD,&sa,NULL) == -1)
{
errExit("sigaction");
}
/* Block SIGCHLD to prevent its delivery if a child terminates
before the parent commences the sigsupsend() */
sigemptyset(&blockMask);
sigaddset(&blockMask,SIGCHLD);
if (sigprocmask(SIG_SETMASK,&blockMask,NULL) == -1)
{
errExit("sigprocmask");
}
printf("Parent PID=%ld\n",(long)getpid());
switch(childPid = fork())
{
case -1:
errExit("fork");
case 0: /* Child: immediately exits to become zombie */
printf("Child (PID=%ld) exiting\n",(long)getpid());
_exit(EXIT_SUCCESS);
default: /* Parent */
sigemptyset(&emptyMask);
if (sigsuspend(&emptyMask) == -1 && errno != EINTR)
{
errExit("sigsuspend");
}
snprintf(cmd,CMD_SIZE,"ps -c | grep %s",basename(argv[0]));
cmd[CMD_SIZE - 1] = '\0'; /* Ensure string is null-terminated */
system(cmd); /* View zombie child */
/* Now send the "sure kill" signal to the zombie */
if (kill(childPid,SIGKILL) == -1)
{
errMsg("kill");
}
sleep(10); /* Give child a chance to react to signal */
printf("After sending SIGKILL to zombie (PID=%ld):\n",(long)childPid);
system(cmd); /* View zombie child again */
exit(EXIT_SUCCESS);
}
}
开发者ID:fanxiangchao,项目名称:tlpi,代码行数:62,代码来源:make_zombie_signal.c
示例6: main
int
main(int argc, char *argv[])
{
char buf[BUF_SIZE];
int outbound[2]; /* Pipe to send data from parent to child */
int inbound[2]; /* Pipe to send data from child to parent */
int j;
ssize_t cnt;
if (pipe(outbound) == -1)
errExit("pipe");
if (pipe(inbound) == -1)
errExit("pipe");
switch (fork()) {
case -1:
errExit("fork");
case 0: /* Child */
/* Close unused pipe descriptors */
if (close(outbound[1]) == -1)
errExit("close");
if (close(inbound[0]) == -1)
errExit("close");
/* Read data from outbound pipe, convert to uppercase,
and send back to parent on inbound pipe */
while ((cnt = read(outbound[0], buf, BUF_SIZE)) > 0) {
for (j = 0; j < cnt; j++)
buf[j] = toupper((unsigned char) buf[j]);
if (write(inbound[1], buf, cnt) == -1)
errExit("write");
}
if (cnt == -1)
errExit("read");
_exit(EXIT_SUCCESS);
default:
/* Close unused pipe descriptors */
if (close(outbound[0]) == -1)
errExit("close");
if (close(inbound[1]) == -1)
errExit("close");
/* Read data from stdin, send to the child via the
outbound pipe, read the results back from the child
on the inbound pipe, and print them on stdout */
while ((cnt = read(STDIN_FILENO, buf, BUF_SIZE)) > 0) {
if (write(outbound[1], buf, cnt) == -1)
errExit("write");
cnt = read(inbound[0], buf, BUF_SIZE);
if (cnt == -1)
errExit("read");
if (cnt > 0)
if (write(STDOUT_FILENO, buf, cnt) == -1)
errExit("write");
}
if (cnt == -1)
errExit("read");
/* Exiting will close write end of outbound pipe, so that
child see EOF */
exit(EXIT_SUCCESS);
}
}
开发者ID:BaxterStockman,项目名称:OSU-CS,代码行数:75,代码来源:change_case.c
示例7: main
int
main(int argc, char *argv[])
{
int epfd,ready,fd,s,j,numOpenFds;
struct epoll_event ev;
struct epoll_event evlist[MAX_EVENTS];
char buf[MAX_BUF];
//使用说明
if(argc < 2|| strcmp(argv[1], "--help") == 0)
usageErr("%s file ..\n",argv[0]);
epfd = epoll_create(argc - 1);
if(epfd==-1)
errExit("epoll_create");
//open each file on command line, and add it to the "interest list" for the epoll instance
for(j = 1;j<argc; ++j)
{
fd = open(argv[j],O_RDONLY);
if(fd == -1)
errExit("open");
printf("Opened \"%s\" on fd %d\n",argv[j],fd);
ev.events = EPOLLIN; //Only interested in input events
ev.data.fd = fd;
if(epoll_ctl(epfd,EPOLL_CTL_ADD,fd,&ev) == -1)
errExit("epoll_ctl");
}
numOpenFds = argc -1;
while(numOpenFds > 0)
{
//fetch up to MAX_EVENTS items from the ready list
printf("About to epoll_wait()\n");
ready = epoll_wait(epfd,evlist,MAX_EVENTS, -1);
if(ready == -1)
{
if(errno == EINTR)
continue;
else
errExit("epoll_wait");
}
printf("Ready: %d\n",ready);
//deal with returned list of events
for(j=0;j<ready;++j)
{
printf(" fd=%d;events: %s%s%s\n",evlist[j].data.fd,
(evlist[j].events & EPOLLIN) ? "EPOLLIN" :"",
(evlist[j].events & EPOLLHUP)? "EPOLLHUP":"",
(evlist[j].events & EPOLLERR)? "EPOLLERR":"");
if(evlist[j].events & EPOLLIN)
{
s = read(evlist[j].data.fd, buf ,MAX_BUF);
if(s == -1)
errExit("read");
printf(" read %d bytes:%.*s\n",s,s,buf);
}
else if(evlist[j].events & (EPOLLHUP | EPOLLERR))
{
/*if EPOLLIN and EPOLLHUP were both set,
then there might be more than MAX_BUF bytes to read.
Therefore, we close the file descriptor only if EPOLLIN wsa not set.
We'll read further bytes after the next epoll_wait().*/
printf(" closing fd %d\n",evlist[j].data.fd);
if(close(evlist[j].data.fd) == -1)
errExit("close");
numOpenFds--;
}
}
}
printf("All file descriptors closed,bye!\n");
exit(EXIT_SUCCESS);
}
开发者ID:chenbk85,项目名称:Linux-Programming-Interface,代码行数:81,代码来源:epoll_input.cpp
示例8: sanitize_group
static void sanitize_group(void) {
struct stat s;
if (stat("/etc/group", &s) == -1)
return;
assert(gid_min);
if (arg_debug)
printf("Sanitizing /etc/group, GID_MIN %d\n", gid_min);
if (is_link("/etc/group")) {
fprintf(stderr, "Error: invalid /etc/group\n");
exit(1);
}
FILE *fpin = NULL;
FILE *fpout = NULL;
// open files
/* coverity[toctou] */
fpin = fopen("/etc/group", "r");
if (!fpin)
goto errout;
fpout = fopen(RUN_GROUP_FILE, "w");
if (!fpout)
goto errout;
// read the file line by line
char buf[MAXBUF];
gid_t mygid = getgid();
while (fgets(buf, MAXBUF, fpin)) {
// comments and empty lines
if (*buf == '\0' || *buf == '#')
continue;
// sample line:
// pulse:x:115:netblue,bingo
// drop lines with uid > 1000 and not the current user group
char *ptr = buf;
// advance to uid
while (*ptr != ':' && *ptr != '\0')
ptr++;
if (*ptr == '\0')
goto errout;
ptr++;
while (*ptr != ':' && *ptr != '\0')
ptr++;
if (*ptr == '\0')
goto errout;
ptr++;
if (*ptr == '\0')
goto errout;
// process uid
int gid;
int rv = sscanf(ptr, "%d:", &gid);
if (rv == 0 || gid < 0)
goto errout;
assert(gid_min);
if (gid < gid_min || gid == 65534) { // on Debian platforms 65534 is group nogroup
if (copy_line(fpout, buf, ptr))
goto errout;
continue;
}
if ((gid_t) gid != mygid) {
continue; // skip line
}
if (copy_line(fpout, buf, ptr))
goto errout;
}
fclose(fpin);
SET_PERMS_STREAM(fpout, 0, 0, 0644);
fclose(fpout);
// mount-bind tne new group file
if (mount(RUN_GROUP_FILE, "/etc/group", "none", MS_BIND, "mode=400,gid=0") < 0)
errExit("mount");
fs_logger("create /etc/group");
return;
errout:
fwarning("failed to clean up /etc/group\n");
if (fpin)
fclose(fpin);
if (fpout)
fclose(fpout);
}
开发者ID:Fred-Barclay,项目名称:firejail,代码行数:86,代码来源:restrict_users.c
示例9: processInotifyEvents
static void
processInotifyEvents(int *inotifyFd)
{
char buf[INOTIFY_READ_BUF_LEN]
__attribute__ ((aligned(__alignof__(struct inotify_event))));
ssize_t numRead, nr;
char *evp;
size_t cnt;
int evLen;
int firstTry;
int j;
struct sigaction sa;
/* SIGALRM handler is designed simply to interrupt read() */
sigemptyset(&sa.sa_mask);
sa.sa_handler = alarmHandler;
sa.sa_flags = 0;
if (sigaction(SIGALRM, &sa, NULL) == -1)
errExit("sigaction");
firstTry = 1;
/* Read some events from inotify file descriptor */
cnt = (readBufferSize > 0) ? readBufferSize : INOTIFY_READ_BUF_LEN;
numRead = read(*inotifyFd, buf, cnt);
if (numRead == -1)
errExit("read");
if (numRead == 0) {
fprintf(stderr, "read() from inotify fd returned 0!");
exit(EXIT_FAILURE);
}
inotifyReadCnt++;
logMessage(VB_NOISY,
"\n==========> Read %d: got %zd bytes\n",
inotifyReadCnt, numRead);
/* Process each event in the buffer returned by read() */
for (evp = buf; evp < buf + numRead; ) {
evLen = processNextInotifyEvent(inotifyFd, evp,
buf + numRead - evp, firstTry);
if (evLen > 0) {
evp += evLen;
firstTry = 1;
} else {
/* We got here because an IN_MOVED_FROM event was found at
the end of a previously read buffer and that event may be
part of an "intra-tree" rename(), meaning that we should
check if there is a subsequent IN_MOVED_TO event with the
same cookie value. We left that event unprocessed and we
will now try to read some more events, delaying for a
short time, to give the associated IN_MOVED_IN event (if
there is one) a chance to arrive. However, we only want
to do this once: if the read() below fails to gather
further events, then when we reprocess the IN_MOVED_FROM
we should treat it as though this is an out-of-tree
rename(). Thus, we set 'firstTry' to 0 for the next
processNextInotifyEvent() call. */
struct sigaction sa;
int savedErrno;
firstTry = 0;
numRead = buf + numRead - evp;
/* Shuffle remaining bytes to start of buffer */
for (j = 0; j < numRead; j++)
buf[j] = evp[j];
/* Do a read with timeout, to allow next events
(if any) to arrive */
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sa.sa_handler = alarmHandler;
/* Set a timeout for read(). Some rough testing suggests
that a 2-millisecond timeout is sufficient to ensure
that, in around 99.8% of cases, we get the IN_MOVED_TO
event (if there is one) that matched an IN_MOVED_FROM
event, even in a highly dynamic directory tree. This
number may, of course, warrant tuning on different
hardware and in environments with different filesystem
activity levels. */
ualarm(2000, 0);
nr = read(*inotifyFd, buf + numRead,
INOTIFY_READ_BUF_LEN - numRead);
savedErrno = errno; /* In case ualarm() should change errno */
ualarm(0, 0); /* Cancel alarm */
//.........这里部分代码省略.........
开发者ID:Bipsy,项目名称:Linux,代码行数:101,代码来源:inotify_dtree.c
示例10: profile_check_line
//.........这里部分代码省略.........
}
else if (strcmp(ptr, "private-dev") == 0) {
arg_private_dev = 1;
return 0;
}
else if (strcmp(ptr, "private-tmp") == 0) {
arg_private_tmp = 1;
return 0;
}
else if (strcmp(ptr, "nogroups") == 0) {
arg_nogroups = 1;
return 0;
}
else if (strcmp(ptr, "nosound") == 0) {
arg_nosound = 1;
arg_private_dev = 1;
return 0;
}
else if (strcmp(ptr, "netfilter") == 0) {
#ifdef HAVE_NETWORK
if (checkcfg(CFG_NETWORK))
arg_netfilter = 1;
else
fprintf(stderr, "Warning: networking features are disabled in Firejail configuration file\n");
#endif
return 0;
}
else if (strncmp(ptr, "netfilter ", 10) == 0) {
#ifdef HAVE_NETWORK
if (checkcfg(CFG_NETWORK)) {
arg_netfilter = 1;
arg_netfilter_file = strdup(ptr + 10);
if (!arg_netfilter_file)
errExit("strdup");
check_netfilter_file(arg_netfilter_file);
}
else
fprintf(stderr, "Warning: networking features are disabled in Firejail configuration file\n");
#endif
return 0;
}
else if (strncmp(ptr, "netfilter6 ", 11) == 0) {
#ifdef HAVE_NETWORK
if (checkcfg(CFG_NETWORK)) {
arg_netfilter6 = 1;
arg_netfilter6_file = strdup(ptr + 11);
if (!arg_netfilter6_file)
errExit("strdup");
check_netfilter_file(arg_netfilter6_file);
}
else
fprintf(stderr, "Warning: networking features are disabled in Firejail configuration file\n");
#endif
return 0;
}
else if (strcmp(ptr, "net none") == 0) {
#ifdef HAVE_NETWORK
if (checkcfg(CFG_NETWORK)) {
arg_nonetwork = 1;
cfg.bridge0.configured = 0;
cfg.bridge1.configured = 0;
cfg.bridge2.configured = 0;
cfg.bridge3.configured = 0;
cfg.interface0.configured = 0;
cfg.interface1.configured = 0;
cfg.interface2.configured = 0;
开发者ID:CaffeinatedStud,项目名称:firejail,代码行数:67,代码来源:profile.c
示例11: sanitize_passwd
static void sanitize_passwd(void) {
struct stat s;
if (stat("/etc/passwd", &s) == -1)
return;
assert(uid_min);
if (arg_debug)
printf("Sanitizing /etc/passwd, UID_MIN %d\n", uid_min);
if (is_link("/etc/passwd")) {
fprintf(stderr, "Error: invalid /etc/passwd\n");
exit(1);
}
FILE *fpin = NULL;
FILE *fpout = NULL;
// open files
/* coverity[toctou] */
fpin = fopen("/etc/passwd", "r");
if (!fpin)
goto errout;
fpout = fopen(RUN_PASSWD_FILE, "w");
if (!fpout)
goto errout;
// read the file line by line
char buf[MAXBUF];
uid_t myuid = getuid();
while (fgets(buf, MAXBUF, fpin)) {
// comments and empty lines
if (*buf == '\0' || *buf == '#')
continue;
// sample line:
// www-data:x:33:33:www-data:/var/www:/bin/sh
// drop lines with uid > 1000 and not the current user
char *ptr = buf;
// advance to uid
while (*ptr != ':' && *ptr != '\0')
ptr++;
if (*ptr == '\0')
goto errout;
char *ptr1 = ptr;
ptr++;
while (*ptr != ':' && *ptr != '\0')
ptr++;
if (*ptr == '\0')
goto errout;
ptr++;
if (*ptr == '\0')
goto errout;
// process uid
int uid;
int rv = sscanf(ptr, "%d:", &uid);
if (rv == 0 || uid < 0)
goto errout;
assert(uid_min);
if (uid < uid_min || uid == 65534) { // on Debian platforms user nobody is 65534
fprintf(fpout, "%s", buf);
continue;
}
if ((uid_t) uid != myuid) {
// store user name - necessary to process /etc/group
*ptr1 = '\0';
char *user = strdup(buf);
if (!user)
errExit("malloc");
ulist_add(user);
continue; // skip line
}
fprintf(fpout, "%s", buf);
}
fclose(fpin);
SET_PERMS_STREAM(fpout, 0, 0, 0644);
fclose(fpout);
// mount-bind tne new password file
if (mount(RUN_PASSWD_FILE, "/etc/passwd", "none", MS_BIND, "mode=400,gid=0") < 0)
errExit("mount");
fs_logger("create /etc/passwd");
return;
errout:
fwarning("failed to clean up /etc/passwd\n");
if (fpin)
fclose(fpin);
if (fpout)
fclose(fpout);
}
开发者ID:Fred-Barclay,项目名称:firejail,代码行数:91,代码来源:restrict_users.c
示例12: main
int
main(int argc, char *argv[])
{
struct timeval start, finish;
struct timespec request, remain;
struct sigaction sa;
int s, flags;
if (argc < 3 || strcmp(argv[1], "--help") == 0)
usageErr("%s secs nanosecs [a]\n", argv[0]);
/* Allow SIGINT handler to interrupt clock_nanosleep() */
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = sigintHandler;
if (sigaction(SIGINT, &sa, NULL) == -1)
errExit("sigaction");
/* If more than three command-line arguments, use TIMER_ABSTIME flag */
flags = (argc > 3) ? TIMER_ABSTIME : 0;
if (flags == TIMER_ABSTIME) {
if (clock_gettime(CLOCK_REALTIME, &request) == -1)
errExit("clock_gettime");
printf("Initial CLOCK_REALTIME value: %ld.%09ld\n",
(long) request.tv_sec, (long) request.tv_nsec);
request.tv_sec += getLong(argv[1], 0, "secs");
request.tv_nsec += getLong(argv[2], 0, "nanosecs");
if (request.tv_nsec >= 1000000000) {
request.tv_sec += request.tv_nsec / 1000000000;
request.tv_nsec %= 1000000000;
}
} else { /* Relative sleep */
request.tv_sec = getLong(argv[1], 0, "secs");
request.tv_nsec = getLong(argv[2], 0, "nanosecs");
}
if (gettimeofday(&start, NULL) == -1)
errExit("gettimeofday");
for (;;) {
s = clock_nanosleep(CLOCK_REALTIME, flags, &request, &remain);
if (s != 0 && s != EINTR)
errExitEN(s, "clock_nanosleep");
if (s == EINTR)
printf("Interrupted... ");
if (gettimeofday(&finish, NULL) == -1)
errExit("gettimeofday");
printf("Slept: %.6f secs", finish.tv_sec - start.tv_sec +
(finish.tv_usec - start.tv_usec) / 1000000.0);
if (s == 0)
break; /* sleep completed */
if (flags != TIMER_ABSTIME) {
printf("... Remaining: %ld.%09ld",
(long) remain.tv_sec, remain.tv_nsec);
request = remain;
}
printf("... Restarting\n");
}
printf("\nSleep complete\n");
exit(EXIT_SUCCESS);
}
开发者ID:BaxterStockman,项目名称:OSU-CS,代码行数:73,代码来源:t_clock_nanosleep.c
示例13: main
int
main(int argc, char *argv[])
{
char *username, *password, *encrypted, *p;
struct passwd *pwd;
struct spwd *spwd;
Boolean authOk;
size_t len;
long lnmax;
/* Determine size of buffer required for a username, and allocate it */
lnmax = sysconf(_SC_LOGIN_NAME_MAX);
if (lnmax == -1) /* If limit is indeterminate */
lnmax = 256; /* make a guess */
username = malloc(lnmax);
if (username == NULL)
errExit("malloc");
printf("Username: ");
fflush(stdout);
if (fgets(username, lnmax, stdin) == NULL)
exit(EXIT_FAILURE); /* Exit on EOF */
len = strlen(username);
if (username[len - 1] == '\n')
username[len - 1] = '\0'; /* Remove trailing '\n' */
/* Look up password and shadow password records for username */
pwd = getpwnam(username);
if (pwd == NULL)
fatal("couldn't get password record");
spwd = getspnam(username);
if (spwd == NULL && errno == EACCES)
fatal("no permission to read shadow password file");
if (spwd != NULL) /* If there is a shadow password record */
pwd->pw_passwd = spwd->sp_pwdp; /* Use the shadow password */
password = getpass("Password: ");
/* Encrypt password and erase cleartext version immediately */
encrypted = crypt(password, pwd->pw_passwd);
for (p = password; *p != '\0'; )
*p++ = '\0';
if (encrypted == NULL)
errExit("crypt");
authOk = strcmp(encrypted, pwd->pw_passwd) == 0;
if (!authOk) {
printf("Incorrect password\n");
exit(EXIT_FAILURE);
}
printf("Successfully authenticated: UID=%ld\n", (long) pwd->pw_uid);
/* Now do authenticated work... */
exit(EXIT_SUCCESS);
}
开发者ID:Cergoo,项目名称:junk,代码行数:64,代码来源:check_password.c
示例14: main
int
main(int argc, char *argv[])
{
int semid, key, perms;
struct sembuf sops[2];
if (argc != 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s sem-op\n", argv[0]);
key = 12345;
perms = S_IRUSR | S_IWUSR;
semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms);
if (semid != -1) { /* Successfully created the semaphore */
union semun arg;
struct sembuf sop;
sleep(5);
printf("%ld: created semaphore\n", (long) getpid());
arg.val = 0; /* So initialize it to 0 */
if (semctl(semid, 0, SETVAL, arg) == -1)
errExit("semctl 1");
printf("%ld: initialized semaphore\n", (long) getpid());
/* Perform a "no-op" semaphore operation - changes sem_otime
so other processes can see we've initialized the set. */
sop.sem_num = 0; /* Operate on semaphore 0 */
sop.sem_op = 0; /* Wait for value to equal 0 */
sop.sem_flg = 0;
if (semop(semid, &sop, 1) == -1)
errExit("semop");
printf("%ld: completed dummy semop()\n", (long) getpid());
} else { /* We didn't create the semaphore set */
if (errno != EEXIST) { /* Unexpected error from semget() */
errExit("semget 1");
} else { /* Someone else already created it */
const int MAX_TRIES = 10;
int j;
union semun arg;
struct semid_ds ds;
semid = semget(key, 1, perms); /* So just get ID */
if (semid == -1)
errExit("semget 2");
printf("%ld: got semaphore key\n", (long) getpid());
/* Wait until another process has called semop() */
arg.buf = &ds;
for (j = 0; j < MAX_TRIES; j++) {
printf("Try %d\n", j);
if (semctl(semid, 0, IPC_STAT, arg) == -1)
errExit("semctl 2");
if (ds.sem_otime != 0) /* Semop() performed? */
break; /* Yes, quit loop */
sleep(1); /* If not, wait and retry */
}
if (ds.sem_otime == 0) /* Loop ran to completion! */
fatal("Existing semaphore not initialized");
}
}
/* Now perform some operation on the semaphore */
sops[0].sem_num = 0; /* Operate on semaphore 0... */
sops[0].sem_op = getInt(argv[1], 0, "sem-op");
sops[0].sem_flg = 0;
if (semop(semid, sops, 1) == -1)
errExit("semop");
exit(EXIT_SUCCESS);
}
开发者ID:Bipsy,项目名称:Linux,代码行数:80,代码来源:svsem_good_init.c
示例15: main
int
main(int argc, char *argv[])
{
int epfd, ready, fd, s, j, numOpenFds;
struct epoll_event ev;
struct epoll_event evlist[MAX_EVENTS];
char buf[MAX_BUF];
if (argc < 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s file...\n", argv[0]);
epfd = epoll_create(argc - 1);
if (epfd == -1)
errExit("epoll_create");
/* Open each file on command line, and add it to the "interest
list" for the epoll instance */
for (j = 1; j < argc; j++) {
fd = open(argv[j], O_RDONLY);
if (fd == -1)
errExit("open");
printf("Opened \"%s\" on fd %d\n", argv[j], fd);
ev.events = EPOLLIN; /* Only interested in input events */
ev.data.fd = fd;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1)
errExit("epoll_ctl");
}
numOpenFds = argc - 1;
while (numOpenFds > 0) {
/* Fetch up to MAX_EVENTS items from the ready list of the
epoll instance */
printf("About to epoll_wait()\n");
ready = epoll_wait(epfd, evlist, MAX_EVENTS, -1);
if (ready == -1) {
if (errno == EINTR)
continue; /* Restart if interrupted by signal */
else
errExit("epoll_wait");
}
printf("Ready: %d\n", ready);
/* Deal with returned list of events */
for (j = 0; j < ready; j++) {
printf(" fd=%d; events: %s%s%s\n", evlist[j].data.fd,
(evlist[j].events & EPOLLIN) ? "EPOLLIN " : "",
(evlist[j].events & EPOLLHUP) ? "EPOLLHUP " : "",
(evlist[j].events & EPOLLERR) ? "EPOLLERR " : "");
if (evlist[j].events & EPOLLIN) {
s = read(evlist[j].data.fd, buf, MAX_BUF);
if (s == -1)
errExit("read");
printf(" read %d bytes: %.*s\n", s, s, buf);
} else if (evlist[j].events & (EPOLLHUP | EPOLLERR)) {
/* After the epoll_wait(), EPOLLIN and EPOLLHUP may both have
been set. But we'll only get here, and thus close the file
descriptor, if EPOLLIN was not set. This ensures that all
outstanding input (possibly more than MAX_BUF bytes) is
consumed (by further loop iterations) before the file
descriptor is closed. */
printf(" closing fd %d\n", evlist[j].data.fd);
if (close(evlist[j].data.fd) == -1)
errExit("close");
numOpenFds--;
}
}
}
printf("All file descriptors closed; bye\n");
exit(EXIT_SUCCESS);
}
开发者ID:Heuristack,项目名称:Productivity,代码行数:82,代码来源:epoll_input.c
示例16: main
int
main(int argc, char *argv[])
{
fd_set rfds;
int opt;
int inotifyFd;
/* Parse command-line options */
verboseMask = 0;
checkCache = 0;
dumpCache = 0;
stopFile = NULL;
abortOnCacheProblem = 0;
while ((opt = getopt(argc, argv, "a:dxl:v:b:")) != -1) {
switch (opt) {
case 'a':
abortOnCacheProblem = 1;
stopFile = optarg;
break;
case 'x':
checkCache = 1;
break;
case 'd':
dumpCache = 1;
break;
case 'v':
verboseMask = atoi(optarg);
break;
case 'b':
readBufferSize = atoi(optarg);
break;
case 'l':
logfp = fopen(optarg, "w+");
if (logfp == NULL)
errExit("fopen");
setbuf(logfp, NULL);
break;
default:
usageError(argv[0]);
}
}
if (optind >= argc)
usageError(argv[0]);
/* Save a copy of the directories on the command line */
copyRootDirPaths(&argv[optind]);
/* Create an inotify instance and populate it with entries for
directory named on command line */
inotifyFd = reinitialize(-1);
/* Loop to handle inotify events and keyboard commands */
printf("%s> ", argv[0]);
fflush(stdout);
for (;;) {
FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds);
FD_SET(inotifyFd, &rfds);
if (select(inotifyFd + 1, &rfds, NULL, NULL, NULL) == -1)
errExit("select");
if (FD_ISSET(STDIN_FILENO, &rfds)) {
executeCommand(&inotifyFd);
printf("%s> ", argv[0]);
fflush(stdout);
}
if (FD_ISSET(inotifyFd, &rfds))
processInotifyEvents(&inotifyFd);
}
exit(EXIT_SUCCESS);
}
开发者ID:Bipsy,项目名称:Linux,代码行数:88,代码来源:inotify_dtree.c
示例17: copyRootDirPaths
static void
copyRootDirPaths(char *argv[])
{
char **p;
int j, k;
struct stat sb;
p = argv;
numRootDirs = 0;
/* Count the number of root paths, and check that the paths are valid */
for (p = argv; *p != NULL; p++) {
/* Check that command-line arguments are directories */
if (lstat(*p, &sb) == -1) {
fprintf(stderr, "lstat() failed on '%s'\n", *p);
exit(EXIT_FAILURE);
}
if (! S_ISDIR(sb.st_mode)) {
fprintf(stderr, "'%s' is not a directory\n", *p);
exit(EXIT_FAILURE);
}
numRootDirs++;
}
/* Create a copy of the root directory pathnames */
rootDirPaths = calloc(numRootDirs, sizeof(char *));
if (rootDirPaths == NULL)
errExit("calloc");
rootDirStat = calloc(numRootDirs, sizeof(struct stat));
if (rootDirPaths == NULL)
errExit("calloc");
for (j = 0; j < numRootDirs; j++) {
rootDirPaths[j] = strdup(argv[j]);
if (rootDirPaths[j] == NULL)
errExit("strdup");
/* If the same filesystem object appears more than once in the
command line, this will cause confusion if we later try to zap
an object from the set of root paths. So, reject such
duplicates now. Note that we can't just do simple string
comparisons of the arguments, since different pathname strings
may refer to the same filesystem object (e.g., "mydir" and
"./mydir"). So, we use stat() to compare i-node numbers and
containing device IDs. */
if (lstat(argv[j], &rootDirStat[j]) == -1)
errExit("lstat");
for (k = 0; k < j; k++) {
if ((rootDirStat[j].st_ino == rootDirStat[k].st_ino) &&
(rootDirStat[j].st_dev == rootDirStat[k].st_dev)) {
fprintf(stderr, "Duplicate filesystem objects: %s, %s\n",
argv[j], argv[k]);
exit(EXIT_FAILURE);
}
}
}
ignoreRootDirs = 0;
}
开发者ID:Bipsy,项目名称:Linux,代码行数:69,代码来源:inotify_dtree.c
|
请发表评论