blob: adc87f30db38d7723620864617afceae62cf4703 [file] [log] [blame]
/*
* Copyright (c) 1989, 1990, 1991 by the University of Washington
*
* For copying and distribution information, please see the file
* <copyright.h>.
*
* v1.2.0 - 11/19/91 (mmt) - added MSDOS & OS2 stuff
* v1.1.2 - 08/30/91 (bpk) - added VMS support
* v1.1.1 - 08/20/91 (bpk) - 4.2 -> 4.2B
*/
#include <copyright.h>
#ifdef VMS
# include <vms.h>
#else /* not VMS */
# ifndef _TYPES_
# include <sys/types.h>
# endif /* _TYPES_ */
# ifndef IN_H
# include <netinet/in.h>
# define IN_H
# endif
#endif /* VMS */
#ifndef NULL
# ifdef MSDOS
# include <stdio.h>
# else
# define NULL 0
# endif /* MSDOS */
#endif /* NULL */
#define PFS_RELEASE "Beta.4.2D"
/* moved up for vdir_init */
#define ZERO(p) bzero((char *)(p), sizeof(*(p)))
/* General Definitions */
#define MAX_PTXT_LEN 1250 /* Max length of PTEXT structure */
#define MAX_PTXT_HDR 32 /* Max offset for start */
#define P_ERR_STRING_SZ 100 /* Size of error string */
#define MAX_VPATH 1024 /* Max length of virtual pathname */
/* Definition of text structure used to pass text around */
struct ptext {
int length; /* Length of text (from start) */
char *start; /* Start of text */
char dat[MAX_PTXT_LEN+2*MAX_PTXT_HDR];/* The data itself */
unsigned long mbz; /* ZERO to catch runaway strings */
struct ptext *previous; /* Previous element in list */
struct ptext *next; /* Next element in linked list */
int seq; /* Sequence Number */
};
typedef struct ptext *PTEXT;
typedef struct ptext PTEXT_ST;
/* Request structure: maintains information about server requests */
struct preq {
int cid; /* Connection ID */
short priority; /* Connection priority */
int pf_priority; /* Priority assigned by pri_func */
int recv_tot; /* Total # of packets received */
int trns_tot; /* Total # of packets to transmit */
struct ptext *cpkt; /* Current packet being filled in */
struct ptext *recv; /* Received packets */
struct ptext *trns; /* Transmitted packets */
int rcvd_thru; /* Received all packets through # */
struct preq *previous; /* Previous element in list */
struct preq *next; /* Next element in linked list */
struct sockaddr_in fromto; /* Sender/Destination */
};
typedef struct preq *PREQ;
typedef struct preq PREQ_ST;
/* Definition of structure containing information on virtual link */
struct vlink {
int dontfree; /* Flag: don't free this link */
char *name; /* Component of path name */
char linktype; /* L = Link, U = Union, N= Native */
int expanded; /* Has a union link been expanded */
char *type; /* Type of object pointed to */
struct vlink *filters; /* Filters associated with link */
struct vlink *replicas; /* Replicas (* see comment below) */
char *hosttype; /* Type of hostname */
char *host; /* Files physical location */
char *nametype; /* Type of filename */
char *filename; /* System level filename */
long version; /* Version number of destination */
long f_magic_no; /* File's magic number */
struct acl *acl; /* ACL for link */
long dest_exp; /* Expiration for dest of link */
long link_exp; /* Expiration of link itself */
char *args; /* Arguments if this is a filter */
struct pattrib *lattrib; /* Attributes associated w/ link */
struct pfile *f_info; /* Info to be assoicated w/ file */
struct vlink *previous; /* Previous elt in linked list */
struct vlink *next; /* Next element in linked list */
};
typedef struct vlink *VLINK;
typedef struct vlink VLINK_ST;
/* * Note that vlink->replicas is not really a list of replicas of the */
/* object. Instead, it is a list of the objects returned during name */
/* resolution that share the same name as the current object. Such */
/* an object should only be considered a replica if it also shares */
/* the same non-zero magic number. */
/* Definition of structure continiaing virtual directory information */
struct vdir {
int version; /* Version of local directory fmt */
int inc_native; /* Include the native directory */
long magic_no; /* Magic number of current file */
struct acl *dacl; /* Default acl for links in dir */
struct pfile *f_info; /* Directory file info */
struct vlink *links; /* The directory entries */
struct vlink *lastlink; /* Last directory entry */
struct vlink *ulinks; /* The entries for union links */
struct vdir *previous; /* Previous element in linked list */
struct vdir *next; /* Next element in linked list */
};
typedef struct vdir *VDIR1;
typedef struct vdir VDIR_ST;
/* Initialize directory */
#define vdir_init(dir) ZERO(dir)
/* XXX: was
dir->version = 0; dir->inc_native = 0; \
dir->magic_no = 0; dir->f_info = NULL; \
dir->links = NULL; dir->lastlink = NULL; \
dir->ulinks = NULL; dir->dacl = NULL; \
dir->previous = NULL; dir->next = NULL;
*/
#define vdir_copy(d1,d2) d2->version = d1->version; \
d2->inc_native = d1->inc_native; \
d2->magic_no = d1->magic_no; \
d2->f_info = d1->f_info; \
d2->links = d1->links; \
d2->lastlink = d1->lastlink; \
d2->ulinks = d1->ulinks; \
d2->dacl = d1->dacl; \
d2->previous = d1->previous; \
d2->next = d1->next;
/* Values of ->inc_native in vdir structure */
#define VDIN_REALONLY -1 /* Include native files, but not . and .. */
#define VDIN_NONATIVE 0 /* Do not include files from native directory */
#define VDIN_INCLNATIVE 1 /* Include files from native directory */
#define VDIN_NATIVEONLY 2 /* All entries in directory are from native dir */
#define VDIN_PSEUDO 3 /* Directory is not real */
/* Definition of structure containing information on a specific file */
union avalue {
char *ascii; /* Character string */
struct vlink *link; /* A link */
};
struct pattrib {
char precedence; /* Precedence for link attribute */
char *aname; /* Name of the attribute */
char *avtype; /* Type of the attribute value */
union avalue value; /* Attribute Value */
struct pattrib *previous; /* Previous element in linked list */
struct pattrib *next; /* Next element in linked list */
};
typedef struct pattrib *PATTRIB;
typedef struct pattrib PATTRIB_ST;
#define ATR_PREC_OBJECT 'O' /* Authoritative answer for object */
#define ATR_PREC_LINK 'L' /* Authoritative answer for link */
#define ATR_PREC_CACHED 'C' /* Object info cached w/ link */
#define ATR_PREC_REPLACE 'R' /* From link (replaces O) */
#define ATR_PREC_ADD 'A' /* From link (additional value) */
/* **** Incomplete **** */
struct pfile {
int version; /* Version of local finfo format */
long f_magic_no; /* Magic number of current file */
long exp; /* Expiration date of timeout */
long ttl; /* Time to live after reference */
long last_ref; /* Time of last reference */
struct vlink *forward; /* List of forwarding pointers */
struct vlink *backlinks; /* Partial list of back links */
struct pattrib *attributes; /* List of file attributes */
struct pfile *previous; /* Previous element in linked list */
struct pfile *next; /* Next element in linked list */
};
typedef struct pfile *PFILE;
typedef struct pfile PFILE_ST;
/* Definition of structure contining an access control list entry */
struct acl {
int acetype; /* Access Contol Entry type */
char *atype; /* Authentication type */
char *rights; /* Rights */
char *principals; /* Authorized principals */
struct restrict_ *restrictions; /* Restrictions on use */
struct acl *previous; /* Previous elt in linked list */
struct acl *next; /* Next element in linked list */
};
typedef struct acl *ACL;
typedef struct acl ACL_ST;
#define ACL_NONE 0 /* Nobody authorized by ths entry */
#define ACL_DEFAULT 1 /* System default */
#define ACL_SYSTEM 2 /* System administrator */
#define ACL_OWNER 3 /* Directory owner */
#define ACL_DIRECTORY 4 /* Same as directory */
#define ACL_ANY 5 /* Any user */
#define ACL_AUTHENT 6 /* Authenticated principal */
#define ACL_LGROUP 7 /* Local group */
#define ACL_GROUP 8 /* External group */
#define ACL_ASRTHOST 10 /* Check host and asserted userid */
#define ACL_TRSTHOST 11 /* ASRTHOST from privileged port */
/* Definition of structure contining access restrictions */
/* for future extensions */
struct restrict_ {
struct acl *previous; /* Previous elt in linked list */
struct acl *next; /* Next element in linked list */
};
/* Definitions for send_to_dirsrv */
#define CLIENT_DIRSRV_TIMEOUT 4 /* time between retries */
#define CLIENT_DIRSRV_BACKOFF(x) (2 * x) /* Backoff algorithm */
#define CLIENT_DIRSRV_RETRY 3 /* retry this many times */
/* Definitions for rd_vlink and rd_vdir */
#define SYMLINK_NESTING 10 /* Max nesting depth for sym links */
/* Definition fo check_acl */
#define ACL_NESTING 10 /* Max depth for ACL group nesting */
/* Flags for mk_vdir */
#define MKVD_LPRIV 1 /* Minimize privs for creator in new ACL */
/* Flags for get_vdir */
#define GVD_UNION 0 /* Do not expand union links */
#define GVD_EXPAND 1 /* Expand union links locally */
#define GVD_LREMEXP 3 /* Request remote expansion of local links */
#define GVD_REMEXP 7 /* Request remote expansion of all links */
#define GVD_VERIFY 8 /* Only verify args are for a directory */
#define GVD_FIND 16 /* Stop expanding when match is found */
#define GVD_ATTRIB 32 /* Request attributes from remote server */
#define GVD_NOSORT 64 /* Do not sort links when adding to dir */
/* Flags for rd_vdir */
#define RVD_UNION GVD_UNION
#define RVD_EXPAND GVD_EXPAND
#define RVD_LREMEXP GVD_LREMEXP
#define RVD_REMEXP GVD_REMEXP
#define RVD_DFILE_ONLY GVD_VERIFY /* Only return ptr to dir file */
#define RVD_FIND GVD_FIND
#define RVD_ATTRIB GVD_ATTRIB
#define RVD_NOSORT GVD_NOSORT
#define RVD_NOCACHE 128
/* Flags for add_vlink */
#define AVL_UNION 1 /* Link is a union link */
/* Flags for vl_insert */
#define VLI_NOCONFLICT 0 /* Do not insert links w/ conflicting names */
#define VLI_ALLOW_CONF 1 /* Allow links with conflicting names */
#define VLI_NOSORT 2 /* Allow conflicts and don't sort */
/* Flags for mapname */
#define MAP_READWRITE 0 /* Named file to be read and written */
#define MAP_READONLY 1 /* Named file to be read only */
/* Flags for modify_acl */
#define MACL_NOSYSTEM 0x01
#define MACL_NOSELF 0x02
#define MACL_DEFAULT 0x08
#define MACL_SET 0x0C
#define MACL_INSERT 0x14
#define MACL_DELETE 0x10
#define MACL_ADD 0x1C
#define MACL_SUBTRACT 0x18
#define MACL_LINK 0x00
#define MACL_DIRECTORY 0x20
#define MACL_OBJECT 0x60
#define MACL_INCLUDE 0x40
#define MACL_OP (MACL_DEFAULT|MACL_SET|MACL_INSERT|\
MACL_DELETE|MACL_ADD|MACL_SUBTRACT)
#define MACL_OTYPE (MACL_LINK|MACL_DIRECTORY|MACL_OBJECT|MACL_INCLUDE)
/* Access methods returned by Pget_am */
#define P_AM_ERROR 0
#define P_AM_FTP 1
#define P_AM_AFTP 2 /* Anonymous FTP */
#define P_AM_NFS 4
#define P_AM_KNFS 8 /* Kerberized NFS */
#define P_AM_AFS 16
/* Return codes */
#define PSUCCESS 0
#define PFAILURE 255
/* Hush up warnings. */
void vllfree();
/* Procedures in libpfs.a */
char *pget_wdhost(), *pget_wdfile(), *pget_wd(), *pget_hdhost();
char *pget_hdfile(), *pget_hd(), *pget_rdhost(), *pget_rdfile();
char *pget_dhost(), *pget_dfile(), *pget_vsname(), *nlsindex();
char *sindex(), *strtok(), *nxtline(), *unquote(), *stcopy();
char *stcopyr(), *readheader(), *month_sname();
long asntotime();
void procquery(char *host,char *str,int max_hits,int offset,
char query_type,int sortflag,int listflag);
PTEXT ptalloc();
PTEXT dirsend();
void ptfree();
void ptlfree();
PREQ pralloc();
PREQ get_next_request();
VLINK rd_slink();
VLINK rd_vlink();
VLINK vl_delete();
VLINK vlalloc();
VLINK vlcopy();
void vlfree();
PFILE pfalloc();
PATTRIB parse_attribute();
PATTRIB atalloc();
PATTRIB pget_at();
void atfree();
void atlfree();
ACL acalloc();
ACL get_acl();
void stfree();
/* Miscellaneous useful definitions */
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#define AUTHORIZED 1
#define NOT_AUTHORIZED 0
#define NEG_AUTHORIZED -1
#ifndef NULL
#define NULL 0
#endif
#define FAILED -1