dict-process.c revision e17fd08d865094c644aa3298ad29320b60c60247
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainenstatic void dict_process_unlisten(struct dict_process *process);
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainenstatic int dict_process_start(struct dict_process *process)
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen unsigned int i, count;
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen /* set stdin and stdout to /dev/null, so anything written into it
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen gets ignored. */
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainen /* stderr = log, 3 = listener */
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen for (i = 0; i <= 3; i++)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen env_put(t_strconcat("DICT_LISTEN_FROM_FD=", process->path, NULL));
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (settings_root->defaults->dict_db_config != NULL) {
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen dicts = array_get(&settings_root->dicts, &count);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen env_put(t_strdup_printf("DICT_%s=%s", dicts[i], dicts[i+1]));
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* make sure we don't leak syslog fd, but do it last so that
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen any errors above will be logged */
da4376093d4e1b26b14ea1e945689fb7056fe0a0Timo Sirainen i_fatal_status(FATAL_EXEC, "execv(%s) failed: %m", executable);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenstatic void dict_process_listen_input(struct dict_process *process)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenstatic int dict_process_listen(struct dict_process *process)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen process->fd = net_listen_unix_unlink_stale(process->path, 128);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen i_error("Socket already exists: %s", process->path);
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainen i_error("net_listen_unix(%s) failed: %m", process->path);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstatic void dict_process_unlisten(struct dict_process *process)
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainendict_process_destroyed(struct child_process *process,
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen struct dict_process *p = (struct dict_process *)process;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen /* not killed by ourself */
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen process = dict_process = i_new(struct dict_process, 1);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen process->path = i_strconcat(settings_root->defaults->base_dir,