rtf.c

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

C
480
字号
/* rtf.c - RT-file transfer utility -- initiator */#ifndef	lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/rtf/RCS/rtf.c,v 9.0 1992/06/16 12:48:07 isode Rel $";#endif/*  * $Header: /xtel/isode/isode/others/rtf/RCS/rtf.c,v 9.0 1992/06/16 12:48:07 isode Rel $ * * * $Log: rtf.c,v $ * Revision 9.0  1992/06/16  12:48:07  isode * Release 8.0 * *//* *				  NOTICE * *    Acquisition, use, and distribution of this module and related *    materials are subject to the restrictions of a license agreement. *    Consult the Preface in the User's Manual for the full terms of *    this agreement. * */#include "RTF-types.h"#include "rtf.h"#include "isoservent.h"/*    DATA */static char *myname = "rtf";static char *myprovider = "rtsap";static char *myentity = "file transfer";static char *host = NULL;static char *user = NULL;static char *password = NULL;static char *source = NULL;static char *destination = NULL;static int   turn = NOTOK;static int   fd;static int   nbytes;int	downtrans (), uptrans ();char   *getenv ();/*    MAIN *//* ARGSUSED */main (argc, argv, envp)int	argc;char  **argv,      **envp;{    int	    result,	    sd;    char   *file;    register struct isoservent *is;    struct SSAPaddr *sa;    struct RtSAPaddr rtzs;    register struct RtSAPaddr *rtz = &rtzs;    struct RtSAPconnect rtcs;    register struct RtSAPconnect   *rtc = &rtcs;    struct RtSAPindication  rtis;    register struct RtSAPindication *rti = &rtis;    register struct RtSAPabort   *rta = &rti -> rti_abort;    PE	    pe;    struct type_RTF_Request reqs;    register struct type_RTF_Request *req = &reqs;    arginit (argv);        if (turn == RTS_INITIATOR) {	if ((fd = open (source, O_RDONLY, 0x00)) == NOTOK)	    adios (source, "unable to open");	file = destination;    }    else	file = source;    if ((req -> user = str2qb (user, strlen (user), 1)) == NULL	    || (req -> password = str2qb (password, strlen (password), 1))		    == NULL	    || (req -> file = str2qb (file, strlen (file), 1)) == NULL)	adios (NULLCP, "out of memory");    pe = NULLPE;    if (encode_RTF_Request (&pe, 1, 0, NULLCP, req) == NOTOK)	adios (NULLCP, "error encoding request: %s", PY_pepy);    PLOGP (pgm_log,RTF_Request, pe, "Request", 0);    if ((is = getisoserventbyname (myentity, myprovider)) == NULL)	adios (NULLCP, "%s/%s: unknown provider/entity pair",	       myentity, myprovider);    rtz -> rta_port = is -> is_port;		/* yikes! */    if ((is = getisoserventbyname ("rts", "ssap")) == NULL)	adios (NULLCP, "ssap/rts: unknown entity");    if ((sa = is2saddr (host, NULLCP, is)) == NULLSA)	adios (NULLCP, "address translation failed");    rtz -> rta_addr = *sa;	/* struct copy */    fprintf (stderr, "%s...", host);    (void) fflush (stderr);    if (RtBeginRequest (rtz, RTS_TWA, turn, pe, rtc, rti) == NOTOK) {	fprintf (stderr, "failed\n");	rts_adios (rta, "RT-BEGIN.REQUEST");    }    pe_free (pe);    qb_free (req -> user);    qb_free (req -> password);    qb_free (req -> file);    if (rtc -> rtc_result != RTS_ACCEPT) {	fprintf (stderr, "failed\n");	adios (NULLCP, "association rejected: [%s]",	       RtErrString (rtc -> rtc_result));    }    fprintf (stderr, "connected\n");    sd = rtc -> rtc_sd;    RTCFREE (rtc);    if (turn == RTS_INITIATOR) {	if (RtSetDownTrans (sd, downtrans, rti) == NOTOK)	    rts_adios (rta, "set DownTrans upcall");	if (RtTransferRequest (sd, NULLPE, NOTOK, rti) == NOTOK)	    rts_adios (rta, "RT-TRANSFER.REQUEST");	if (nbytes == 0)	    advise (LLOG_NOTICE, NULLCP, "transfer complete");	else	    timer (nbytes);	(void) close (fd);    }    else {	if (RtSetUpTrans (sd, uptrans, rti) == NOTOK)	    rts_adios (rta, "set UpTrans upcall");	for (;;) {	    switch (result = RtWaitRequest (sd, NOTOK, rti)) {		case NOTOK:		case OK:		case DONE:		    break;		default:		    adios (NULLCP, "unknown return from RtWaitRequest=%d",			   result);	    }	    switch (rti -> rti_type) {		case RTI_TURN:		    {			register struct RtSAPturn *rtu = &rti -> rti_turn;			if (rtu -> rtu_please) {			    if (RtGTurnRequest (sd, rti) == NOTOK)				rts_adios (rta, "RT-TURN-GIVE.REQUEST");			}			else			    break;		    }		    continue;		    		case RTI_TRANSFER:		    {#ifndef	lint			register struct RtSAPtransfer *rtt =							&rti -> rti_transfer;#endif			if (nbytes == 0)			    advise (LLOG_NOTICE, NULLCP, "transfer complete");			else			    timer (nbytes);			if (RtPTurnRequest (sd, 1, rti) == NOTOK)			    rts_adios (rta, "RT-TURN-PLEASE.REQUEST");		    }		    continue;		case RTI_ABORT:		    {			register struct RtSAPabort *rtb = &rti -> rti_abort;			if (rtb -> rta_peer)			    rts_adios (rtb, "RT-U-ABORT.INDICATION");			if (RTS_FATAL (rtb -> rta_reason))			    rts_adios (rtb, "RT-P-ABORT.INDICATION");			rts_advise (rtb, "RT-P-ABORT.INDICATION");		    }		    break;		case RTI_CLOSE:		case RTI_FINISH:		    adios (NULLCP, "unexpected indication type=%d",			   rti -> rti_type);		default:		    adios (NULLCP, "unknown indication type=%d",			   rti -> rti_type);	    }	    break;	}    }    if (RtEndRequest (sd, rti) == NOTOK)	rts_adios (rta, "RT-END.REQUEST");    exit (0);} /*     TRANSFER *//* ARGSUSED */static int  downtrans (sd, base, len, size, ssn, ack, rti)int	sd;char  **base;int    *len,	size;long	ssn,	ack;struct RtSAPindication *rti;{    register int    cc;    int	    n;    register char *dp,		  *ep;    static int bsize;    static char *bp = NULL;    if (base == NULLVP) {#ifdef	DEBUG	advise (LLOG_DEBUG, NULLCP, "RT-PLEASE.INDICATION: %d", size);#endif	return OK;    }    if (bp == NULL) {	struct stat st;	if (fstat (fd, &st) == NOTOK)	    return rtsaplose (rti, RTS_TRANSFER, source, "unable to fstat");#ifdef	MAXBSIZE	bsize = st.st_blksize > 0 ? st.st_blksize : BUFSIZ;#else	bsize = BUFSIZ;#endif	if (size == 0)	/* no checkpointing... */	    n = st.st_size;	else	    if ((n = bsize) > size)		n = size;	if ((bp = malloc ((unsigned) n)) == NULL)	    return rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");#ifdef	DEBUG	advise (LLOG_DEBUG, NULLCP, "Selecting block size of %d", n);	advise (LLOG_DEBUG, NULLCP,		"  based on blksize of %d and RTTR size of %d",		bsize, size);#endif	bsize = n;	timer (nbytes = 0);    }    *base = NULLCP, *len = 0;    for (ep = (dp = bp) + (cc = bsize); dp < ep; dp += n, cc -= n) {	switch (n = read (fd, dp, cc)) {	    case NOTOK:	        return rtsaplose (rti, RTS_TRANSFER, "failed", "read");	    default:		continue;	    case OK:		break;	}	break;    }    if ((cc = dp - bp) > 0) {	*base = bp, *len = cc;	nbytes += cc;    }    return OK;}/*  *//* ARGSUSED */static int  uptrans (sd, type, addr, rti)int	sd;int	type;caddr_t	addr;struct RtSAPindication *rti;{    switch (type) {	case SI_DATA:	    {		register struct qbuf *qb = (struct qbuf *) addr;		register struct qbuf *qp;		for (qp = qb -> qb_forw; qp != qb; qp = qp -> qb_forw)		    if (write (fd, qp -> qb_data, qp -> qb_len) !=qp -> qb_len)			return rtsaplose (rti, RTS_TRANSFER, "failed","write");		    else			nbytes += qp -> qb_len;	    }	    break;	case SI_SYNC:	    {#ifdef	DEBUG		register struct SSAPsync *sn = (struct SSAPsync *) addr;		advise (LLOG_DEBUG, NULLCP, "S-MINOR-SYNC.INDICATION: %ld",			sn -> sn_ssn);#endif	    }	    break;	case SI_ACTIVITY:	    {		register struct SSAPactivity *sv = (struct SSAPactivity *)addr;		switch (sv -> sv_type) {		    case SV_START:#ifdef	DEBUG			advise (LLOG_DEBUG, NULLCP,				"S-ACTIVITY-START.INDICATION");#endif		        if ((fd = creat (destination, 0666)) == NOTOK) {			    advise (LLOG_EXCEPTIONS, destination,				    "unable to create");			    return rtsaplose (rti, RTS_TRANSFER, destination,					      "unable to create");			}			timer (nbytes = 0);		        break;		    case SV_INTRIND:		    case SV_DISCIND:			advise (LLOG_EXCEPTIONS, NULLCP,				"activity %s: %s",				sv -> sv_type == SV_INTRIND ? "interrupted"							    : "discarded",				SReportString (sv -> sv_reason));			if (unlink (destination) == NOTOK)			    advise (LLOG_EXCEPTIONS, destination,				    "unable to unlink");			break;		    case SV_ENDIND:#ifdef	DEBUG			advise (LLOG_DEBUG, NULLCP,				"S-ACTIVITY-END.INDICATION");#endif			if (close (fd) == NOTOK)			    return rtsaplose (rti, RTS_TRANSFER, destination,					      "close failed on");			break;		    default:			return rtsaplose (rti, RTS_TRANSFER, NULLCP,				       "unexpected activity indication=0x%x",				       sv -> sv_type);		}	    }	    break;	case SI_REPORT:	    {		register struct SSAPreport *sp = (struct SSAPreport *) addr;		if (!sp -> sp_peer)		    return rtsaplose (rti, RTS_TRANSFER, NULLCP,			     "unexpected provider-initiated exception report");		advise (LLOG_EXCEPTIONS, NULLCP,			"exception: %s", SReportString (sp -> sp_reason));		if (unlink (destination) == NOTOK)		    advise (LLOG_EXCEPTIONS, destination, "unable to unlink");	    }	    break;	default:	    return rtsaplose (rti, RTS_TRANSFER, NULLCP,			      "unknown uptrans type=0x%x", type);    }    return OK;}/*  */static	arginit (vec)char  **vec;{    register char *ap;    char    prompt[BUFSIZ];    if (myname = rindex (*vec, '/'))	myname++;    if (myname == NULL || *myname == NULL)	myname = *vec;    if (strcmp (myname, "rtf") && strcmp (myname, "xrtf"))	host = myname, myname = "rtf";    isodetailor (myname, 1);    ll_hdinit (pgm_log, myname);    pgm_log -> ll_stat |= LLOGTTY;    for (vec++; ap = *vec; vec++) {	if (*ap == '-')	    switch (*++ap) {		case 'l':		    if ((user = *++vec) == NULL || *user == '-')			adios (NULLCP, "usage: %s -l username", myname);		    continue;		default:		    adios (NULLCP, "-%s: unknown switch", ap);	    }	if (host == NULL)	    host = ap;	else	    if (turn == NOTOK) {		if (strcmp (ap, "get") == 0)		    turn = RTS_RESPONDER;		else		    if (strcmp (ap, "put") == 0)			turn = RTS_INITIATOR;		    else			goto usage;	    }	    else		if (source == NULL)		    source = ap;		else		    if (destination == NULL)			destination = ap;		else {usage: ;		    adios (NULLCP,			   "usage: %s host [get|put] source destination",			   myname);		}    }    if (destination == NULL)	goto usage;    if (user == NULL && (user = getenv ("USER")) == NULL)	user = getenv ("LOGNAME");    if (strcmp (user, "anon") == 0)	user = "ANON";	    if (password == NULL) {	if (strcmp (user, "ANON")) {	    (void) sprintf (prompt, "password (%s:%s): ", host, user);	    password = getpassword (prompt);	}	else	    password = user ? user : "";    }}

⌨️ 快捷键说明

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