pfs.h
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:14k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1989, 1990, 1991 by the University of Washington
  3.  *
  4.  * For copying and distribution information, please see the file
  5.  * <copyright.h>.
  6.  */
  7. #include <copyright.h>
  8. #include <sys/types.h>
  9. #include <netinet/in.h>
  10. #ifndef NULL
  11. # define NULL 0
  12. #endif /* NULL */
  13. #define PFS_RELEASE "Beta.4.2E"
  14. #define PFS_SW_ID "B42E"
  15. /* moved up for vdir_init */
  16. #define ZERO(p) bzero((char *)(p), sizeof(*(p)))
  17. /* General Definitions */
  18. #define MAX_PTXT_LEN 1250     /* Max length of PTEXT structure   */
  19. #define MAX_PTXT_HDR 32       /* Max offset for start            */
  20. #define P_ERR_STRING_SZ 100  /* Size of error string     */
  21. #define MAX_VPATH 1024  /* Max length of virtual pathname  */
  22. /* Definition of text structure used to pass text around */
  23. struct ptext {
  24.     int length;   /* Length of text (from start)    */
  25.     char *start;   /* Start of text     */
  26.     char dat[MAX_PTXT_LEN+2*MAX_PTXT_HDR];/* The data itself */
  27.     unsigned long  mbz;   /* ZERO to catch runaway strings  */
  28.     struct ptext *previous;        /* Previous element in list       */
  29.     struct ptext *next;   /* Next element in linked list    */
  30.     int seq;   /* Sequence Number     */
  31. };
  32. typedef struct ptext *PTEXT;
  33. typedef struct ptext PTEXT_ST;
  34. /* Request structure: maintains information about server requests */
  35. struct preq {
  36.     int cid;   /* Connection ID                  */
  37.     short priority;   /* Connection priority            */
  38.     int pf_priority;   /* Priority assigned by pri_func  */
  39.     int recv_tot;   /* Total # of packets received    */
  40.     int trns_tot;   /* Total # of packets to transmit */
  41.     struct ptext *cpkt;   /* Current packet being filled in */
  42.     struct ptext *recv;   /* Received packets               */
  43.     struct ptext *trns;   /* Transmitted packets            */
  44.     int rcvd_thru;   /* Received all packets through # */
  45.     struct preq *previous;        /* Previous element in list       */
  46.     struct preq *next;   /* Next element in linked list    */
  47.     struct sockaddr_in fromto;    /* Sender/Destination     */
  48. };
  49. typedef struct preq *PREQ;
  50. typedef struct preq PREQ_ST;
  51. /* Definition of structure containing information on virtual link */
  52. struct vlink {
  53.     int dontfree;   /* Flag: don't free this link     */
  54.     char *name;   /* Component of path name     */
  55.     char linktype;   /* L = Link, U = Union, N= Native */
  56.     int expanded;   /* Has a union link been expanded */
  57.     char *type;            /* Type of object pointed to      */
  58.     struct vlink *filters;   /* Filters associated with link   */
  59.     struct vlink *replicas;   /* Replicas (* see comment below) */
  60.     char *hosttype;   /* Type of hostname     */
  61.     char *host;   /* Files physical location     */
  62.     char *nametype;   /* Type of filename     */
  63.     char *filename;   /* System level filename     */
  64.     long version;   /* Version number of destination  */
  65.     long f_magic_no;   /* File's magic number     */
  66.     struct acl *acl;   /* ACL for link     */
  67.     long dest_exp;   /* Expiration for dest of link    */
  68.     long link_exp;   /* Expiration of link itself      */
  69.     char *args;   /* Arguments if this is a filter  */
  70.     struct pattrib *lattrib;   /* Attributes associated w/ link  */
  71.     struct pfile *f_info;   /* Info to be assoicated w/ file  */
  72.     struct vlink *previous;        /* Previous elt in linked list    */
  73.     struct vlink *next;   /* Next element in linked list    */
  74. };
  75. typedef struct vlink *VLINK;
  76. typedef struct vlink VLINK_ST;
  77. /* * Note that vlink->replicas is not really a list of replicas of the  */
  78. /*   object.  Instead, it is a list of the objects returned during name */
  79. /*   resolution that share the same name as the current object.  Such   */
  80. /*   an object should only be considered a replica if it also shares    */
  81. /*   the same non-zero magic number.                                    */
  82. /* Definition of structure continiaing virtual directory information    */
  83. struct vdir {
  84.     int version;   /* Version of local directory fmt  */
  85.     int inc_native;   /* Include the native directory    */
  86.     long magic_no;   /* Magic number of current file    */
  87.     struct acl *dacl;            /* Default acl for links in dir    */
  88.     struct pfile *f_info;   /* Directory file info             */
  89.     struct vlink *links;   /* The directory entries      */
  90.     struct vlink *lastlink;   /* Last directory entry            */
  91.     struct vlink *ulinks;   /* The entries for union links     */
  92.     struct vdir *previous;        /* Previous element in linked list */
  93.     struct vdir *next;   /* Next element in linked list     */
  94. };
  95. typedef struct vdir *PVDIR;
  96. typedef struct vdir VDIR_ST;
  97. /* Initialize directory */
  98. #define vdir_init(dir)  ZERO(dir)
  99. /* XXX: was
  100.   dir->version = 0;     dir->inc_native = 0; 
  101.   dir->magic_no = 0;    dir->f_info = NULL; 
  102.   dir->links = NULL;    dir->lastlink = NULL; 
  103.   dir->ulinks = NULL;   dir->dacl = NULL; 
  104.   dir->previous = NULL; dir->next = NULL;
  105. */
  106. #define vdir_copy(d1,d2) d2->version = d1->version; 
  107.                          d2->inc_native = d1->inc_native; 
  108.                          d2->magic_no = d1->magic_no; 
  109.       d2->f_info = d1->f_info; 
  110.                          d2->links = d1->links; 
  111.                          d2->lastlink = d1->lastlink; 
  112.                          d2->ulinks = d1->ulinks; 
  113.                          d2->dacl = d1->dacl; 
  114.                          d2->previous = d1->previous; 
  115.                          d2->next = d1->next; 
  116.                          
  117. /* Values of ->inc_native in vdir structure */
  118. #define VDIN_REALONLY -1   /* Include native files, but not . and ..       */
  119. #define VDIN_NONATIVE  0   /* Do not include files from native directory   */
  120. #define VDIN_INCLNATIVE  1   /* Include files from native directory          */
  121. #define VDIN_NATIVEONLY  2   /* All entries in directory are from native dir */
  122. #define VDIN_PSEUDO      3   /* Directory is not real                        */
  123. /* Definition of structure containing information on a specific file */
  124. union avalue {
  125.     char *ascii; /* Character string                */
  126.     struct vlink *link; /* A link    */
  127. };
  128. struct pattrib {
  129.     char precedence; /* Precedence for link attribute   */
  130.     char *aname; /* Name of the attribute           */
  131.     char *avtype; /* Type of the attribute value     */
  132.     union avalue value; /* Attribute Value                 */
  133.     struct pattrib *previous;      /* Previous element in linked list */
  134.     struct pattrib *next; /* Next element in linked list     */
  135. };
  136. typedef struct pattrib *PATTRIB;
  137. typedef struct pattrib PATTRIB_ST;
  138. #define  ATR_PREC_OBJECT  'O'   /* Authoritative answer for object */
  139. #define  ATR_PREC_LINK    'L'   /* Authoritative answer for link   */
  140. #define  ATR_PREC_CACHED  'C'   /* Object info cached w/ link      */
  141. #define  ATR_PREC_REPLACE 'R'   /* From link (replaces O)          */
  142. #define  ATR_PREC_ADD     'A'   /* From link (additional value)    */
  143. /* **** Incomplete **** */
  144. struct pfile {
  145.     int version;   /* Version of local finfo format   */
  146.     long f_magic_no;   /* Magic number of current file    */
  147.     long exp;   /* Expiration date of timeout      */
  148.     long ttl;   /* Time to live after reference    */
  149.     long last_ref;   /* Time of last reference          */
  150.     struct vlink *forward;   /* List of forwarding pointers     */
  151.     struct vlink *backlinks;   /* Partial list of back links      */
  152.     struct pattrib *attributes;   /* List of file attributes         */
  153.     struct pfile *previous;        /* Previous element in linked list */
  154.     struct pfile *next;   /* Next element in linked list     */
  155. };
  156. typedef struct pfile *PFILE;
  157. typedef struct pfile PFILE_ST;
  158. /* Definition of structure contining an access control list entry */
  159. struct acl {
  160.     int acetype;   /* Access Contol Entry type       */
  161.     char *atype;           /* Authentication type            */
  162.     char *rights;          /* Rights                         */
  163.     char *principals;      /* Authorized principals          */
  164.     struct archie_restrict     *restrictions;    /* Restrictions on use            */
  165.     struct acl *previous;        /* Previous elt in linked list    */
  166.     struct acl *next;   /* Next element in linked list    */
  167. };
  168. typedef struct acl *ACL;
  169. typedef struct acl ACL_ST;
  170. #define ACL_NONE 0         /* Nobody authorized by ths entry */
  171. #define ACL_DEFAULT 1         /* System default                 */
  172. #define ACL_SYSTEM 2         /* System administrator           */
  173. #define ACL_OWNER               3         /* Directory owner                */
  174. #define ACL_DIRECTORY           4         /* Same as directory              */
  175. #define ACL_ANY                 5         /* Any user                       */
  176. #define ACL_AUTHENT             6         /* Authenticated principal        */
  177. #define ACL_LGROUP              7         /* Local group                    */
  178. #define ACL_GROUP               8         /* External group                 */
  179. #define ACL_ASRTHOST            10        /* Check host and asserted userid */
  180. #define ACL_TRSTHOST            11        /* ASRTHOST from privileged port  */
  181. /* Definition of structure contining access restrictions */
  182. /* for future extensions                                 */
  183. struct archie_restrict {
  184.     struct acl *previous;        /* Previous elt in linked list    */
  185.     struct acl *next;   /* Next element in linked list    */
  186. };
  187. /* Definitions for send_to_dirsrv */
  188. #define CLIENT_DIRSRV_TIMEOUT 4 /* time between retries      */
  189. #define CLIENT_DIRSRV_BACKOFF(x)  (2 * x) /* Backoff algorithm         */
  190. #define CLIENT_DIRSRV_RETRY 3 /* retry this many times     */
  191. /* Definitions for rd_vlink and rd_vdir */
  192. #define SYMLINK_NESTING 10       /* Max nesting depth for sym links */
  193. /* Definition fo check_acl */
  194. #define ACL_NESTING     10       /* Max depth for ACL group nesting */
  195. /* Flags for mk_vdir */
  196. #define      MKVD_LPRIV     1   /* Minimize privs for creator in new ACL    */
  197. /* Flags for get_vdir */
  198. #define      GVD_UNION      0 /* Do not expand union links       */
  199. #define      GVD_EXPAND     1   /* Expand union links locally      */
  200. #define      GVD_LREMEXP    3   /* Request remote expansion of local links   */
  201. #define      GVD_REMEXP     7   /* Request remote expansion of all links     */
  202. #define      GVD_VERIFY     8 /* Only verify args are for a directory      */
  203. #define      GVD_FIND    16   /* Stop expanding when match is found        */
  204. #define      GVD_ATTRIB    32   /* Request attributes from remote server     */
  205. #define      GVD_NOSORT    64   /* Do not sort links when adding to dir      */
  206. /* Flags for rd_vdir */
  207. #define      RVD_UNION      GVD_UNION
  208. #define      RVD_EXPAND     GVD_EXPAND 
  209. #define      RVD_LREMEXP    GVD_LREMEXP
  210. #define      RVD_REMEXP     GVD_REMEXP
  211. #define      RVD_DFILE_ONLY GVD_VERIFY /* Only return ptr to dir file        */
  212. #define      RVD_FIND       GVD_FIND   
  213. #define      RVD_ATTRIB     GVD_ATTRIB
  214. #define      RVD_NOSORT     GVD_NOSORT
  215. #define      RVD_NOCACHE    128
  216. /* Flags for add_vlink */
  217. #define      AVL_UNION      1   /* Link is a union link                      */
  218. /* Flags for vl_insert */
  219. #define      VLI_NOCONFLICT 0   /* Do not insert links w/ conflicting names  */
  220. #define      VLI_ALLOW_CONF 1   /* Allow links with conflicting names        */
  221. #define      VLI_NOSORT     2   /* Allow conflicts and don't sort            */
  222. /* Flags for mapname */
  223. #define      MAP_READWRITE  0   /* Named file to be read and written         */
  224. #define      MAP_READONLY   1   /* Named file to be read only                */
  225. /* Flags for modify_acl */
  226. #define      MACL_NOSYSTEM   0x01
  227. #define      MACL_NOSELF     0x02
  228. #define      MACL_DEFAULT    0x08
  229. #define      MACL_SET        0x0C
  230. #define      MACL_INSERT     0x14
  231. #define      MACL_DELETE     0x10
  232. #define      MACL_ADD        0x1C
  233. #define      MACL_SUBTRACT   0x18
  234. #define      MACL_LINK       0x00
  235. #define      MACL_DIRECTORY  0x20
  236. #define      MACL_OBJECT     0x60
  237. #define      MACL_INCLUDE    0x40
  238. #define      MACL_OP    (MACL_DEFAULT|MACL_SET|MACL_INSERT|
  239.  MACL_DELETE|MACL_ADD|MACL_SUBTRACT)
  240. #define      MACL_OTYPE (MACL_LINK|MACL_DIRECTORY|MACL_OBJECT|MACL_INCLUDE)
  241. /* Flags for dsrdir */
  242. #define DSRD_ATTRIBUTES                      0x1 /* Fill in attributes for links */
  243. /* Access methods returned by Pget_am */
  244. #define P_AM_ERROR 0
  245. #define P_AM_FTP 1
  246. #define P_AM_AFTP 2  /* Anonymous FTP  */
  247. #define P_AM_NFS 4
  248. #define P_AM_KNFS 8  /* Kerberized NFS */
  249. #define P_AM_AFS        16
  250. /* Return codes */
  251. #define PSUCCESS 0
  252. #define PFAILURE 255
  253. /* Hush up warnings.  */
  254. void vllfree();
  255. /* Procedures in libpfs.a */
  256. char *pget_wdhost(), *pget_wdfile(), *pget_wd(), *pget_hdhost();
  257. char *pget_hdfile(), *pget_hd(), *pget_rdhost(), *pget_rdfile();
  258. char *pget_dhost(), *pget_dfile(), *pget_vsname(), *nlsindex();
  259. char *sindex(), *strtok(), *nxtline(), *unquote(), *stcopy();
  260. char *stcopyr(), *readheader(), *month_sname();
  261. long asntotime();
  262. void procquery();
  263. PTEXT ptalloc();
  264. PTEXT dirsend();
  265. void ptfree();
  266. void ptlfree();
  267. PREQ pralloc();
  268. PREQ get_next_request();
  269. VLINK rd_slink();
  270. VLINK rd_vlink();
  271. VLINK vl_delete();
  272. VLINK vlalloc();
  273. VLINK vlcopy();
  274. void vlfree();
  275. int             vl_comp();
  276. int             vl_equal();
  277. int             vl_insert();
  278. int             ul_insert();
  279. PFILE pfalloc();
  280. PATTRIB         parse_attribute();
  281. PATTRIB         atalloc();
  282. PATTRIB  pget_at();
  283. void atfree();
  284. void atlfree();
  285. ACL             acalloc();
  286. ACL             get_acl();
  287. void stfree();
  288. int             get_vdir();
  289. int             wcmatch();
  290. int             scan_error();
  291. /* Miscellaneous useful definitions */
  292. #ifndef TRUE
  293. #define TRUE 1
  294. #endif
  295. #ifndef FALSE
  296. #define FALSE 0
  297. #endif
  298. #define AUTHORIZED      1
  299. #define NOT_AUTHORIZED  0
  300. #define NEG_AUTHORIZED  -1
  301. #ifndef NULL
  302. #define NULL 0
  303. #endif
  304. #define FAILED -1