Files
@ efaa36850d87
Branch filter:
Location: DistRen/src/common/remoteio.c
efaa36850d87
2.6 KiB
text/plain
most of openning a command is finished
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | /*
Copyright 2008 Nathan Phillip Brink, Ethan Zonca
This file is a part of DistRen.
DistRen is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DistRen is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with DistRen. If not, see <http://www.gnu.org/licenses/>.
*/
#include "remoteio.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <malloc.h>
int remoteio_open(const char *spec, struct remoteio **rem)
{
/* pipe used to write to child */
int pipe_write[2];
/* pipe used to read from child */
int pipe_read[2];
pid_t child;
/* for wait(2) if needed */
int childstatus;
/* create two pipes to facilitate communication with child */
if(pipe(pipe_write))
return 1;
if(pipe(pipe_read));
{
close(pipe_write[0]);
close(pipe_write[1]);
return 1;
}
/* parent */
child = fork();
if(child == -1)
{
close(pipe_write[0]);
close(pipe_write[1]);
close(pipe_read[0]);
close(pipe_read[1]);
return 1;
}
if(child)
{
/* setup remoteio struct */
(*rem) = malloc(sizeof(struct remoteio));
if(!(*rem))
{
/* we should tell the child we're dead - use wait and close our end of the pipes! */
close(pipe_write[1]);
close(pipe_read[0]);
/* we should probably pass of the wait() call to a thread that just does boring things like that. Especially for when the server tries to connect to other servers... */
/* maybe we should just kill the child */
kill(child, SIGTERM);
/* the waitpid(2) seems to indicate that only when the child is terminated will this wait return. */
waitpid(child, &childstatus, 0);
}
(*rem)->pipe_write = pipe_write[1];
(*rem)->pipe_read = pipe_read[0];
(*rem)->child = child;
return 0;
}
/* child */
else
{
return 1; /* this line should never be reached because we exec*/
}
}
size_t remoteio_read(struct remoteio *rem, void *buf, size_t len)
{
return 0;
}
size_t remoteio_write(struct remoteio *rem, void *buf, size_t len)
{
return 0;
}
int remoteio_close(struct remoteio *rem)
{
return 0;
}
|