aboutsummaryrefslogtreecommitdiffstats
path: root/src/version.h
blob: c008481dcdff6ba20d30150d5b3e461927c9093c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#ifndef L2SU_VERSION_H_INCLUDED
#define L2SU_VERSION_H_INCLUDED

#include "digest/digest.h"
#include <time.h>
#include <jansson.h>
#include <stdbool.h>

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);

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);

unsigned l2_version_collect_libraries(json_t *version, struct l2_version_library **libs, l2_version_feature_match_proc_t *feature_matcher);
unsigned l2_version_download_libraries(struct l2_version_library *libs);
void l2_version_free_libraries(struct l2_version_library *libs);

unsigned l2_version_download_jar(json_t *version, const char *specifier, char **path);

#endif /* include guard */