+/*
+ * FIXME: PDINFO is UTF8 and doesn't need adp
+*/
+#define PARAM_NEED_ADP(b) ((b) & ((1 << FILPBIT_ATTR) |\
+ (1 << FILPBIT_CDATE) |\
+ (1 << FILPBIT_MDATE) |\
+ (1 << FILPBIT_BDATE) |\
+ (1 << FILPBIT_FINFO) |\
+ (1 << FILPBIT_RFLEN) |\
+ (1 << FILPBIT_EXTRFLEN) |\
+ (1 << FILPBIT_PDINFO) |\
+ (1 << FILPBIT_FNUM) |\
+ (1 << FILPBIT_UNIXPR)))
+
+/* -------------------------- */
+u_int32_t get_id(struct vol *vol, struct adouble *adp, const struct stat *st,
+ const cnid_t did, char *upath, const int len)
+{
+ u_int32_t adcnid;
+ u_int32_t dbcnid = CNID_INVALID;
+
+ if (vol->v_cdb != NULL) {
+ /* prime aint with what we think is the cnid, set did to zero for
+ catching moved files */
+ adcnid = ad_getid(adp, st->st_dev, st->st_ino, 0, vol->v_stamp);
+
+ dbcnid = cnid_add(vol->v_cdb, st, did, upath, len, adcnid);
+ /* Throw errors if cnid_add fails. */
+ if (dbcnid == CNID_INVALID) {
+ switch (errno) {
+ case CNID_ERR_CLOSE: /* the db is closed */
+ break;
+ case CNID_ERR_PARAM:
+ LOG(log_error, logtype_afpd, "get_id: Incorrect parameters passed to cnid_add");
+ afp_errno = AFPERR_PARAM;
+ return CNID_INVALID;
+ case CNID_ERR_PATH:
+ afp_errno = AFPERR_PARAM;
+ return CNID_INVALID;
+ default:
+ afp_errno = AFPERR_MISC;
+ return CNID_INVALID;
+ }
+ }
+ else if (adp && (adcnid != dbcnid)) {
+ /* Update the ressource fork. For a folder adp is always null */
+ LOG(log_debug, logtype_afpd, "get_id: calling ad_setid. adcnid: %u, dbcnid: %u", htonl(adcnid), htonl(dbcnid));
+ if (ad_setid(adp, st->st_dev, st->st_ino, dbcnid, did, vol->v_stamp)) {
+ ad_flush(adp);
+ }
+ }
+ }
+ return dbcnid;
+}
+