master.c revision a7024a121041f5498d35f36ef56078acbf7a0677
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (C) 2002 Timo Sirainen */
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#include "common.h"
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen#include "ioloop.h"
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#include "ostream.h"
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen#include "network.h"
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen#include "cookie.h"
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainen#include "master.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen#define MAX_OUTBUF_SIZE (10 * sizeof(struct auth_cookie_reply_data))
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainenstatic struct auth_cookie_reply_data failure_reply;
0f833d18af36bf307cd69f235eb3fb779245b478Timo Sirainen
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainenstatic struct ostream *output;
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainenstatic struct io *io_master;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainenstatic unsigned int master_pos;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainenstatic char master_buf[sizeof(struct auth_cookie_request_data)];
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainenstatic void master_handle_request(struct auth_cookie_request_data *request,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen int fd __attr_unused__)
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen{
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen struct cookie_data *cookie;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen struct auth_cookie_reply_data *reply, temp_reply;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen cookie = cookie_lookup_and_remove(request->login_pid, request->cookie);
0f833d18af36bf307cd69f235eb3fb779245b478Timo Sirainen if (cookie == NULL)
0f833d18af36bf307cd69f235eb3fb779245b478Timo Sirainen reply = &failure_reply;
0f833d18af36bf307cd69f235eb3fb779245b478Timo Sirainen else {
0f833d18af36bf307cd69f235eb3fb779245b478Timo Sirainen if (cookie->auth_fill_reply(cookie, &temp_reply))
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen reply = &temp_reply;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen else
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen reply = &failure_reply;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen cookie->free(cookie);
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen }
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen reply->id = request->id;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen switch (o_stream_send(output, reply, sizeof(*reply))) {
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen case -2:
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen i_fatal("Master transmit buffer full, aborting");
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen case -1:
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen /* master died, kill ourself too */
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen io_loop_stop(ioloop);
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen break;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen }
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen}
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainenstatic void master_input(void *context __attr_unused__, int fd,
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen struct io *io __attr_unused__)
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen{
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen int ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen ret = net_receive(fd, master_buf + master_pos,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen sizeof(master_buf) - master_pos);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen if (ret < 0) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen /* master died, kill ourself too */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen io_loop_stop(ioloop);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen return;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen master_pos += ret;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen if (master_pos < sizeof(master_buf))
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen return;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen /* reply is now read */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen master_handle_request((struct auth_cookie_request_data *) master_buf,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen fd);
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen master_pos = 0;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen}
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenvoid master_init(void)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen{
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen memset(&failure_reply, 0, sizeof(failure_reply));
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen master_pos = 0;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen output = o_stream_create_file(MASTER_SOCKET_FD, default_pool,
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen MAX_OUTBUF_SIZE, IO_PRIORITY_DEFAULT,
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen FALSE);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen io_master = io_add(MASTER_SOCKET_FD, IO_READ, master_input, NULL);
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen /* just a note to master that we're ok. if we die before,
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainen master should shutdown itself. */
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen o_stream_send(output, "O", 1);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainenvoid master_deinit(void)
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o_stream_unref(output);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen io_remove(io_master);
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen}
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen