rfa.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,200 行 · 第 1/3 页

C
1,200
字号
	/*--- 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)));		CONT(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 : %s ***\n",			errMsg(rc));		CONT(NOTOK_FILEACCESS);	    }	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(out, "locked file %s\n",fn);	    continue;	}	/*--- otherwise we are slave, get from master ---*/	if (getConnection() != OK)	    CONT(NOTOK_REMOTE_ERROR);	if (rfa->ri_mode & S_IFMT & S_IFREG) 	    if ((rc = getfile_aux(fn, rfa, &rmode)) != OK)  {		releaseRfaInfoList(dirname(fn), rfalist);		CONT(NOTOK_REMOTE_ERROR);	    }	if ((rma = (struct type_RFA_RequestMasterArg *)		malloc(sizeof(struct type_RFA_RequestMasterArg))) == NULL) 	{	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err,"*** local error : no memory ***\n");	    CONT(NOTOK_LOCAL_ERROR);	}		rma->filename = str2qb(fn, strlen(fn), 1);	rma->slaveVersion = rfa->ri_modTime;	if (invoke(operation_RFA_requestMaster, (caddr_t)rma, (caddr_t *)&rmr, &res)		== NOTOK) 	{	    releaseRfaInfoList(dirname(fn), rfalist);	    free_RFA_RequestMasterArg(rma);	    fprintf(err, "*** remote operation invocation failed ***\n");	    CONT(NOTOK_REMOTE_ERROR);	}	if (res != RY_RESULT) {	    releaseRfaInfoList(dirname(fn), rfalist);	    free_RFA_RequestMasterArg(rma);	    printError(res, (caddr_t)rmr, &rc);	    CONT(rc);	}	free_RFA_RequestMasterRes(rmr);	free_RFA_RequestMasterArg(rma);	SET_LOCKINFO(rfa->ri_status, RI_LOCKED);	SET_STATUS(rfa->ri_status, RI_MASTER);	(void)time(&(rfa->ri_lastChange));	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 : %s ***\n", errMsg(rc));	    fprintf(err,"*** PANIC : can't set local Master status of %s ***\n",			fn);	    CONT(NOTOK_FILEACCESS);	}	/*--- set owner and group mode to writable ---*/	if (rmode && (rfa->ri_mode & S_IFMT & S_IFREG)) 	    if (changeFileMode(fn, rmode, "set write permissions") != OK)		fprintf(err, "*** %s ***\n", rfaErrStr);	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(out, "locked file %s\n",fn);    }    RETURN;}/*--------------------------------------------------------------*//*  master							*//*--------------------------------------------------------------*/do_master(av)    char **av;{    int rc, res;    struct RfaInfo *rfalist, *rfa, *remoteRfaList, *rrfa;    char *fn, *shortTime();    char  buf[512];    struct type_RFA_RequestMasterRes *rmr;    struct type_RFA_RequestMasterArg *rma;    int rmode = 0;    START;    for(; *av; av++) {	/*--- get file Info ---*/	fn = *av;	if ((rc = getLocalRfaInfo(&fn, &rfa, &rfalist, 0)) != OK) 	    CONT(rc);	/*--- check if not a .rfaexec file ---*/	if (strcmp(rfa->ri_filename, ".rfaexec") == 0) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** not allowed on file '%s' ***\n",rfa->ri_filename);	    CONT(NOTOK_NOT_ALLOWED);	}	/*--- check if unregistered ---*/	if (IS_MASTER(rfa->ri_status)) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** file %s is already master version ***\n", fn);	    CONT(NOTOK_ALREADY_MASTER);	}	/*--- check if remote is already master ---*/	if ((rc = getRemoteRfaInfoList(dirname(fn), &remoteRfaList)) != OK) {	    if (interactive) {		fprintf(err, "can't determine remote status, become master");		fprintf(err, " anyway ? (y/n): ");		gets(buf);		if ((*buf != 'y') && (*buf != 'Y')) {		    releaseRfaInfoList(dirname(fn), rfalist);		    fprintf(err,"...aborted\n");		    CONT(NOTOK_REMOTE_ERROR);		}	    } else {		releaseRfaInfoList(dirname(fn), rfalist);		fprintf(err,"*** can't determine remote status of %s ***\n",fn);		CONT(NOTOK_REMOTE_ERROR);	    }	} else {	    /*--- consistency checks ---*/	    if (rrfa = findRfaInfo(basename(fn), remoteRfaList)) {		if (IS_MASTER(rrfa->ri_status)) {					    /*--- try to become master ---*/		    if (rfa->ri_mode & S_IFMT & S_IFREG) 			if ((rc = getfile_aux(fn, rfa, &rmode)) != OK)  {			    releaseRfaInfoList(dirname(fn), rfalist);			    freeRfaInfoList(remoteRfaList);			    CONT(NOTOK_REMOTE_ERROR);			}		    if ((rma = (struct type_RFA_RequestMasterArg *)		      malloc(sizeof(struct type_RFA_RequestMasterArg))) == NULL)		    {			releaseRfaInfoList(dirname(fn), rfalist);			freeRfaInfoList(remoteRfaList);			fprintf(err,"*** local error : no memory ***\n");			CONT(NOTOK_LOCAL_ERROR);		    }			    		    rma->filename = str2qb(fn, strlen(fn), 1);		    rma->slaveVersion = rfa->ri_modTime;		    if (invoke(operation_RFA_requestMaster, (caddr_t) rma, 			(caddr_t *)&rmr, &res) ==NOTOK)		    {			releaseRfaInfoList(dirname(fn), rfalist);			free_RFA_RequestMasterArg(rma);			freeRfaInfoList(remoteRfaList);			fprintf(err,				"*** remote operation invocation failed ***\n");			CONT(NOTOK_REMOTE_ERROR);		    }		    if (res != RY_RESULT) {			releaseRfaInfoList(dirname(fn), rfalist);			free_RFA_RequestMasterArg(rma);			printError(res, (caddr_t)rmr, &rc);			CONT(rc);		    }		    free_RFA_RequestMasterArg(rma);		    free_RFA_RequestMasterRes(rmr);		}		if (IS_SLAVE(rrfa->ri_status)) {		    if (interactive) {			fprintf(err, "remote version is already slave, become");			fprintf(err, " master anyway ? (y/n): ");			gets(buf);			if ((*buf != 'y') && (*buf != 'Y')) {			    releaseRfaInfoList(dirname(fn), rfalist);			    freeRfaInfoList(remoteRfaList);			    fprintf(err,"...aborted\n");			    CONT(NOTOK_REMOTE_ERROR);			}		    } else {			releaseRfaInfoList(dirname(fn), rfalist);			freeRfaInfoList(remoteRfaList);			fprintf(err,			  "*** remote version of %s is already slave ***\n",fn);			CONT(NOTOK_REMOTE_ERROR);		    }		}	    }	    freeRfaInfoList(remoteRfaList);	}	if (IS_UNREGISTERED(rfa->ri_status))	    SET_TRANSFER(rfa->ri_status, default_transfer);	SET_STATUS(rfa->ri_status, RI_MASTER);	time(&(rfa->ri_lastChange));	if ((rc = putRfaInfoList(dirname(fn), rfalist)) != OK) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err, "*** local file access error : %s ***\n", errMsg(rc));	    CONT(NOTOK_FILEACCESS);	}	/*--- set owner and group mode to writable ---*/	if (rmode && (rrfa->ri_mode & S_IFMT & S_IFREG)) 	    if (changeFileMode(fn, rmode, "set write permissions") != OK)		fprintf(err, "*** %s ***\n", rfaErrStr);	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(out, "changed local version of %s to MASTER\n",fn);    }    RETURN;}/*--------------------------------------------------------------*//* slave							*//*--------------------------------------------------------------*/do_slave(av)    char **av;{    int rc;    struct RfaInfo *rfalist, *rfa, *remoteRfaList, *rrfa;    char *fn, *shortTime();    char  buf[512];    START;    for(; *av; av++) {	/*--- get file Info ---*/	fn = *av;	if ((rc = getLocalRfaInfo(&fn, &rfa, &rfalist, 0)) != OK) 	    CONT(rc);	/*--- check if not a .rfaexec file ---*/	if (strcmp(rfa->ri_filename, ".rfaexec") == 0) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** not allowed on file '%s' ***\n",rfa->ri_filename);	    CONT(NOTOK_NOT_ALLOWED);	}	/*--- check if unregistered ---*/	if (IS_SLAVE(rfa->ri_status)) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** file %s already is slave version ***\n", fn);	    CONT(NOTOK_ALREADY_SLAVE);	}	/*--- check if unregistered ---*/	if (IS_LOCKED(rfa->ri_status)) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** file %s is currently locked ***\n", fn);	    CONT(NOTOK_LOCKED);	}	/*--- check if remote is already master ---*/	if ((rc = getRemoteRfaInfoList(dirname(fn), &remoteRfaList)) != OK) {	    if (interactive) {		fprintf(err, "can't determine remote status, become slave");		fprintf(err, " anyway ? (y/n): ");		gets(buf);		if ((*buf != 'y') && (*buf != 'Y')) {		    releaseRfaInfoList(dirname(fn), rfalist);		    fprintf(err,"...aborted\n");		    CONT(NOTOK_REMOTE_ERROR);		}	    } else {		releaseRfaInfoList(dirname(fn), rfalist);		fprintf(err,"*** can't determine remote status of %s ***\n",fn);		CONT(NOTOK_REMOTE_ERROR);	    }	} else {	    /*--- consistency checks ---*/	    if (rrfa = findRfaInfo(basename(fn), remoteRfaList)) {		if (!IS_MASTER(rrfa->ri_status)) {		    releaseRfaInfoList(dirname(fn), rfalist);		    freeRfaInfoList(remoteRfaList);		    fprintf(err, 			"*** remote site is not master for file %s ***\n", fn);		    CONT(NOTOK_REMOTE_NOT_MASTER);		}		if (((rfa->ri_mode & S_IFMT & S_IFDIR) == 0) 	    	   && (rrfa->ri_modTime < rfa->ri_modTime)) {		    releaseRfaInfoList(dirname(fn), rfalist);		    freeRfaInfoList(remoteRfaList);		    fprintf(err,"*** remote master version of %s would be", fn);		    fprintf(err, " older than local slave version ***\n");		    CONT(NOTOK_REMOTE_MASTER_OLDER);		}	    } else {		releaseRfaInfoList(dirname(fn), rfalist);		freeRfaInfoList(remoteRfaList);		fprintf(err, 			"*** remote site is not master for file %s ***\n", fn);		CONT(NOTOK_REMOTE_NOT_MASTER);	    }	    (void)freeRfaInfoList(remoteRfaList);	}	if ((rfa->ri_mode & S_IFMT & S_IFDIR) == 0)	    if (makeFileReadOnly(fn, rfa) != OK)		fprintf(err, "*** %s ***\n", rfaErrStr);	SET_LOCKINFO(rfa->ri_status, RI_UNLOCKED);	if (IS_UNREGISTERED(rfa->ri_status))	    SET_TRANSFER(rfa->ri_status, default_transfer);	SET_STATUS(rfa->ri_status, RI_SLAVE);	(void)time(&(rfa->ri_lastChange));	if ((rc = putRfaInfoList(dirname(fn), rfalist)) != OK) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err, "*** local file access error : %s ***\n", errMsg(rc));	    CONT(NOTOK_FILEACCESS);	}	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(out, "changed local version of %s to SLAVE\n",fn);    }    RETURN;}/*--------------------------------------------------------------*//* unregister							*//*--------------------------------------------------------------*/do_unregister(av)    char **av;{    int rc;    struct RfaInfo *rfalist, *rfa;    char *fn;    START;    for(; *av; av++) {	/*--- get file Info ---*/	fn = *av;	if ((rc = getLocalRfaInfo(&fn, &rfa, &rfalist, 0)) != OK) 	    CONT(rc);	/*--- check if unregistered ---*/	if (IS_UNREGISTERED(rfa->ri_status)) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** file %s already is unregistered ***\n", fn);	    CONT(NOTOK_ALREADY_UNREG);	}	/*--- check if locked ---*/	if (IS_LOCKED(rfa->ri_status)) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err," *** file %s is currently locked ***\n", fn);	    CONT(NOTOK_LOCKED);	}	if ((rfa->ri_mode & S_IFMT & S_IFDIR) == 0)	    if (makeFileReadWrite(fn, rfa) != OK)		fprintf(err, "*** %s ***\n", rfaErrStr);	SET_LOCKINFO(rfa->ri_status, RI_UNLOCKED);	SET_TRANSFER(rfa->ri_status, RI_TR_REQ);	SET_STATUS(rfa->ri_status, RI_UNREGISTERED);	(void)time(&(rfa->ri_lastChange));	if ((rc = putRfaInfoList(dirname(fn), rfalist)) != OK) {	    releaseRfaInfoList(dirname(fn), rfalist);	    fprintf(err, "*** local file access error : %s ***\n", errMsg(rc));	    CONT(NOTOK_FILEACCESS);	}	releaseRfaInfoList(dirname(fn), rfalist);	fprintf(out, "changed local version of %s to UNREGISTERED\n",fn);    }    RETURN;}/*--------------------------------------------------------------*//*  rsyncdir							*//*--------------------------------------------------------------*/do_rsyncdir(av)    char **av;{    char *fn;    int rc;    if (*av == NULL) {	*av = "";	*(av+1) = NULL;    }    START;    for(; *av; av++) {	if((fn = getRfaContext(cwd_remote, *av)) == NULL) {

⌨️ 快捷键说明

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