-/* check for mtab DID code */
-#ifdef DID_MTAB
-#include "parse_mtab.h"
-#endif /* DID_MTAB */
-
-struct dir *
-adddir( vol, dir, name, namlen, upath, upathlen, st )
- struct vol *vol;
- struct dir *dir;
- char *name, *upath;
- int namlen, upathlen;
- struct stat *st;
-{
- struct dir *cdir, *edir;
-#if AD_VERSION > AD_VERSION1
- struct adouble ad;
-#endif /* AD_VERSION > AD_VERSION1 */
-
-#ifndef USE_LASTDID
- struct stat lst, *lstp;
-#endif /* USE_LASTDID */
-
- if ((cdir = dirnew(namlen + 1)) == NULL) {
- syslog( LOG_ERR, "adddir: malloc: %m" );
- return NULL;
- }
- strcpy( cdir->d_name, name );
- cdir->d_name[namlen] = '\0';
-
- cdir->d_did = 0;
-
-#ifdef CNID_DB
- /* find out if we have a fixed did already */
- cdir->d_did = cnid_lookup(vol->v_db, st, dir->d_did, upath,
- upathlen);
-#endif /* CNID_DB */
-
- if (cdir->d_did == 0) {
-#if AD_VERSION > AD_VERSION1
- memset(&ad, 0, sizeof(ad));
- if (ad_open(upath, ADFLAGS_HF|ADFLAGS_DIR, O_RDONLY, 0, &ad) < 0) {
- /* if we can't parse the AppleDouble header, return 0 for the DID */
- cdir->d_did = 0;
- } else {
- /* ... else retrieve the DID entry into cdir->d_did */
- memcpy(&cdir->d_did, ad_entry(&ad, ADEID_DID), sizeof(cdir->d_did));
- ad_close(&ad, ADFLAGS_HF);
- }
-#endif /* AD_VERSION */
-
-#ifdef CNID_DB
- /* add to cnid db */
- cdir->d_did = cnid_add(vol->v_db, st, dir->d_did, upath,
- upathlen, cdir->d_did);
-#endif /* CNID_DB */
- }
-
- if (cdir->d_did == 0) {
-#ifdef USE_LASTDID
- /* last way of doing DIDs */
- cdir->d_did = htonl( vol->v_lastdid++ );
-#else /* USE_LASTDID */
- lstp = lstat(upath, &lst) < 0 ? st : &lst;
-#ifdef DID_MTAB
- /* mtab way of doing DIDs */
- cdir->d_did = htonl( afpd_st_cnid ( lstp ) );
-#else /* DID_MTAB */
- /* the old way of doing DIDs (default) */
- cdir->d_did = htonl( CNID(lstp, 0) );
-#endif /* DID_MTAB */
-#endif /* USE_LASTDID */
- }
-
- if ((edir = dirinsert( vol, cdir ))) {
- if (edir->d_name) {
- if (strcmp(edir->d_name, cdir->d_name)) {
- syslog(LOG_INFO, "WARNING: DID conflict for '%s' and '%s'. Are these the same file?", edir->d_name, cdir->d_name);
- }
- free(cdir->d_name);
- free(cdir);
- return edir;
- }
- edir->d_name = cdir->d_name;
- free(cdir);
- cdir = edir;
- }
-
- /* parent/child directories */
- cdir->d_parent = dir;
- dirchildadd(dir, cdir);
- return( cdir );
-}