#ifndef L2SU_MAIN_H_INCLUDED #define L2SU_MAIN_H_INCLUDED #include "command.h" #include "digest/digest.h" #include "instance.h" #include "version.h" #include "macros.h" #include "user.h" #include #include #include #include #include struct l2_user_paths { const char *config; const char *data; }; struct tag_l2_state_t { struct l2_user_paths paths; /* eventually instances and other stuff will be stored in a hash table or something, * but for now a doubly-linked list accomplishes our goals */ struct l2_instance *instance_head; struct l2_instance *instance_tail; struct l2_version_remote *ver_latest, *ver_snapshot; struct l2_version_remote *ver_remote_head; struct l2_version_remote *ver_remote_tail; struct l2_user *users_head, *users_tail; }; extern struct tag_l2_state_t l2_state; /* homecooked string methods */ char *l2_launcher_strapp(char *target, const char *src); bool l2_launcher_strpre(const char *pre, const char *text); char *l2_launcher_sprintf_alloc(const char *fmt, ...) L2_FORMAT(printf, 1, 2); char *l2_launcher_sprintf_resize(char **buf, size_t *len, const char *fmt, ...) L2_FORMAT(printf, 3, 4); /* launcher utilities */ char *l2_launcher_find_config_path(void); char *l2_launcher_find_data_path(void); int l2_launcher_open_config(const char *path, int flags, mode_t mode); int l2_launcher_mkdir_parents(const char *path); int l2_launcher_mkdir_parents_ex(const char *path, unsigned ignore); int l2_launcher_rm_tree(const char *path, int nfds); struct l2_ftw_data { int depth; int reloffset; int baseoffset; void *user; }; enum { L2_FTW_FILE = 0, L2_FTW_DIR = 1, L2_FTW_SYMLINK = 2, L2_FTW_TYPEMASK = 3, L2_FTW_NONEXIST = 4 }; typedef int (l2_ftw_proc_t)(const char * /*fname*/, const struct stat * /*sb*/, int /*flags*/, struct l2_ftw_data * /*data*/); int l2_launcher_ftw(const char *path, int depth, l2_ftw_proc_t *proc, void *user); struct l2_dlbuf { void *data; size_t size; size_t capacity; }; void l2_launcher_download_init(struct l2_dlbuf *buf); void *l2_launcher_download_finalize(struct l2_dlbuf *buf, size_t *psz); void l2_launcher_download_cleanup(struct l2_dlbuf *buf); //extern size_t (*const l2_dlcb)(char *, size_t, size_t, void *); extern const curl_write_callback l2_dlcb; CURLcode l2_launcher_download(CURL *cd, const char *url, void **odata, size_t *osize); int l2_launcher_should_download(const char *path, const l2_sha1_digest_t *expectdigest, size_t expectsize); int l2_launcher_check_integrity(FILE *fp, const l2_sha1_digest_t *digest, size_t sz); int l2_launcher_download_checksummed(const char *url, const char *pathstr, l2_sha1_digest_t *expect_digest, size_t expect_size); int l2_json_merge_objects(json_t *j1, json_t *j2); /* string substitute utility */ typedef struct l2_subst l2_subst_t; int l2_subst_init(l2_subst_t **sp); int l2_subst_add(l2_subst_t *sp, const char *name, const char *value); int l2_subst_apply(l2_subst_t *sp, const char *in, char **out); void l2_subst_free(l2_subst_t *sp); /* parses an RFC3339 time string */ int l2_parse_time(const char *timestr, time_t *ocaltime); #endif /* include guard */