#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include "internal.h"
#include <spawn.h>
Go to the source code of this file.
|
ncfdplane * | ncfdplane_create (ncplane *n, const ncfdplane_options *opts, int fd, ncfdplane_callback cbfxn, ncfdplane_done_cb donecbfxn) |
|
ncplane * | ncfdplane_plane (ncfdplane *n) |
|
int | ncfdplane_destroy (ncfdplane *n) |
|
ncsubproc * | ncsubproc_createv (ncplane *n, const ncsubproc_options *opts, const char *bin, const char *const arg[], ncfdplane_callback cbfxn, ncfdplane_done_cb donecbfxn) |
|
ncsubproc * | ncsubproc_createvp (ncplane *n, const ncsubproc_options *opts, const char *bin, const char *const arg[], ncfdplane_callback cbfxn, ncfdplane_done_cb donecbfxn) |
|
ncsubproc * | ncsubproc_createvpe (ncplane *n, const ncsubproc_options *opts, const char *bin, const char *const arg[], const char *const env[], ncfdplane_callback cbfxn, ncfdplane_done_cb donecbfxn) |
|
int | ncsubproc_destroy (ncsubproc *n) |
|
ncplane * | ncsubproc_plane (ncsubproc *n) |
|
int | get_tty_fd (FILE *ttyfp) |
|
◆ NCPOLLEVENTS
#define NCPOLLEVENTS (POLLIN) |
Definition at line 23 of file fd.c.
◆ get_tty_fd()
int get_tty_fd |
( |
FILE * |
ttyfp | ) |
|
Definition at line 455 of file fd.c.
455 {
456 int fd = -1;
457 if(ttyfp){
458 if((fd = fileno(ttyfp)) < 0){
459 logwarn(
"no file descriptor was available in outfp %p", ttyfp);
460 }else{
461 if(tty_check(fd)){
462 fd = dup(fd);
463 }else{
464 loginfo(
"fd %d is not a TTY", fd);
465 fd = -1;
466 }
467 }
468 }
469 if(fd < 0){
470 fd = open("/dev/tty", O_RDWR | O_CLOEXEC | O_NOCTTY);
471 if(fd < 0){
472 loginfo(
"couldn't open /dev/tty (%s)", strerror(errno));
473 }else{
474 if(!tty_check(fd)){
475 loginfo(
"file descriptor for /dev/tty (%d) is not actually a TTY", fd);
476 close(fd);
477 fd = -1;
478 }
479 }
480 }
481 if(fd >= 0){
482 loginfo(
"returning TTY fd %d", fd);
483 }
484 return fd;
485}
◆ ncfdplane_create()
Definition at line 120 of file fd.c.
121 {
125 }
126 if(fd < 0 || !cbfxn || !donecbfxn){
128 }
129 return ncfdplane_create_internal(
n,
opts, fd, cbfxn, donecbfxn,
true);
130}
const struct ncplane_options * opts
◆ ncfdplane_destroy()
Definition at line 136 of file fd.c.
136 {
137 int ret = 0;
139 if(pthread_equal(pthread_self(),
n->tid)){
141 }else{
143 ret |= cancel_and_join(
"fdplane",
n->tid, &vret);
144 ret |= ncfdplane_destroy_inner(
n);
145 }
146 }
147 return ret;
148}
◆ ncfdplane_plane()
Definition at line 132 of file fd.c.
◆ ncsubproc_createv()
Definition at line 383 of file fd.c.
385 {
386 return ncexecvpe(
n,
opts, 0, bin, (
char*
const *)arg,
NULL, cbfxn, donecbfxn);
387}
◆ ncsubproc_createvp()
Definition at line 389 of file fd.c.
391 {
392 return ncexecvpe(
n,
opts, 1, bin, (
char*
const *)arg,
NULL, cbfxn, donecbfxn);
393}
◆ ncsubproc_createvpe()
Definition at line 395 of file fd.c.
398 {
399 return ncexecvpe(
n,
opts, 1, bin, (
char*
const *)arg, (
char*
const*)env, cbfxn, donecbfxn);
400}
◆ ncsubproc_destroy()
Definition at line 402 of file fd.c.
402 {
403 int ret = 0;
406
407#ifndef __MINGW32__
408#ifdef USING_PIDFD
410 loginfo(
"sending SIGKILL to pidfd %d",
n->pidfd);
411 if(syscall(__NR_pidfd_send_signal,
n->pidfd, SIGKILL,
NULL, 0)){
412 kill(
n->pid, SIGKILL);
413 }
414 }
415#else
416 pthread_mutex_lock(&
n->lock);
418 loginfo(
"sending SIGKILL to PID %d",
n->pid);
419 kill(
n->pid, SIGKILL);
420 }
421 pthread_mutex_unlock(&
n->lock);
422#endif
423#endif
424
425
426
428 pthread_cancel(
n->nfp->tid);
429
430 pthread_join(
n->waittid, &vret);
431 }
433 pthread_join(
n->nfp->tid, &vret);
434 }else{
435 pthread_join(
n->nfp->tid,
NULL);
436 }
437 pthread_mutex_destroy(&
n->lock);
440 ret = -1;
441 }else if(vret != PTHREAD_CANCELED){
442 ret = *(int*)vret;
444 }
445 }
446 return ret;
447}
◆ ncsubproc_plane()
Definition at line 449 of file fd.c.