ftp.nice.ch/pub/next/unix/network/system/cap.5.0.s.tar.gz#/cap_5.0/applications/aufs/afpdir.c

This is afpdir.c in view mode; [Download] [Up]

/*
 * $Author: cck $ $Date: 88/02/23 17:15:33 $
 * $Header: afpdir.c,v 1.19 88/02/23 17:15:33 cck Rel $
 * $Revision: 1.19 $
*/

/*
 * afpdir.c - Appletalk Filing Protocol Directory Level Routines
 *
 * AppleTalk package for UNIX (4.2 BSD).
 *
 * Copyright (c) 1986, 1987, 1988 by The Trustees of Columbia University in the
 * City of New York.
 *
 * Edit History:
 *
 *  March 1987     Schilit	Created.
 *
 */

/*
 * Non OS dependant support routines for:
 *
 * FPGetDirParms()
 * FPSetDirParms()
 * FPOpenDir()
 * FPCloseDir()
 * FPEnumerate()
 * FPCreateDir()
 * FPGetFileDirInfo()
 *
 */

#include <stdio.h>
#include <sys/param.h>
#ifndef _TYPES
 /* assume included by param.h */
# include <sys/types.h>
#endif
#include <netat/appletalk.h>
#include <netat/afp.h>
#include <netat/afpcmd.h>
#include "afpntoh.h"
#include "afps.h"			/* common server header */

private int EnumPack();

/*
 * OSErr FPGetDirParms(byte *p,byte *r,int *rl)
 *
 * This call is used to retrieve parameters for a particular directory.
 *
 */

OSErr
FPGetFileDirParms(p,l,r,rl)
byte *p,*r;
int l;
int *rl;
{
  GetFileDirParmsPkt gfdp;
  FileDirParm fdp;
  IDirP idir,ipdir;
  char file[MAXUFLEN];
  int ivol,err;

  ntohPackX(PsGetFileDirParms,p,l,(byte *) &gfdp);

  err = EtoIfile(file,&idir,&ipdir,&ivol,gfdp.gdp_dirid,
		 gfdp.gdp_volid,gfdp.gdp_ptype,gfdp.gdp_path);

  if (err != noErr) {
    if (DBFIL || DBDIR)
      printf("FPGetFileDirParms: EtoIfile returns %d\n",err);
    return(err);
  }

  fdp.fdp_pdirid = ItoEdirid(ipdir,ivol);
  fdp.fdp_dbitmap = gfdp.gdp_dbitmap;
  fdp.fdp_fbitmap = gfdp.gdp_fbitmap;
  fdp.fdp_zero = 0;
  err = OSFileDirInfo(ipdir,idir,file,&fdp,ivol); /* fill in information */
  if (err != noErr) {
    if (DBFIL || DBDIR)
      printf("FPGetFileDirParms: OSFileDirInfo returns %d on %s/%s\n",
	     err,pathstr(ipdir),file);
    return(err);
  }
  if (FDP_ISDIR(fdp.fdp_flg)) {
    *rl = htonPackX(DirParmPackR,(byte *)&fdp,r);
    *rl += htonPackX(DirPackR,(byte *)&fdp,r+(*rl));
  }
  if (!FDP_ISDIR(fdp.fdp_flg)) {
    *rl = htonPackX(DirParmPackR,(byte *)&fdp,r);    
    *rl += htonPackX(FilePackR,(byte *)&fdp,r+(*rl));
  }
  return(noErr);
}

/*
 * OSErr FPEnumerate(...)
 *
 * This call is used to enumerate the contents of a directory.  The
 * reply is composed of a number of file and/or directory parameter
 * structures.
 *
 */

