⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 beos.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
字号:
/* beos.c * (c) 2002 Mikulas Patocka * This file is a part of the Links program, released under GPL */#ifdef __BEOS__#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <be/kernel/OS.h>#define SHS	128#ifndef MAXINT#define MAXINT 0x7fffffff#endifint be_read(int s, void *ptr, int len){	if (s >= SHS) return recv(s - SHS, ptr, len, 0);	return read(s, ptr, len);}int be_write(int s, void *ptr, int len){	if (s >= SHS) return send(s - SHS, ptr, len, 0);	return write(s, ptr, len);}int be_close(int s){	if (s >= SHS) return closesocket(s - SHS);	return close(s);}int be_socket(int af, int sock, int prot){	int h = socket(af, sock, prot);	if (h < 0) return h;	return h + SHS;}int be_connect(int s, struct sockaddr *sa, int sal){	return connect(s - SHS, sa, sal);}int be_getpeername(int s, struct sockaddr *sa, int *sal){	return getpeername(s - SHS, sa, sal);}int be_getsockname(int s, struct sockaddr *sa, int *sal){	return getsockname(s - SHS, sa, sal);}int be_listen(int s, int c){	return listen(s - SHS, c);}int be_accept(int s, struct sockaddr *sa, int *sal){	int a = accept(s - SHS, sa, sal);	if (a < 0) return -1;	return a + SHS;}int be_bind(int s, struct sockaddr *sa, int sal){	/*struct sockaddr_in *sin = (struct sockaddr_in *)sa;	if (!sin->sin_port) {		int i;		for (i = 16384; i < 49152; i++) {			sin->sin_port = i;			if (!be_bind(s, sa, sal)) return 0;		}		return -1;	}*/	if (bind(s - SHS, sa, sal)) return -1;	getsockname(s - SHS, sa, &sal);	return 0;}#define PIPE_RETRIES	10int be_pipe(int *fd){	int s1, s2, s3, l;	struct sockaddr_in sa1, sa2;	int retry_count = 0;	again:	if ((s1 = be_socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {		/*perror("socket1");*/		goto fatal_retry;	}	if ((s2 = be_socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {		/*perror("socket2");*/		be_close(s1);		goto fatal_retry;	}	memset(&sa1, 0, sizeof(sa1));	sa1.sin_family = AF_INET;	sa1.sin_port = 0;	sa1.sin_addr.s_addr = INADDR_ANY;	if (be_bind(s1, (struct sockaddr *)&sa1, sizeof(sa1))) {		/*perror("bind");*/		clo:		be_close(s1);		be_close(s2);		goto fatal_retry;	}	if (be_listen(s1, 1)) {		/*perror("listen");*/		goto clo;	}	if (be_connect(s2, (struct sockaddr *)&sa1, sizeof(sa1))) {		/*perror("connect");*/		goto clo;	}	l = sizeof(sa2);	if ((s3 = be_accept(s1, (struct sockaddr *)&sa2, &l)) < 0) {		/*perror("accept");*/		goto clo;	}	be_getsockname(s3, (struct sockaddr *)&sa1, &l);	if (sa1.sin_addr.s_addr != sa2.sin_addr.s_addr) {		be_close(s3);		goto clo;	}	be_close(s1);	fd[0] = s2;	fd[1] = s3;	return 0;	fatal_retry:	if (++retry_count > PIPE_RETRIES) return -1;	sleep(1);	goto again;}int be_select(int n, struct fd_set *rd, struct fd_set *wr, struct fd_set *exc, struct timeval *tm){	int i, s;	struct fd_set d, rrd;	FD_ZERO(&d);	if (!rd) rd = &d;	if (!wr) wr = &d;	if (!exc) exc = &d;	if (n >= FDSETSIZE) n = FDSETSIZE;	FD_ZERO(exc);	for (i = 0; i < n; i++) if ((i < SHS && FD_ISSET(i, rd)) || FD_ISSET(i, wr)) {		for (i = SHS; i < n; i++) FD_CLR(i, rd);		return MAXINT;	}	FD_ZERO(&rrd);	for (i = SHS; i < n; i++) if (FD_ISSET(i, rd)) FD_SET(i - SHS, &rrd);	if ((s = select(FD_SETSIZE, &rrd, &d, &d, tm)) < 0) {		FD_ZERO(rd);		return 0;	}	FD_ZERO(rd);	for (i = SHS; i < n; i++) if (FD_ISSET(i - SHS, &rrd)) FD_SET(i, rd);	return s;}#ifndef SO_ERROR#define SO_ERROR	10001#endifint be_getsockopt(int s, int level, int optname, void *optval, int *optlen){	if (optname == SO_ERROR && *optlen >= sizeof(int)) {		*(int *)optval = 0;		*optlen = sizeof(int);		return 0;	}	return -1;}int start_thr(void (*)(void *), void *, unsigned char *);int ihpipe[2];int inth;#include <errno.h>void input_handle_th(void *p){	char c;	int b = 0;	setsockopt(ihpipe[1], SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));	while (1) if (read(0, &c, 1) == 1) be_write(ihpipe[1], &c, 1);}int get_input_handle(){	static int h = -1;	if (h >= 0) return h;	if (be_pipe(ihpipe) < 0) return -1;	if ((inth = start_thr(input_handle_th, NULL, "input_thread")) < 0) {		closesocket(ihpipe[0]);		closesocket(ihpipe[1]);		return -1;	}	return h = ihpipe[0];}void block_stdin(){	suspend_thread(inth);}void unblock_stdin(){	resume_thread(inth);}/*int ohpipe[2];#define O_BUF	16384void output_handle_th(void *p){	char *c = malloc(O_BUF);	int r, b = 0;	if (!c) return;	setsockopt(ohpipe[1], SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));	while ((r = be_read(ohpipe[0], c, O_BUF)) > 0) write(1, c, r);	free(c);}int get_output_handle(){	static int h = -1;	if (h >= 0) return h;	if (be_pipe(ohpipe) < 0) return -1;	if (start_thr(output_handle_th, NULL, "output_thread") < 0) {		closesocket(ohpipe[0]);		closesocket(ohpipe[1]);		return -1;	}	return h = ohpipe[1];}*/#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -