snac.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* snac - A simple, minimalistic ActivityPub instance */
  2. /* copyright (c) 2022 grunfink - MIT license */
  3. #define XS_IMPLEMENTATION
  4. #include "xs.h"
  5. #include "xs_io.h"
  6. #include "xs_encdec.h"
  7. #include "xs_json.h"
  8. #include "xs_curl.h"
  9. #include "xs_openssl.h"
  10. #include "xs_socket.h"
  11. #include "xs_httpd.h"
  12. #include "snac.h"
  13. d_char *srv_basedir = NULL;
  14. d_char *srv_config = NULL;
  15. d_char *srv_baseurl = NULL;
  16. int dbglevel = 0;
  17. d_char *xs_time(char *fmt, int local)
  18. /* returns a d_char with a formated time */
  19. {
  20. time_t t = time(NULL);
  21. struct tm tm;
  22. char tmp[64];
  23. if (local)
  24. localtime_r(&t, &tm);
  25. else
  26. gmtime_r(&t, &tm);
  27. strftime(tmp, sizeof(tmp), fmt, &tm);
  28. return xs_str_new(tmp);
  29. }
  30. void srv_debug(int level, d_char *str)
  31. /* logs a debug message */
  32. {
  33. xs *msg = str;
  34. if (dbglevel >= level) {
  35. xs *tm = xs_local_time("%H:%M:%S");
  36. fprintf(stderr, "%s %s\n", tm, msg);
  37. }
  38. }
  39. int srv_open(char *basedir)
  40. /* opens a server */
  41. {
  42. int ret = 0;
  43. xs *cfg_file = NULL;
  44. FILE *f;
  45. srv_basedir = xs_str_new(basedir);
  46. cfg_file = xs_fmt("%s/server.json", basedir);
  47. if ((f = fopen(cfg_file, "r")) == NULL)
  48. srv_log(xs_fmt("cannot open %s", cfg_file));
  49. else {
  50. xs *cfg_data;
  51. /* read full config file */
  52. cfg_data = xs_readall(f);
  53. /* parse */
  54. srv_config = xs_json_loads(cfg_data);
  55. if (srv_config == NULL)
  56. srv_log(xs_fmt("cannot parse %s", cfg_file));
  57. else {
  58. char *host;
  59. char *prefix;
  60. char *dbglvl;
  61. host = xs_dict_get(srv_config, "host");
  62. prefix = xs_dict_get(srv_config, "prefix");
  63. dbglvl = xs_dict_get(srv_config, "dbglevel");
  64. if (host == NULL || prefix == NULL)
  65. srv_log(xs_str_new("cannot get server data"));
  66. else {
  67. srv_baseurl = xs_fmt("https://%s%s", host, prefix);
  68. dbglevel = (int) xs_number_get(dbglvl);
  69. if ((dbglvl = getenv("DEBUG")) != NULL) {
  70. dbglevel = atoi(dbglvl);
  71. srv_log(xs_fmt("DEBUG level set to %d from environment", dbglevel));
  72. }
  73. ret = 1;
  74. }
  75. }
  76. }
  77. return ret;
  78. }