idistd.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 679 行 · 第 1/2 页

C
679
字号
/* idistd.c - remote distribution -- responder */#ifndef	lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/idist/RCS/idistd.c,v 9.0 1992/06/16 14:38:53 isode Rel $";#endif/*  * $Header: /xtel/isode/isode/others/idist/RCS/idistd.c,v 9.0 1992/06/16 14:38:53 isode Rel $ * * Idist daemon - this module handles the remote operations as they * are received. It runs as a state machine for file transfer * expecting the sequence transfer, data..., terminate for each file * transfered. This module has only slight correlation with the * original UCB version. It is entirely client driven. This server is * not designed to run other than under tsapd. Two reasons for this :- * 1) There is a lot of state info kept around in global variables * (this is fixable if required) * 2) Its first operation is to setuid to the authenticated user. This * is a one way operation - thus 1) is not really worth fixing (IMHO). * * Julian Onions <jpo@cs.nott.ac.uk> * Nottingham University Computer Science. *  * * $Log: idistd.c,v $ * Revision 9.0  1992/06/16  14:38:53  isode * Release 8.0 * * */#include <stdio.h>#include <varargs.h>#include "Idist-types.h"      /* type definitions */#include "Idist-ops.h"                /* operation definitions */#include "ryresponder.h"      /* for generic idempotent responders */#include "defs.h"/*    DATA */static char *myservice = "isode idist";static char *mycontext = "isode idist";extern	struct type_Idist_QueryResult *query ();extern	struct type_Idist_FileList *do_listcdir ();static int error (), i_strerror (), syserror (), ureject ();					/* OPERATIONS */int	op_init (), op_transfer (), op_terminate (), op_listcdir (),	op_query (), op_special (), op_data (), op_deletefile ();static struct dispatch dispatches[] = {    "init", operation_Idist_init, op_init,    "transfer", operation_Idist_transfer, op_transfer,    "terminate", operation_Idist_terminate, op_terminate,    "listcdir",	operation_Idist_listcdir, op_listcdir,    "deletefile", operation_Idist_deletefile, op_deletefile,    "query", operation_Idist_query, op_query,    "special", operation_Idist_special, op_special,    "data", operation_Idist_data, op_data,        NULL};int catname = 0;char target[BUFSIZ];extern	char	*tp;extern	char	*stp[];FILE	*cfile;		/* the currently open file */static struct type_Idist_FileSpec *cpy_fs();struct type_Idist_FileSpec *cfiletype;int oumask;char    utmpfile[] = "/tmp/idistXXXXXX";char    *tmpname = &utmpfile[5];struct type_Idist_IA5List *ia5list;char	*host;int groupid, userid;char homedir[BUFSIZ];char user[100];struct passwd *pw;struct group *gr;/*    MAIN *//* ARGSUSED */main (argc, argv, envp)int	argc;char  **argv,      **envp;{	int initiate ();	oumask = umask (0);	host = getlocalhost ();			(void) ryresponder (argc, argv, PLocalHostName (), myservice, mycontext,			    dispatches, table_Idist_Operations, initiate,			    NULLIFP);	exit (0);		/* NOTREACHED */}/*    OPERATIONS */static int  op_init (sd, ryo, rox, in, roi)int	sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t	in;struct RoSAPindication *roi;{	char	*str;	register struct type_Idist_InitDir *arg =		(struct type_Idist_InitDir *) in;	if (rox -> rox_nolinked == 0) {		advise (LLOG_NOTICE, NULLCP,			"RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",			sd, ryo -> ryo_name, rox -> rox_linkid);		return ureject (sd, ROS_IP_LINKED, rox, roi);	}	if (debug)		advise (LLOG_DEBUG, NULLCP, "RO-INVOKE.INDICATION/%d: %s",			sd, ryo -> ryo_name);	if (arg -> offset == type_Idist_InitDir_destdir) {		catname = 1;		str = qb2str (arg -> un.destdir);	}	else {		catname = 0;		str = qb2str (arg ->un.nodestdir);	}	if (exptilde (target, str) == NULL)		return error (sd, error_Idist_badfilename, (caddr_t)ia5list,			      rox, roi);	tp = target + strlen (target);	if (RyDsResult (sd, rox -> rox_id, (caddr_t) NULL, ROS_NOPRIO,			roi) == NOTOK)		ros_adios (&roi -> roi_preject, "RESULT");    	return OK;}op_transfer (sd, ryo, rox, in, roi)int	sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t	in;struct RoSAPindication *roi;{	register struct type_Idist_FileSpec *arg =		(struct type_Idist_FileSpec *) in;	if (rox -> rox_nolinked == 0) {		advise (LLOG_NOTICE, NULLCP,			"RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",			sd, ryo -> ryo_name, rox -> rox_linkid);		return ureject (sd, ROS_IP_LINKED, rox, roi);	}	if (debug)		advise (LLOG_DEBUG, NULLCP, "RO-INVOKE.INDICATION/%d: %s",			sd, ryo -> ryo_name);		switch (arg -> filetype -> parm) {	    case int_Idist_FileType_regular:		if (do_rfile (arg) == NOTOK)			return error (sd, error_Idist_badfilename,				      (caddr_t)ia5list, rox, roi);		break;	    case int_Idist_FileType_directory:		if (do_direct (arg) == NOTOK)			return error (sd, error_Idist_badfilename,				      (caddr_t)ia5list, rox, roi);		break;	    case int_Idist_FileType_symlink:		if (do_symlink (arg) == NOTOK)			return error (sd, error_Idist_badfilename,				      (caddr_t) ia5list, rox, roi);		break;	    case int_Idist_FileType_hardlink:		if ( do_hardlink (arg) == NOTOK)			return error (sd, error_Idist_badfilename,				      (caddr_t) ia5list, rox, roi);		break;	    default:		return error (sd, error_Idist_badfiletype, (caddr_t) NULL,			      rox, roi);	}	if (cfiletype != NULL)		free_Idist_FileSpec (cfiletype);	cfiletype = cpy_fs (arg);;	if (RyDsResult (sd, rox -> rox_id, (caddr_t) ia5list, ROS_NOPRIO, roi)	    == NOTOK)		ros_adios (&roi -> roi_preject, "RESULT");	free_Idist_IA5List (ia5list);	ia5list = NULL;	return OK;}op_data (sd, ryo, rox, in, roi)int	sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t	in;struct RoSAPindication *roi;{	register struct type_Idist_Data *arg =		(struct type_Idist_Data *) in;	register struct qbuf *qb;	if (rox -> rox_nolinked == 0) {		advise (LLOG_NOTICE, NULLCP,			"RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",			sd, ryo -> ryo_name, rox -> rox_linkid);		return ureject (sd, ROS_IP_LINKED, rox, roi);	}	if (debug)		advise (LLOG_DEBUG, NULLCP, "RO-INVOKE.INDICATION/%d: %s",			sd, ryo -> ryo_name);	for (qb = arg -> qb_forw; qb != arg; qb = qb -> qb_forw) {		if (fwrite (qb -> qb_data, sizeof (char),			    qb -> qb_len, cfile) != qb -> qb_len)			return syserror (sd, error_Idist_writeerror,					 rox, roi);	}	if (RyDsResult (sd, rox -> rox_id, (caddr_t) NULL, ROS_NOPRIO, roi)	    == NOTOK)		ros_adios (&roi -> roi_preject, "RESULT");	return OK;}op_query (sd, ryo, rox, in, roi)int	sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t	in;struct RoSAPindication *roi;{	register struct type_UNIV_IA5String *arg =		(struct type_UNIV_IA5String *) in;	struct type_Idist_QueryResult *qr;	char	*str;	if (rox -> rox_nolinked == 0) {		advise (LLOG_NOTICE, NULLCP,			"RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",			sd, ryo -> ryo_name, rox -> rox_linkid);		return ureject (sd, ROS_IP_LINKED, rox, roi);	}	if (debug)		advise (LLOG_DEBUG, NULLCP, "RO-INVOKE.INDICATION/%d: %s",			sd, ryo -> ryo_name);	str = qb2str (arg);	qr = query (str);	free (str);	if (qr == NULL)		return error (sd, error_Idist_congested, (caddr_t)ia5list,			      rox, roi);	if (RyDsResult (sd, rox -> rox_id, (caddr_t) qr, ROS_NOPRIO, roi)	    == NOTOK)		ros_adios (&roi -> roi_preject, "RESULT");	free_Idist_QueryResult (qr);	return OK;}op_terminate (sd, ryo, rox, in, roi)int	sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t	in;struct RoSAPindication *roi;{	register struct type_Idist_TermStatus *arg =		(struct type_Idist_TermStatus *) in;	if (rox -> rox_nolinked == 0) {		advise (LLOG_NOTICE, NULLCP,			"RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",			sd, ryo -> ryo_name, rox -> rox_linkid);		return ureject (sd, ROS_IP_LINKED, rox, roi);	}	if (debug)		advise (LLOG_DEBUG, NULLCP, "RO-INVOKE.INDICATION/%d: %s",			sd, ryo -> ryo_name);	switch (arg -> filetype -> parm) {	    case int_Idist_FileType_regular:		if (cfile == NULL)			return i_strerror (sd, error_Idist_protocol,					 "File not open", rox, roi);		(void) fflush (cfile);		if (ferror (cfile))			return syserror (sd, error_Idist_writeerror, rox, roi);		(void) fclose (cfile);		if ( fixup () < 0)			return error (sd, error_Idist_fileproblem,				      (caddr_t) ia5list, rox, roi);		break;	    case int_Idist_FileType_directory:		*tp = '\0';		if (catname <= 0)			return i_strerror (sd, error_Idist_protocol,					 "Too many directory levels popped",					 rox, roi);		tp = stp[--catname];		*tp = '\0';		break;	    case int_Idist_FileType_symlink:	    case int_Idist_FileType_hardlink:		return i_strerror (sd, error_Idist_protocol,

⌨️ 快捷键说明

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