#include <sys/param.h> #include <sys/filio.h> #include <errno.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <pwd.h> #define COMMANDER←PORT 9999 main(int argc, char **argv) { struct hostent *e; struct sockaddr←in addr; int s, i; char buf[1000]; FILE *f; struct in←addr ia; enum { Waiting, Printing } state = Waiting; char wd[MAXPATHLEN]; uid←t uid; struct passwd *passwdPtr; addr.sin←family = AF←INET; addr.sin←port = htons(COMMANDER←PORT); ia.s←addr = inet←addr("127.0.0.1"); memcpy(&addr.sin←addr, &ia, sizeof(ia)); s = socket(AF←INET, SOCK←STREAM, 0); if (s < 0) { perror("Making socket"); exit(3); } if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { close(s); if (errno == ECONNREFUSED) exit(2); else exit(3); } f = fdopen(s, "w"); uid = getuid(); passwdPtr = getpwuid(uid); fprintf(f, "AssertUser %s;", passwdPtr->pw←name); fprintf(f, "cd %s; echo -s -n \007; ", getwd(wd)); for (i = 1; i < argc; i++) { if (i != 1) fputc(' ', f); fputs(argv[i], f); } fprintf(f, "; echo -s -n \"\\001 Ignore this line...\";; echo -s -n \007\n"); fflush(f); shutdown(s, 1); while (read(s, buf, 1)) { long count; ioctl(s, FIONREAD, &count); read(s, buf + 1, count > sizeof(buf) - 1 ? sizeof(buf) - 1 : count); for (i = 0; i <= count; i++) { switch (state) { case Waiting: if (buf[i] == '\007') state = Printing; break; case Printing: if (buf[i] == '\007') exit(1); else if (buf[i] == '\001') /* success marker */ exit(0); else { putc(buf[i], stdout); break; } } } fflush(stdout); } exit(3); /* Shouldn't get EOF */ }