This is a better practice than checking to see if the data length was 0.
It now allows for extant but zero-length data to be returned.
13 files changed:
// Then look in the database.
cdb = cdb_fetch(CDB_CONFIG, key, key_len);
// Then look in the database.
cdb = cdb_fetch(CDB_CONFIG, key, key_len);
- if (cdb.len <= 0) { // nope, not there either.
+ if (cdb.ptr == NULL) { // nope, not there either.
cprintf("%d all configuration variables\n", LISTING_FOLLOWS);
cdb_rewind(CDB_CONFIG);
cprintf("%d all configuration variables\n", LISTING_FOLLOWS);
cdb_rewind(CDB_CONFIG);
- while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg.len>0) {
+ while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg.ptr!=NULL) {
if (cdbcfg.len < 1020) {
keylen = strlen(cdbcfg.ptr);
key = cdbcfg.ptr;
if (cdbcfg.len < 1020) {
keylen = strlen(cdbcfg.ptr);
key = cdbcfg.ptr;
cdb_euid = cdb_fetch(CDB_EUIDINDEX, key, key_len);
free(key);
cdb_euid = cdb_fetch(CDB_EUIDINDEX, key, key_len);
free(key);
- if (cdb_euid.len == 0) {
+ if (cdb_euid.ptr == NULL) {
if (IsDirectory(internet_addr, 0) == 0) return(-1);
directory_key(key, internet_addr);
if (IsDirectory(internet_addr, 0) == 0) return(-1);
directory_key(key, internet_addr);
- cdbrec = cdb_fetch(CDB_DIRECTORY, key, strlen(key) );
- if (cdbrec.len == 0) {
+ cdbrec = cdb_fetch(CDB_DIRECTORY, key, strlen(key));
+ if (cdbrec.ptr != NULL) {
if (target != NULL) {
safestrncpy(target, cdbrec.ptr, targbuflen);
}
if (target != NULL) {
safestrncpy(target, cdbrec.ptr, targbuflen);
}
cprintf("%d Who knows room:\n", LISTING_FOLLOWS);
cdb_rewind(CDB_USERS);
cprintf("%d Who knows room:\n", LISTING_FOLLOWS);
cdb_rewind(CDB_USERS);
- while (cdbus = cdb_next_item(CDB_USERS), cdbus.len>0) {
+ while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) {
memset(&temp, 0, sizeof temp);
memcpy(&temp, cdbus.ptr, sizeof temp);
memset(&temp, 0, sizeof temp);
memcpy(&temp, cdbus.ptr, sizeof temp);
// There are unvalidated users. Traverse the user database, and return the first user we find that needs validation.
cdb_rewind(CDB_USERS);
// There are unvalidated users. Traverse the user database, and return the first user we find that needs validation.
cdb_rewind(CDB_USERS);
- while (cdbus = cdb_next_item(CDB_USERS), cdbus.len>0) {
+ while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) {
memset(&usbuf, 0, sizeof(struct ctdluser));
memcpy(&usbuf, cdbus.ptr, ((cdbus.len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus.len));
if ((usbuf.flags & US_NEEDVALID) && (usbuf.axlevel > AxDeleted)) {
memset(&usbuf, 0, sizeof(struct ctdluser));
memcpy(&usbuf, cdbus.ptr, ((cdbus.len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus.len));
if ((usbuf.flags & US_NEEDVALID) && (usbuf.axlevel > AxDeleted)) {
// Now traverse through the visits, purging irrelevant records...
cdb_rewind(CDB_VISIT);
// Now traverse through the visits, purging irrelevant records...
cdb_rewind(CDB_VISIT);
- while(cdbvisit = cdb_next_item(CDB_VISIT), cdbvisit.len>0) {
+ while(cdbvisit = cdb_next_item(CDB_VISIT), cdbvisit.ptr!=NULL) {
memset(&vbuf, 0, sizeof(struct visit));
memcpy(&vbuf, cdbvisit.ptr,
( (cdbvisit.len > sizeof(struct visit)) ?
memset(&vbuf, 0, sizeof(struct visit));
memcpy(&vbuf, cdbvisit.ptr,
( (cdbvisit.len > sizeof(struct visit)) ?
syslog(LOG_DEBUG, "Purge use table: phase 1");
cdb_rewind(CDB_USETABLE);
syslog(LOG_DEBUG, "Purge use table: phase 1");
cdb_rewind(CDB_USETABLE);
- while(cdbut = cdb_next_item(CDB_USETABLE), cdbut.len>0) {
+ while(cdbut = cdb_next_item(CDB_USETABLE), cdbut.ptr!=NULL) {
++total;
if (cdbut.len > sizeof(struct UseTable))
memcpy(&ut, cdbut.ptr, sizeof(struct UseTable));
++total;
if (cdbut.len > sizeof(struct UseTable))
memcpy(&ut, cdbut.ptr, sizeof(struct UseTable));
// Phase 1: traverse through the table, discovering old records...
syslog(LOG_DEBUG, "Purge EUID index: phase 1");
cdb_rewind(CDB_EUIDINDEX);
// Phase 1: traverse through the table, discovering old records...
syslog(LOG_DEBUG, "Purge EUID index: phase 1");
cdb_rewind(CDB_EUIDINDEX);
- while(cdbei = cdb_next_item(CDB_EUIDINDEX), cdbei.len>0) {
+ while(cdbei = cdb_next_item(CDB_EUIDINDEX), cdbei.ptr!=NULL) {
memcpy(&msgnum, cdbei.ptr, sizeof(long));
memcpy(&msgnum, cdbei.ptr, sizeof(long));
// fetch the bucket, Liza
if (ftc_msgs[tok] == NULL) {
cdb_bucket = cdb_fetch(CDB_FULLTEXT, &tok, sizeof(int));
// fetch the bucket, Liza
if (ftc_msgs[tok] == NULL) {
cdb_bucket = cdb_fetch(CDB_FULLTEXT, &tok, sizeof(int));
- if (cdb_bucket.len > 0) {
+ if (cdb_bucket.ptr != NULL) {
ftc_num_msgs[tok] = cdb_bucket.len / sizeof(long);
ftc_msgs[tok] = malloc(cdb_bucket.len);
memcpy(ftc_msgs[tok], cdb_bucket.ptr, cdb_bucket.len);
ftc_num_msgs[tok] = cdb_bucket.len / sizeof(long);
ftc_msgs[tok] = malloc(cdb_bucket.len);
memcpy(ftc_msgs[tok], cdb_bucket.ptr, cdb_bucket.len);
// fetch the bucket, Liza
if (ftc_msgs[tok] == NULL) {
cdb_bucket = cdb_fetch(CDB_FULLTEXT, &tok, sizeof(int));
// fetch the bucket, Liza
if (ftc_msgs[tok] == NULL) {
cdb_bucket = cdb_fetch(CDB_FULLTEXT, &tok, sizeof(int));
- if (cdb_bucket.len > 0) {
+ if (cdb_bucket.ptr != NULL) {
ftc_num_msgs[tok] = cdb_bucket.len / sizeof(long);
ftc_msgs[tok] = (long *) malloc(cdb_bucket.len);
memcpy(ftc_msgs[tok], cdb_bucket.ptr, cdb_bucket.len);
ftc_num_msgs[tok] = cdb_bucket.len / sizeof(long);
ftc_msgs[tok] = (long *) malloc(cdb_bucket.len);
memcpy(ftc_msgs[tok], cdb_bucket.ptr, cdb_bucket.len);
// Traverse the userlist
rights = NewStrBuf();
cdb_rewind(CDB_USERS);
// Traverse the userlist
rights = NewStrBuf();
cdb_rewind(CDB_USERS);
- while (cdbus = cdb_next_item(CDB_USERS), cdbus.len > 0) {
+ while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) {
memset(&temp, 0, sizeof temp);
memcpy(&temp, cdbus.ptr, sizeof temp);
memset(&temp, 0, sizeof temp);
memcpy(&temp, cdbus.ptr, sizeof temp);
syslog(LOG_DEBUG, "msgbase: CtdlFetchMessage(%ld, %d)", msgnum, with_body);
dmsgtext = cdb_fetch(CDB_MSGMAIN, &msgnum, sizeof(long));
syslog(LOG_DEBUG, "msgbase: CtdlFetchMessage(%ld, %d)", msgnum, with_body);
dmsgtext = cdb_fetch(CDB_MSGMAIN, &msgnum, sizeof(long));
- if (dmsgtext.len == 0) {
+ if (dmsgtext.ptr == NULL) {
syslog(LOG_ERR, "msgbase: message #%ld was not found", msgnum);
return NULL;
}
syslog(LOG_ERR, "msgbase: message #%ld was not found", msgnum);
return NULL;
}
//
if ( (CM_IsEmpty(ret, eMesageText)) && (with_body) ) {
dmsgtext = cdb_fetch(CDB_BIGMSGS, &msgnum, sizeof(long));
//
if ( (CM_IsEmpty(ret, eMesageText)) && (with_body) ) {
dmsgtext = cdb_fetch(CDB_BIGMSGS, &msgnum, sizeof(long));
- if (dmsgtext.len > 0) {
+ if (dmsgtext.ptr != NULL) {
CM_SetAsField(ret, eMesageText, &dmsgtext.ptr, dmsgtext.len - 1);
}
}
CM_SetAsField(ret, eMesageText, &dmsgtext.ptr, dmsgtext.len - 1);
}
}
TheIndex = (0L - msgnum);
cdbsmi = cdb_fetch(CDB_MSGMAIN, &TheIndex, sizeof(long));
TheIndex = (0L - msgnum);
cdbsmi = cdb_fetch(CDB_MSGMAIN, &TheIndex, sizeof(long));
+ if (cdbsmi.ptr == NULL) {
return; /* record not found; leave it alone */
}
memcpy(smibuf, cdbsmi.ptr, ((cdbsmi.len > sizeof(struct MetaData)) ? sizeof(struct MetaData) : cdbsmi.len));
return; /* record not found; leave it alone */
}
memcpy(smibuf, cdbsmi.ptr, ((cdbsmi.len > sizeof(struct MetaData)) ? sizeof(struct MetaData) : cdbsmi.len));
cdbqr = cdb_fetch(CDB_ROOMS, lowercase_name, strlen(lowercase_name));
// If that didn't work, try the user's personal namespace
cdbqr = cdb_fetch(CDB_ROOMS, lowercase_name, strlen(lowercase_name));
// If that didn't work, try the user's personal namespace
+ if (cdbqr.ptr == NULL) {
snprintf(personal_lowercase_name, sizeof personal_lowercase_name, "%010ld.%s", CC->user.usernum, lowercase_name);
cdbqr = cdb_fetch(CDB_ROOMS, personal_lowercase_name, strlen(personal_lowercase_name));
}
snprintf(personal_lowercase_name, sizeof personal_lowercase_name, "%010ld.%s", CC->user.usernum, lowercase_name);
cdbqr = cdb_fetch(CDB_ROOMS, personal_lowercase_name, strlen(personal_lowercase_name));
}
+ if (cdbqr.ptr != NULL) {
memcpy(qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.len));
room_sanity_check(qrbuf);
return (0);
memcpy(qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.len));
room_sanity_check(qrbuf);
return (0);
memset(flbuf, 0, sizeof(struct floor));
cdbfl = cdb_fetch(CDB_FLOORTAB, &floor_num, sizeof(int));
memset(flbuf, 0, sizeof(struct floor));
cdbfl = cdb_fetch(CDB_FLOORTAB, &floor_num, sizeof(int));
+ if (cdbfl.ptr != NULL) {
memcpy(flbuf, cdbfl.ptr, ((cdbfl.len > sizeof(struct floor)) ? sizeof(struct floor) : cdbfl.len));
}
else {
memcpy(flbuf, cdbfl.ptr, ((cdbfl.len > sizeof(struct floor)) ? sizeof(struct floor) : cdbfl.len));
}
else {
- while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.len>0) {
+ while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.ptr!=NULL) {
memset(&qrbuf, 0, sizeof(struct ctdlroom));
memcpy(&qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.len) );
room_sanity_check(&qrbuf);
memset(&qrbuf, 0, sizeof(struct ctdlroom));
memcpy(&qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.len) );
room_sanity_check(&qrbuf);
void delete_msglist(struct ctdlroom *whichroom) {
struct cdbdata cdbml;
void delete_msglist(struct ctdlroom *whichroom) {
struct cdbdata cdbml;
- // Make sure the msglist we're deleting actually exists, otherwise
- // libdb will complain when we try to delete an invalid record
+ // Make sure the msglist we're deleting actually exists; don't try to delete an invalid record
cdbml = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
cdbml = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
- if (cdbml.len > 0) {
- // Go ahead and delete it
+ if (cdbml.ptr != NULL) {
+ // ok it exists, go ahead and delete it
cdb_delete(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
}
}
cdb_delete(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
}
}
struct cdbdata cdbfr;
cdbfr = cdb_fetch(CDB_MSGLISTS, &roomnum, sizeof(long));
struct cdbdata cdbfr;
cdbfr = cdb_fetch(CDB_MSGLISTS, &roomnum, sizeof(long));
+ if (cdbfr.ptr == NULL) {
syslog(LOG_ERR, "room_ops: no msglist for room %ld", roomnum);
*msgs = malloc(sizeof(long)); // dummy buffer
*msgs[0] = 0;
syslog(LOG_ERR, "room_ops: no msglist for room %ld", roomnum);
*msgs = malloc(sizeof(long)); // dummy buffer
*msgs[0] = 0;
}
cdbus = cdb_fetch(CDB_USERS, usernamekey, strlen(usernamekey));
}
cdbus = cdb_fetch(CDB_USERS, usernamekey, strlen(usernamekey));
- if (cdbus.len == 0) { // user not found
+ if (cdbus.ptr == NULL) { // user not found
return(1);
}
if (usbuf != NULL) {
return(1);
}
if (usbuf != NULL) {
// Fetch the user record using the old index format
cdbus = cdb_fetch(CDB_USERS, oldkey, strlen(oldkey));
// Fetch the user record using the old index format
cdbus = cdb_fetch(CDB_USERS, oldkey, strlen(oldkey));
+ if (cdbus.ptr == NULL) {
syslog(LOG_INFO, "user_ops: <%s> not found, were they already reindexed?", username);
return;
}
syslog(LOG_INFO, "user_ops: <%s> not found, were they already reindexed?", username);
return;
}
vbuf->v_usernum = rel_user->usernum;
cdbvisit = cdb_fetch(CDB_VISIT, vbuf, (sizeof(long)*3));
vbuf->v_usernum = rel_user->usernum;
cdbvisit = cdb_fetch(CDB_VISIT, vbuf, (sizeof(long)*3));
- if (cdbvisit.len > 0) {
- memcpy(vbuf, cdbvisit.ptr, ((cdbvisit.len > sizeof(struct visit)) ? sizeof(struct visit) : cdbvisit.len));
+ if (cdbvisit.ptr != NULL) {
+ memcpy(vbuf, cdbvisit.ptr, ((cdbvisit.len > sizeof(struct visit)) ? sizeof(struct visit) : cdbvisit.len));
}
else {
// If this is the first time the user has seen this room, set the view to be the default for the room.
}
else {
// If this is the first time the user has seen this room, set the view to be the default for the room.
int r;
cdbun = cdb_fetch(CDB_USERSBYNUMBER, &number, sizeof(long));
int r;
cdbun = cdb_fetch(CDB_USERSBYNUMBER, &number, sizeof(long));
+ if (cdbun.ptr == NULL) {
syslog(LOG_INFO, "user_ops: %ld not found", number);
return(-1);
}
syslog(LOG_INFO, "user_ops: %ld not found", number);
return(-1);
}
// No, we don't use CtdlForEachUser() because that requires multiple reads for each record
// TODO: make an index
cdb_rewind(CDB_USERS);
// No, we don't use CtdlForEachUser() because that requires multiple reads for each record
// TODO: make an index
cdb_rewind(CDB_USERS);
- while (cdbus = cdb_next_item(CDB_USERS), cdbus.len>0) {
+ while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) {
usptr = (struct ctdluser *) cdbus.ptr;
if (usptr->uid == number) {
usptr = (struct ctdluser *) cdbus.ptr;
if (usptr->uid == number) {
cdb_rewind(CDB_USERS);
// Phase 1 : build an array of all our user account names
cdb_rewind(CDB_USERS);
// Phase 1 : build an array of all our user account names
- while (cdbus = cdb_next_item(CDB_USERS), cdbus.len > 0) {
+ while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) {
usptr = (struct ctdluser *) cdbus.ptr;
if (strlen(usptr->fullname) > 0) {
array_append(all_users, usptr->fullname);
usptr = (struct ctdluser *) cdbus.ptr;
if (strlen(usptr->fullname) > 0) {
array_append(all_users, usptr->fullname);
syslog(LOG_DEBUG, "usetable: CheckIfAlreadySeen(0x%8x)", hash);
cdbut = cdb_fetch(CDB_USETABLE, &hash, sizeof(hash));
syslog(LOG_DEBUG, "usetable: CheckIfAlreadySeen(0x%8x)", hash);
cdbut = cdb_fetch(CDB_USETABLE, &hash, sizeof(hash));
+ if (cdbut.ptr != NULL) {
ut.hash = hash;
ut.timestamp = time(NULL);
cdb_store(CDB_USETABLE, &hash, sizeof(hash), &ut, sizeof(struct UseTable));
ut.hash = hash;
ut.timestamp = time(NULL);
cdb_store(CDB_USETABLE, &hash, sizeof(hash), &ut, sizeof(struct UseTable));