Add alt code to 2005/mynx and format fix README.md
Instead of the original code scanning for https (which it did not) I made the version that does an alt code. This should have been done originally but I did not think about it at the time quite unfortunately. Still it would be nice to be able to use https with it. I noted a way that one might be able to get it to work - stunnel, though it's been years since I've used it so it might not be a solution to the problem. Updated .gitignore with files in source/ subdirectory in case configure is run. To make sure that make from source/ works I copied the mynx.c to the source/ directory. I guess I could have updated the configure script but that seems like it would take more effort than it would be worth. Format fix README.md.
This commit is contained in:
1 parent
7fcacd8b38
commit
7ccf7c75ec
7 files changed
+520
-34
No files matched your search
@@ -1 +1,4 @@
|
|||||||
mynx
|
mynx
|
||||||
|
mynx.alt
|
||||||
|
source/config.*
|
||||||
|
source/makefile
|
||||||
+2
-2
@@ -114,8 +114,8 @@ OBJ= ${PROG}.o
|
|||||||
DATA= source/configure source/configure.in entities.txt source/makefile.in
|
DATA= source/configure source/configure.in entities.txt source/makefile.in
|
||||||
TARGET= ${PROG}
|
TARGET= ${PROG}
|
||||||
#
|
#
|
||||||
ALT_OBJ=
|
ALT_OBJ= ${PROG}.alt.o
|
||||||
ALT_TARGET=
|
ALT_TARGET= ${PROG}.alt
|
||||||
|
|
||||||
|
|
||||||
#################
|
#################
|
||||||
|
|||||||
+57
-25
@@ -13,6 +13,11 @@
|
|||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
|
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed this so that the
|
||||||
|
[configure](source/configure) script (which is not needed but part of the entry)
|
||||||
|
would work with compilers that have by default `-Werror` like clang in macOS.
|
||||||
|
Thank you Cody!
|
||||||
|
|
||||||
## To run:
|
## To run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -22,6 +27,8 @@ make
|
|||||||
You can specify a port by appending to the domain `:port`. See notes below on
|
You can specify a port by appending to the domain `:port`. See notes below on
|
||||||
the issue of https.
|
the issue of https.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Try:
|
## Try:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -30,28 +37,52 @@ the issue of https.
|
|||||||
|
|
||||||
|
|
||||||
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) pointed out that this
|
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) pointed out that this
|
||||||
will not work for https initially for two reasons. First it scanned for http://.
|
will not work for https initially for two reasons. For a starting point see the
|
||||||
Cody changed it to scan for both http:// and https:// but the problem is a
|
alternate code section below.
|
||||||
secure connection needs to be set up before http commands can be sent. One would
|
|
||||||
also have to specify a port in the URL. Fortunately or unfortunately many more
|
### Alternate code:
|
||||||
websites use https nowadays so this entry will not work as well as it used to.
|
|
||||||
If one were to try and connect to `http://www.ioccc.org` with this entry they'll
|
As noted this will not work for https. This is because it does not scan for
|
||||||
just get a 301 error. Perhaps someone can come up with a pipeline that will make
|
https but also a secure connection needs to be set up before http commands can
|
||||||
this work with the change made. Otherwise just enjoy it for what it was.
|
be sent. One would also have to specify a port in the URL. Fortunately or
|
||||||
|
unfortunately many more websites use https nowadays so this entry will not work
|
||||||
|
as well as it used to. If one were to try and connect to `http://www.ioccc.org`
|
||||||
|
with this entry they'll just get a 301 error.
|
||||||
|
|
||||||
|
In case someone can come up with a clever pipeline or some other hack or
|
||||||
|
workaround (perhaps [stunnel](https://www.stunnel.org)), Cody added the alt code
|
||||||
|
which does scan for https. Futile, maybe, in which case just enjoy it for what
|
||||||
|
it was. To compile:
|
||||||
|
|
||||||
|
|
||||||
## Judges' remarks
|
```sh
|
||||||
|
make alt
|
||||||
|
```
|
||||||
|
|
||||||
This little mynx will give any Fiery Fox a run for its money. A nice complement
|
Use `mynx.alt` as you would `mynx`. You'd have to specify a port at the end of
|
||||||
to last years winning hibachi. The judges double dare any eager
|
the URL like:
|
||||||
Obfuscationalists to submit the missing pieces to get a functioning LAMP stack.
|
|
||||||
|
```sh
|
||||||
|
./mynx.alt https://www.ioccc.org:443
|
||||||
|
```
|
||||||
|
|
||||||
|
but again unless you have a clever workaround or hack to the problem, this sadly
|
||||||
|
won't work.
|
||||||
|
|
||||||
|
## Judges' remarks:
|
||||||
|
|
||||||
|
This little `mynx` will give any [Fiery
|
||||||
|
Fox](https://en.wikipedia.org/wiki/Firefox) a run for its money. A nice
|
||||||
|
complement to last years winning [hibachi](/2004/hibachi/src/hibachi.c). The
|
||||||
|
judges double dare any eager Obfuscationalists to submit the missing pieces to
|
||||||
|
get a functioning LAMP stack.
|
||||||
|
|
||||||
## Author's remarks:
|
## Author's remarks:
|
||||||
|
|
||||||
I was rather impressed by last year's mini web server. So much so that
|
I was rather impressed by last year's mini webserver. So much so that
|
||||||
it inspired me to try my hand at writing the client side complement.
|
it inspired me to try my hand at writing the client side complement.
|
||||||
|
|
||||||
A typical build would be command would be:
|
A typical build command would be:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cc -omynx mynx.c
|
cc -omynx mynx.c
|
||||||
@@ -69,26 +100,27 @@ all the network functions in a variety of places. So a simpler build
|
|||||||
command sequence would be:
|
command sequence would be:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./configure
|
cd source ; ./configure ; make
|
||||||
make
|
|
||||||
```
|
```
|
||||||
|
|
||||||
After which, the rest of the documentation can be read by saying:
|
After which, the rest of the documentation can be read by saying:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./mynx manual.html
|
./mynx ../manual.html
|
||||||
```
|
```
|
||||||
|
|
||||||
Manifest:
|
Manifest:
|
||||||
|
|
||||||
mynx.c
|
```
|
||||||
makefile pre-built generic Un*x
|
mynx.c
|
||||||
README.TXT
|
makefile pre-built generic Un*x
|
||||||
manual.html
|
README.TXT
|
||||||
makefile.in makefile template
|
manual.html
|
||||||
entities.txt ISO 8859-1 entites
|
makefile.in makefile template
|
||||||
configure.in configure script description
|
entities.txt ISO 8859-1 entites
|
||||||
configure pre-built configure script
|
configure.in configure script description
|
||||||
|
configure pre-built configure script
|
||||||
|
```
|
||||||
|
|
||||||
## Copyright and CC BY-SA 4.0 License:
|
## Copyright and CC BY-SA 4.0 License:
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,224 @@
|
|||||||
|
#define I int
|
||||||
|
#define c char *
|
||||||
|
#define G fscanf(f,
|
||||||
|
#define W while(
|
||||||
|
#define k return
|
||||||
|
#define Q if(
|
||||||
|
#define Z 512
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
FILE *f;
|
||||||
|
short w[4] = { 24, 80 };
|
||||||
|
I L, B, r, H;
|
||||||
|
c l[Z], b[Z], s[Z], S[Z][10], T[Z], h[Z];
|
||||||
|
I
|
||||||
|
e(c s)
|
||||||
|
{
|
||||||
|
I n = 0;
|
||||||
|
Q *s == '#')
|
||||||
|
k (I) strtol(s+1, 0, 0);
|
||||||
|
W n < Z) {
|
||||||
|
Q *S[n] && !strcmp(s, S[n]+1))
|
||||||
|
k *S[n];
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
k '?';
|
||||||
|
}
|
||||||
|
void
|
||||||
|
P(I x)
|
||||||
|
{
|
||||||
|
Q x == '\n' || w[1] - 3 < B) {
|
||||||
|
b[B] = 0;
|
||||||
|
b[B+1] = 0;
|
||||||
|
B = printf("%s", b);
|
||||||
|
B = snprintf(
|
||||||
|
b, Z,
|
||||||
|
"\n %s",
|
||||||
|
b + B + 1
|
||||||
|
);
|
||||||
|
r++;
|
||||||
|
}
|
||||||
|
Q b[B-1] != ' ' || !isspace(x)) {
|
||||||
|
b[B++] = isspace(x) ? ' ' : x;
|
||||||
|
Q w[1] - 3 < B)
|
||||||
|
*strrchr(b, ' ') = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void
|
||||||
|
p(c t, ...)
|
||||||
|
{
|
||||||
|
va_list x;
|
||||||
|
va_start(x, t);
|
||||||
|
vsnprintf(s, Z, t, x);
|
||||||
|
t = s;
|
||||||
|
W *t)
|
||||||
|
P(*t++);
|
||||||
|
va_end(x);
|
||||||
|
}
|
||||||
|
I
|
||||||
|
X(c s)
|
||||||
|
{
|
||||||
|
I x;
|
||||||
|
c t = s;
|
||||||
|
long m = ftell(f);
|
||||||
|
W *t && (x = fgetc(f)) != EOF) {
|
||||||
|
Q *t == '*')
|
||||||
|
s = t++;
|
||||||
|
Q tolower(x) != *t) {
|
||||||
|
Q *s != '*')
|
||||||
|
break;
|
||||||
|
t = s;
|
||||||
|
}
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
Q *t)
|
||||||
|
fseek(f, m, SEEK_SET);
|
||||||
|
k !*t;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
d(c s)
|
||||||
|
{
|
||||||
|
Q 4 < B)
|
||||||
|
P('\n');
|
||||||
|
P('\n');
|
||||||
|
Q *s == 'h')
|
||||||
|
B = 1;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
a(c s)
|
||||||
|
{
|
||||||
|
*T = 0;
|
||||||
|
G
|
||||||
|
ungetc(fgetc(f), f) == '"'
|
||||||
|
? "\"%511[^\"]"
|
||||||
|
: "'%511[^']",
|
||||||
|
T
|
||||||
|
);
|
||||||
|
Q *s == 'a' || *s == 'f' || s[1] == 'f') {
|
||||||
|
free(l[++L]);
|
||||||
|
l[L] = strdup(T);
|
||||||
|
p(" [%d] ", L);
|
||||||
|
}
|
||||||
|
Q *s != 'a')
|
||||||
|
p("%s%s\n", T, *s == 'b' || s[1] == 'h' ? "" : "\n");
|
||||||
|
X("*>");
|
||||||
|
}
|
||||||
|
void *Y[] = {
|
||||||
|
"!--*-->" , 0 ,
|
||||||
|
"a *href=" , a ,
|
||||||
|
"ifr*src=" , a ,
|
||||||
|
"fra*src=" , a ,
|
||||||
|
"img*src=" , a ,
|
||||||
|
"p*>" , d ,
|
||||||
|
"bl*>" , d ,
|
||||||
|
"br" , a ,
|
||||||
|
"hr" , a ,
|
||||||
|
"h*>" , d ,
|
||||||
|
"/h" , a ,
|
||||||
|
"/tr" , a ,
|
||||||
|
"/dt" , a ,
|
||||||
|
"/dd" , a ,
|
||||||
|
"li*>" , d ,
|
||||||
|
"*>" , 0 ,
|
||||||
|
0 , 0
|
||||||
|
};
|
||||||
|
I
|
||||||
|
main(I V, c *v)
|
||||||
|
{
|
||||||
|
I x, n = 0;
|
||||||
|
c t = v[1];
|
||||||
|
ioctl(0, TIOCGWINSZ, w);
|
||||||
|
f = fopen("entities.txt", "r");
|
||||||
|
Q f) {
|
||||||
|
W G "%s %d", S[n]+1, &x) == 2)
|
||||||
|
*S[n++] = x;
|
||||||
|
fclose(f);
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
|
W t) {
|
||||||
|
I m = 0;
|
||||||
|
struct hostent *y;
|
||||||
|
struct sockaddr_in A;
|
||||||
|
L = 0;
|
||||||
|
B = 1;
|
||||||
|
Q (!sscanf(t, "http://%255[^/]%n", h, &n)&&!sscanf(t,"https://%255[^/]%n",h, &n) && !*h)) {
|
||||||
|
Q !(f = fopen(t, "rb")))
|
||||||
|
k 1;
|
||||||
|
goto e;
|
||||||
|
}
|
||||||
|
Q 0 < sscanf(h, "%*[^:]%n:%d", &x, &H))
|
||||||
|
h[x] = 0;
|
||||||
|
else
|
||||||
|
H = 80;
|
||||||
|
y = gethostbyname(h);
|
||||||
|
Q !y)
|
||||||
|
k 1;
|
||||||
|
memcpy(&A.sin_addr.s_addr, y->h_addr, y->h_length);
|
||||||
|
A.sin_port = htons( (short) H);
|
||||||
|
A.sin_family = y->h_addrtype;
|
||||||
|
f = tmpfile();
|
||||||
|
Q !f)
|
||||||
|
k 1;
|
||||||
|
W
|
||||||
|
connect(
|
||||||
|
m = socket(
|
||||||
|
A.sin_family, SOCK_STREAM, 0
|
||||||
|
), (void *) &A, sizeof A
|
||||||
|
)
|
||||||
|
|| errno == EINTR
|
||||||
|
)
|
||||||
|
;
|
||||||
|
n = snprintf(
|
||||||
|
b, Z,
|
||||||
|
"GET %s%s HTTP/1.0\r\nHost: %s:%d\r\n\r\n",
|
||||||
|
t[n] == '/' ? "" : "/", t+n, h, H
|
||||||
|
);
|
||||||
|
Q send(m, b, n, 0) == n) {
|
||||||
|
W 0 < (n = recv(m, b, Z, 0)))
|
||||||
|
fwrite(b, 1, n, f);
|
||||||
|
}
|
||||||
|
close(m);
|
||||||
|
rewind(f);
|
||||||
|
X("*\r\n\r\n");
|
||||||
|
e:
|
||||||
|
r = 3;
|
||||||
|
*b = ' ';
|
||||||
|
W r < *w && (x = fgetc(f)) != EOF) {
|
||||||
|
Q x == '<') {
|
||||||
|
void **p = Y;
|
||||||
|
W *p) {
|
||||||
|
Q X(*p)) {
|
||||||
|
Q p[1])
|
||||||
|
(* (void (*)(c ))
|
||||||
|
p[1])(*p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Q x == '&') {
|
||||||
|
G "%9[^;];", T);
|
||||||
|
x = e(T);
|
||||||
|
}
|
||||||
|
P(isspace(x) ? ' ' : x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n? ");
|
||||||
|
fflush(stdout);
|
||||||
|
fgets(T, Z, stdin);
|
||||||
|
Q *T == '\n')
|
||||||
|
goto e;
|
||||||
|
t = l[strtol(T, 0, 0)];
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
k 0;
|
||||||
|
}
|
||||||
+4
-1
@@ -6,6 +6,9 @@
|
|||||||
#define Q if(
|
#define Q if(
|
||||||
#define Z 512
|
#define Z 512
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -147,7 +150,7 @@ main(I V, c *v)
|
|||||||
struct sockaddr_in A;
|
struct sockaddr_in A;
|
||||||
L = 0;
|
L = 0;
|
||||||
B = 1;
|
B = 1;
|
||||||
Q (!sscanf(t, "http://%255[^/]%n", h, &n)&&!sscanf(t,"https://%255[^/]%n",h, &n) && !*h)) {
|
Q !sscanf(t, "http://%255[^/]%n", h, &n) && !*h) {
|
||||||
Q !(f = fopen(t, "rb")))
|
Q !(f = fopen(t, "rb")))
|
||||||
k 1;
|
k 1;
|
||||||
goto e;
|
goto e;
|
||||||
|
|||||||
@@ -0,0 +1,224 @@
|
|||||||
|
#define I int
|
||||||
|
#define c char *
|
||||||
|
#define G fscanf(f,
|
||||||
|
#define W while(
|
||||||
|
#define k return
|
||||||
|
#define Q if(
|
||||||
|
#define Z 512
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
FILE *f;
|
||||||
|
short w[4] = { 24, 80 };
|
||||||
|
I L, B, r, H;
|
||||||
|
c l[Z], b[Z], s[Z], S[Z][10], T[Z], h[Z];
|
||||||
|
I
|
||||||
|
e(c s)
|
||||||
|
{
|
||||||
|
I n = 0;
|
||||||
|
Q *s == '#')
|
||||||
|
k (I) strtol(s+1, 0, 0);
|
||||||
|
W n < Z) {
|
||||||
|
Q *S[n] && !strcmp(s, S[n]+1))
|
||||||
|
k *S[n];
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
k '?';
|
||||||
|
}
|
||||||
|
void
|
||||||
|
P(I x)
|
||||||
|
{
|
||||||
|
Q x == '\n' || w[1] - 3 < B) {
|
||||||
|
b[B] = 0;
|
||||||
|
b[B+1] = 0;
|
||||||
|
B = printf("%s", b);
|
||||||
|
B = snprintf(
|
||||||
|
b, Z,
|
||||||
|
"\n %s",
|
||||||
|
b + B + 1
|
||||||
|
);
|
||||||
|
r++;
|
||||||
|
}
|
||||||
|
Q b[B-1] != ' ' || !isspace(x)) {
|
||||||
|
b[B++] = isspace(x) ? ' ' : x;
|
||||||
|
Q w[1] - 3 < B)
|
||||||
|
*strrchr(b, ' ') = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void
|
||||||
|
p(c t, ...)
|
||||||
|
{
|
||||||
|
va_list x;
|
||||||
|
va_start(x, t);
|
||||||
|
vsnprintf(s, Z, t, x);
|
||||||
|
t = s;
|
||||||
|
W *t)
|
||||||
|
P(*t++);
|
||||||
|
va_end(x);
|
||||||
|
}
|
||||||
|
I
|
||||||
|
X(c s)
|
||||||
|
{
|
||||||
|
I x;
|
||||||
|
c t = s;
|
||||||
|
long m = ftell(f);
|
||||||
|
W *t && (x = fgetc(f)) != EOF) {
|
||||||
|
Q *t == '*')
|
||||||
|
s = t++;
|
||||||
|
Q tolower(x) != *t) {
|
||||||
|
Q *s != '*')
|
||||||
|
break;
|
||||||
|
t = s;
|
||||||
|
}
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
Q *t)
|
||||||
|
fseek(f, m, SEEK_SET);
|
||||||
|
k !*t;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
d(c s)
|
||||||
|
{
|
||||||
|
Q 4 < B)
|
||||||
|
P('\n');
|
||||||
|
P('\n');
|
||||||
|
Q *s == 'h')
|
||||||
|
B = 1;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
a(c s)
|
||||||
|
{
|
||||||
|
*T = 0;
|
||||||
|
G
|
||||||
|
ungetc(fgetc(f), f) == '"'
|
||||||
|
? "\"%511[^\"]"
|
||||||
|
: "'%511[^']",
|
||||||
|
T
|
||||||
|
);
|
||||||
|
Q *s == 'a' || *s == 'f' || s[1] == 'f') {
|
||||||
|
free(l[++L]);
|
||||||
|
l[L] = strdup(T);
|
||||||
|
p(" [%d] ", L);
|
||||||
|
}
|
||||||
|
Q *s != 'a')
|
||||||
|
p("%s%s\n", T, *s == 'b' || s[1] == 'h' ? "" : "\n");
|
||||||
|
X("*>");
|
||||||
|
}
|
||||||
|
void *Y[] = {
|
||||||
|
"!--*-->" , 0 ,
|
||||||
|
"a *href=" , a ,
|
||||||
|
"ifr*src=" , a ,
|
||||||
|
"fra*src=" , a ,
|
||||||
|
"img*src=" , a ,
|
||||||
|
"p*>" , d ,
|
||||||
|
"bl*>" , d ,
|
||||||
|
"br" , a ,
|
||||||
|
"hr" , a ,
|
||||||
|
"h*>" , d ,
|
||||||
|
"/h" , a ,
|
||||||
|
"/tr" , a ,
|
||||||
|
"/dt" , a ,
|
||||||
|
"/dd" , a ,
|
||||||
|
"li*>" , d ,
|
||||||
|
"*>" , 0 ,
|
||||||
|
0 , 0
|
||||||
|
};
|
||||||
|
I
|
||||||
|
main(I V, c *v)
|
||||||
|
{
|
||||||
|
I x, n = 0;
|
||||||
|
c t = v[1];
|
||||||
|
ioctl(0, TIOCGWINSZ, w);
|
||||||
|
f = fopen("entities.txt", "r");
|
||||||
|
Q f) {
|
||||||
|
W G "%s %d", S[n]+1, &x) == 2)
|
||||||
|
*S[n++] = x;
|
||||||
|
fclose(f);
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
|
W t) {
|
||||||
|
I m = 0;
|
||||||
|
struct hostent *y;
|
||||||
|
struct sockaddr_in A;
|
||||||
|
L = 0;
|
||||||
|
B = 1;
|
||||||
|
Q !sscanf(t, "http://%255[^/]%n", h, &n) && !*h) {
|
||||||
|
Q !(f = fopen(t, "rb")))
|
||||||
|
k 1;
|
||||||
|
goto e;
|
||||||
|
}
|
||||||
|
Q 0 < sscanf(h, "%*[^:]%n:%d", &x, &H))
|
||||||
|
h[x] = 0;
|
||||||
|
else
|
||||||
|
H = 80;
|
||||||
|
y = gethostbyname(h);
|
||||||
|
Q !y)
|
||||||
|
k 1;
|
||||||
|
memcpy(&A.sin_addr.s_addr, y->h_addr, y->h_length);
|
||||||
|
A.sin_port = htons( (short) H);
|
||||||
|
A.sin_family = y->h_addrtype;
|
||||||
|
f = tmpfile();
|
||||||
|
Q !f)
|
||||||
|
k 1;
|
||||||
|
W
|
||||||
|
connect(
|
||||||
|
m = socket(
|
||||||
|
A.sin_family, SOCK_STREAM, 0
|
||||||
|
), (void *) &A, sizeof A
|
||||||
|
)
|
||||||
|
|| errno == EINTR
|
||||||
|
)
|
||||||
|
;
|
||||||
|
n = snprintf(
|
||||||
|
b, Z,
|
||||||
|
"GET %s%s HTTP/1.0\r\nHost: %s:%d\r\n\r\n",
|
||||||
|
t[n] == '/' ? "" : "/", t+n, h, H
|
||||||
|
);
|
||||||
|
Q send(m, b, n, 0) == n) {
|
||||||
|
W 0 < (n = recv(m, b, Z, 0)))
|
||||||
|
fwrite(b, 1, n, f);
|
||||||
|
}
|
||||||
|
close(m);
|
||||||
|
rewind(f);
|
||||||
|
X("*\r\n\r\n");
|
||||||
|
e:
|
||||||
|
r = 3;
|
||||||
|
*b = ' ';
|
||||||
|
W r < *w && (x = fgetc(f)) != EOF) {
|
||||||
|
Q x == '<') {
|
||||||
|
void **p = Y;
|
||||||
|
W *p) {
|
||||||
|
Q X(*p)) {
|
||||||
|
Q p[1])
|
||||||
|
(* (void (*)(c ))
|
||||||
|
p[1])(*p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Q x == '&') {
|
||||||
|
G "%9[^;];", T);
|
||||||
|
x = e(T);
|
||||||
|
}
|
||||||
|
P(isspace(x) ? ' ' : x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n? ");
|
||||||
|
fflush(stdout);
|
||||||
|
fgets(T, Z, stdin);
|
||||||
|
Q *T == '\n')
|
||||||
|
goto e;
|
||||||
|
t = l[strtol(T, 0, 0)];
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
k 0;
|
||||||
|
}
|
||||||
@@ -1751,12 +1751,12 @@ does not exist.
|
|||||||
## STATUS: INABIAF - please **DO NOT** fix
|
## STATUS: INABIAF - please **DO NOT** fix
|
||||||
|
|
||||||
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) notes that, though
|
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) notes that, though
|
||||||
probably obvious, this entry will not work with https. He changed the code to
|
probably obvious, this entry will not work with https. He added an alt version
|
||||||
scan for https too (it exited before) in case someone comes up with a clever
|
that scans for https in case someone wants to set up a pipeline or other
|
||||||
command line to make it work but the problem is a secure connection has to first
|
workaround (perhaps with stunnel) but the problem otherwise is a secure
|
||||||
be set up in order to give http commands. This is not a bug but it's worth
|
connection has to first be set up in order to give http commands. This is not a
|
||||||
pointing out as it won't work on as many websites as it used to including the
|
bug but it's worth pointing out as it won't work on as many websites as it used
|
||||||
[IOCCC website](https://www.ioccc.org) itself.
|
to including the [IOCCC website](https://www.ioccc.org) itself.
|
||||||
|
|
||||||
|
|
||||||
# 2006
|
# 2006
|
||||||
|
|||||||
Reference in new issue
Block a user