#ifndef L2SU_VERSION_H_INCLUDED #define L2SU_VERSION_H_INCLUDED #include "digest/digest.h" #include #include #include enum { VERSION_SUCCESS, VERSION_EFORMAT, VERSION_EJSON, VERSION_EALLOC, VERSION_ERRNO, VERSION_EDOWNLOAD, VERSION_ENOTFOUND, VERSION_ERECURSE }; struct l2_version_remote { struct l2_version_remote *next; struct l2_version_remote *prev; char *id; char *type; char *url; l2_sha1_digest_t sha1; json_int_t compliance_level; time_t update_time; time_t release_time; }; enum { VERSION_ARG_ACTION_ALLOW, VERSION_ARG_ACTION_DISALLOW }; enum { VERSION_DOWNLOAD_CLIENT, VERSION_DOWNLOAD_SERVER, VERSION_DOWNLOAD_WINDOWS_SERVER, VERSION_DOWNLOAD_CLIENT_MAPPINGS, VERSION_DOWNLOAD_SERVER_MAPPINGS, VERSION_DOWNLOAD_MAX }; typedef bool (l2_version_feature_match_proc_t)(const char *name, json_t *val); struct l2_version_download { char *url; l2_sha1_digest_t sha1; size_t size; }; struct l2_version_library { char *url; char *artifactpath; char *fullpath; l2_sha1_digest_t digest; bool has_digest; size_t size; struct { enum { EXTRACT_NONE, /* do not extract anything */ EXTRACT_OLD, /* extract whole jar, preserving entries that are not excluded */ EXTRACT_NEW /* extract only .dll, .so, .dylib from jar */ } extracttype; char **exclude; } extract; struct l2_version_library *next; }; struct l2_version { json_t *data; struct l2_version *inherit; }; extern const char *const l2_version__messages[]; #define l2_version_strerror(_en) l2_version__messages[(_en)] unsigned l2_version_load_remote(void); unsigned l2_version_load_local(const char *name, json_t **ojs); int l2_version_check_integrity(FILE *fp, l2_sha1_digest_t *digest, size_t sz); enum l2_version_check_result { RULE_CHECK_ERROR = -1, RULE_CHECK_DEFAULT, RULE_CHECK_ALLOW, RULE_CHECK_DISALLOW, } l2_version_check_rules(json_t *rules, l2_version_feature_match_proc_t *matcher); #endif /* include guard */