commit - ba61c78b3aec77e1f1eeb8c70436273d9dad9219
commit + e112ed1d59eb471c749edac917491dbbcf366784
blob - 970773d8d9c33955439e30233a5b829c655dfaad
blob + bf4974462c73274329bbad4d3a80a1cc1882fe93
--- gotwebd/config.c
+++ gotwebd/config.c
STAILQ_INSERT_TAIL(rules, rule, entry);
}
+
+void
+config_set_repository(struct imsgev *iev, struct gotwebd_repo *repo)
+{
+ if (imsg_compose_event(iev,
+ GOTWEBD_IMSG_CFG_REPO, 0, -1, -1, repo, sizeof(*repo)) == -1)
+ fatal("imsg_compose_event GOTWEBD_IMSG_CFG_REPO");
+}
+
+void
+config_get_repository(struct gotwebd_repolist *repos, struct imsg *imsg)
+{
+ struct gotwebd_repo *repo;
+ size_t len;
+
+ repo = calloc(1, sizeof(*repo));
+ if (repo == NULL)
+ fatal("malloc");
+
+ if (imsg_get_data(imsg, repo, sizeof(*repo)))
+ fatalx("%s: invalid CFG_REPO message", __func__);
+
+ switch (repo->auth_config) {
+ case GOTWEBD_AUTH_DISABLED:
+ case GOTWEBD_AUTH_SECURE:
+ case GOTWEBD_AUTH_INSECURE:
+ break;
+ default:
+ fatalx("%s: invalid CFG_REPO message", __func__);
+ }
+
+ len = strnlen(repo->name, sizeof(repo->name));
+ if (len == 0 || len >= sizeof(repo->name))
+ fatalx("%s: invalid CFG_REPO message", __func__);
+
+ STAILQ_INIT(&repo->access_rules);
+
+ TAILQ_INSERT_TAIL(repos, repo, entry);
+}
blob - bf90c2001f8ab845bffc292ddabbd0da93fa3221
blob + 7fa1ab0f5de4526e17c35977ee3c1a068f457846
--- gotwebd/gotweb.c
+++ gotwebd/gotweb.c
struct imsgbuf *ibuf;
struct imsg imsg;
struct gotwebd *env = gotwebd_env;
+ struct server *srv;
+ struct gotwebd_repo *repo;
ssize_t n;
int shut = 0;
config_get_access_rule(&env->access_rules,
&imsg);
} else {
- struct server *srv;
-
srv = TAILQ_LAST(&env->servers, serverlist);
if (TAILQ_EMPTY(&srv->repos)) {
/* per-server access rule */
config_get_access_rule(
&srv->access_rules, &imsg);
} else {
- struct gotwebd_repo *repo;
-
/* per-repository access rule */
repo = TAILQ_LAST(&srv->repos,
gotwebd_repolist);
case GOTWEBD_IMSG_CFG_SRV:
config_getserver(env, &imsg);
break;
+ case GOTWEBD_IMSG_CFG_REPO:
+ if (TAILQ_EMPTY(&env->servers))
+ fatalx("%s: unexpected CFG_REPO msg", __func__);
+ srv = TAILQ_LAST(&env->servers, serverlist);
+ config_get_repository(&srv->repos, &imsg);
+ break;
case GOTWEBD_IMSG_CFG_FD:
config_getfd(env, &imsg);
break;
blob - 69f105491d4a849d9231fe8547d59084d175025b
blob + a2bcb51ecdc5ad72372dc40a7d33332c84a54576
--- gotwebd/gotwebd.c
+++ gotwebd/gotwebd.c
gotwebd_configure(struct gotwebd *env, uid_t uid, gid_t gid)
{
struct server *srv;
+ struct gotwebd_repo *repo;
struct socket *sock;
char auth_token_secret[32];
int i;
&srv->access_rules);
}
- /* TODO: send repositories and per-repo access rules */
+ /* send repositories */
+ TAILQ_FOREACH(repo, &srv->repos, entry) {
+ for (i = 0; i < env->nserver; i++) {
+ config_set_repository(&env->iev_login[i],
+ repo);
+ config_set_repository(&env->iev_gotweb[i],
+ repo);
+
+ /* send per-repository access rules */
+ config_set_access_rules(&env->iev_login[i],
+ &repo->access_rules);
+ config_set_access_rules(&env->iev_gotweb[i],
+ &repo->access_rules);
+ }
+ }
+
+ for (i = 0; i < env->nserver; i++) {
+ if (imsgbuf_flush(&env->iev_login[i].ibuf) == -1)
+ fatal("imsgbuf_flush");
+ imsg_event_add(&env->iev_login[i]);
+
+ if (imsgbuf_flush(&env->iev_gotweb[i].ibuf) == -1)
+ fatal("imsgbuf_flush");
+ imsg_event_add(&env->iev_gotweb[i]);
+ }
}
/* send our sockets */
blob - f7efb51b844b9b62895cd011fdae0d444d6e8ae4
blob + 81ed267b63329b626454173f2072d58cb1364aa0
--- gotwebd/gotwebd.h
+++ gotwebd/gotwebd.h
GOTWEBD_IMSG_CFG_SOCK,
GOTWEBD_IMSG_CFG_FD,
GOTWEBD_IMSG_CFG_ACCESS_RULE,
+ GOTWEBD_IMSG_CFG_REPO,
GOTWEBD_IMSG_CFG_DONE,
GOTWEBD_IMSG_CTL_PIPE,
GOTWEBD_IMSG_CTL_START,
void config_set_access_rules(struct imsgev *,
struct gotwebd_access_rule_list *);
void config_get_access_rule(struct gotwebd_access_rule_list *, struct imsg *);
+void config_set_repository(struct imsgev *, struct gotwebd_repo *);
+void config_get_repository(struct gotwebd_repolist *, struct imsg *);
int config_init(struct gotwebd *);
/* auth.c */
blob - b91e56a07f7b0fd10a0ca6c989f76d599a26c2d0
blob + 43e4facc484aba4c58ac40ab763f4be719880792
--- gotwebd/login.c
+++ gotwebd/login.c
struct imsgbuf *ibuf;
struct imsg imsg;
struct gotwebd *env = gotwebd_env;
+ struct server *srv;
+ struct gotwebd_repo *repo;
ssize_t n;
int shut = 0;
config_get_access_rule(&env->access_rules,
&imsg);
} else {
- struct server *srv;
-
srv = TAILQ_LAST(&env->servers, serverlist);
if (TAILQ_EMPTY(&srv->repos)) {
/* per-server access rule */
config_get_access_rule(
&srv->access_rules, &imsg);
} else {
- struct gotwebd_repo *repo;
-
/* per-repository access rule */
repo = TAILQ_LAST(&srv->repos,
gotwebd_repolist);
case GOTWEBD_IMSG_CFG_SRV:
config_getserver(gotwebd_env, &imsg);
break;
+ case GOTWEBD_IMSG_CFG_REPO:
+ if (TAILQ_EMPTY(&env->servers))
+ fatalx("%s: unexpected CFG_REPO msg", __func__);
+ srv = TAILQ_LAST(&env->servers, serverlist);
+ config_get_repository(&srv->repos, &imsg);
+ break;
case GOTWEBD_IMSG_CTL_PIPE:
if (env->iev_server == NULL)
recv_server_pipe(env, &imsg);