OSErr 
FPEnumerate(p,l,r,rl)
byte *p,*r;
int l;
int *rl;
{
  FileDirParm fdp;
  EnumeratePkt enup;
  EnumerateReplyPkt enpr;
  IDirP idir,ipdir;
  char file[MAXUFLEN];
  byte *cntptr;
  int ivol,stidx,idx,maxidx;
  word cnt;
  int reqcnt,maxreply,len,elen,err;
  extern int sqs;		/* maximum send qs */

  ntohPackX(PsEnumerate,p,l,(byte *) &enup);
  err = EtoIfile(file,&idir,&ipdir,&ivol,enup.enu_dirid,
		 enup.enu_volid,enup.enu_ptype,enup.enu_path);

  if (err != noErr)
    return(err);

  /* set the bitmaps for return message and packing */
  
  fdp.fdp_fbitmap = enpr.enur_fbitmap = enup.enu_fbitmap;
  fdp.fdp_dbitmap = enpr.enur_dbitmap = enup.enu_dbitmap;

  /* set the parent dirid to the enumerated directory */

  fdp.fdp_pdirid = ItoEdirid(idir,ivol); 

  /* fetch the max size of a reply packet, start index, request count */

  maxreply = enup.enu_maxreply;
  maxreply = min(sqs, maxreply);
  stidx = enup.enu_stidx;
  reqcnt = enup.enu_reqcnt;

  maxidx = OSEnumInit(idir);		/* init, and fetch count of entries */
  if (maxidx < 0)			/* error? */
    return(maxidx);			/* return error */

  if (stidx > maxidx) {			/* start index gt count of entries? */
    OSEnumDone(idir);
    return(aeObjectNotFound);		/* yes... object not found then */
  }

  cntptr = &r[ENUR_ACTCNT_OFF];		/* address of packed actcnt word */

  len = htonPackX(EnumPackR,(byte *)&enpr,r);

  /* starting with the file/directory at stidx, load upto reqcnt
   * entries into the reply buffer.  The size of the reply buffer must
   * not exceed maxreply bytes.  Do not include a file/directory if
   * the associated bitmap is zero.
   */

  for (idx=stidx,cnt=0; idx <= maxidx && cnt < reqcnt; idx++) {
    elen = EnumPack(idir,&fdp,ivol,idx,&r[len]);
    if (elen > 0) {			/* something packed for this entry? */
      if (len+elen > maxreply)		/* yes... check if overflow */
	break;				/* yes.. break out */
      cnt++;				/* else include entry in count */
      len += elen;			/* include entry in len */
      if (len > maxreply-30)		/* if close to the limit */
	break;				/*  then break out now */
    }
  }

  OSEnumDone(idir);			/* finished with enumerate */

  if (cnt == 0)				/* filter tossed all */
    return(aeObjectNotFound);

  PackWord(cnt,cntptr);			/* pack the actual count */
  *rl = len;				/* length of packet for reply */

  if (DBDIR)
    printf("OSEnum: maxreply=%d, ourreply=%d, reqcnt=%d, ourcnt=%d\n",
	   maxreply,len,reqcnt,cnt);
  
  return(noErr);			/* all ok */
}

/*
 * int EnumPack(IDirP ipdir, FileDirParm *fdp, int ivol, 
 *		int idx, byte *r);
 *
 * Pack a single enumeration entry as specified by the enumeration
 * idx and the enumeration direcotry ipdir.
 *
 * Fetch file/directory information for the entry as specified by
 * the parent directory (ipdir), the volume (ivol), and the name
 * from enumeration index (idx).
 *
 * If the file bitmap passed in fdp is zero and the entry is a file
 * then return 0.  If the directory bitmap passed in fdp is zero and
 * the entry is a directory then return 0.  
 *
 * In the normal case pack a length byte, directory flag byte, and
 * the file/directory information as specified by the fdp bitmaps
 * int r and return the length of of this entry.
 *
 */ 

private int
EnumPack(ipdir,fdp,ivol,idx,r)
IDirP ipdir;
FileDirParm *fdp;
int ivol,idx;
byte *r;
{
  char *fn;
  int len;
  int err;

  fn = (char *) OSEnumGet(ipdir,idx);	/* get the file name */
  /* and the info for this entry (nildir - no info on whether */
  /* directory or not) */
  err = OSFileDirInfo(ipdir,NILDIR,fn,fdp,ivol);
  if (err == aeAccessDenied)		/* if no access */
    return(0);				/*  then forget the entry */

  if (FDP_ISDIR(fdp->fdp_flg)) {	/* if a directory */
    if (fdp->fdp_dbitmap == 0)		/*  and dir bitmap is zero */
      return(0);			/*  then skip the entry */
    len = htonPackX(DirPackR,(byte *) fdp,r+2);	/* else pack */
  }  else {				/* else, if a file */
    if (fdp->fdp_fbitmap == 0)		/*  and file bitmap is zero  */
      return(0);			/*  then skip the entry */
    len = htonPackX(FilePackR,(byte *) fdp,r+2); /* else pack */
  }

  len += 2;				/* include size, flg into sum */
  if ((len % 2) != 0)			/* if odd number of bytes */
    r[len++] = 0;			/* then even out the length */
  r[0] = (byte) len;			/* store length of structure */
  r[1] = fdp->fdp_flg;			/* directory flag */
  return(len);				/* return length of this item */
}

