llock.c

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

C
265
字号
/* * 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 * * llock.c : do a local lock if possible * * Contributed by Oliver Wenzel, GMD Berlin, 1990 * * $Header: /xtel/isode/isode/others/rfa/RCS/llock.c,v 9.0 1992/06/16 12:47:25 isode Rel $ * * $Log: llock.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/llock.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 <errno.h>#include <sys/types.h>#include <sys/stat.h>#include "general.h"#include "logger.h"#include "rfa.h"#include "rfainfo.h"extern char *fsBase;extern char *strtok();extern char *getRfaContext();extern char *isodetcpath;extern int commandMode;extern char *sys_errname();extern char *strdup();char *myname;int connected = 0;FILE *err, *out;char cwd_remote[512];int interactive = 1;int retcode;cleanup() {}/*--------------------------------------------------------------*//*  errMsg                                                      *//*--------------------------------------------------------------*/char *errMsg(type)    int type;{    if(type == NOTOK)	return rfaErrStr;    else	return sys_errname(errno);}/*--------------------------------------------------------------*//*  getLocalFileRfaInfo						*//*--------------------------------------------------------------*/int getLocalRfaInfo(fn, rfap, rfalp, reg)    char **fn;    struct RfaInfo **rfap, **rfalp;    int reg;{    int rc;    /*--- expand symbolic links in fn ---*/    if((*fn = getRfaContext(cwd_remote, *fn)) == NULL) {	fprintf(err,		"*** local file access error : not within RFA subtree %s ***\n"		, fsBase);	return(NOTOK_OUTOFSUBTREE);    }    if ((*fn = expandSymLinks(*fn)) == NULL) {	fprintf(err, "*** local file access error : %s ***\n", rfaErrStr);	return(NOTOK_OUTOFSUBTREE);    }    /*--- get file Info ---*/    if ((rc = getRfaInfoList(dirname(*fn), rfalp, basename(*fn), 1)) != OK) {	fprintf(err,	    "*** local file access error : can't read %s/.rfainfo (%s) ***\n", 	    dirname(*fn), errMsg(rc));	return(NOTOK_FILEACCESS);    }    if ((*rfap = findRfaInfo(basename(*fn), *rfalp)) == NULL) {	releaseRfaInfoList(*fn,*rfalp);	*rfalp = NULL;	fprintf(err,"*** local file access error : %s does not exist ***\n",		*fn);	return(NOTOK_FILEACCESS);    }    /*--- check if regular file ---*/    if (reg)	if (((*rfap)->ri_mode & S_IFMT) != S_IFREG) {	    releaseRfaInfoList(*fn,*rfalp);	    fprintf(err," *** status error : not a regular file ***\n");	    *rfalp = NULL;	    return NOTOK_NOTREGULAR;	}    return OK;}/*--------------------------------------------------------------*//*  unlockFile							*//*--------------------------------------------------------------*/do_lunlock(fn)    char *fn;{    int rc;    struct RfaInfo *rfalist, *rfa;    /*--- get file Info ---*/    if ((rc = getLocalRfaInfo(&fn, &rfa, &rfalist, 1)) != OK) 	return rc;    /*--- check if we are master ---*/    if (IS_SLAVE(rfa->ri_status)) {	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(err," *** local file %s is slave version ***\n", fn);	return NOTOK_IS_SLAVE;    }    if (!IS_LOCKED(rfa->ri_status)) {	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(err," *** local file %s not locked ***\n", fn);	return NOTOK_NOTLOCKED;    }    SET_LOCKINFO(rfa->ri_status, RI_UNLOCKED);    rfa->ri_lcksince = NULL;    free(rfa->ri_lckname);    rfa->ri_lckname = "NONE";    if ((rc = putRfaInfoList(dirname(fn), rfalist)) != OK) {	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(err, "*** local file access error : %s ***\n", errMsg(rc));	return NOTOK_FILEACCESS;    }    releaseRfaInfoList(dirname(fn), rfalist);    return OK;}/*--------------------------------------------------------------*//*  lockFile							*//*--------------------------------------------------------------*/do_llock(fn)    char *fn;{    int res, rc;    struct RfaInfo *rfalist, *rfa;    /*--- get file Info ---*/    if ((rc = getLocalRfaInfo(&fn, &rfa, &rfalist, 1)) != OK) 	return rc;    /*--- check if we are master ---*/    if (IS_MASTER(rfa->ri_status) || IS_UNREGISTERED(rfa->ri_status)) {	if (IS_LOCKED(rfa->ri_status)) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** file already locked by %s since %s ***\n",		    rfa->ri_lckname, shortTime(&(rfa->ri_lcksince)));	    return NOTOK_LOCKED;	}	SET_LOCKINFO(rfa->ri_status, RI_LOCKED);	rfa->ri_lckname = strdup(getenv("USER"));	(void)time(&(rfa->ri_lcksince));	if ((rc = putRfaInfoList(dirname(fn), rfalist)) != OK) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err, 	     "*** local file access error : can't write rfainfo (%s) ***\n",	     errMsg(rc));	    return NOTOK_FILEACCESS;	}	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(out, "locked file %s\n",fn);	return OK;    }    /*-- here we will need help from Big-Brother "rfa" --*/    return NOTOK_LOCAL_LOCK;}main (ac, av) int ac;char **av;{    char c, *cwd, buf[BUFSIZ];    char *cmd=NULL;    int rc;    myname = av[0];    out = stdout;    err = stderr;    initLog(myname);    if (ac < 2) {	fprintf(stderr, "USAGE: %s filename [-q]\n", basename(myname));	exit (1);    }    if (ac > 2 && strcmp(av[2], "-q") == 0)	interactive = 0;    /*--- rfa tailoring ---*/    sprintf(buf, "%s/rfatailor", isodetcpath);    if (tailor(buf) != OK) {        fprintf(stderr, "*** tailoring %s - %s ***\n", buf, rfaErrStr);        exit(1);    }    sprintf(buf, "%s/rfatailor", RFA_TAILDIR);    if (tailor(buf) != OK) {        fprintf(stderr, "*** tailoring %s - %s ***\n", buf, rfaErrStr);        exit(1);    }    sprintf(buf,"%s/.rfarc", getenv("HOME"));    if (tailor(buf) != OK) {        fprintf(stderr, "*** tailoring %s - %s ***\n", buf, rfaErrStr);        exit(1);    }    /*--- init cwd ---*/    (void)getwd(buf);    if (strncmp(buf, fsBase, strlen(fsBase)) == 0) 	strcpy(cwd_remote, buf + strlen(fsBase));    interactive = 0;    commandMode = 1;    if (strcmp(basename(myname), "llock") == 0) 	rc = do_llock(av[1]);    else    	rc = do_lunlock(av[1]);    if (interactive && (rc == 2)) 	fprintf(stderr,"*** can't LOCK locally, must use RFA command ***\n");    exit (rc);}    

⌨️ 快捷键说明

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