#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
enum {
NPOSTS = 2,
TIMEOUT = 5
};
FILE *dial(const char *host, const char *port);
char **tokenise(const char *s, const char *delim);
size_t count_tokens(const char *s, const char *delim);
char *nth_token(char *to, size_t n, const char *s, const char *delim, size_t i);
void free_tokens(char **a);
static char buffer[2000000];
void post(const char *thread, const char *name, const char *email,
const char *comment)
{
FILE *iop;
if (!(iop = dial("dis.4chan.org", "80"))) {
fputs("error: unable to connect to server\n", stderr
); return;
}
sprintf(buffer
, "bbs=prog&id=%s&shiichan=proper2&" "kotehan=%s&meiru=%s&com=%s&email=%%27", thread, name, email,
comment);
"POST /post HTTP/1.1\r\n"
"Host: dis.4chan.org\r\n"
"Connection: close\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Length: %lu\r\n\r\n%s",
(unsigned long int) strlen(buffer
), buffer
); }
char *get(const char *page)
{
FILE *iop;
size_t n;
puts("Connecting to server ..."); if (!(iop = dial("dis.4chan.org", "80"))) {
fputs("error: unable to connect to server\n", stderr
); }
"GET %s HTTP/1.1\r\n"
"Host: dis.4chan.org\r\n"
"Connection: close\r\n\r\n", page);
puts("Downloading thread list ..."); n
= fread(buffer
, 1, sizeof buffer
, iop
); buffer[n] = '\0';
return buffer;
}
int main(int argc, char *argv[])
{
char buf[1024];
size_t n, i;
char **a;
if (!(a = tokenise(get("/prog/subject.txt"), "\n"))) {
fputs("memory error\n", stderr
); return EXIT_FAILURE;
}
for (n = i = 0; (a[n] = a[i]); i++)
if (count_tokens(a[i], "<>") == 7)
n++;
for (i = 0;;) {
post
(nth_token
(buf
, sizeof buf
, a
[rand() % n
], "<>", 3), "James+Gosling", "",
"GAWWZMACS+FLABBERGASTS+MY+AUDIENCE");
if (++i == NPOSTS)
break;
sleep(TIMEOUT);
}
free_tokens(a);
return 0;
}
/* -------------------------------------------------------------------------- */
char *nth_token(char *to, size_t n, const char *s, const char *delim, size_t i)
{
char *save = to;
while (i--) {
return 0;
s += dsize;
}
while (--n
&& (*to
= *s
) && strncmp(s
++, delim
, dsize
)) to++;
*to = '\0';
return save;
}
size_t count_tokens(const char *s, const char *delim)
{
size_t dsize
= strlen(delim
), n
= 0;
while (*s) {
n++;
while (*s
&& strncmp(s
, delim
, dsize
)) s++;
if (!*s)
break;
s += dsize;
}
return n;
}
void free_tokens(char **a)
{
}
static char **make_tokens(char **to, size_t n, char *s, const char *delim)
{
char **save = to, **endp = to + n - 1;
while (*s) {
if (to < endp)
*to++ = s;
while (*s
&& strncmp(s
, delim
, dsize
)) s++;
if (!*s)
break;
*s = '\0';
s += dsize;
}
*to = 0;
return save;
}
char **tokenise(const char *s, const char *delim)
{
size_t n = count_tokens(s, delim) + 1;
char **r;
if (!(r
= malloc((n
+ 1) * sizeof *r
))) return 0;
return 0;
}
return make_tokens
(r
+ 1, n
, strcpy(*r
, s
), delim
); }
FILE *dial(const char *host, const char *port)
{
struct addrinfo hints;
struct addrinfo *info, *ip;
int fd;
memset(&hints
, 0, sizeof hints
); hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_UNSPEC;
if (getaddrinfo(host, port, &hints, &info))
return 0;
for (ip = info; ip; ip = ip->ai_next) {
if ((fd = socket(ip->ai_family, ip->ai_socktype,
ip->ai_protocol)) == -1)
continue;
if (!connect(fd, ip->ai_addr, ip->ai_addrlen))
break;
close(fd);
}
freeaddrinfo(info);
return !ip
? 0 : fdopen(fd
, "r+"); }
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgoKI2luY2x1ZGUgPG5ldGRiLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKZW51bSB7CglOUE9TVFMgPSAyLAoJVElNRU9VVCA9IDUKfTsKCkZJTEUgKmRpYWwoY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcG9ydCk7CgpjaGFyICoqdG9rZW5pc2UoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZGVsaW0pOwoKc2l6ZV90IGNvdW50X3Rva2Vucyhjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpkZWxpbSk7CgpjaGFyICpudGhfdG9rZW4oY2hhciAqdG8sIHNpemVfdCBuLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpkZWxpbSwgc2l6ZV90IGkpOwoKdm9pZCBmcmVlX3Rva2VucyhjaGFyICoqYSk7CgpzdGF0aWMgY2hhciBidWZmZXJbMjAwMDAwMF07Cgp2b2lkIHBvc3QoY29uc3QgY2hhciAqdGhyZWFkLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICplbWFpbCwKCSAgY29uc3QgY2hhciAqY29tbWVudCkKewoJRklMRSAqaW9wOwoKCWlmICghKGlvcCA9IGRpYWwoImRpcy40Y2hhbi5vcmciLCAiODAiKSkpIHsKCQlmcHV0cygiZXJyb3I6IHVuYWJsZSB0byBjb25uZWN0IHRvIHNlcnZlclxuIiwgc3RkZXJyKTsKCQlyZXR1cm47Cgl9CglzcHJpbnRmKGJ1ZmZlciwgImJicz1wcm9nJmlkPSVzJnNoaWljaGFuPXByb3BlcjImIgoJCSJrb3RlaGFuPSVzJm1laXJ1PSVzJmNvbT0lcyZlbWFpbD0lJTI3IiwgdGhyZWFkLCBuYW1lLCBlbWFpbCwKCQljb21tZW50KTsKCWZwcmludGYoaW9wLAoJCSJQT1NUIC9wb3N0IEhUVFAvMS4xXHJcbiIKCQkiSG9zdDogZGlzLjRjaGFuLm9yZ1xyXG4iCgkJIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIKCQkiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcclxuIgoJCSJDb250ZW50LUxlbmd0aDogJWx1XHJcblxyXG4lcyIsCgkJKHVuc2lnbmVkIGxvbmcgaW50KSBzdHJsZW4oYnVmZmVyKSwgYnVmZmVyKTsKCWZmbHVzaChpb3ApOwoJZ2V0Yyhpb3ApOwoJZmNsb3NlKGlvcCk7CglwdXRzKHRocmVhZCk7Cn0KCmNoYXIgKmdldChjb25zdCBjaGFyICpwYWdlKQp7CglGSUxFICppb3A7CglzaXplX3QgbjsKCglwdXRzKCJDb25uZWN0aW5nIHRvIHNlcnZlciAuLi4iKTsKCWlmICghKGlvcCA9IGRpYWwoImRpcy40Y2hhbi5vcmciLCAiODAiKSkpIHsKCQlmcHV0cygiZXJyb3I6IHVuYWJsZSB0byBjb25uZWN0IHRvIHNlcnZlclxuIiwgc3RkZXJyKTsKCQlleGl0KEVYSVRfRkFJTFVSRSk7Cgl9CglmcHJpbnRmKGlvcCwKCQkiR0VUICVzIEhUVFAvMS4xXHJcbiIKCQkiSG9zdDogZGlzLjRjaGFuLm9yZ1xyXG4iCgkJIkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4iLCBwYWdlKTsKCWZmbHVzaChpb3ApOwoJcHV0cygiRG93bmxvYWRpbmcgdGhyZWFkIGxpc3QgLi4uIik7CgluID0gZnJlYWQoYnVmZmVyLCAxLCBzaXplb2YgYnVmZmVyLCBpb3ApOwoJYnVmZmVyW25dID0gJ1wwJzsKCWZjbG9zZShpb3ApOwoJcmV0dXJuIGJ1ZmZlcjsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJY2hhciBidWZbMTAyNF07CglzaXplX3QgbiwgaTsKCWNoYXIgKiphOwoKCXNyYW5kKHRpbWUoMCkpOwoJaWYgKCEoYSA9IHRva2VuaXNlKGdldCgiL3Byb2cvc3ViamVjdC50eHQiKSwgIlxuIikpKSB7CgkJZnB1dHMoIm1lbW9yeSBlcnJvclxuIiwgc3RkZXJyKTsKCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwoJfQoJZm9yIChuID0gaSA9IDA7IChhW25dID0gYVtpXSk7IGkrKykKCQlpZiAoY291bnRfdG9rZW5zKGFbaV0sICI8PiIpID09IDcpCgkJCW4rKzsKCXB1dHMoIlN0YXJ0aW5nIC4uLiIpOwoJZm9yIChpID0gMDs7KSB7CgkJcG9zdChudGhfdG9rZW4oYnVmLCBzaXplb2YgYnVmLCBhW3JhbmQoKSAlIG5dLAoJCQkgICAgICAgIjw+IiwgMyksICJKYW1lcytHb3NsaW5nIiwgIiIsCgkJICAgICAiR0FXV1pNQUNTK0ZMQUJCRVJHQVNUUytNWStBVURJRU5DRSIpOwoJCWlmICgrK2kgPT0gTlBPU1RTKQoJCQlicmVhazsKCQlzbGVlcChUSU1FT1VUKTsKCX0KCWZyZWVfdG9rZW5zKGEpOwoJcmV0dXJuIDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpjaGFyICpudGhfdG9rZW4oY2hhciAqdG8sIHNpemVfdCBuLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpkZWxpbSwgc2l6ZV90IGkpCnsKCXNpemVfdCBkc2l6ZSA9IHN0cmxlbihkZWxpbSk7CgljaGFyICpzYXZlID0gdG87CgoJd2hpbGUgKGktLSkgewoJCWlmICghKHMgPSBzdHJzdHIocywgZGVsaW0pKSkKCQkJcmV0dXJuIDA7CgkJcyArPSBkc2l6ZTsKCX0KCXdoaWxlICgtLW4gJiYgKCp0byA9ICpzKSAmJiBzdHJuY21wKHMrKywgZGVsaW0sIGRzaXplKSkKCQl0bysrOwoJKnRvID0gJ1wwJzsKCXJldHVybiBzYXZlOwp9CgpzaXplX3QgY291bnRfdG9rZW5zKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmRlbGltKQp7CglzaXplX3QgZHNpemUgPSBzdHJsZW4oZGVsaW0pLCBuID0gMDsKCgl3aGlsZSAoKnMpIHsgCgkJbisrOwoJCXdoaWxlICgqcyAmJiBzdHJuY21wKHMsIGRlbGltLCBkc2l6ZSkpCgkJCXMrKzsKCQlpZiAoISpzKQoJCQlicmVhazsKCQlzICs9IGRzaXplOwoJfQoJcmV0dXJuIG47Cn0KCnZvaWQgZnJlZV90b2tlbnMoY2hhciAqKmEpCnsKCWZyZWUoKi0tYSk7CglmcmVlKGEpOwp9CgpzdGF0aWMgY2hhciAqKm1ha2VfdG9rZW5zKGNoYXIgKip0bywgc2l6ZV90IG4sIGNoYXIgKnMsIGNvbnN0IGNoYXIgKmRlbGltKQp7CgljaGFyICoqc2F2ZSA9IHRvLCAqKmVuZHAgPSB0byArIG4gLSAxOwoJc2l6ZV90IGRzaXplID0gc3RybGVuKGRlbGltKTsKCgl3aGlsZSAoKnMpIHsKCQlpZiAodG8gPCBlbmRwKQoJCQkqdG8rKyA9IHM7CgkJd2hpbGUgKCpzICYmIHN0cm5jbXAocywgZGVsaW0sIGRzaXplKSkKCQkJcysrOwoJCWlmICghKnMpCgkJCWJyZWFrOwoJCSpzID0gJ1wwJzsKCQlzICs9IGRzaXplOwoJfQoJKnRvID0gMDsKCXJldHVybiBzYXZlOwp9CgpjaGFyICoqdG9rZW5pc2UoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZGVsaW0pCnsKCXNpemVfdCBuID0gY291bnRfdG9rZW5zKHMsIGRlbGltKSArIDE7CgljaGFyICoqcjsKCglpZiAoIShyID0gbWFsbG9jKChuICsgMSkgKiBzaXplb2YgKnIpKSkKCQlyZXR1cm4gMDsKCWlmICghKCpyID0gbWFsbG9jKHN0cmxlbihzKSArIDEpKSkgewoJCWZyZWUocik7CgkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gbWFrZV90b2tlbnMociArIDEsIG4sIHN0cmNweSgqciwgcyksIGRlbGltKTsKfQoKRklMRSAqZGlhbChjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpwb3J0KQp7CglzdHJ1Y3QgYWRkcmluZm8gaGludHM7CglzdHJ1Y3QgYWRkcmluZm8gKmluZm8sICppcDsKCWludCBmZDsKCgltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YgaGludHMpOwoJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKCWhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKCWlmIChnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZpbmZvKSkKCQlyZXR1cm4gMDsKCWZvciAoaXAgPSBpbmZvOyBpcDsgaXAgPSBpcC0+YWlfbmV4dCkgewoJCWlmICgoZmQgPSBzb2NrZXQoaXAtPmFpX2ZhbWlseSwgaXAtPmFpX3NvY2t0eXBlLAoJCQkJIGlwLT5haV9wcm90b2NvbCkpID09IC0xKQoJCQljb250aW51ZTsKCQlpZiAoIWNvbm5lY3QoZmQsIGlwLT5haV9hZGRyLCBpcC0+YWlfYWRkcmxlbikpCgkJCWJyZWFrOwoJCWNsb3NlKGZkKTsKCX0KCWZyZWVhZGRyaW5mbyhpbmZvKTsKCXJldHVybiAhaXAgPyAwIDogZmRvcGVuKGZkLCAicisiKTsKfQ==