/*ARGSUSED*/
OSErr
FPSetDirParms(p,l,r,rl)
byte *p,*r;
int l;
int *rl;
{
  SetDirParmsPkt sdp;
  FileDirParm fdp;
  IDirP ipdir,idir;
  int ivol,len,err;
  char file[MAXUFLEN];

  len = ntohPackX(PsSetDirParms,p,l,(byte *) &sdp);
  ntohPackXbitmap(ProtoDirAttr,p+len,l-len,
		  (byte *) &fdp,sdp.sdp_bitmap);

  err = EtoIfile(file,&idir,&ipdir,&ivol,sdp.sdp_dirid,
		 sdp.sdp_volid,sdp.sdp_ptype,sdp.sdp_path);
  if (err != noErr)
    return(err);  

  fdp.fdp_dbitmap = sdp.sdp_bitmap;	/* using this bitmap  */

  if (DBDIR) 
    printf("FPSetDirParms: path=%s, file=%s, bm=%d\n",
	   pathstr(ipdir),file,sdp.sdp_bitmap);

  err = OSSetDirParms(ipdir,file,&fdp);	/* set dirparms */
  if (err == noErr)
    VolModified(ivol);
  return(err);
}
  
OSErr 
FPOpenDir()
{
  return(aeParamErr);
}


OSErr 
FPCloseDir()
{
  return(aeParamErr);
}


OSErr
FPCreateDir(p,l,r,rl)
byte *p,*r;
int l;
int *rl;
{
  CreateDirPkt crd;
  IDirP idir,ipdir;
  int ivol,err;
  char file[MAXUFLEN];

  ntohPackX(PsCreateDir,p,l,(byte *) &crd);

  err = EtoIfile(file,&idir,&ipdir,&ivol,crd.crd_dirid,
		 crd.crd_volid,crd.crd_ptype,crd.crd_path);
  if (err != noErr)
    return(err);

  if (DBFIL)
    printf("FPCreateDir: create path=%s name=%s\n",pathstr(ipdir),file);

  if ((err = OSCreateDir(ipdir,file, &idir)) == noErr) {
    PackDWord(ItoEdirid(idir,ivol),r);
    *rl = 4;
  }
  if (err == noErr)			/* if success  */
    VolModified(ivol);			/*  then volume modified */
  return(err);
}


/*
 * Preliminary version - just does files
 *
*/

/*ARGSUSED*/
OSErr
FPSetFileDirParms(p,l,r,rl)
byte *p, *r;
int l;
int *rl;
{
  SetFileDirParmsPkt scp;
  FileDirParm fdp;
  IDirP idir,ipdir;
  char file[MAXUFLEN];
  int ivol,len,err;

  len = ntohPackX(PsSetFileDirParms,p,l,(byte *) &scp);
  ntohPackXbitmap(ProtoFileDirAttr,p+len,l-len,(byte *) &fdp,scp.scp_bitmap);

  err = EtoIfile(file,&idir,&ipdir,&ivol,scp.scp_dirid,
		 scp.scp_volid,scp.scp_ptype,scp.scp_path);
  if (err != noErr)
    return(err);

  fdp.fdp_dbitmap = fdp.fdp_fbitmap = scp.scp_bitmap;

  if (DBFIL) 
    printf("FPSetFileDirParms: setting bm=%d for %s %s\n",
	   scp.scp_bitmap,pathstr(ipdir),file);

  return(OSSetFileDirParms(ipdir,idir,file,&fdp));
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.