idistd.c

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

C
679
字号
				 "Bad file type for terminate operation",				 rox, roi);	    default:		return error (sd, error_Idist_badfiletype, (caddr_t)NULL,			      rox, roi);	}	if (RyDsResult (sd, rox -> rox_id, (caddr_t) NULL, ROS_NOPRIO, roi)	    == NOTOK)		ros_adios (&roi -> roi_preject, "RESULT");	return OK;}op_special (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;	int	result;	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);	result = doexec (str);	free (str);	if (result == NOTOK)		return syserror (sd, error_Idist_execError, rox, roi);	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_deletefile (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;	int	result;	char	*str;	char	buf[BUFSIZ];	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);	(void) sprintf (buf, "%s/%s", target, str);	free (str);	result = i_remove (buf);	if (result == NOTOK)		return error (sd, error_Idist_badfilename, (caddr_t) ia5list,			      rox, roi);	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;}/* ARGSUSED */op_listcdir (sd, ryo, rox, in, roi)int	sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t	in;struct RoSAPindication *roi;{	struct type_Idist_FileList *fl;	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);	fl = do_listcdir ();	if (RyDsResult (sd, rox -> rox_id, (caddr_t) fl, ROS_NOPRIO, roi)	    == NOTOK)		ros_adios (&roi -> roi_preject, "RESULT");	free_Idist_FileList (fl);	return OK;}/*    ERROR */static int  error (sd, err, param, rox, roi)int	sd,	err;caddr_t	param;struct RoSAPinvoke *rox;struct RoSAPindication *roi;{    if (RyDsError (sd, rox -> rox_id, err, param, ROS_NOPRIO, roi) == NOTOK)	ros_adios (&roi -> roi_preject, "ERROR");    if (ia5list)	    free_Idist_IA5List (ia5list);    ia5list = NULL;    return OK;}static int i_strerror (sd, err, str, rox, roi)int	sd, err;char	*str;struct RoSAPinvoke *rox;struct RoSAPindication *roi;{	addtoia5 (str, strlen(str));	return error (sd, err, (caddr_t)ia5list, rox, roi);}static int syserror (sd, err, rox, roi)int	sd, err;struct RoSAPinvoke *rox;struct RoSAPindication *roi;{	extern	int errno;	return i_strerror (sd, err, sys_errname (errno), rox, roi);}	/*    U-REJECT */static int  ureject (sd, reason, rox, roi)int	sd,	reason;struct RoSAPinvoke *rox;struct RoSAPindication *roi;{    if (RyDsUReject (sd, rox -> rox_id, reason, ROS_NOPRIO, roi) == NOTOK)	ros_adios (&roi -> roi_preject, "U-REJECT");    return OK;}/*  Initialisation stuff *//* ARGSUSED */initiate (sd, acs, pe)int	sd;struct AcSAPstart *acs;PE	*pe;{	struct type_Idist_Initiate *initial;	char	*cp;	*pe  = NULLPE;	if ( acs -> acs_ninfo != 1)		return init_lose (ACS_PERMANENT, pe, "No Association data");	if (decode_Idist_Initiate (acs -> acs_info[0], 1, NULLIP, NULLVP,				   &initial) == NOTOK)		return init_lose (ACS_PERMANENT, pe,				  "Can't parse initial data");	if (initial -> version != VERSION)		return init_lose (ACS_PERMANENT, pe, "Version mismatch");	cp = qb2str (initial -> user);	(void) strcpy (user, cp);	free (cp);		if (baduser (NULLCP, user)) {	    advise (LLOG_EXCEPTIONS, NULLCP, "Bad listed user '%s'", user);	    return init_lose (ACS_PERMANENT, pe, "Bad user/password");	}	if ((pw = getpwnam (user)) == NULL) {		advise (LLOG_NOTICE, NULLCP, "Unknown user '%s'", user);		return init_lose (ACS_PERMANENT, pe, "Bad user/password");	}	userid = pw -> pw_uid;	groupid = pw -> pw_gid;	(void) strcpy (homedir, pw -> pw_dir);	cp = qb2str (initial -> passwd);	if (pw -> pw_passwd == NULL	            || !chkpassword (user, pw -> pw_passwd, cp)) {		advise (LLOG_NOTICE, NULLCP, "Password mismatch for %s", user);		return init_lose (ACS_PERMANENT, pe, "Bad user/password");	}	bzero (cp, strlen(cp));	/* in case of cores */	free (cp);	free_Idist_Initiate (initial);	if (chdir (homedir) == -1) {		advise (LLOG_NOTICE, NULLCP, "Can't set home directory to '%s'",			homedir);		return init_lose (ACS_PERMANENT, pe, "No home directory");	}#ifdef SVR4	if (setuid (userid) < 0) {#else	if (setreuid (userid, userid) < 0) {#endif		advise (LLOG_NOTICE, NULLCP, "Cant set userid %d for %s",			userid, user);		return init_lose (ACS_PERMANENT, pe, "Can't set user id");	}		(void) mktemp (utmpfile);	return ACS_ACCEPT;}init_lose (type, pe, str)int	type;PE	*pe;char	*str;{	*pe = ia5s2prim (str, strlen(str));	(*pe) -> pe_context = 3;	/* magic!! - don't ask me why */	return type;}#define SIZEOFQB(qb)  (sizeof (struct qbuf) +  (qb && qb->qb_data ? qb->qb_len \				: 0))static struct qbuf *qb_cpy(qb)struct qbuf	*qb;{    struct qbuf	*qp;    struct qbuf	*nqb;    struct qbuf	*nqp;    struct qbuf	*pred;    if (qb == (struct qbuf *)0)	return ((struct qbuf *)0);    nqb = (struct qbuf *) smalloc(SIZEOFQB(qb));    nqb->qb_len = qb->qb_len;    if (qb->qb_data) {	nqb->qb_data = nqb->qb_base;	bcopy(qb->qb_data, nqb->qb_data, qb->qb_len);    } else	nqb->qb_data = NULLCP;    nqb->qb_forw = nqb;    nqb->qb_back = nqb;    pred = nqb;    for (qp = qb->qb_forw; qp != qb; qp = qp->qb_forw) {	nqp = (struct qbuf *) smalloc(SIZEOFQB(qp));	nqp->qb_len = qp->qb_len;	if (qp->qb_data) {	    nqp->qb_data = nqp->qb_base;	    bcopy(qp->qb_data, nqp->qb_data, qp->qb_len);	} else	    nqp->qb_data = NULLCP;	insque(nqp, pred);	pred = nqp;    }    return (nqb);}static struct type_Idist_FileSpec *cpy_fs (ft)struct type_Idist_FileSpec *ft;{	struct type_Idist_FileSpec *new;	new = (struct type_Idist_FileSpec *)calloc (1, sizeof *new);	if (ft -> filetype) {		new -> filetype = (struct type_Idist_FileType *)			calloc (1, sizeof *new -> filetype);		new -> filetype -> parm = ft -> filetype -> parm;	}	if (ft -> fileopts)		new -> fileopts = pe_cpy (ft -> fileopts);	new -> filemode = ft -> filemode;	new -> filesize = ft -> filesize;	if (ft -> filemtime) {		new -> filemtime = (struct type_Idist_FileTime *)			calloc (1, sizeof *new -> filemtime);		new -> filemtime -> parm = ft -> filemtime -> parm;	}	new -> fileowner = qb_cpy (ft -> fileowner);	new -> filegroup = qb_cpy (ft -> filegroup);	new -> filename = qb_cpy (ft -> filename);	new -> linkname = qb_cpy (ft -> linkname);	return new;}

⌨️ 快捷键说明

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