/* Great hacking proggie by the eleet p0nk B) */ #include #include #include #include #include #include #include #include #include #include #include #include #define FLASH "\033c\033(0\033#8\033[1;3r\033[J\033[5m\033[?5h" struct timeval timeout = { 25, 0 }; int mbufsize; char *mbuf; void makemsg (); int main(argc, argv) int argc; char **argv; { char *wallhost, res; CLIENT *cl; if ((argc < 2) || (argc > 3)) { fprintf(stderr, "usage: %s hostname [file]\n", argv[0]); exit(1); } wallhost = argv[1]; makemsg(argv[2]); /* * Create client "handle" used for calling MESSAGEPROG on the * server designated on the command line. We tell the rpc package * to use the "tcp" protocol when contacting the server. */ cl = clnt_create(wallhost, WALLPROG, WALLVERS, "udp"); if (cl == NULL) { /* * Couldn't establish connection with server. * Print error message and die. [2000]*/ clnt_pcreateerror(wallhost); exit(1); } if (clnt_call(cl, WALLPROC_WALL, xdr_wrapstring, &mbuf, xdr_void, &res, timeout) != RPC_SUCCESS) { /* * An error occurred while calling the server. * Print error message and die. [2000]*/ clnt_perror(cl, wallhost); exit(1); } exit(0); } void makemsg(fname) char *fname; { struct tm *lt; struct passwd *pw; struct stat sbuf; time_t now; FILE *fp; int fd; char whom[30]=FLASH, hostname[MAXHOSTNAMELEN], lbuf[100], tmpname[32]; (void)strcpy(tmpname, _PATH_TMP); (void)strcat(tmpname, "/wall.XXXXXX"); if (!(fd = mkstemp(tmpname)) || !(fp = fdopen(fd, "r+"))) { (void)fprintf(stderr, "wall: can't open temporary file.\n"); exit(1); } (void)unlink(tmpname); (void)gethostname(hostname, sizeof(hostname)); (void)time(&now); lt = localtime(&now); /* * all this stuff is to blank out a square for the message; * we wrap message lines at column 79, not 80, because some * terminals wrap after 79, some do not, and we can't tell. * Which means that we may leave a non-blank character * in column 80, but that can't be helped. */ (void)fprintf(fp, "Remote Broadcast Message from %s@%s\n", whom, hostname); (void)fprintf(fp, " (%s) at %d:%02d ...\n", ttyname(2), lt->tm_hour, lt->tm_min); putc('\n', fp); if (fname && !(freopen(fname, "r", stdin))) { (void)fprintf(stderr, "wall: can't read %s.\n", fname); exit(1); } while (fgets(lbuf, sizeof(lbuf), stdin)) fputs(lbuf, fp); rewind(fp); if (fstat(fd, &sbuf)) { (void)fprintf(stderr, "wall: can't stat temporary file.\n"); exit(1); } mbufsize = sbuf.st_size; if (!(mbuf = malloc((u_int)mbufsize))) { (void)fprintf(stderr, "wall: out of memory.\n"); exit(1); } if (fread(mbuf, sizeof(*mbuf), mbufsize, fp) != mbufsize) { (void)fprintf(stderr, "wall: can't read temporary file.\n"); exit(1); } (void)close(fd); } /* www.hack.co.za [2000]*/