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