Net2/usr/src/contrib/isode/others/rfa/rfa2fi.c

/*
 * 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
 *
 * rfa2fi.c : convert between RfaInfo and type_RFA_FileInfoList and vice versa
 *
 * Contributed by Oliver Wenzel, GMD Berlin, 1990
 *
 * $Header: /f/osi/others/rfa/RCS/rfa2fi.c,v 7.3 91/02/22 09:28:20 mrose Interim $
 *
 * $Log:	rfa2fi.c,v $
 * Revision 7.3  91/02/22  09:28:20  mrose
 * Interim 6.8
 * 
 * Revision 7.2  91/01/14  13:54:56  mrose
 * update
 * 
 * Revision 1.1  91/01/04  16:07:24  ow
 * Initial revision
 * 
 */

#ifndef       lint
static char *rcsid = "$Header: /f/osi/others/rfa/RCS/rfa2fi.c,v 7.3 91/02/22 09:28:20 mrose Interim $";
#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 <stdio.h>
#include "rfa.h"
#include "RFA-types.h"
#include "rfainfo.h"

extern char *getRelativeFN();
extern char *fsBase;

/*--------------------------------------------------------------------
 * rfa2fi  - RfaInfo to type_RFA_FileInfo
 *--------------------------------------------------------------------*/
struct type_RFA_FileInfo *rfa2fi(dir, rfa)
    char *dir;
    struct RfaInfo *rfa;
{
    struct type_RFA_FileInfo *fi;
    char *l;

    if ((fi = (struct type_RFA_FileInfo *)
		malloc(sizeof(struct type_RFA_FileInfo))) == NULL)
    {
	sprintf(rfaErrStr, "out of memory");
	return NULL;
    }
    fi->name = str2qb(rfa->ri_filename, strlen(rfa->ri_filename), 1);
    fi->mode = rfa->ri_mode;
    fi->user = str2qb(rfa->ri_owner, strlen(rfa->ri_owner), 1);
    fi->group = str2qb(rfa->ri_group, strlen(rfa->ri_group), 1);
    fi->size = rfa->ri_size;
    fi->accTime = rfa->ri_accTime;
    fi->modTime = rfa->ri_modTime;
    if (l = rfa->ri_lnkName) {
	if (*l != '/') {
	    if (getRelativeFN(realPath3(fsBase, dir, l)) == NULL) 
		l = "(link outside RFA context)";
	} else
	    if ((l = getRelativeFN(rfa->ri_lnkName)) == NULL) 
		l = "(link outside RFA context)";
	fi->lnkName = str2qb(l, strlen(l), 1);
    } else
	fi->lnkName = NULL;
    fi->status = rfa->ri_status;
    if (IS_LOCKED(rfa->ri_status)) {
	fi->lockedBy = str2qb(rfa->ri_lckname, strlen(rfa->ri_lckname), 1);
	fi->lockedSince = rfa->ri_lcksince;
    } else {
	fi->lockedBy = NULL;
	fi->lockedSince = NULL;
    }
    return fi;
}

/*--------------------------------------------------------------------
 * rfa2fil  - RfaInfo to type_RFA_FileInfoList
 *--------------------------------------------------------------------*/
struct type_RFA_FileInfoList *rfa2fil(dir, rfa)
    char *dir;
    struct RfaInfo *rfa;
{
    struct type_RFA_FileInfoList *fil, **filp;

    filp = &fil;
    for (; rfa; rfa = rfa->ri_next) {
	if (((*filp) = (struct type_RFA_FileInfoList *)
	    malloc(sizeof(struct type_RFA_FileInfoList))) == NULL)
	{
	    free_RFA_FileInfoList(fil);
	    sprintf(rfaErrStr, "out of memory");
	    return NULL;
	}
	(*filp)->next = NULL;
	if (((*filp)->FileInfo = rfa2fi(dir, rfa)) == NULL) {
	    free_RFA_FileInfoList(fil);
	    return NULL;
	}
	filp = &((*filp)->next);
    }
    return fil;
}

/*--------------------------------------------------------------------
 * fi2rfa  - type_RFA_FileInfoList to RfaInfo 
 *--------------------------------------------------------------------*/
struct RfaInfo *fi2rfa(fil)
    struct type_RFA_FileInfoList *fil;
{
    struct type_RFA_FileInfo *fi;
    struct RfaInfo *rfa, *rfaNew;
    char *l;

    rfa = NULL;
    for (; fil; fil = fil->next) {
	fi = fil->FileInfo;
	if ((rfaNew = mallocRfaInfo(qb2str(fi->name))) == NULL) {
	    freeRfaInfoList(rfa);
	    return NULL;
	}
	rfaNew->ri_next = rfa;
	rfa = rfaNew;
	
	rfa->ri_mode = fi->mode;
	rfa->ri_owner = qb2str(fi->user);
	rfa->ri_group = qb2str(fi->group);
	rfa->ri_size = fi->size;
	rfa->ri_accTime = fi->accTime;
	rfa->ri_modTime = fi->modTime;
	if (fi->lnkName) {
	    l = qb2str(fi->lnkName);
	    if (*l == '/')
		l = makeFN(l);
	    rfa->ri_lnkName = strdup(l);
	} else
	    rfa->ri_lnkName = NULL;
	rfa->ri_status = fi->status;
	if (IS_LOCKED(rfa->ri_status)) {
	    rfa->ri_lckname = qb2str(fi->lockedBy);
	    rfa->ri_lcksince = fi->lockedSince;
	} else {
	    rfa->ri_lckname = NULL;
	    rfa->ri_lcksince = NULL;
	}
    }
    return rfa;
}