Simplify a bunch of verbose strncmp(,,strlen()) calls.
--- 8< --- strncmp.cocci ---
@@
expression e1, e2;
@@
- strncmp(e1, e2, strlen(e2)) == 0
+ str_begins(e1, e2)
@@
expression e1, e2;
@@
- strncmp(e1, e2, strlen(e2)) != 0
+ !str_begins(e1, e2)
@@
expression e1, e2;
@@
- strncmp(e1, e2, strlen(e1)) == 0
+ str_begins(e2, e1)
@@
expression e1, e2;
@@
- strncmp(e1, e2, strlen(e1)) != 0
+ !str_begins(e2, e1)
--- 8< ---------------------
Signed-off-by: Phil Carmody <phil@dovecot.fi>
i_debug("key = %s", key);
- if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) != 0 &&
- strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) != 0) {
+ if (!str_begins(key, DICT_PATH_PRIVATE) &&
+ !str_begins(key, DICT_PATH_SHARED)) {
i_error("Key must begin with '"DICT_PATH_PRIVATE
"' or '"DICT_PATH_SHARED"': %s", key);
doveadm_exit_code = EX_USAGE;
return -1;
}
if (username[0] == '\0' &&
- strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0) {
+ str_begins(key, DICT_PATH_PRIVATE)) {
i_error("-u must be specified for "DICT_PATH_PRIVATE" keys");
doveadm_exit_code = EX_USAGE;
return -1;
const char *value = NULL;
for(;*fields != NULL; fields++) {
- if (strncmp(*fields, field_name, strlen(field_name)) == 0) {
+ if (str_begins(*fields, field_name)) {
value = *fields+strlen(field_name);
break;
}
client_proxy_log_failure(client, log_line);
}
#define STR_NO_IMAP_RESP_CODE_AUTHFAILED "NO ["IMAP_RESP_CODE_AUTHFAILED"]"
- if (strncmp(line, STR_NO_IMAP_RESP_CODE_AUTHFAILED,
- strlen(STR_NO_IMAP_RESP_CODE_AUTHFAILED)) == 0) {
+ if (str_begins(line, STR_NO_IMAP_RESP_CODE_AUTHFAILED)) {
/* the remote sent a generic "authentication failed"
error. replace it with our one, so that in case
the remote is sending a different error message
if (((ctx->flags & DICT_ITERATE_FLAG_EXACT_KEY) != 0 &&
strcmp(key, *ptr) == 0) ||
((ctx->flags & DICT_ITERATE_FLAG_RECURSE) != 0 &&
- strncmp(key, *ptr, strlen(*ptr)) == 0) ||
+ str_begins(key, *ptr)) ||
((ctx->flags & DICT_ITERATE_FLAG_RECURSE) == 0 &&
- strncmp(key, *ptr, strlen(*ptr)) == 0 &&
+ str_begins(key, *ptr) &&
strchr(key + strlen(*ptr), '/') == NULL)) {
match = TRUE;
break;
static const char *fs_dict_get_full_key(struct fs_dict *dict, const char *key)
{
- if (strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0)
+ if (str_begins(key, DICT_PATH_SHARED))
return key + strlen(DICT_PATH_SHARED);
- else if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0) {
+ else if (str_begins(key, DICT_PATH_PRIVATE)) {
return t_strdup_printf("%s/%s", dict->username,
key + strlen(DICT_PATH_PRIVATE));
} else {
memcached_ascii_dict_get_full_key(struct memcached_ascii_dict *dict,
const char *key)
{
- if (strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0)
+ if (str_begins(key, DICT_PATH_SHARED))
key += strlen(DICT_PATH_SHARED);
- else if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0) {
+ else if (str_begins(key, DICT_PATH_PRIVATE)) {
key = t_strdup_printf("%s%c%s", dict->username,
DICT_USERNAME_SEPARATOR,
key + strlen(DICT_PATH_PRIVATE));
struct timeout *to;
size_t key_len;
- if (strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0)
+ if (str_begins(key, DICT_PATH_SHARED))
key += strlen(DICT_PATH_SHARED);
else {
*error_r = t_strdup_printf("memcached: Only shared keys supported currently");
static const char *
redis_dict_get_full_key(struct redis_dict *dict, const char *key)
{
- if (strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0)
+ if (str_begins(key, DICT_PATH_SHARED))
key += strlen(DICT_PATH_SHARED);
- else if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0) {
+ else if (str_begins(key, DICT_PATH_PRIVATE)) {
key = t_strdup_printf("%s%c%s", dict->username,
DICT_USERNAME_SEPARATOR,
key + strlen(DICT_PATH_PRIVATE));
static bool dict_key_prefix_is_valid(const char *key)
{
- return strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0 ||
- strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0;
+ return str_begins(key, DICT_PATH_SHARED) ||
+ str_begins(key, DICT_PATH_PRIVATE);
}
int dict_lookup(struct dict *dict, pool_t pool, const char *key,
const struct fs_metadata *metadata;
array_foreach(&file->file.metadata, metadata) {
- if (strncmp(metadata->key, FS_METADATA_INTERNAL_PREFIX,
- strlen(FS_METADATA_INTERNAL_PREFIX)) == 0)
+ if (str_begins(metadata->key, FS_METADATA_INTERNAL_PREFIX))
continue;
str_append_tabescaped(str, metadata->key);
while ((p = strrchr(path, '/')) != NULL) {
path = t_strdup_until(path, p);
if ((fs->root_path != NULL && strcmp(path, fs->root_path) == 0) ||
- (fs->path_prefix != NULL && strncmp(path, fs->path_prefix, strlen(path)) == 0))
+ (fs->path_prefix != NULL && str_begins(fs->path_prefix, path)))
break;
if (rmdir(path) == 0) {
/* success, continue to parent */
/* names are case-insensitive so we'll always lowercase them */
entry = t_str_lcase(entry);
- if (strncmp(entry, IMAP_METADATA_PRIVATE_PREFIX,
- strlen(IMAP_METADATA_PRIVATE_PREFIX)) == 0) {
+ if (str_begins(entry, IMAP_METADATA_PRIVATE_PREFIX)) {
*key_r = entry + strlen(IMAP_METADATA_PRIVATE_PREFIX);
*type_r = MAIL_ATTRIBUTE_TYPE_PRIVATE;
} else {
- i_assert(strncmp(entry, IMAP_METADATA_SHARED_PREFIX,
- strlen(IMAP_METADATA_SHARED_PREFIX)) == 0);
+ i_assert(str_begins(entry, IMAP_METADATA_SHARED_PREFIX));
*key_r = entry + strlen(IMAP_METADATA_SHARED_PREFIX);
*type_r = MAIL_ATTRIBUTE_TYPE_SHARED;
}
i_assert((*key_r)[0] == '/');
*key_r += 1;
}
- if (strncmp(*key_r, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT,
- strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT)) == 0) {
+ if (str_begins(*key_r, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT)) {
/* Dovecot's internal attribute (mailbox or server).
don't allow accessing this. */
return FALSE;
dir_len = str_len(path);
for (errno = 0; (d = readdir(dir)) != NULL; errno = 0) {
- if (strncmp(d->d_name, MDBOX_MAIL_FILE_PREFIX,
- strlen(MDBOX_MAIL_FILE_PREFIX)) != 0)
+ if (!str_begins(d->d_name, MDBOX_MAIL_FILE_PREFIX))
continue;
if (str_to_uint32(d->d_name + strlen(MDBOX_MAIL_FILE_PREFIX),
&file_id) < 0)
uint32_t uid;
int ret;
- if (strncmp(fname, SDBOX_MAIL_FILE_PREFIX,
- strlen(SDBOX_MAIL_FILE_PREFIX)) != 0)
+ if (!str_begins(fname, SDBOX_MAIL_FILE_PREFIX))
return 0;
fname += strlen(SDBOX_MAIL_FILE_PREFIX);
case SEARCH_MIME_FILENAME_CONTAINS:
return (strstr(value, key) != NULL ? 1 : 0);
case SEARCH_MIME_FILENAME_BEGINS:
- return (strncmp(value, key, strlen(key)) == 0 ? 1 : 0);
+ return (str_begins(value, key) ? 1 : 0);
case SEARCH_MIME_FILENAME_ENDS:
vlen = strlen(value);
alen = strlen(key);
iter = mailbox_attribute_iter_init(t->box, type, "");
while ((key = mailbox_attribute_iter_next(iter)) != NULL) {
if (inbox &&
- strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER,
- strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER)) == 0)
+ str_begins(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER))
continue;
if (mailbox_attribute_unset(t, type, key) < 0) {
subscription name */
subs_name = t_strconcat(list->ns->prefix, box->name, NULL);
/* drop the common prefix (typically there isn't one) */
- i_assert(strncmp(ns->prefix, subs_name, strlen(ns->prefix)) == 0);
+ i_assert(str_begins(subs_name, ns->prefix));
subs_name += strlen(ns->prefix);
list = ns->list;
/var/mail and we want to allow privileged dotlocking */
rootdir = mailbox_list_get_root_forced(box->list,
MAILBOX_LIST_PATH_TYPE_DIR);
- if (strncmp(box_path, rootdir, strlen(rootdir)) != 0)
+ if (!str_begins(box_path, rootdir))
mbox->mbox_privileged_locking = TRUE;
}
if ((box->flags & MAILBOX_FLAG_KEEP_LOCKED) != 0) {
}
root_dir = mailbox_list_get_root_forced(list, type);
- if (strncmp(path, root_dir, strlen(root_dir)) != 0) {
+ if (!str_begins(path, root_dir)) {
/* mbox workaround: name=child/box, root_dir=mail/.imap/,
path=mail/child/.imap/box. we'll want to try to delete
the .imap/ part, but no further. */
if (mailbox_list_get_path(list, child_name,
MAILBOX_LIST_PATH_TYPE_INDEX,
&child_path) > 0 &&
- strncmp(path, child_path, strlen(path)) == 0) {
+ str_begins(child_path, path)) {
/* drop the "/child" part out. */
p = strrchr(child_path, '/');
if (rmdir(t_strdup_until(child_path, p)) == 0) {
chroot_dirs = t_strsplit(user_set->valid_chroot_dirs, ":");
while (*chroot_dirs != NULL) {
if (**chroot_dirs != '\0' &&
- strncmp(dir, *chroot_dirs, strlen(*chroot_dirs)) == 0)
+ str_begins(dir, *chroot_dirs))
return TRUE;
chroot_dirs++;
}
return NULL;
}
iattr = array_idx(&mailbox_internal_attributes, insert_idx-1);
- if (strncmp(iattr->key, key, strlen(iattr->key)) != 0) {
+ if (!str_begins(key, iattr->key)) {
/* iattr isn't a prefix of key */
return NULL;
} else if ((iattr->flags & MAIL_ATTRIBUTE_INTERNAL_FLAG_CHILDREN) != 0) {
/* allow internal server attribute only for inbox */
if (iattr != NULL && !t->box->inbox_any &&
- strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER,
- strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER)) == 0)
+ str_begins(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER))
iattr = NULL;
/* handle internal attribute */
/* allow internal server attributes only for the inbox */
if (iattr != NULL && !box->inbox_user &&
- strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER,
- strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER)) == 0)
+ str_begins(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER))
iattr = NULL;
/* internal attribute */
/* User can get/set all non-pvt/ attributes and also pvt/server/
(but not pvt/server/pvt/) attributes. */
#define MAILBOX_ATTRIBUTE_KEY_IS_USER_ACCESSIBLE(key) \
- (strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT, \
- strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT)) != 0 || \
- (strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER, \
- strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER)) == 0 && \
+ (!str_begins(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT) || \
+ (str_begins(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER) && \
strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT, \
strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT)) != 0))
if (!mailbox_list_get_root_path(list, type, &root_dir))
i_unreached();
- i_assert(strncmp(root_dir, path, strlen(root_dir)) == 0);
+ i_assert(str_begins(path, root_dir));
if (strcmp(root_dir, path) != 0 && stat(root_dir, &st) == 0) {
/* creating a subdirectory under an already existing root dir.
use the root's permissions */
new_apool = p_new(&apool.pool, struct alloconly_pool, 1);
*new_apool = apool;
#ifdef DEBUG
- if (strncmp(name, MEMPOOL_GROWING, strlen(MEMPOOL_GROWING)) == 0 ||
+ if (str_begins(name, MEMPOOL_GROWING) ||
getenv("DEBUG_SILENT") != NULL) {
name += strlen(MEMPOOL_GROWING);
new_apool->disable_warning = TRUE;
/* This is just 2 ways of wording the same test, but that also
sanity tests the match values above. */
test_assert_idx(str_begins(tests[i].s1, tests[i].s2) ==
- (strncmp(tests[i].s1, tests[i].s2, strlen(tests[i].s2)) == 0), i);
+ (str_begins(tests[i].s1, tests[i].s2)), i);
test_assert_idx(str_begins(tests[i].s1, tests[i].s2) ==
(strlen(tests[i].s2) == tests[i].match), i);
}
/* prefix with dovecot/ */
argv[0] = t_strdup_printf("%s/%s", services->set->instance_name,
argv[0]);
- if (strncmp(argv[0], PACKAGE, strlen(PACKAGE)) != 0)
+ if (!str_begins(argv[0], PACKAGE))
argv[0] = t_strconcat(PACKAGE"-", argv[0], NULL);
execv_const(executable, argv);
}
int acl_identifier_parse(const char *line, struct acl_rights *rights)
{
- if (strncmp(line, ACL_ID_NAME_USER_PREFIX,
- strlen(ACL_ID_NAME_USER_PREFIX)) == 0) {
+ if (str_begins(line, ACL_ID_NAME_USER_PREFIX)) {
rights->id_type = ACL_ID_USER;
rights->identifier = line + 5;
} else if (strcmp(line, ACL_ID_NAME_OWNER) == 0) {
rights->id_type = ACL_ID_OWNER;
- } else if (strncmp(line, ACL_ID_NAME_GROUP_PREFIX,
- strlen(ACL_ID_NAME_GROUP_PREFIX)) == 0) {
+ } else if (str_begins(line, ACL_ID_NAME_GROUP_PREFIX)) {
rights->id_type = ACL_ID_GROUP;
rights->identifier = line + 6;
- } else if (strncmp(line, ACL_ID_NAME_GROUP_OVERRIDE_PREFIX,
- strlen(ACL_ID_NAME_GROUP_OVERRIDE_PREFIX)) == 0) {
+ } else if (str_begins(line, ACL_ID_NAME_GROUP_OVERRIDE_PREFIX)) {
rights->id_type = ACL_ID_GROUP_OVERRIDE;
rights->identifier = line + 15;
} else if (strcmp(line, ACL_ID_NAME_AUTHENTICATED) == 0) {
if (acl_have_attribute_rights(t->box) < 0)
return -1;
- if (strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_ACL,
- strlen(MAILBOX_ATTRIBUTE_PREFIX_ACL)) == 0)
+ if (str_begins(key, MAILBOX_ATTRIBUTE_PREFIX_ACL))
return acl_attribute_update_acl(t, key, value);
return abox->module_ctx.super.attribute_set(t, type, key, value);
}
if (acl_have_attribute_rights(box) < 0)
return -1;
- if (strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_ACL,
- strlen(MAILBOX_ATTRIBUTE_PREFIX_ACL)) == 0)
+ if (str_begins(key, MAILBOX_ATTRIBUTE_PREFIX_ACL))
return acl_attribute_get_acl(box, key, value_r);
return abox->module_ctx.super.attribute_get(box, type, key, value_r);
}
attribute_iter_init(box, type, prefix);
if (box->storage->user->dsyncing &&
type == MAIL_ATTRIBUTE_TYPE_SHARED &&
- strncmp(prefix, MAILBOX_ATTRIBUTE_PREFIX_ACL,
- strlen(prefix)) == 0) {
+ str_begins(MAILBOX_ATTRIBUTE_PREFIX_ACL, prefix)) {
aiter->acl_iter = acl_object_list_init(abox->aclobj);
aiter->acl_name = str_new(default_pool, 128);
str_append(aiter->acl_name, MAILBOX_ATTRIBUTE_PREFIX_ACL);
{
struct mail_user *user = cmd->client->user;
- if (strncmp(id, IMAP_ACL_GLOBAL_PREFIX,
- strlen(IMAP_ACL_GLOBAL_PREFIX)) == 0) {
+ if (str_begins(id, IMAP_ACL_GLOBAL_PREFIX)) {
*error_r = t_strdup_printf("Global ACLs can't be modified: %s",
id);
return -1;
rights->id_type = ACL_ID_AUTHENTICATED;
} else if (strcmp(id, IMAP_ACL_OWNER) == 0)
rights->id_type = ACL_ID_OWNER;
- else if (strncmp(id, IMAP_ACL_GROUP_PREFIX,
- strlen(IMAP_ACL_GROUP_PREFIX)) == 0) {
+ else if (str_begins(id, IMAP_ACL_GROUP_PREFIX)) {
rights->id_type = ACL_ID_GROUP;
rights->identifier = id + strlen(IMAP_ACL_GROUP_PREFIX);
- } else if (strncmp(id, IMAP_ACL_GROUP_OVERRIDE_PREFIX,
- strlen(IMAP_ACL_GROUP_OVERRIDE_PREFIX)) == 0) {
+ } else if (str_begins(id, IMAP_ACL_GROUP_OVERRIDE_PREFIX)) {
rights->id_type = ACL_ID_GROUP_OVERRIDE;
rights->identifier = id +
strlen(IMAP_ACL_GROUP_OVERRIDE_PREFIX);