/*
- * $Id: enumerate.c,v 1.15 2002-01-24 16:32:12 jmarcus Exp $
+ * $Id: enumerate.c,v 1.16 2002-01-29 21:12:14 jmarcus Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
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_MAX) {
- switch (cdir->d_did) {
+ if (cdir->d_did < 0) {
+ switch (errno) {
case CNID_ERR_PARAM:
LOG(log_error, logtype_default, "adddir: Incorrect parameters passed to cnid_add");
return NULL;
/*
- * $Id: file.c,v 1.37 2002-01-20 01:32:45 jmarcus Exp $
+ * $Id: file.c,v 1.38 2002-01-29 21:12:14 jmarcus Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
aint = cnid_add(vol->v_db, st, dir->d_did, upath,
strlen(upath), aint);
/* Throw errors if cnid_add fails. */
- if (aint > CNID_MAX) {
- switch (aint) {
+ if (aint < 0) {
+ switch (errno) {
case CNID_ERR_PARAM:
LOG(log_error, logtype_default, "getfilparams: Incorrect parameters passed to cnid_add");
return(AFPERR_PARAM);
/*
- * $Id: fork.c,v 1.18 2002-01-20 01:34:40 jmarcus Exp $
+ * $Id: fork.c,v 1.19 2002-01-29 21:12:14 jmarcus Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
aint = cnid_add(ofork->of_vol->v_db, &st,
ofork->of_dir->d_did,
upath, strlen(upath), aint);
- if (aint > CNID_MAX) {
- switch (aint) {
+ if (aint < 0) {
+ switch (errno) {
case CNID_ERR_PARAM:
LOG(log_error, logtype_default, "getforkparams: Incorrect parameters passed to cnid_add");
return(AFPERR_PARAM);
#define CNID_ERR_DB 0x80000003
#define CNID_ERR_MAX 0x80000004
-#define CNID_MAX 0x80000000
-
typedef u_int32_t cnid_t;
/* cnid_open.c */
/*
- * $Id: cnid_add.c,v 1.26 2002-01-24 15:15:48 jmarcus Exp $
+ * $Id: cnid_add.c,v 1.27 2002-01-29 21:12:18 jmarcus Exp $
*
* Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT.
int rc;
if (!(db = CNID) || !st || !name) {
- return CNID_ERR_PARAM;
+ errno = CNID_ERR_PARAM;
+ return -1;
}
/* Do a lookup. */
if ((data.data = make_cnid_data(st, did, name, len)) == NULL) {
LOG(log_error, logtype_default, "cnid_add: Path name is too long");
- return CNID_ERR_PATH;
+ errno = CNID_ERR_PATH;
+ return -1;
}
data.size = CNID_HEADER_LEN + len + 1;
default:
LOG(log_error, logtype_default, "cnid_add: Unable to add CNID %u: %s",
ntohl(hint), db_strerror(rc));
- return CNID_ERR_DB;
+ errno = CNID_ERR_DB;
+ return -1;
case 0:
#ifdef DEBUG
LOG(log_info, logtype_default, "cnid_add: Used hint for did %u, name %s as %u",
retry:
if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
LOG(log_error, logtype_default, "cnid_add: Failed to begin transaction: %s", db_strerror(rc));
- return CNID_ERR_DB;
+ errno = CNID_ERR_DB;
+ return -1;
}
/* Get the key. */
case DB_LOCK_DEADLOCK:
if ((rc = txn_abort(tid)) != 0) {
LOG(log_error, logtype_default, "cnid_add: txn_abort: %s", db_strerror(rc));
- return CNID_ERR_DB;
+ errno = CNID_ERR_DB;
+ return -1;
}
goto retry;
case 0:
memcpy(&hint, rootinfo_data.data, sizeof(hint));
id = ntohl(hint);
- /* If we've hit the MAX CNID allowed, we return a fatal error. CNID
+ /* If we've hit the max CNID allowed, we return a fatal error. CNID
* needs to be recycled before proceding. */
- if (++id == CNID_MAX) {
+ if (++id == CNID_INVALID) {
txn_abort(tid);
LOG(log_error, logtype_default, "cnid_add: FATAL: Cannot add CNID for %s. CNID database has reached its limit.", name);
- return CNID_ERR_MAX;
+ errno = CNID_ERR_MAX;
+ return -1;
}
hint = htonl(id);
#ifdef DEBUG
case DB_LOCK_DEADLOCK:
if ((rc = txn_abort(tid)) != 0) {
LOG(log_error, logtype_default, "cnid_add: txn_abort: %s", db_strerror(rc));
- return CNID_ERR_DB;
+ errno = CNID_ERR_DB;
+ return -1;
}
goto retry;
case 0:
/* The transaction finished, commit it. */
if ((rc = txn_commit(tid, 0)) != 0) {
LOG(log_error, logtype_default, "cnid_add: Unable to commit transaction: %s", db_strerror(rc));
- return CNID_ERR_DB;
+ errno = CNID_ERR_DB;
+ return -1;
}
break;
default:
rc = add_cnid(db, &key, &data);
if (rc) {
LOG(log_error, logtype_default, "cnid_add: Failed to add CNID for %s to database using hint %u: %s", name, ntohl(hint), db_strerror(rc));
- return CNID_ERR_DB;
+ errno = CNID_ERR_DB;
+ return -1;
}
#ifdef DEBUG
cleanup_abort:
txn_abort(tid);
- return CNID_ERR_DB;
+ errno = CNID_ERR_DB;
+ return -1;
}
#endif /* CNID_DB */
/*
- * $Id: cnid_close.c,v 1.20 2002-01-19 21:42:08 jmarcus Exp $
+ * $Id: cnid_close.c,v 1.21 2002-01-29 21:12:18 jmarcus Exp $
*/
#ifdef HAVE_CONFIG_H
LOG(log_error, logtype_default, "cnid_close: Failed to open database closing lock file: %s", strerror(errno));
}
}
+ (void)remove(db->lock_file);
}
db->db_didname->close(db->db_didname, 0);
/*
- * $Id: cnid_open.c,v 1.36 2002-01-24 16:22:16 jmarcus Exp $
+ * $Id: cnid_open.c,v 1.37 2002-01-29 21:12:18 jmarcus Exp $
*
* Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT.
static int have_lock = 0;
void *cnid_open(const char *dir) {
- struct stat st, rsb, csb;
+ struct stat st, rsb, lsb, csb;
struct flock lock;
char path[MAXPATHLEN + 1];
char recover_file[MAXPATHLEN + 1];
DB_TXN *tid;
u_int32_t DBEXTRAS = 0;
int open_flag, len;
+ int no_recover_flag = 0;
int rc, rfd = -1;
if (!dir) {
* NOTE: This won't work if multiple volumes for the same user refer
* to the sahe directory. */
strcat(path, DBLOCKFILE);
+ strcpy(db->lock_file, path);
+ if (stat(path, &lsb) == 0) {
+ no_recover_flag = 1;
+ }
if ((db->lockfd = open(path, O_RDWR | O_CREAT, 0666)) > -1) {
lock.l_start = 0;
lock.l_len = 1;
/* Create a file to represent database recovery. While this file
* exists, the database is being recovered, and all other clients will
* select until recovery is complete, and this file goes away. */
- if (!have_lock && db->lockfd > -1 && lock.l_start == 0) {
+ if (!have_lock && db->lockfd > -1 && lock.l_start == 0 &&
+ no_recover_flag == 0) {
if (stat(recover_file, &rsb) == 0) {
(void)remove(recover_file);
}
/*
- * $Id: cnid_private.h,v 1.6 2002-01-18 05:19:26 jmarcus Exp $
+ * $Id: cnid_private.h,v 1.7 2002-01-29 21:12:18 jmarcus Exp $
*/
#ifndef LIBATALK_CNID_PRIVATE_H
#define CNID_HEADER_LEN (CNID_DEVINO_LEN + CNID_DID_LEN)
#define CNID_START 17
+#define CNID_INVALID 0
#define CNIDFLAG_ROOTINFO_RO (1 << 0)
#define CNIDFLAG_DB_RO (1 << 1)
DB_ENV* dbenv;
int lockfd, flags;
char close_file[MAXPATHLEN + 1];
+ char lock_file[MAXPATHLEN + 1];
} CNID_private;
/* on-disk data format (in network byte order where appropriate) --