filemode.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 269 行
C
269 行
/* * RFA - Remote File Access * * Access and Management for a partial file system tree that exists * at two sites either as master files or slave files * * filemode.c : manipulate file owner, groups and access mode * * contributed by: Oliver Wenzel, GMD Berlin, 1990 * * $Header: /xtel/isode/isode/others/rfa/RCS/filemode.c,v 9.0 1992/06/16 12:47:25 isode Rel $ * * $Log: filemode.c,v $ * Revision 9.0 1992/06/16 12:47:25 isode * Release 8.0 * */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/rfa/RCS/filemode.c,v 9.0 1992/06/16 12:47:25 isode Rel $";#endif/* * 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 <ctype.h>#include <stdio.h>#include <pwd.h>#include <grp.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/time.h>#include "general.h"#include "rfa.h"#include "rfainfo.h"static int runAsRoot = 0; /* we started with effective uid of root *//*--------------------------------------------------------------*//* initUserId *//* called when rfa or rfad is started. Even if *//* they are started with effective uid of root *//* they are running with eff. uid of user until *//* the eff. uid of root is REALLY needed (see *//* below) *//*--------------------------------------------------------------*/int initUserId(uid, gid, user) int uid, gid; char *user;{ if (geteuid() == 0) { runAsRoot++; if (setregid (gid, gid) < 0) { sprintf (rfaErrStr, "Can't set group-id %d for %s", gid, user); return NOTOK; } if(setreuid (-1, uid) < 0) { sprintf (rfaErrStr, "Can't set user-id %d for %s", uid, user); return NOTOK; } } return OK;}/*--------------------------------------------------------------*//* getFileOwner *//*--------------------------------------------------------------*/int getFileOwner (fn, uidp, gidp) char *fn; int *uidp, *gidp;{ struct stat st; if (stat(makeFN(fn), &st) == -1) return NOTOK; *uidp = st.st_uid; *gidp = st.st_gid; return OK;}/*--------------------------------------------------------------*//* changeFileOwner *//*--------------------------------------------------------------*/int changeFileOwner(fn, rfa) char *fn; struct RfaInfo *rfa;{ struct group *gr; struct passwd *pw; int changedUID = 0; int rc = OK; int fuid, fgid; if (getFileOwner(fn, &fuid, &fgid) == NOTOK) { sprintf(rfaErrStr, "can't change owner/group of %s\n", fn); return NOTOK; } if ((doChgrp || doChown) && runAsRoot) if (setreuid(-1, 0) != -1) changedUID++; if (doChgrp) if ((gr = getgrnam(rfa->ri_group)) == NULL) { sprintf(rfaErrStr, "can't change group to %s (invalid group)", rfa->ri_group); rc = NOTOK; } else if (fgid != gr->gr_gid) if (chown(makeFN(fn), -1, gr->gr_gid) == -1) { if (runAsRoot) { setreuid(-1, fuid); if (chown(makeFN(fn), -1, gr->gr_gid) == -1) { sprintf(rfaErrStr, "can't change group to %s (%s)", rfa->ri_group, sys_errname(errno)); rc = NOTOK; } } else { sprintf(rfaErrStr, "can't change group to %s (%s)", rfa->ri_group, sys_errname(errno)); rc = NOTOK; } } if (doChown && runAsRoot) if ((pw = getpwnam(rfa->ri_owner)) == NULL) { sprintf(rfaErrStr, "can't change owner to %s (invalid user-name)", rfa->ri_owner); rc = NOTOK; } else if (fuid != pw->pw_uid) if (chown(makeFN(fn), pw->pw_uid, -1) == -1) { sprintf(rfaErrStr, "can't change owner to %s (%s)", rfa->ri_owner, sys_errname(errno)); rc = NOTOK; } if (changedUID) setreuid(-1, getuid()); return rc;}/*--------------------------------------------------------------*//* changeFileMode *//*--------------------------------------------------------------*/int changeFileMode(fn, mode, errmsg) char *fn; int mode; char *errmsg;{ int changedUID = 0; int rc = OK; int fuid, fgid; if (getFileOwner(fn, &fuid, &fgid) == NOTOK) { sprintf(rfaErrStr, "can't %s of file %s", errmsg, fn); return NOTOK; } if (fuid != getuid()) if (runAsRoot && (setreuid(-1, 0) != -1) && (fuid != getuid())) changedUID++; /*-- clear set uid on execution bit --*/ if (doClearSUID) mode &= ~S_ISUID; if (chmod(makeFN(fn), mode & 07777) == -1) if (runAsRoot) { setreuid(-1, fuid); if (chmod(makeFN(fn), mode & 07777) == -1) { sprintf(rfaErrStr, "can't %s of file %s (%s)", errmsg, fn, sys_errname(errno)); rc = NOTOK; } } else { sprintf(rfaErrStr, "can't %s of file %s (%s)", errmsg, fn, sys_errname(errno)); rc = NOTOK; } if (changedUID) setreuid(-1, getuid()); return rc;}/*--------------------------------------------------------------*//* makeFileReadOnly *//*--------------------------------------------------------------*/int makeFileReadOnly(fn, rfa) struct RfaInfo *rfa; char *fn;{ if (doChmod && (rfa->ri_mode & 0222)) { rfa->ri_mode &= ~0222; return changeFileMode(fn, rfa->ri_mode, "clear write permission"); } return OK;}/*--------------------------------------------------------------*//* makeFileReadWrite *//*--------------------------------------------------------------*/int makeFileReadWrite(fn, rfa) struct RfaInfo *rfa; char *fn;{ if (doChmod) { rfa->ri_mode |= 0220; return changeFileMode(fn, rfa->ri_mode, "set write permission"); } return OK;}/*--------------------------------------------------------------*//* changeTime - change local time if eff. uid is root *//*--------------------------------------------------------------*/int changeTime (dt) time_t dt;{ struct timeval tv; int rc = OK; int changedUID = 0; if (runAsRoot) if (setreuid(-1, 0) == -1) { sprintf(rfaErrStr, "can't switch to user ID of ROOT"); } else changedUID++; else { sprintf (rfaErrStr, "can't set time myself, using 'rfatime'"); return NOTOK; } if (dt > 0) { /*--- clock "jumps" forwards ---*/ gettimeofday(&tv, (struct timezone *)NULL); tv.tv_sec += dt; if (settimeofday(&tv, (struct timezone *)NULL) == -1) { sprintf(rfaErrStr, "can't set time : %s ", sys_errname(errno)); rc = NOTOK; } } else { tv.tv_sec = dt; tv.tv_usec = 0L; if (adjtime(&tv, (struct timeval *)NULL) == -1) { sprintf(rfaErrStr, "can't set time : %s", sys_errname(errno)); rc = NOTOK; } } if (changedUID) setreuid(-1, getuid()); return rc;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?