| /* ping for ip v4 and v6 */ |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <parlib.h> |
| #include <unistd.h> |
| #include <signal.h> |
| #include <nixip.h> |
| #include <icmp.h> |
| #include <ctype.h> |
| |
| /* see http://swtch.com/plan9port/man/man3/dial.html */ |
| void caller(char *addr) |
| { |
| char data[512]; |
| int fd = dial(addr, 0, 0, 0); |
| while (1){ |
| int amt; |
| amt = read(0, data, sizeof(data)); |
| if (amt <= 0) |
| break; |
| amt = write(fd, data, amt); |
| amt = read(fd, data, sizeof(data)); |
| if (amt <= 0) |
| break; |
| write(1, data, amt); |
| } |
| } |
| |
| int server(char *addr) |
| { |
| int dfd, acfd, lcfd; |
| char adir[40], ldir[40]; |
| int n; |
| char buf[256]; |
| acfd = announce(addr, adir); |
| if (acfd < 0) |
| return -1; |
| for (;;) { |
| /* listen for a call */ |
| lcfd = listen(adir, ldir); |
| if (lcfd < 0) |
| return -1; |
| /* fork a process to echo */ |
| switch (fork()) { |
| case -1: |
| perror("forking"); |
| exit(1); |
| break; |
| case 0: |
| /* accept the call and open the data file */ |
| dfd = accept(lcfd, ldir); |
| if (dfd < 0) |
| return -1; |
| /* echo until EOF */ |
| while ((n = read(dfd, buf, sizeof(buf))) > 0) { |
| write(dfd, buf, n); |
| } |
| exit(0); |
| default: |
| close(lcfd); |
| break; |
| } |
| } |
| } |
| |
| void main(int argc, char **argv) |
| { |
| int fd, msglen, interval, nmsg; |
| char *ds; |
| int pid; |
| char *addr = "/net/tcp!127.0.0.1!2000"; |
| |
| if (argc > 1) |
| addr = argv[1]; |
| pid = fork(); |
| if (pid < 0) { |
| perror("fork"); |
| exit(1); |
| } |
| if (pid == 0){ |
| /* Attempt to get the caller to dial after the server announces. */ |
| for (int i = 0; i < 3; i++) |
| sys_block(1000000); |
| caller(addr); |
| } else |
| server(addr); |
| } |