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

📄 uucpd.c

📁 早期freebsd实现
💻 C
字号:
/* * Copyright (c) 1985, 1993 *	The Regents of the University of California.  All rights reserved. * * This code is derived from software contributed to Berkeley by * Rick Adams. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char copyright[] ="@(#) Copyright (c) 1985, 1993\n\	The Regents of the University of California.  All rights reserved.\n";#endif /* not lint */#ifndef lintstatic char sccsid[] = "@(#)uucpd.c	8.1 (Berkeley) 6/4/93";#endif /* not lint *//* * 4.2BSD TCP/IP server for uucico * uucico's TCP channel causes this server to be run at the remote end. */#include <sys/types.h>#include <sys/wait.h>#include <sys/ioctl.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <signal.h>#include <fcntl.h>#include <time.h>#include <pwd.h>#include <unistd.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "pathnames.h"struct	sockaddr_in hisctladdr;int hisaddrlen = sizeof hisctladdr;struct	sockaddr_in myctladdr;int mypid;char Username[64];char *nenv[] = {	Username,	NULL,};extern char **environ;main(argc, argv)int argc;char **argv;{#ifndef BSDINETD	register int s, tcp_socket;	struct servent *sp;#endif !BSDINETD	extern int errno;	int dologout();	environ = nenv;#ifdef BSDINETD	close(1); close(2);	dup(0); dup(0);	hisaddrlen = sizeof (hisctladdr);	if (getpeername(0, &hisctladdr, &hisaddrlen) < 0) {		fprintf(stderr, "%s: ", argv[0]);		perror("getpeername");		_exit(1);	}	if (fork() == 0)		doit(&hisctladdr);	dologout();	exit(1);#else !BSDINETD	sp = getservbyname("uucp", "tcp");	if (sp == NULL){		perror("uucpd: getservbyname");		exit(1);	}	if (fork())		exit(0);	if ((s=open(_PATH_TTY, 2)) >= 0){		ioctl(s, TIOCNOTTY, (char *)0);		close(s);	}	bzero((char *)&myctladdr, sizeof (myctladdr));	myctladdr.sin_family = AF_INET;	myctladdr.sin_port = sp->s_port;#ifdef BSD4_2	tcp_socket = socket(AF_INET, SOCK_STREAM, 0);	if (tcp_socket < 0) {		perror("uucpd: socket");		exit(1);	}	if (bind(tcp_socket, (char *)&myctladdr, sizeof (myctladdr)) < 0) {		perror("uucpd: bind");		exit(1);	}	listen(tcp_socket, 3);	/* at most 3 simultaneuos uucp connections */	signal(SIGCHLD, dologout);	for(;;) {		s = accept(tcp_socket, &hisctladdr, &hisaddrlen);		if (s < 0){			if (errno == EINTR) 				continue;			perror("uucpd: accept");			exit(1);		}		if (fork() == 0) {			close(0); close(1); close(2);			dup(s); dup(s); dup(s);			close(tcp_socket); close(s);			doit(&hisctladdr);			exit(1);		}		close(s);	}#endif BSD4_2#endif	!BSDINETD}doit(sinp)struct sockaddr_in *sinp;{	char user[64], passwd[64];	char *xpasswd, *crypt();	struct passwd *pw, *getpwnam();	alarm(60);	printf("login: "); fflush(stdout);	if (readline(user, sizeof user) < 0) {		fprintf(stderr, "user read\n");		return;	}	/* truncate username to 8 characters */	user[8] = '\0';	pw = getpwnam(user);	if (pw == NULL) {		fprintf(stderr, "user unknown\n");		return;	}	if (strcmp(pw->pw_shell, _PATH_UUCICO)) {		fprintf(stderr, "Login incorrect.");		return;	}	if (pw->pw_passwd && *pw->pw_passwd != '\0') {		printf("Password: "); fflush(stdout);		if (readline(passwd, sizeof passwd) < 0) {			fprintf(stderr, "passwd read\n");			return;		}		xpasswd = crypt(passwd, pw->pw_passwd);		if (strcmp(xpasswd, pw->pw_passwd)) {			fprintf(stderr, "Login incorrect.");			return;		}	}	alarm(0);	sprintf(Username, "USER=%s", user);	dologin(pw, sinp);	setgid(pw->pw_gid);#ifdef BSD4_2	initgroups(pw->pw_name, pw->pw_gid);#endif BSD4_2	chdir(pw->pw_dir);	setuid(pw->pw_uid);#ifdef BSD4_2	execl(UUCICO, "uucico", (char *)0);#endif BSD4_2	perror("uucico server: execl");}readline(p, n)register char *p;register int n;{	char c;	while (n-- > 0) {		if (read(0, &c, 1) <= 0)			return(-1);		c &= 0177;		if (c == '\n' || c == '\r') {			*p = '\0';			return(0);		}		*p++ = c;	}	return(-1);}#include <utmp.h>#ifdef BSD4_2#include <fcntl.h>#endif BSD4_2#define	SCPYN(a, b)	strncpy(a, b, sizeof (a))struct	utmp utmp;dologout(){	union wait status;	int pid, wtmp;#ifdef BSDINETD	while ((pid=wait((int *)&status)) > 0) {#else  !BSDINETD	while ((pid=wait3((int *)&status,WNOHANG,0)) > 0) {#endif !BSDINETD		wtmp = open(_PATH_WTMP, O_WRONLY|O_APPEND);		if (wtmp >= 0) {			sprintf(utmp.ut_line, "uucp%.4d", pid);			SCPYN(utmp.ut_name, "");			SCPYN(utmp.ut_host, "");			(void) time(&utmp.ut_time);			(void) write(wtmp, (char *)&utmp, sizeof (utmp));			(void) close(wtmp);		}	}}/* * Record login in wtmp file. */dologin(pw, sin)struct passwd *pw;struct sockaddr_in *sin;{	char line[32];	char remotehost[32];	int wtmp, f;	struct hostent *hp = gethostbyaddr((char *)&sin->sin_addr,		sizeof (struct in_addr), AF_INET);	if (hp) {		strncpy(remotehost, hp->h_name, sizeof (remotehost));		endhostent();	} else		strncpy(remotehost, inet_ntoa(sin->sin_addr),		    sizeof (remotehost));	wtmp = open(_PATH_WTMP, O_WRONLY|O_APPEND);	if (wtmp >= 0) {		/* hack, but must be unique and no tty line */		sprintf(line, "uucp%.4d", getpid());		SCPYN(utmp.ut_line, line);		SCPYN(utmp.ut_name, pw->pw_name);		SCPYN(utmp.ut_host, remotehost);		time(&utmp.ut_time);		(void) write(wtmp, (char *)&utmp, sizeof (utmp));		(void) close(wtmp);	}	if ((f = open(_PATH_LASTLOG, O_RDWR)) >= 0) {		struct lastlog ll;		time(&ll.ll_time);		lseek(f, (long)pw->pw_uid * sizeof(struct lastlog), 0);		strcpy(line, remotehost);		SCPYN(ll.ll_line, line);		SCPYN(ll.ll_host, remotehost);		(void) write(f, (char *) &ll, sizeof ll);		(void) close(f);	}}

⌨️ 快捷键说明

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