diff --git a/c/rexec/Makefile b/c/rexec/Makefile index 2a6f5db..098455d 100644 --- a/c/rexec/Makefile +++ b/c/rexec/Makefile @@ -5,3 +5,6 @@ $(CC) $(CFLAGS) $^ -o rexec rexecd: rexecd.c rexec.h $(CC) $(CFLAGS) $^ -o rexecd + +clean: + rm -f rexec rexecd diff --git a/c/rexec/rexec.c b/c/rexec/rexec.c index 913b76a..e744661 100644 --- a/c/rexec/rexec.c +++ b/c/rexec/rexec.c @@ -31,10 +31,10 @@ #include #include +#include #include -#include +#include #include -#include #include #include "rexec.h" @@ -54,14 +54,12 @@ void usage(void); void version(void); -void license(void); int main ( int argc, char* argv[] ) { int localargsparsed = 0; int i; int sock; int tmp; - int child; char buff; char *command = NULL; in_addr_t remote_addr = 0; @@ -98,21 +96,19 @@ exit(-1); } - remote_host_addr = malloc(sizeof(struct sockaddr_in)); + remote_host_addr = alloca(sizeof(struct sockaddr_in)); remote_host_addr->sin_family = AF_INET; remote_host_addr->sin_addr.s_addr = remote_addr; remote_host_addr->sin_port = REXEC_PORT; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if ( sock < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("socket"); exit(-1); } - tmp = connect(sock, (struct sockaddr*)remote_host_addr, sizeof(struct sockaddr_in)); - free(remote_host_addr); - if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + if ( connect(sock, (struct sockaddr*)remote_host_addr, sizeof(struct sockaddr_in)) < 0 ) { + showerror("connect"); exit(-1); } @@ -123,17 +119,18 @@ } write(sock, "\n", 1); - if ( (child = fork()) == 0 ) { + + if ( fork() == 0 ) { while ( tmp > -1 ) { if ( (tmp = read(sock, &buff, 1)) == 1 ) { - printf("%c", buff); + write(1, &buff, 1); } else { usleep(200000); } } } else { - while ( feof(stdin) == 0 ) { - if ( buff = (char)getchar() ) { + while ( tmp > -1 ) { + if ( (tmp = read(1, &buff, 1)) == 1 ) { write(sock, &buff, 1); } else { usleep(200000); @@ -141,15 +138,14 @@ } } - tmp = shutdown(sock, SHUT_RDWR); - if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + + if ( shutdown(sock, SHUT_RDWR) < 0 ) { + showerror("shutdown"); exit(-1); } - tmp = close(sock); - if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + if ( close(sock) < 0 ) { + showerror("close"); exit(-1); } @@ -159,13 +155,9 @@ } void usage(void) { - fprintf(stdout, "%s", usagemsg); + write(1, usagemsg, strlen(usagemsg)); } void version(void) { - fprintf(stdout, "%s", versionmsg); -} - -void license(void) { - fprintf(stdout, "%s", licensemsg); + write(1, versionmsg, strlen(versionmsg)); } diff --git a/c/rexec/rexec.h b/c/rexec/rexec.h index 961cc81..b1fa883 100644 --- a/c/rexec/rexec.h +++ b/c/rexec/rexec.h @@ -1,6 +1,10 @@ #ifndef _REXEC_H #define _REXEC_H +#include +#include +#include + #define REXEC_PORT 1234 #define REXEC_MAX_LENGTH 1024 #define REXEC_MAX_ARGS 256 @@ -32,4 +36,16 @@ "THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" ; +void license ( ) { + write(1, licensemsg, strlen(licensemsg)); +} + +void showerror ( char* type ) { + char* errstr = strerror(errno); + write(1, type, strlen(type)); + write(1, ": ", 2); + write(1, errstr, strlen(errstr)); + write(1, "\n", 1); +} + #endif diff --git a/c/rexec/rexecd.c b/c/rexec/rexecd.c index 3d7d57a..889fae2 100644 --- a/c/rexec/rexecd.c +++ b/c/rexec/rexecd.c @@ -31,9 +31,10 @@ #include #include +#include #include #include -#include +#include #include #include "rexec.h" @@ -47,18 +48,17 @@ const char versionmsg[] = "rexecd 0.2\n"; -void usage(void); -void version(void); -void license(void); +void usage(); +void version(); int main ( int argc, char * argv[] ) { int sock; int child; int tmp; - int i,j,k; + int i,j; int sock2; int lineend; - int *remote_host_addr_len; + socklen_t *remote_host_addr_len; char buff; struct sockaddr *remote_host_addr = NULL; struct sockaddr_in *local_addr = NULL; @@ -82,27 +82,26 @@ } } - local_addr = malloc(sizeof(struct sockaddr_in)); + local_addr = alloca(sizeof(struct sockaddr_in)); local_addr->sin_family = AF_INET; local_addr->sin_addr.s_addr = INADDR_ANY; local_addr->sin_port = REXEC_PORT; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if ( sock < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("socket"); exit(-1); } tmp = bind(sock, (struct sockaddr*)local_addr, sizeof(struct sockaddr_in)); - free(local_addr); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("bind"); exit(-1); } tmp = listen(sock, 4); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("listen"); exit(-1); } @@ -114,7 +113,7 @@ do { tmp = read(sock2, &buff, 1); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("read"); exit(-1); } cmdline[i] = buff; @@ -145,23 +144,23 @@ tmp = execvp(cmdargs[0], cmdargs); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("execvp"); exit(-1); } exit(0); } else { - wait(); + wait(&tmp); } tmp = shutdown(sock2, SHUT_RDWR); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("shutdown"); exit(-1); } tmp = close(sock2); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("close"); exit(-1); } @@ -172,19 +171,19 @@ } if ( sock2 < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("accept"); exit(-1); } tmp = shutdown(sock, SHUT_RDWR); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("shutdown"); exit(-1); } tmp = close(sock); if ( tmp < 0 ) { - printf("error: %s\n", strerror(errno)); + showerror("close"); exit(-1); } @@ -193,14 +192,10 @@ exit(0); } -void usage(void) { - fprintf(stdout, "%s", usagemsg); +void usage() { + write(1, usagemsg, strlen(usagemsg)); } -void version(void) { - fprintf(stdout, "%s", versionmsg); -} - -void license(void) { - fprintf(stdout, "%s", licensemsg); +void version() { + write(1, versionmsg, strlen(versionmsg)); }