-/* ---------------------------- */
-struct dir *
- adddir( vol, dir, path)
-struct vol *vol;
-struct dir *dir;
-struct path *path;
-{
- struct dir *cdir, *edir;
- int upathlen;
- char *name;
- char *upath;
-#ifndef USE_LASTDID
- struct stat lst, *lstp;
-#endif /* USE_LASTDID */
- struct stat *st;
-
- upath = path->u_name;
- name = path->m_name;
- st = &path->st;
- upathlen = strlen(upath);
- if ((cdir = dirnew(name, upath)) == NULL) {
- LOG(log_error, logtype_afpd, "adddir: malloc: %s", strerror(errno) );
- return NULL;
- }
-
- cdir->d_did = 0;
-
-#ifdef CNID_DB
- /* add to cnid db */
- cdir->d_did = cnid_add(vol->v_db, st, dir->d_did, upath,
- upathlen, cdir->d_did);
- /* Fail out if things go bad with CNID. */
- if (cdir->d_did == CNID_INVALID) {
- switch (errno) {
- case CNID_ERR_PARAM:
- LOG(log_error, logtype_afpd, "adddir: Incorrect parameters passed to cnid_add");
- return NULL;
- case CNID_ERR_PATH:
- case CNID_ERR_DB:
- case CNID_ERR_MAX:
- return NULL;
- }
- }
-#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;
- /* the old way of doing DIDs (default) */
- cdir->d_did = htonl( CNID(lstp, 0) );
-#endif /* USE_LASTDID */
- }
-
- if ((edir = dirinsert( vol, cdir ))) {
- edir->d_m_name = cdir->d_m_name;
- edir->d_u_name = cdir->d_u_name;
- free(cdir);
- cdir = edir;
- }
-
- /* parent/child directories */
- cdir->d_parent = dir;
- dirchildadd(dir, cdir);
- return( cdir );
-}