[pacman-dev] [RFC, PATCHES]: Very preliminary work towards clean build with clang -Weverything
First of all, don't worry; I'm under no illusion that the pie-in-the-sky Subject line is anything that will happen in the near future, nor even necessarily a goal for the project (given just how finicky -Weverything is). Basically, I'm wondering whether sporadic patches addressing the sorts of things "clang -Weverything" gripes about would be considered welcome contributions, or nitpicking. By "sporadic patches", I mean that any of this sort from me would come when I felt like working on a coding project but didn't have anything particularly in mind. As a sample, I've made two patches addressing some of its earliest warnings. The first changes several headers to (say) #define IDENTIFIERS rather than _IDENTIFIERS. The second adds ALPM_ERR_OK = 0 to the _alpm_err_t enum. Some functions which return an _alpm_err_t return value were returning 0 on success, but there was no 0 value enumerated--not actively harmful, but still an oddity. If this sort of thing isn't of interest, I definitely get it. I just figured that an RFC with patches attached would provide something more concrete to discuss than one without. Cheers, Ivy
From: Ivy Foster
From: Ivy Foster
All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use. All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces. (ISO 9899:1999, 7.1.3) Don't use such identifiers. As a matter of fact, typedefs, struct names and function names fall under this terminology. Despite the fact that the compiler accepts leading underscores, per standard they are explicitly discouraged. So, what we should consider is to move _alpm_errno_t along with all other names in the source tree away from leading underscores. Their visibility should be controlled by the presence of a static keyword, -fvisibility and such instead. You might want to write a sed script for this, and it looks like a major invasion into the codebase. The last word is with the developers, though, hence I'm not sure this is going to be accepted for traditional reasons. cheers! mar77i
On 03/09/16 12:08, ivy.foster@gmail.com wrote:
First of all, don't worry; I'm under no illusion that the pie-in-the-sky Subject line is anything that will happen in the near future, nor even necessarily a goal for the project (given just how finicky -Weverything is).
Basically, I'm wondering whether sporadic patches addressing the sorts of things "clang -Weverything" gripes about would be considered welcome contributions, or nitpicking. By "sporadic patches", I mean that any of this sort from me would come when I felt like working on a coding project but didn't have anything particularly in mind.
As a sample, I've made two patches addressing some of its earliest warnings. The first changes several headers to (say) #define IDENTIFIERS rather than _IDENTIFIERS. The second adds ALPM_ERR_OK = 0 to the _alpm_err_t enum. Some functions which return an _alpm_err_t return value were returning 0 on success, but there was no 0 value enumerated--not actively harmful, but still an oddity.
If this sort of thing isn't of interest, I definitely get it. I just figured that an RFC with patches attached would provide something more concrete to discuss than one without.
I am happy to accept these. When you fix a specific set of warnings from clang/gcc, you can add that specific warning flag (i.e. not -Weverything...) to our configure.ac at this section: # Enable or disable compiler warning flags AC_MSG_CHECKING(for excessive compiler warning flags) if test "x$warningflags" = "xyes" ; then AC_MSG_RESULT(yes) CFLAGS_ADD([-Wcast-align], [WARNING_CFLAGS]) CFLAGS_ADD([-Wclobbered], [WARNING_CFLAGS]) ... That way we will not regress in the future. Thanks, Allan
I've had another go at the patches from yesterday. The first patch, which eliminates use of #define _RESERVED_IDENTIFIERS, has one problem keeping me from adding -Wreserved-id-macro to configure.ac: the autoconf-generated file config.h.in contains one, _DARWIN_USE_64_BIT_INODE. I'm honestly not sure how to prevent autoconf from adding this, or how to make it print it at the very bottom after a "#pragma GCC system_header". The second is a much more complete version of the patch that added ALPM_ERR_OK. This version handles *every* enum type that is used by functions that return either a member of that enum or an error, and allows building cleanly with clang -Wassign-enum. The RFC in the subject is because for patch #2, I discovered that a common code pattern in pacman is using enum types to generate bitfields. Technically, the resulting bitfield isn't a member of the enum*, which caused many a warning with -Wassign-enum. As a quick and dirty solution, I declared these bitfield variables to be ints rather than (say) _alpm_siglevel_t. It encodes less information than declaring them as the enum type, but is technically more accurate. Would it be better to use unions or something? Comments welcome. Cheers. Ivy *: enum foo { BAR = 1 << 0, /* 01 */ BAZ = 1 << 1; /* 10 */ /* Not included: 11 */ }
From: Ivy Foster
From: Ivy Foster
On 09/03/16 at 10:14pm, ivy.foster@gmail.com wrote:
From: Ivy Foster
In many cases, it was enough to add error or "none" values to enums, to account for cases where functions returned either an enumerated value or 0/-1.
A common code pattern in pacman is to use enums to create bitfields representing various option combinations. Since they are not technically part of the enumerated type used to build them, these bitfields have been reassigned to type int.
Signed-off-by: Ivy Foster
--- configure.ac | 1 + lib/libalpm/alpm.c | 4 +-- lib/libalpm/alpm.h | 15 +++++++-- lib/libalpm/be_package.c | 2 +- lib/libalpm/be_sync.c | 4 +-- lib/libalpm/db.c | 20 ++++++------ lib/libalpm/db.h | 2 +- lib/libalpm/dload.c | 2 +- lib/libalpm/package.c | 84 ++++++++++++++++++++++++------------------------ lib/libalpm/package.h | 2 +- lib/libalpm/signing.c | 6 ++-- lib/libalpm/sync.c | 10 +++--- lib/libalpm/trans.c | 2 +- lib/libalpm/util.h | 2 +- src/pacman/conf.c | 4 +-- src/pacman/conf.h | 12 +++---- src/pacman/database.c | 2 +- src/util/cleanupdelta.c | 2 +- src/util/pactree.c | 2 +- src/util/testpkg.c | 2 +- 20 files changed, 96 insertions(+), 84 deletions(-)
Even though all of these changes are related our enum handling, there is a lot going on in this patch. I would prefer if it were broken up into more specific change sets. * converting bitfield values to int I think int is the correct type for bitfields, but it looks like you missed many. Enums like siglevel_t and usage_t are used exclusively in the construction of bitfields. I don't think we should really have any variables of those types anywhere. * adding ERR_OK OK - libarchive and libcurl do this and I think it makes sense. * adding NONE/ERROR to other enums The addition of NONE values to enums appears to be unnecessary to me. I only see them being used as empty bitfield values, and, once we change those to int, using a literal 0 for those is just fine. I'm not fond of adding ERROR values to every enum just so that we can return -1 for invalid input. Most of them look unnecessary because the relevant functions are actually returning bitfields and should be changed to return an int, making -1 a valid return value.
diff --git a/configure.ac b/configure.ac index 51288e7..2f9aeab 100644 --- a/configure.ac +++ b/configure.ac @@ -430,6 +430,7 @@ fi AC_MSG_CHECKING(for excessive compiler warning flags) if test "x$warningflags" = "xyes" ; then AC_MSG_RESULT(yes) + CFLAGS_ADD([-Wassign-enum], [WARNING_CFLAGS]) CFLAGS_ADD([-Wcast-align], [WARNING_CFLAGS]) CFLAGS_ADD([-Wclobbered], [WARNING_CFLAGS]) CFLAGS_ADD([-Wempty-body], [WARNING_CFLAGS]) diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c index 6b7fa7a..6338429 100644 --- a/lib/libalpm/alpm.c +++ b/lib/libalpm/alpm.c @@ -152,9 +152,9 @@ const char SYMEXPORT *alpm_version(void) /** Get the capabilities of the library. * @return a bitmask of the capabilities * */ -enum alpm_caps SYMEXPORT alpm_capabilities(void) +int SYMEXPORT alpm_capabilities(void) { - return 0 + return ALPM_CAPABILITY_NONE #ifdef ENABLE_NLS | ALPM_CAPABILITY_NLS #endif diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 7955585..cb3aa51 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -53,7 +53,8 @@ typedef struct __alpm_trans_t alpm_trans_t; * @{ */ typedef enum _alpm_errno_t { - ALPM_ERR_MEMORY = 1, + ALPM_ERR_OK = 0, + ALPM_ERR_MEMORY, ALPM_ERR_SYSTEM, ALPM_ERR_BADPERMS, ALPM_ERR_NOT_A_FILE, @@ -143,6 +144,7 @@ typedef int64_t alpm_time_t;
/** Package install reasons. */ typedef enum _alpm_pkgreason_t { + ALPM_PKG_REASON_ERROR = -1, /** Explicitly requested by the user. */ ALPM_PKG_REASON_EXPLICIT = 0, /** Installed as a dependency for another package. */ @@ -151,6 +153,7 @@ typedef enum _alpm_pkgreason_t {
/** Location a package object was loaded from. */ typedef enum _alpm_pkgfrom_t { + ALPM_PKG_FROM_ERROR = -1, ALPM_PKG_FROM_FILE = 1, ALPM_PKG_FROM_LOCALDB, ALPM_PKG_FROM_SYNCDB @@ -158,6 +161,7 @@ typedef enum _alpm_pkgfrom_t {
/** Method used to validate a package. */ typedef enum _alpm_pkgvalidation_t { + ALPM_PKG_VALIDATION_ERROR = -1, ALPM_PKG_VALIDATION_UNKNOWN = 0, ALPM_PKG_VALIDATION_NONE = (1 << 0), ALPM_PKG_VALIDATION_MD5SUM = (1 << 1), @@ -193,6 +197,9 @@ typedef enum _alpm_fileconflicttype_t {
/** PGP signature verification options */ typedef enum _alpm_siglevel_t { + ALPM_SIG_ERROR = -1, + ALPM_SIG_NONE = 0, + ALPM_SIG_PACKAGE = (1 << 0), ALPM_SIG_PACKAGE_OPTIONAL = (1 << 1), ALPM_SIG_PACKAGE_MARGINAL_OK = (1 << 2), @@ -1037,6 +1044,7 @@ alpm_list_t *alpm_db_get_groupcache(alpm_db_t *db); alpm_list_t *alpm_db_search(alpm_db_t *db, const alpm_list_t *needles);
typedef enum _alpm_db_usage_ { + ALPM_DB_USAGE_NONE = 0, ALPM_DB_USAGE_SYNC = 1, ALPM_DB_USAGE_SEARCH = (1 << 1), ALPM_DB_USAGE_INSTALL = (1 << 2), @@ -1439,6 +1447,8 @@ alpm_pkg_t *alpm_sync_newversion(alpm_pkg_t *pkg, alpm_list_t *dbs_sync);
/** Transaction flags */ typedef enum _alpm_transflag_t { + ALPM_TRANS_FLAG_ERROR = -1, + ALPM_TRANS_FLAG_NONE = 0, /** Ignore dependency checks. */ ALPM_TRANS_FLAG_NODEPS = 1, /** Ignore file conflicts and overwrite files. */ @@ -1606,13 +1616,14 @@ int alpm_release(alpm_handle_t *handle); int alpm_unlock(alpm_handle_t *handle);
enum alpm_caps { + ALPM_CAPABILITY_NONE = 0, ALPM_CAPABILITY_NLS = (1 << 0), ALPM_CAPABILITY_DOWNLOADER = (1 << 1), ALPM_CAPABILITY_SIGNATURES = (1 << 2) };
const char *alpm_version(void); -enum alpm_caps alpm_capabilities(void); +int alpm_capabilities(void);
void alpm_fileconflict_free(alpm_fileconflict_t *conflict); void alpm_depmissing_free(alpm_depmissing_t *miss); diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c index 430d2ae..befcba3 100644 --- a/lib/libalpm/be_package.c +++ b/lib/libalpm/be_package.c @@ -274,7 +274,7 @@ int _alpm_pkg_validate_internal(alpm_handle_t *handle, alpm_siglist_t **sigdata, alpm_pkgvalidation_t *validation) { int has_sig; - handle->pm_errno = 0; + handle->pm_errno = ALPM_ERR_OK;
if(pkgfile == NULL || strlen(pkgfile) == 0) { RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1); diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 32a669d..2cd722e 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -186,7 +186,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) /* Sanity checks */ ASSERT(db != NULL, return -1); handle = db->handle; - handle->pm_errno = 0; + handle->pm_errno = ALPM_ERR_OK; ASSERT(db != handle->db_local, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1)); ASSERT(db->servers != NULL, RET_ERR(handle, ALPM_ERR_SERVER_NONE, -1));
@@ -320,7 +320,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) _alpm_log(handle, ALPM_LOG_DEBUG, "failed to sync db: %s\n", alpm_strerror(handle->pm_errno)); } else { - handle->pm_errno = 0; + handle->pm_errno = ALPM_ERR_OK; }
_alpm_handle_unlock(handle); diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index f70f83c..913ea6a 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -112,7 +112,7 @@ int SYMEXPORT alpm_db_unregister(alpm_db_t *db) ASSERT(db != NULL, return -1); /* Do not unregister a database if a transaction is on-going */ handle = db->handle; - handle->pm_errno = 0; + handle->pm_errno = ALPM_ERR_OK; ASSERT(handle->trans == NULL, RET_ERR(handle, ALPM_ERR_TRANS_NOT_NULL, -1));
if(db == handle->db_local) { @@ -179,7 +179,7 @@ int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
/* Sanity checks */ ASSERT(db != NULL, return -1); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK; ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
newurl = sanitize_url(url); @@ -206,7 +206,7 @@ int SYMEXPORT alpm_db_remove_server(alpm_db_t *db, const char *url)
/* Sanity checks */ ASSERT(db != NULL, return -1); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK; ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
newurl = sanitize_url(url); @@ -237,7 +237,7 @@ const char SYMEXPORT *alpm_db_get_name(const alpm_db_t *db) /** Get the signature verification level for a database. */ alpm_siglevel_t SYMEXPORT alpm_db_get_siglevel(alpm_db_t *db) { - ASSERT(db != NULL, return -1); + ASSERT(db != NULL, return ALPM_SIG_ERROR); if(db->siglevel & ALPM_SIG_USE_DEFAULT) { return db->handle->siglevel; } else { @@ -249,7 +249,7 @@ alpm_siglevel_t SYMEXPORT alpm_db_get_siglevel(alpm_db_t *db) int SYMEXPORT alpm_db_get_valid(alpm_db_t *db) { ASSERT(db != NULL, return -1); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK; return db->ops->validate(db); }
@@ -258,7 +258,7 @@ alpm_pkg_t SYMEXPORT *alpm_db_get_pkg(alpm_db_t *db, const char *name) { alpm_pkg_t *pkg; ASSERT(db != NULL, return NULL); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK; ASSERT(name != NULL && strlen(name) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, NULL));
@@ -273,7 +273,7 @@ alpm_pkg_t SYMEXPORT *alpm_db_get_pkg(alpm_db_t *db, const char *name) alpm_list_t SYMEXPORT *alpm_db_get_pkgcache(alpm_db_t *db) { ASSERT(db != NULL, return NULL); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK; return _alpm_db_get_pkgcache(db); }
@@ -281,7 +281,7 @@ alpm_list_t SYMEXPORT *alpm_db_get_pkgcache(alpm_db_t *db) alpm_group_t SYMEXPORT *alpm_db_get_group(alpm_db_t *db, const char *name) { ASSERT(db != NULL, return NULL); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK; ASSERT(name != NULL && strlen(name) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, NULL));
@@ -292,7 +292,7 @@ alpm_group_t SYMEXPORT *alpm_db_get_group(alpm_db_t *db, const char *name) alpm_list_t SYMEXPORT *alpm_db_get_groupcache(alpm_db_t *db) { ASSERT(db != NULL, return NULL); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK;
return _alpm_db_get_groupcache(db); } @@ -301,7 +301,7 @@ alpm_list_t SYMEXPORT *alpm_db_get_groupcache(alpm_db_t *db) alpm_list_t SYMEXPORT *alpm_db_search(alpm_db_t *db, const alpm_list_t *needles) { ASSERT(db != NULL, return NULL); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK;
return _alpm_db_search(db, needles); } diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h index e696298..ae21e75 100644 --- a/lib/libalpm/db.h +++ b/lib/libalpm/db.h @@ -72,7 +72,7 @@ struct __alpm_db_t { alpm_list_t *servers; struct db_operations *ops; /* flags determining validity, local, loaded caches, etc. */ - enum _alpm_dbstatus_t status; + int status; alpm_siglevel_t siglevel; alpm_db_usage_t usage; }; diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index f4e6a27..10e4a0d 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -412,7 +412,7 @@ static int curl_download_internal(struct dload_payload *payload, /* shortcut to our handle within the payload */ alpm_handle_t *handle = payload->handle; CURL *curl = get_libcurl_handle(handle); - handle->pm_errno = 0; + handle->pm_errno = ALPM_ERR_OK;
/* make sure these are NULL */ FREE(payload->tempfile_name); diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index f08df8b..4cac2d1 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -60,7 +60,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(alpm_pkg_t *pkg) int retval;
ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; /* We only inspect packages from sync repositories */ ASSERT(pkg->origin == ALPM_PKG_FROM_SYNCDB, RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1)); @@ -184,196 +184,196 @@ struct pkg_operations default_pkg_ops = { const char SYMEXPORT *alpm_pkg_get_filename(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->filename; }
const char SYMEXPORT *alpm_pkg_get_base(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_base(pkg); }
const char SYMEXPORT *alpm_pkg_get_name(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->name; }
const char SYMEXPORT *alpm_pkg_get_version(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->version; }
alpm_pkgfrom_t SYMEXPORT alpm_pkg_get_origin(alpm_pkg_t *pkg) { - ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + ASSERT(pkg != NULL, return ALPM_PKG_FROM_ERROR); + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->origin; }
const char SYMEXPORT *alpm_pkg_get_desc(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_desc(pkg); }
const char SYMEXPORT *alpm_pkg_get_url(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_url(pkg); }
alpm_time_t SYMEXPORT alpm_pkg_get_builddate(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_builddate(pkg); }
alpm_time_t SYMEXPORT alpm_pkg_get_installdate(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_installdate(pkg); }
const char SYMEXPORT *alpm_pkg_get_packager(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_packager(pkg); }
const char SYMEXPORT *alpm_pkg_get_md5sum(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->md5sum; }
const char SYMEXPORT *alpm_pkg_get_sha256sum(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->sha256sum; }
const char SYMEXPORT *alpm_pkg_get_base64_sig(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->base64_sig; }
const char SYMEXPORT *alpm_pkg_get_arch(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_arch(pkg); }
off_t SYMEXPORT alpm_pkg_get_size(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->size; }
off_t SYMEXPORT alpm_pkg_get_isize(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_isize(pkg); }
alpm_pkgreason_t SYMEXPORT alpm_pkg_get_reason(alpm_pkg_t *pkg) { - ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + ASSERT(pkg != NULL, return ALPM_PKG_REASON_ERROR); + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_reason(pkg); }
alpm_pkgvalidation_t SYMEXPORT alpm_pkg_get_validation(alpm_pkg_t *pkg) { - ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + ASSERT(pkg != NULL, return ALPM_PKG_VALIDATION_ERROR); + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_validation(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_licenses(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_groups(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_groups(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_depends(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_depends(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_optdepends(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_optdepends(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_conflicts(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_conflicts(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_provides(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_provides(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_replaces(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_replaces(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_deltas(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->deltas; }
alpm_filelist_t SYMEXPORT *alpm_pkg_get_files(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_files(pkg); }
alpm_list_t SYMEXPORT *alpm_pkg_get_backup(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->get_backup(pkg); }
@@ -382,7 +382,7 @@ alpm_db_t SYMEXPORT *alpm_pkg_get_db(alpm_pkg_t *pkg) /* Sanity checks */ ASSERT(pkg != NULL, return NULL); ASSERT(pkg->origin != ALPM_PKG_FROM_FILE, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK;
return pkg->origin_data.db; } @@ -391,7 +391,7 @@ alpm_db_t SYMEXPORT *alpm_pkg_get_db(alpm_pkg_t *pkg) void SYMEXPORT *alpm_pkg_changelog_open(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->changelog_open(pkg); }
@@ -400,7 +400,7 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size, const alpm_pkg_t *pkg, void *fp) { ASSERT(pkg != NULL, return 0); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->changelog_read(ptr, size, pkg, fp); }
@@ -408,7 +408,7 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size, int SYMEXPORT alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->changelog_close(pkg, fp); }
@@ -416,7 +416,7 @@ int SYMEXPORT alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp) struct archive SYMEXPORT *alpm_pkg_mtree_open(alpm_pkg_t * pkg) { ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->mtree_open(pkg); }
@@ -425,7 +425,7 @@ int SYMEXPORT alpm_pkg_mtree_next(const alpm_pkg_t * pkg, struct archive *archiv struct archive_entry **entry) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->mtree_next(pkg, archive, entry); }
@@ -433,14 +433,14 @@ int SYMEXPORT alpm_pkg_mtree_next(const alpm_pkg_t * pkg, struct archive *archiv int SYMEXPORT alpm_pkg_mtree_close(const alpm_pkg_t * pkg, struct archive *archive) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->mtree_close(pkg, archive); }
int SYMEXPORT alpm_pkg_has_scriptlet(alpm_pkg_t *pkg) { ASSERT(pkg != NULL, return -1); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK; return pkg->ops->has_scriptlet(pkg); }
@@ -448,7 +448,7 @@ static void find_requiredby(alpm_pkg_t *pkg, alpm_db_t *db, alpm_list_t **reqs, int optional) { const alpm_list_t *i; - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK;
for(i = _alpm_db_get_pkgcache(db); i; i = i->next) { alpm_pkg_t *cachepkg = i->data; @@ -478,7 +478,7 @@ static alpm_list_t *compute_requiredby(alpm_pkg_t *pkg, int optional) alpm_db_t *db;
ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK;
if(pkg->origin == ALPM_PKG_FROM_FILE) { /* The sane option; search locally for things that require this. */ diff --git a/lib/libalpm/package.h b/lib/libalpm/package.h index 114d225..4dce542 100644 --- a/lib/libalpm/package.h +++ b/lib/libalpm/package.h @@ -130,7 +130,7 @@ struct __alpm_pkg_t { char *file; } origin_data;
- alpm_dbinfrq_t infolevel; + int infolevel; alpm_pkgvalidation_t validation; alpm_pkgfrom_t origin; alpm_pkgreason_t reason; diff --git a/lib/libalpm/signing.c b/lib/libalpm/signing.c index 6557c20..527e763 100644 --- a/lib/libalpm/signing.c +++ b/lib/libalpm/signing.c @@ -771,7 +771,7 @@ int _alpm_check_pgp_helper(alpm_handle_t *handle, const char *path, if(ret && handle->pm_errno == ALPM_ERR_SIG_MISSING) { if(optional) { _alpm_log(handle, ALPM_LOG_DEBUG, "missing optional signature\n"); - handle->pm_errno = 0; + handle->pm_errno = ALPM_ERR_OK; ret = 0; } else { _alpm_log(handle, ALPM_LOG_DEBUG, "missing required signature\n"); @@ -931,7 +931,7 @@ int SYMEXPORT alpm_pkg_check_pgp_signature(alpm_pkg_t *pkg, { ASSERT(pkg != NULL, return -1); ASSERT(siglist != NULL, RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1)); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK;
return _alpm_gpgme_checksig(pkg->handle, pkg->filename, pkg->base64_sig, siglist); @@ -948,7 +948,7 @@ int SYMEXPORT alpm_db_check_pgp_signature(alpm_db_t *db, { ASSERT(db != NULL, return -1); ASSERT(siglist != NULL, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1)); - db->handle->pm_errno = 0; + db->handle->pm_errno = ALPM_ERR_OK;
return _alpm_gpgme_checksig(db->handle, _alpm_db_path(db), NULL, siglist); } diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 00b68d0..41b95f6 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -57,7 +57,7 @@ alpm_pkg_t SYMEXPORT *alpm_sync_newversion(alpm_pkg_t *pkg, alpm_list_t *dbs_syn alpm_pkg_t *spkg = NULL;
ASSERT(pkg != NULL, return NULL); - pkg->handle->pm_errno = 0; + pkg->handle->pm_errno = ALPM_ERR_OK;
for(i = dbs_sync; !spkg && i; i = i->next) { alpm_db_t *db = i->data; @@ -460,7 +460,7 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data) transaction. The packages will be removed from the actual transaction when the transaction packages are replaced with a dependency-reordered list below */ - handle->pm_errno = 0; + handle->pm_errno = ALPM_ERR_OK; if(data) { alpm_list_free_inner(*data, (alpm_list_fn_free)alpm_depmissing_free); @@ -1140,7 +1140,7 @@ static int check_validity(alpm_handle_t *handle, EVENT(handle, &event);
for(i = handle->trans->add; i; i = i->next, current++) { - struct validity v = { i->data, NULL, NULL, 0, 0, 0 }; + struct validity v = { i->data, NULL, NULL, ALPM_SIG_NONE, 0, 0 }; int percent = (int)(((double)current_bytes / total_bytes) * 100);
PROGRESS(handle, ALPM_PROGRESS_INTEGRITY_START, "", percent, @@ -1195,7 +1195,7 @@ static int check_validity(alpm_handle_t *handle, } alpm_list_free(errors);
- if(!handle->pm_errno) { + if(handle->pm_errno == ALPM_ERR_OK) { RET_ERR(handle, ALPM_ERR_PKG_INVALID, -1); } return -1; @@ -1280,7 +1280,7 @@ static int load_packages(alpm_handle_t *handle, alpm_list_t **data, EVENT(handle, &event);
if(errors) { - if(!handle->pm_errno) { + if(handle->pm_errno == ALPM_ERR_OK) { RET_ERR(handle, ALPM_ERR_PKG_INVALID, -1); } return -1; diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 1398470..1d23864 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -418,7 +418,7 @@ cleanup: alpm_transflag_t SYMEXPORT alpm_trans_get_flags(alpm_handle_t *handle) { /* Sanity checks */ - CHECK_HANDLE(handle, return -1); + CHECK_HANDLE(handle, return ALPM_TRANS_FLAG_ERROR); ASSERT(handle->trans != NULL, RET_ERR(handle, ALPM_ERR_TRANS_NULL, -1));
return handle->trans->flags; diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h index 5a2c105..b9c5c17 100644 --- a/lib/libalpm/util.h +++ b/lib/libalpm/util.h @@ -77,7 +77,7 @@ void _alpm_alloc_fail(size_t size);
#define DOUBLE_EQ(x, y) (fabs((x) - (y)) < DBL_EPSILON)
-#define CHECK_HANDLE(handle, action) do { if(!(handle)) { action; } (handle)->pm_errno = 0; } while(0) +#define CHECK_HANDLE(handle, action) do { if(!(handle)) { action; } (handle)->pm_errno = ALPM_ERR_OK; } while(0)
/** Standard buffer size used throughout the library. */ #ifdef BUFSIZ diff --git a/src/pacman/conf.c b/src/pacman/conf.c index 25de7af..a2d5555 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -328,7 +328,7 @@ int config_set_arch(const char *arch) static int process_siglevel(alpm_list_t *values, alpm_siglevel_t *storage, alpm_siglevel_t *storage_mask, const char *file, int linenum) { - alpm_siglevel_t level = *storage, mask = *storage_mask; + int level = *storage, mask = *storage_mask; alpm_list_t *i; int ret = 0;
@@ -1005,7 +1005,7 @@ static int _parse_directive(const char *file, int linenum, const char *name, section->repo = calloc(sizeof(config_repo_t), 1); section->repo->name = strdup(name); section->repo->siglevel = ALPM_SIG_USE_DEFAULT; - section->repo->usage = 0; + section->repo->usage = ALPM_DB_USAGE_NONE; config->repos = alpm_list_add(config->repos, section->repo); } return 0; diff --git a/src/pacman/conf.h b/src/pacman/conf.h index 2ddeadb..d7bc1bc 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -96,13 +96,13 @@ typedef struct __config_t { unsigned short noask; unsigned int ask; alpm_transflag_t flags; - alpm_siglevel_t siglevel; - alpm_siglevel_t localfilesiglevel; - alpm_siglevel_t remotefilesiglevel; + int siglevel; + int localfilesiglevel; + int remotefilesiglevel;
- alpm_siglevel_t siglevel_mask; - alpm_siglevel_t localfilesiglevel_mask; - alpm_siglevel_t remotefilesiglevel_mask; + int siglevel_mask; + int localfilesiglevel_mask; + int remotefilesiglevel_mask;
/* conf file options */ /* I Love Candy! */ diff --git a/src/pacman/database.c b/src/pacman/database.c index 0197903..a62c082 100644 --- a/src/pacman/database.c +++ b/src/pacman/database.c @@ -61,7 +61,7 @@ static int change_install_reason(alpm_list_t *targets) }
/* Lock database */ - if(trans_init(0, 0) == -1) { + if(trans_init(ALPM_TRANS_FLAG_NONE, 0) == -1) { return 1; }
diff --git a/src/util/cleanupdelta.c b/src/util/cleanupdelta.c index 043acf1..d107811 100644 --- a/src/util/cleanupdelta.c +++ b/src/util/cleanupdelta.c @@ -68,7 +68,7 @@ static void checkdbs(alpm_list_t *dbnames) { alpm_db_t *db = NULL; alpm_list_t *i; - const alpm_siglevel_t level = ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL; + const int level = ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL;
for(i = dbnames; i; i = alpm_list_next(i)) { const char *dbname = i->data; diff --git a/src/util/pactree.c b/src/util/pactree.c index 67be9f9..2463f40 100644 --- a/src/util/pactree.c +++ b/src/util/pactree.c @@ -128,7 +128,7 @@ static int register_syncs(void) FILE *fp; char *section = NULL; char line[LINE_MAX]; - const alpm_siglevel_t level = ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL; + const int level = ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL;
fp = fopen(configfile, "r"); if(!fp) { diff --git a/src/util/testpkg.c b/src/util/testpkg.c index 89e8dbd..b176e6b 100644 --- a/src/util/testpkg.c +++ b/src/util/testpkg.c @@ -43,7 +43,7 @@ int main(int argc, char *argv[]) alpm_handle_t *handle; alpm_errno_t err; alpm_pkg_t *pkg = NULL; - const alpm_siglevel_t level = ALPM_SIG_PACKAGE | ALPM_SIG_PACKAGE_OPTIONAL; + const int level = ALPM_SIG_PACKAGE | ALPM_SIG_PACKAGE_OPTIONAL;
if(argc != 2) { fprintf(stderr, "testpkg (pacman) v" PACKAGE_VERSION "\n\n" -- 2.9.3
On 28 Sep 2016, at 1:28 pm -0400, Andrew Gregory wrote:
On 09/03/16 at 10:14pm, ivy.foster@gmail.com wrote:
From: Ivy Foster
In many cases, it was enough to add error or "none" values to enums, to account for cases where functions returned either an enumerated value or 0/-1.
A common code pattern in pacman is to use enums to create bitfields representing various option combinations. Since they are not technically part of the enumerated type used to build them, these bitfields have been reassigned to type int.
Even though all of these changes are related our enum handling, there is a lot going on in this patch. I would prefer if it were broken up into more specific change sets.
Fair enough! I'll start working on that tonight.
* converting bitfield values to int
I think int is the correct type for bitfields, but it looks like you missed many. Enums like siglevel_t and usage_t are used exclusively in the construction of bitfields. I don't think we should really have any variables of those types anywhere.
That makes sense. I like the consistency, too. I'll do a more fine-grained search for those for the bitfield-to-int patch.
* adding ERR_OK
OK - libarchive and libcurl do this and I think it makes sense.
* adding NONE/ERROR to other enums
The addition of NONE values to enums appears to be unnecessary to me. I only see them being used as empty bitfield values, and, once we change those to int, using a literal 0 for those is just fine.
I'm not fond of adding ERROR values to every enum just so that we can return -1 for invalid input. Most of them look unnecessary because the relevant functions are actually returning bitfields and should be changed to return an int, making -1 a valid return value.
Cool, I'll do it that way instead. Thanks for the feedback! Ivy
participants (5)
-
Allan McRae
-
Andrew Gregory
-
Ivy Foster
-
ivy.foster@gmail.com
-
Martin Kühne