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

📄 af_unix.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
字号:
/* af_unix.c * (c) 2002 Mikulas Patocka * This file is a part of the Links program, released under GPL */#include "links.h"#ifdef DONT_USE_AF_UNIXint bind_to_af_unix(void){	return -1;}void af_unix_close(void){}#else#ifdef USE_AF_UNIX#include <sys/un.h>#endifvoid af_unix_connection(void *);struct sockaddr *s_unix_acc = NULL;struct sockaddr *s_unix = NULL;socklen_t s_unix_l;int s_unix_fd = -1;/* prototypes */int get_address(void);void unlink_unix(void);#ifdef USE_AF_UNIXint get_address(void){	struct sockaddr_un *su;	unsigned char *path;	if (!links_home) return -1;	path = stracpy(links_home);	su = mem_alloc(sizeof(struct sockaddr_un) + strlen(path) + 1);	s_unix_acc = mem_alloc(sizeof(struct sockaddr_un) + strlen(path) + 1);	memset(su, 0, sizeof(struct sockaddr_un) + strlen(path) + 1);	su->sun_family = AF_UNIX;	add_to_strn(&path, LINKS_SOCK_NAME);	strcpy(su->sun_path, path);	mem_free(path);	s_unix = (struct sockaddr *)su;	s_unix_l = (char *)&su->sun_path - (char *)su + strlen(su->sun_path) + 1;	return PF_UNIX;}void unlink_unix(void){	if (unlink(((struct sockaddr_un *)s_unix)->sun_path)) {		/*perror("unlink");		debug("unlink: %s", ((struct sockaddr_un *)s_unix)->sun_path);*/	}}#elseint get_address(void){	struct sockaddr_in *sin;	sin = mem_alloc(sizeof(struct sockaddr_in));	s_unix_acc = mem_alloc(sizeof(struct sockaddr_in));	memset(sin, 0, sizeof(struct sockaddr_in));	sin->sin_family = AF_INET;	sin->sin_port = htons(LINKS_PORT);	sin->sin_addr.s_addr = htonl(0x7f000001);	s_unix = (struct sockaddr *)sin;	s_unix_l = sizeof(struct sockaddr_in);	return PF_INET;}void unlink_unix(void){}#endifint bind_to_af_unix(void){	int u = 0;	int a1 = 1;	int cnt = 0;	int af;	if ((af = get_address()) == -1) return -1;	again:	if ((s_unix_fd = socket(af, SOCK_STREAM, 0)) == -1) return -1;#if defined(SOL_SOCKET) && defined(SO_REUSEADDR)	setsockopt(s_unix_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&a1, sizeof a1);#endif	if (bind(s_unix_fd, s_unix, s_unix_l)) {		/*perror("");		debug("bind: %d", errno);*/		close(s_unix_fd);		if ((s_unix_fd = socket(af, SOCK_STREAM, 0)) == -1) return -1;#if defined(SOL_SOCKET) && defined(SO_REUSEADDR)		setsockopt(s_unix_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&a1, sizeof a1);#endif		if (connect(s_unix_fd, s_unix, s_unix_l)) {			/*perror("");			debug("connect: %d", errno);*/			if (++cnt < MAX_BIND_TRIES) {				struct timeval tv = { 0, 100000 };				fd_set dummy;				FD_ZERO(&dummy);				select(0, &dummy, &dummy, &dummy, &tv);				close(s_unix_fd);				goto again;			}			close(s_unix_fd), s_unix_fd = -1;			if (!u) {				unlink_unix();				u = 1;				goto again;			}			mem_free(s_unix), s_unix = NULL;			return -1;		}		mem_free(s_unix), s_unix = NULL;		return s_unix_fd;	}	if (listen(s_unix_fd, 100)) {		error("ERROR: listen failed: %d", errno);		mem_free(s_unix), s_unix = NULL;		close(s_unix_fd), s_unix_fd = -1;		return -1;	}	set_handlers(s_unix_fd, af_unix_connection, NULL, NULL, NULL);	return -1;}void af_unix_connection(void *xxx){	socklen_t l = s_unix_l;	int ns;	memset(s_unix_acc, 0, l);	ns = accept(s_unix_fd, (struct sockaddr *)s_unix_acc, &l);	if (ns == -1) return;	init_term(ns, ns, win_func);	set_highpri();}void af_unix_close(void){	if (s_unix_fd != -1) close(s_unix_fd);	if (s_unix) unlink_unix(), mem_free(s_unix), s_unix = NULL;	if (s_unix_acc) mem_free(s_unix_acc), s_unix_acc = NULL;}#endif

⌨️ 快捷键说明

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