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 + -
显示快捷键?