*** empty log message ***
This commit is contained in:
@@ -30,6 +30,9 @@ void pipehandler(int sig)
|
||||
|
||||
}
|
||||
|
||||
#define CHILDFD 1
|
||||
#define PARENTFD 0
|
||||
|
||||
void do_child(int pty_fds[])
|
||||
{
|
||||
/* reads from pipe and prints out the data */
|
||||
@@ -43,38 +46,38 @@ void do_child(int pty_fds[])
|
||||
signal(SIGUSR1, pipehandler);
|
||||
|
||||
/* first, close the write part, since it is not needed */
|
||||
close(pty_fds[1]);
|
||||
close(pty_fds[PARENTFD]);
|
||||
|
||||
while(1) {
|
||||
FD_ZERO(&fds_read);
|
||||
FD_ZERO(&fds_exception);
|
||||
FD_SET(pty_fds[0], &fds_read);
|
||||
FD_SET(pty_fds[0], &fds_exception);
|
||||
FD_SET(pty_fds[CHILDFD], &fds_read);
|
||||
FD_SET(pty_fds[CHILDFD], &fds_exception);
|
||||
timeout.tv_sec = 5;
|
||||
timeout.tv_usec = 0;
|
||||
retval = select(pty_fds[0]+1, &fds_read, NULL, &fds_exception, &timeout);
|
||||
retval = select(pty_fds[CHILDFD]+1, &fds_read, NULL, &fds_exception, &timeout);
|
||||
if (retval == -1) {
|
||||
perror("select");
|
||||
fprintf(stderr, "child: Error in select\n");
|
||||
continue;
|
||||
} else printf("child select: %d\n", retval);
|
||||
if (FD_ISSET(pty_fds[0], &fds_exception)) {
|
||||
if (FD_ISSET(pty_fds[CHILDFD], &fds_exception)) {
|
||||
printf("child: exception fd set. quitting.\n");
|
||||
break;
|
||||
}
|
||||
if (FD_ISSET(pty_fds[0], &fds_read)) {
|
||||
if (FD_ISSET(pty_fds[CHILDFD], &fds_read)) {
|
||||
printf("child: read fd set. reading.\n");
|
||||
if ((retval = read(pty_fds[0], data, sizeof(data))) < 0) {
|
||||
if ((retval = read(pty_fds[CHILDFD], data, sizeof(data))) < 0) {
|
||||
perror("read");
|
||||
fprintf(stderr, "child: couldn't read from pipe\n");
|
||||
fprintf(stderr, "child: couldn't read from pty\n");
|
||||
exit(-1);
|
||||
}
|
||||
if(retval == 0) {
|
||||
fprintf(stderr, "child: eof on pipe\n");
|
||||
fprintf(stderr, "child: eof on pty\n");
|
||||
break;
|
||||
}
|
||||
data[retval] = '\0';
|
||||
printf("pid %d eipe reads (%d): %s\n", getpid(), retval, data);
|
||||
printf("pid %d pty reads (%d): %s\n", getpid(), retval, data);
|
||||
} else printf("child: no fd set\n");
|
||||
}
|
||||
|
||||
@@ -91,15 +94,15 @@ void do_parent(int pty_fds[])
|
||||
signal(SIGUSR1, pipehandler);
|
||||
|
||||
/* first, close the read part of pty, since it is not needed */
|
||||
close(pty_fds[0]);
|
||||
close(pty_fds[CHILDFD]);
|
||||
|
||||
/* now enter a loop of read user input, and writing it to the pty */
|
||||
while (1) {
|
||||
FD_ZERO(&fds_write);
|
||||
FD_SET(pty_fds[1], &fds_write);
|
||||
FD_SET(pty_fds[PARENTFD], &fds_write);
|
||||
printf("pid %d Waiting for pty ready to write on %s...\n",
|
||||
getpid(), name);
|
||||
retval = select(pty_fds[1]+1, NULL, &fds_write, NULL, NULL);
|
||||
retval = select(pty_fds[PARENTFD]+1, NULL, &fds_write, NULL, NULL);
|
||||
if (retval == -1) {
|
||||
perror("select");
|
||||
fprintf(stderr, "Parent: Error in select\n");
|
||||
@@ -113,11 +116,11 @@ void do_parent(int pty_fds[])
|
||||
}
|
||||
if (!strcmp(data, "exit"))
|
||||
break;
|
||||
if (!FD_ISSET(pty_fds[1], &fds_write)) {
|
||||
if (!FD_ISSET(pty_fds[PARENTFD], &fds_write)) {
|
||||
fprintf(stderr, "parent: write fd not set?! retrying\n");
|
||||
continue;
|
||||
}
|
||||
retval = write(pty_fds[1], &data, 1024);
|
||||
retval = write(pty_fds[PARENTFD], &data, 1024);
|
||||
if (retval == -1) {
|
||||
perror("write");
|
||||
fprintf(stderr, "Error writing on pty\n");
|
||||
@@ -126,7 +129,7 @@ void do_parent(int pty_fds[])
|
||||
}
|
||||
|
||||
/* got exit from user */
|
||||
close(pty_fds[1]); /* close pty, let child know we're done */
|
||||
close(pty_fds[PARENTFD]); /* close pty, let child know we're done */
|
||||
wait(&retval);
|
||||
printf("Child exited with status: %d\n", retval);
|
||||
exit(0);
|
||||
|
||||
Reference in New Issue
Block a user