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

📄 builtins.c

📁 netkit-base-0.17.tar.gz linux嵌入式开发使用!
💻 C
字号:
/* * Internet services provided internally by inetd: */#include <sys/types.h>#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/un.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include "servtab.h"#include "builtins.h"#include "setproctitle.h"#define MINUDPSRCPORT	1024	/* ignore inbound udp on low-number ports */#define	BUFSIZE	4096char builtins_rcsid[] =   "$Id: builtins.c,v 1.5 2000/07/22 20:13:07 dholland Exp $";static voiddo_setproctitle(char *a, int s){	struct sockaddr_in sn;	socklen_t size = sizeof(sn);	if (getpeername(s, (struct sockaddr *)&sn, &size) == 0) {		setproctitle("-%s [%s]", a, inet_ntoa(sn.sin_addr));	}	else {		setproctitle("-%s", a); 	}}/* Echo service -- echo data back *//* ARGSUSED */voidecho_stream(int s, struct servtab *sep){	char buffer[BUFSIZE];	int i;	do_setproctitle(sep->se_service, s);	while ((i = read(s, buffer, sizeof(buffer))) > 0 &&	    write(s, buffer, i) > 0)		;	exit(0);}/* ARGSUSED *//* Echo service -- echo data back */voidecho_dg(int s, struct servtab *sep){	char buffer[BUFSIZE];	int i, port;/* 	size_t size; */	socklen_t size;/*	struct sockaddr sa; */	struct sockaddr_in sa;	(void)sep;	size = sizeof(sa);	i = recvfrom(s, buffer, sizeof(buffer), 0, 		     (struct sockaddr *)&sa, &size);	if (i < 0)		return;	port = sa.sin_port;	if (ntohs(port) < MINUDPSRCPORT) 		return;	(void) sendto(s, buffer, i, 0, (struct sockaddr *)&sa, sizeof(sa));}/* Discard service -- ignore data *//* ARGSUSED */voiddiscard_stream(int s, struct servtab *sep){	char buffer[BUFSIZE];	do_setproctitle(sep->se_service, s);	while ((errno = 0, read(s, buffer, sizeof(buffer)) > 0) ||			errno == EINTR)		;	exit(0);}/* ARGSUSED *//* Discard service -- ignore data */voiddiscard_dg(int s, struct servtab *sep){	char buffer[BUFSIZE];	(void)sep;	read(s, buffer, sizeof(buffer));}#include <ctype.h>#define LINESIZ 72char ring[128];char *endring;static voidinitring(void){	register int i;	endring = ring;	for (i = 0; i <= 128; ++i)		if (isprint(i))			*endring++ = i;}/* Character generator *//* ARGSUSED */voidchargen_stream(int s, struct servtab *sep){	register char *rs;	int len;	char text[LINESIZ+2];	do_setproctitle(sep->se_service, s);	if (!endring) {		initring();		rs = ring;	}	text[LINESIZ] = '\r';	text[LINESIZ + 1] = '\n';	for (rs = ring;;) {		if ((len = endring - rs) >= LINESIZ)			bcopy(rs, text, LINESIZ);		else {			bcopy(rs, text, len);			bcopy(ring, text + len, LINESIZ - len);		}		if (++rs == endring)			rs = ring;		if (write(s, text, sizeof(text)) != sizeof(text))			break;	}	exit(0);}/* ARGSUSED *//* Character generator */voidchargen_dg(int s, struct servtab *sep){/*	struct sockaddr sa; */	struct sockaddr_in sa;	static char *rs;	size_t len;	socklen_t size;	char text[LINESIZ+2];	int port;	(void)sep;	if (endring == 0) {		initring();		rs = ring;	}	size = sizeof(sa);	if (recvfrom(s, text, sizeof(text), 0, 		     (struct sockaddr *)&sa, &size) < 0)		return;	port = sa.sin_port;	if (ntohs(port)<MINUDPSRCPORT)		return;	if ((len = endring - rs) >= LINESIZ)		bcopy(rs, text, LINESIZ);	else {		bcopy(rs, text, len);		bcopy(ring, text + len, LINESIZ - len);	}	if (++rs == endring)		rs = ring;	text[LINESIZ] = '\r';	text[LINESIZ + 1] = '\n';	(void) sendto(s, text, sizeof(text), 0, 		      (struct sockaddr *)&sa, sizeof(sa));}/* * Return a machine readable date and time, in the form of the * number of seconds since midnight, Jan 1, 1900.  Since gettimeofday * returns the number of seconds since midnight, Jan 1, 1970, * we must add 2208988800 seconds to this figure to make up for * some seventy years Bell Labs was asleep. * * This is already overflowing signed 32-bit long - it will overflow 32-bit  * unsigned long in 2036. No clue what to do then; probably nothing, since * nobody uses this service. */static unsigned longmachtime(void){	struct timeval tv;	if (gettimeofday(&tv, (struct timezone *)0) < 0) {		fprintf(stderr, "Unable to get time of day\n");		return (0L);	}	return (htonl((unsigned long)tv.tv_sec + 2208988800UL));}voidmachtime_stream(int s, struct servtab *sep){	unsigned long result;	(void)sep;	result = machtime();	write(s, (char *) &result, sizeof(result));}voidmachtime_dg(int s, struct servtab *sep){	unsigned long result;/*	struct sockaddr sa; */	struct sockaddr_in sa;/*	size_t size; */	socklen_t size;	int port;	(void)sep;	size = sizeof(sa);	if (recvfrom(s, (char *)&result, sizeof(result), 0, 		     (struct sockaddr *)&sa, &size) < 0)		return;	port = sa.sin_port;	if (ntohs(port) < MINUDPSRCPORT)		return;	result = machtime();	(void) sendto(s, (char *) &result, sizeof(result), 0, 		      (struct sockaddr *)&sa, sizeof(sa));}/* Return human-readable time of day */voiddaytime_stream(int s, struct servtab *sep){	char buffer[256];	time_t clocc;	(void)sep;	clocc = time(NULL);	snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(&clocc));	write(s, buffer, strlen(buffer));}/* Return human-readable time of day */voiddaytime_dg(int s, struct servtab *sep){	char buffer[256];	time_t clocc;	struct sockaddr_in sa;/*	size_t size; */	socklen_t size;	int port;	(void)sep;	clocc = time(NULL);	size = sizeof(sa);	if (recvfrom(s, buffer, sizeof(buffer), 0, 		     (struct sockaddr *)&sa, &size) < 0)		return;	port = sa.sin_port;	if (ntohs(port) < MINUDPSRCPORT)		return;	snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(&clocc));	sendto(s, buffer, strlen(buffer), 0, 	       (struct sockaddr *)&sa, sizeof(sa));}

⌨️ 快捷键说明

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