quota-status.c revision c5acac1fd44571aabefc1b4db291488b87f822a0
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "lib.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "ostream.h"
c2d2161296e2361f97ee48b70b168602157069e6Timo Sirainen#include "connection.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "restrict-access.h"
c2d2161296e2361f97ee48b70b168602157069e6Timo Sirainen#include "master-service.h"
c2d2161296e2361f97ee48b70b168602157069e6Timo Sirainen#include "master-service-settings.h"
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#include "mail-namespace.h"
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#include "mail-storage.h"
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#include "mail-storage-settings.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "mail-storage-service.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "quota-private.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "quota-plugin.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
cf77eee4f485c152886e12bc3aa288da81c68532Timo Sirainenenum quota_protocol {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen QUOTA_PROTOCOL_UNKNOWN = 0,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen QUOTA_PROTOCOL_POSTFIX
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen};
686bc4ea97a86333316182865be3fcfe465a5827Timo Sirainen
686bc4ea97a86333316182865be3fcfe465a5827Timo Sirainenstruct quota_client {
686bc4ea97a86333316182865be3fcfe465a5827Timo Sirainen struct connection conn;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen char *recipient;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen uoff_t size;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen};
d1808f883d0da0e9740616695618924e8278fce1Timo Sirainen
686bc4ea97a86333316182865be3fcfe465a5827Timo Sirainenstatic enum quota_protocol protocol;
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainenstatic struct mail_storage_service_ctx *storage_service;
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainenstatic struct connection_list *clients;
686bc4ea97a86333316182865be3fcfe465a5827Timo Sirainenstatic char *nouser_reply;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void client_connected(struct master_service_connection *conn)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen{
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct quota_client *client;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen client = i_new(struct quota_client, 1);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen connection_init_server(clients, &client->conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "(quota client)", conn->fd, conn->fd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen master_service_client_connection_accept(conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void client_reset(struct quota_client *client)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen{
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen i_free_and_null(client->recipient);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainenstatic int
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenquota_check(struct mail_user *user, uoff_t mail_size, const char **error_r)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen{
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct quota_user *quser = QUOTA_USER_CONTEXT(user);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail_namespace *ns;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mailbox *box;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct quota_transaction_context *ctx;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen bool too_large;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen int ret;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen if (quser == NULL) {
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* no quota for user */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen return 1;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen }
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen ns = mail_namespace_find_inbox(user->namespaces);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen box = mailbox_alloc(ns->list, "INBOX", 0);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ctx = quota_transaction_begin(box);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = quota_test_alloc(ctx, I_MAX(1, mail_size), &too_large);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen quota_transaction_rollback(&ctx);
c69a177207ed18d0f0210347430a60957136bd6cJosef 'Jeff' Sipek
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mailbox_free(&box);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (ret < 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen *error_r = "Internal quota calculation error";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen else if (ret == 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen *error_r = quser->quota->set->quota_exceeded_msg;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen return ret;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen}
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void client_handle_request(struct quota_client *client)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen{
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct mail_storage_service_input input;
4ca83616715c3bd417e34ced2c1d61852513e427Timo Sirainen struct mail_storage_service_user *service_user;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct mail_user *user;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen const char *value = NULL, *error;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen int ret;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (client->recipient == NULL) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen o_stream_send_str(client->conn.output, "action=DUNNO\n\n");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen return;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen memset(&input, 0, sizeof(input));
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen input.username = client->recipient;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = mail_storage_service_lookup_next(storage_service, &input,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen &service_user, &user, &error);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen restrict_access_allow_coredumps(TRUE);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (ret == 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = nouser_reply;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen } else if (ret > 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if ((ret = quota_check(user, client->size, &error)) > 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* under quota */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = mail_user_plugin_getenv(user, "quota_status_success");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (value == NULL)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = "OK";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen } else if (ret == 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* over quota */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = mail_user_plugin_getenv(user, "quota_status_overquota");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (value == NULL)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = t_strdup_printf("554 5.2.2 %s\n\n", error);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = t_strdup(value); /* user's pool is being freed */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_user_unref(&user);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_storage_service_user_free(&service_user);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (ret < 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* temporary failure */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen o_stream_send_str(client->conn.output, t_strdup_printf(
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen "action=DEFER_IF_PERMIT %s\n\n", error));
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen } else {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen o_stream_send_str(client->conn.output,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen t_strdup_printf("action=%s\n\n", value));
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen}
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenstatic int client_input_line(struct connection *conn, const char *line)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen{
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct quota_client *client = (struct quota_client *)conn;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (*line == '\0') {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen o_stream_cork(conn->output);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen client_handle_request(client);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen o_stream_uncork(conn->output);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen client_reset(client);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen return 1;
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen }
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen if (client->recipient == NULL &&
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen strncmp(line, "recipient=", 10) == 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen client->recipient = i_strdup(line + 10);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen else if (strncmp(line, "size=", 5) == 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (str_to_uoff(line+5, &client->size) < 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen client->size = 0;
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen }
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen return 1;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen}
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void client_destroy(struct connection *conn)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen{
172b6edea36e425b0d0c35a854721ae63f57c289Timo Sirainen struct quota_client *client = (struct quota_client *)conn;
172b6edea36e425b0d0c35a854721ae63f57c289Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen connection_deinit(&client->conn);
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen client_reset(client);
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainen i_free(client);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen master_service_client_connection_destroyed(master_service);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic struct connection_settings client_set = {
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen .input_max_size = (size_t)-1,
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen .output_max_size = (size_t)-1,
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen .client = FALSE
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen};
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainenstatic const struct connection_vfuncs client_vfuncs = {
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainen .destroy = client_destroy,
172b6edea36e425b0d0c35a854721ae63f57c289Timo Sirainen .input_line = client_input_line
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainen};
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainen
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainenstatic void main_preinit(void)
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainen{
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainen restrict_access_by_env(NULL, FALSE);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen restrict_access_allow_coredumps(TRUE);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void main_init(void)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen{
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail_storage_service_input input;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const struct setting_parser_info *user_info;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const struct setting_parser_context *set_parser;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen const struct mail_user_settings *user_set;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen const char *value, *error;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen pool_t pool;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen clients = connection_list_init(&client_set, &client_vfuncs);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP |
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP |
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen MAIL_STORAGE_SERVICE_FLAG_ENABLE_CORE_DUMPS |
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen MAIL_STORAGE_SERVICE_FLAG_NO_CHDIR);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen memset(&input, 0, sizeof(input));
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen input.service = "quota-status";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen input.module = "mail";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen input.username = "";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen pool = pool_alloconly_create("service all settings", 4096);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (mail_storage_service_read_settings(storage_service, &input, pool,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen &user_info, &set_parser,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen &error) < 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_fatal("%s", error);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen user_set = master_service_settings_parser_get_others(master_service,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen set_parser)[0];
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen value = mail_user_set_plugin_getenv(user_set, "quota_status_nouser");
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen nouser_reply = value != NULL ? i_strdup(value) :
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_strdup("REJECT Unknown user");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen pool_unref(&pool);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen}
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void main_deinit(void)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen{
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen i_free(nouser_reply);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen connection_list_deinit(&clients);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_storage_service_deinit(&storage_service);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen}
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenint main(int argc, char *argv[])
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen{
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen enum master_service_flags service_flags =
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen int c;
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen protocol = QUOTA_PROTOCOL_UNKNOWN;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen master_service = master_service_init("quota-status", service_flags,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen &argc, &argv, "p:");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen while ((c = master_getopt(master_service)) > 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen switch (c) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen case 'p':
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (strcmp(optarg, "postfix") == 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen protocol = QUOTA_PROTOCOL_POSTFIX;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen else
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_fatal("Unknown -p parameter: '%s'", optarg);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen break;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen default:
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen return FATAL_DEFAULT;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen }
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (protocol == QUOTA_PROTOCOL_UNKNOWN)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_fatal("Missing -p parameter");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen master_service_init_log(master_service, "quota-status: ");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen main_preinit();
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen main_init();
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen master_service_init_finish(master_service);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen master_service_run(master_service, client_connected);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen main_deinit();
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen master_service_deinit(&master_service);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return 0;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen