/* Seed the random-number generator */ void randpkt_seed(void) { unsigned int randomness; time_t now; #ifndef _WIN32 int fd; ssize_t ret; #define RANDOM_DEV "/dev/urandom" /* * Assume it's at least worth trying /dev/urandom on UN*X. * If it doesn't exist, fall back on time(). * * XXX - Use CryptGenRandom on Windows? */ fd = ws_open(RANDOM_DEV, O_RDONLY); if (fd == -1) { if (errno != ENOENT) { fprintf(stderr, "randpkt: Could not open " RANDOM_DEV " for reading: %s\n", g_strerror(errno)); exit(2); } goto fallback; } ret = ws_read(fd, &randomness, sizeof randomness); if (ret == -1) { fprintf(stderr, "randpkt: Could not read from " RANDOM_DEV ": %s\n", g_strerror(errno)); exit(2); } if ((size_t)ret != sizeof randomness) { fprintf(stderr, "randpkt: Tried to read %lu bytes from " RANDOM_DEV ", got %ld\n", (unsigned long)sizeof randomness, (long)ret); exit(2); } srand(randomness); ws_close(fd); return; fallback: #endif now = time(NULL); randomness = (unsigned int) now; srand(randomness); }
int main(int argc, char ** argv) { char buf[8000]; websocket_t ws; int fd, plen, len; fd = ws_connect(); ws_init(&ws, fd, 1000, 1); for (int eof = 0; !eof;) { for (len = 0; !eof;) { if ((plen = read(0, buf + len, sizeof(buf) - len)) == -1) exit(1); // check for eof eof = plen == 0; len += plen; // check for "\n.\n" (single period on line) if (len > 2 && buf[len - 1] == '\n' && buf[len - 3] == '\n' && buf[len - 2] == '.') { // remove it len -= 2; break; } } if ((ws_write(&ws, buf, len)) == -1) exit(1); if ((plen = ws_read(&ws, buf, sizeof(buf))) == -1) exit(1); if (!plen) break; write(1, buf, plen); } ws_free(&ws); close(fd); return 0; }