aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/core/include/utils.h5
-rw-r--r--src/lib/core/utils.c28
2 files changed, 33 insertions, 0 deletions
diff --git a/src/lib/core/include/utils.h b/src/lib/core/include/utils.h
index 583a8b8..1512285 100644
--- a/src/lib/core/include/utils.h
+++ b/src/lib/core/include/utils.h
@@ -456,4 +456,9 @@ void debug_hexdump(char *data, int len);
* @return -1 on error
*/
int grow(size_t size_new, size_t *size_orig, char **data);
+
+int in_ascii_range(char c, char lower, char upper);
+
+#define GIT_HASH_LEN 40
+int is_git_sha(char const *hash);
#endif //STASIS_UTILS_H
diff --git a/src/lib/core/utils.c b/src/lib/core/utils.c
index f02a7ea..3d9659d 100644
--- a/src/lib/core/utils.c
+++ b/src/lib/core/utils.c
@@ -966,3 +966,31 @@ int grow(const size_t size_new, size_t *size_orig, char **data) {
return 0;
}
+int in_ascii_range(const char c, char lower, char upper) {
+ if (!(c >= lower && c <= upper)) {
+ return 0;
+ }
+ return 1;
+}
+
+int is_git_sha(char const *hash) {
+ size_t result = 0;
+ size_t len = strlen(hash);
+
+ if (len > GIT_HASH_LEN) {
+ // too long to be a git commit hash
+ return 0;
+ }
+ for (size_t i = 0; i < len; i++) {
+ if (in_ascii_range(hash[i], 'a', 'f')
+ || in_ascii_range(hash[i], 'A', 'F')
+ || in_ascii_range(hash[i], '0', '9')) {
+ result++;
+ }
+ }
+ if (result < len) {
+ return 0;
+ }
+ return 1;
+}
+