maildrop.c
author convert-repo
Sat, 13 Jan 2024 08:53:42 +0000
changeset 46 af5d52d66199
parent 33 252e70a700c0
permissions -rw-r--r--
update tags
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     1
/*
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     2
 * Copyright (c) 2014 Sunil Nimmagadda <sunil@nimmagadda.net>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     3
 *
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     4
 * Permission to use, copy, modify, and distribute this software for any
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     5
 * purpose with or without fee is hereby granted, provided that the above
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     6
 * copyright notice and this permission notice appear in all copies.
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     7
 *
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     8
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     9
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    10
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    11
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    12
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    13
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    14
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    15
 */
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    16
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    17
#include <sys/param.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    18
#include <sys/types.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    19
#include <sys/socket.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    20
#include <sys/stat.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    21
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    22
#include <event.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    23
#include <fcntl.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    24
#include <pwd.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    25
#include <signal.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    26
#include <stdio.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    27
#include <stdlib.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    28
#include <string.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    29
#include <syslog.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    30
#include <unistd.h>
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    31
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    32
#include "imsgev.h"
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    33
#include "pop3d.h"
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    34
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    35
static void session_imsgev(struct imsgev *, int, struct imsg *);
33
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
    36
static void maildrop_init(struct imsgev *, struct imsg *, struct m_backend *);
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    37
static void update(struct imsgev *, struct imsg *, struct m_backend *);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    38
static void retr(struct imsgev *, struct imsg *, struct m_backend *);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    39
static void dele(struct imsgev *, struct imsg *, struct m_backend *);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    40
static void rset(struct imsgev *, struct imsg *, struct m_backend *);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    41
static void list(struct imsgev *, struct imsg *, struct m_backend *);
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
    42
static void list_all(struct imsgev *, struct imsg *, struct m_backend *);
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    43
static void do_list(unsigned int, size_t *, char *, size_t);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    44
static struct m_backend *m_backend_lookup(enum m_type);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    45
static void sig_handler(int, short, void *);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    46
static void needfd(struct imsgev *);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    47
static size_t expand(char *, const char *, size_t, struct passwd *);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    48
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    49
static struct mdrop m;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    50
4
cb3d0d99955c Import.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff changeset
    51
pid_t
32
efb124b66dbd mtype, mpath are accessible to maildrop, simplify setup parameters.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 31
diff changeset
    52
maildrop_setup(uint32_t session_id, int pair[2], struct passwd *pw)
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    53
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    54
	struct imsgev		iev_session;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    55
	struct event		ev_sigint, ev_sigterm;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    56
	struct m_backend	*mb;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    57
	pid_t			pid;
32
efb124b66dbd mtype, mpath are accessible to maildrop, simplify setup parameters.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 31
diff changeset
    58
	extern int		mtype;
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    59
4
cb3d0d99955c Import.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff changeset
    60
	if ((pid = fork()) != 0)
cb3d0d99955c Import.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff changeset
    61
		return (pid);
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    62
4
cb3d0d99955c Import.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff changeset
    63
	if (setgroups(1, &pw->pw_gid) ||
cb3d0d99955c Import.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff changeset
    64
	    setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
cb3d0d99955c Import.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff changeset
    65
	    setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
cb3d0d99955c Import.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff changeset
    66
		fatal("cannot drop privileges");
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    67
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    68
	close(pair[0]);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    69
	setproctitle("maildrop");
32
efb124b66dbd mtype, mpath are accessible to maildrop, simplify setup parameters.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 31
diff changeset
    70
	if ((mb = m_backend_lookup(mtype)) == NULL)
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    71
		fatalx("maildrop: invalid backend");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    72
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    73
	event_init();
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    74
	signal_set(&ev_sigint, SIGINT, sig_handler, NULL);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    75
	signal_set(&ev_sigterm, SIGTERM, sig_handler, NULL);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    76
	signal_add(&ev_sigint, NULL);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    77
	signal_add(&ev_sigterm, NULL);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    78
	imsgev_init(&iev_session, pair[1], mb, session_imsgev, needfd);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    79
	if (event_dispatch() < 0)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    80
		fatal("event_dispatch");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    81
27
6a8a845df07c Prepend session id to the log message.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    82
	logit(LOG_INFO, "%zu: maildrop process exiting", session_id);
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    83
	_exit(0);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    84
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    85
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    86
/*
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    87
 * Build dst by substituting '~' with user's home dir and '%u' with user name
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    88
 * in src. Return the length of string built. If return value >= dst_sz then
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    89
 * dst is truncated. 
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    90
 */
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    91
static size_t
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    92
expand(char *dst, const char *src, size_t dst_sz, struct passwd *pw)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    93
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    94
	size_t	i = 0, r;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    95
	int	c;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    96
3
a32da8616e0e Properly NUL terminate expanded path by memsetting it.
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents: 2
diff changeset
    97
	memset(dst, 0, dst_sz);
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    98
	while ((c = *src++)) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    99
		if (i >= dst_sz)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   100
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   101
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   102
		switch (c) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   103
		case '~':
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   104
			if ((r = strlcpy(&dst[i], pw->pw_dir,
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   105
			    (dst_sz - i))) >= (dst_sz - i)) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   106
				i += r;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   107
				goto end;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   108
			}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   109
			i += r;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   110
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   111
		case '%':
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   112
			if (*src == 'u') {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   113
				if ((r = strlcpy(&dst[i], pw->pw_name,
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   114
				    (dst_sz - i))) >= (dst_sz - i)) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   115
					i += r;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   116
					goto end;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   117
				}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   118
				i += r;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   119
				src++;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   120
			} else
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   121
				dst[i++] = c;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   122
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   123
		default:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   124
			dst[i++] = c;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   125
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   126
		}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   127
	}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   128
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   129
end:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   130
	if (c)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   131
		while ((c = *src++))
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   132
			i++;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   133
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   134
	dst[dst_sz - 1] = '\0';
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   135
	return (i);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   136
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   137
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   138
static void
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   139
session_imsgev(struct imsgev *iev, int code, struct imsg *imsg)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   140
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   141
	struct m_backend	*mb = iev->data;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   142
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   143
	switch (code) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   144
	case IMSGEV_IMSG:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   145
		switch (imsg->hdr.type) {
31
c1bdfc1a9800 Rename to differentiate setup and init operations.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 27
diff changeset
   146
		case IMSG_MAILDROP_INIT:
33
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   147
			maildrop_init(iev, imsg, mb);
31
c1bdfc1a9800 Rename to differentiate setup and init operations.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 27
diff changeset
   148
			break;
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   149
		case IMSG_MAILDROP_UPDATE:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   150
			update(iev, imsg, mb);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   151
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   152
		case IMSG_MAILDROP_RETR:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   153
			retr(iev, imsg, mb);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   154
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   155
		case IMSG_MAILDROP_DELE:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   156
			dele(iev, imsg, mb);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   157
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   158
		case IMSG_MAILDROP_RSET:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   159
			rset(iev, imsg, mb);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   160
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   161
		case IMSG_MAILDROP_LIST:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   162
			list(iev, imsg, mb);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   163
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   164
		case IMSG_MAILDROP_LISTALL:
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   165
			list_all(iev, imsg, mb);
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   166
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   167
		default:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   168
			logit(LOG_DEBUG, "%s: unexpected imsg %u",
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   169
			    __func__, imsg->hdr.type);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   170
			break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   171
		}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   172
		break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   173
	case IMSGEV_EREAD:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   174
	case IMSGEV_EWRITE:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   175
	case IMSGEV_EIMSG:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   176
		fatal("maildrop: imsgev read/write error");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   177
		break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   178
	case IMSGEV_DONE:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   179
		event_loopexit(NULL);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   180
		break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   181
	}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   182
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   183
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   184
static void
33
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   185
maildrop_init(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb)
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   186
{
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   187
	struct stats		stats;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   188
	char			buf[MAXPATHLEN];
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   189
	struct passwd		*pw;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   190
	extern const char	*mpath;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   191
	extern int		mtype;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   192
	mode_t			old_mask;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   193
	int			fd, flags, res = -1;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   194
	uint32_t		session_id = imsg->hdr.peerid;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   195
	const char		*user = imsg->data;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   196
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   197
	if ((pw = getpwnam(user)) == NULL)
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   198
		fatalx("authenticate: getpwnam");
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   199
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   200
	if (expand(buf, mpath, sizeof(buf), pw) >= sizeof(buf))
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   201
		fatalx("maildrop: path truncation");
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   202
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   203
	flags = O_CREAT;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   204
	if (mtype == M_MBOX)
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   205
		flags |= O_RDWR;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   206
	else
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   207
		flags |= O_RDONLY;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   208
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   209
	old_mask = umask(S_IXUSR|S_IXGRP|S_IWOTH|S_IROTH|S_IXOTH);
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   210
	if ((fd = open(buf, flags)) == -1)
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   211
		logit(LOG_CRIT, "%zu: failed to open %s", session_id , buf);
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   212
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   213
	if (fd != -1) {
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   214
		m.fd = fd;
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   215
		res = mb->init(&m, &stats.nmsgs, &stats.sz);
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   216
	}
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   217
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   218
	umask(old_mask);
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   219
	if (res == 0) {
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   220
		imsgev_xcompose(iev, IMSG_MAILDROP_INIT, session_id,
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   221
		    0, -1, &stats, sizeof(struct stats), "maildrop_init");
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   222
	} else {
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   223
		logit(LOG_CRIT, "%zu: maildrop init failed %s",
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   224
		    session_id, buf);
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   225
		imsgev_xcompose(iev, IMSG_MAILDROP_INIT, session_id,
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   226
		    0, -1, NULL, 0, "maildrop_init");
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   227
	}
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   228
}
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   229
252e70a700c0 Give session a chance to init its imsgev. Let session initiate the
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 32
diff changeset
   230
static void
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   231
update(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   232
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   233
	int		res;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   234
	uint32_t	session_id = imsg->hdr.peerid;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   235
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   236
	if ((res = mb->update(&m)) == 0)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   237
		logit(LOG_INFO, "%zu: maildrop updated", session_id);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   238
	else
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   239
		logit(LOG_CRIT, "%zu: maildrop updated failed", session_id);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   240
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   241
	imsgev_xcompose(iev, IMSG_MAILDROP_UPDATE, session_id,  0,
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   242
	    -1, &res, sizeof(res), "maildrop_update");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   243
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   244
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   245
static void
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   246
retr(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   247
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   248
	struct retr_res	res;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   249
	struct retr_req	*req = imsg->data;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   250
	int		fd;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   251
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   252
	fd = mb->retr(&m, req->idx, &res.nlines, &res.offset);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   253
	/* pass on top arguments */
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   254
	res.top = req->top;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   255
	res.ntop = req->ntop;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   256
	imsgev_xcompose(iev, IMSG_MAILDROP_RETR, imsg->hdr.peerid, 0,
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   257
	    fd, &res, sizeof(res), "maildrop_retr");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   258
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   259
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   260
static void
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   261
dele(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   262
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   263
	unsigned int	*idx = imsg->data;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   264
	int		res = 0;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   265
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   266
	if (m.msgs_index[*idx]->flags & F_DELE) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   267
		res = -1;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   268
		goto end;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   269
	}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   270
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   271
	m.msgs_index[*idx]->flags |= F_DELE;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   272
end:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   273
	imsgev_xcompose(iev, IMSG_MAILDROP_DELE, imsg->hdr.peerid, 0,
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   274
	    -1, &res, sizeof(res), "maildrop_dele");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   275
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   276
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   277
static void
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   278
rset(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   279
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   280
	size_t	i;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   281
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   282
	for (i = 0; i < m.nmsgs; i++)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   283
		m.msgs_index[i]->flags = 0;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   284
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   285
	imsgev_xcompose(iev, IMSG_MAILDROP_RSET, imsg->hdr.peerid, 0,
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   286
	    -1, NULL, 0, "maildrop_rset");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   287
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   288
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   289
static void
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   290
list(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   291
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   292
	struct list_req	*req = imsg->data;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   293
	struct list_res	res;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   294
	char		hash[SHA1_DIGEST_STRING_LENGTH];
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   295
	size_t		sz;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   296
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   297
	res.idx = req->idx;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   298
	do_list(req->idx, &sz, hash, sizeof(hash));
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   299
	res.uidl = req->uidl;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   300
	if (res.uidl)
20
efd945b7f3d2 hash is a fixed length string. Copying is always done to same length
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents: 18
diff changeset
   301
		(void)strlcpy(res.u.hash, hash, sizeof(res.u.hash));
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   302
	else
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   303
		res.u.sz = sz;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   304
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   305
	imsgev_xcompose(iev, IMSG_MAILDROP_LIST, imsg->hdr.peerid, 0,
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   306
	    -1, &res, sizeof(res), "maildrop_list");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   307
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   308
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   309
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   310
static void
7
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   311
do_list(unsigned int idx, size_t *sz, char *hash, size_t hash_sz)
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   312
{
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   313
	if (m.msgs_index[idx]->flags & F_DELE) {
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   314
		*sz = 0;
20
efd945b7f3d2 hash is a fixed length string. Copying is always done to same length
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents: 18
diff changeset
   315
		(void)strlcpy(hash, "", hash_sz);
7
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   316
		return;
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   317
	}
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   318
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   319
	*sz = m.msgs_index[idx]->sz;
20
efd945b7f3d2 hash is a fixed length string. Copying is always done to same length
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents: 18
diff changeset
   320
	(void)strlcpy(hash, m.msgs_index[idx]->hash, hash_sz);
7
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   321
}
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   322
bb148c4cfe52 Move it closer to list.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 6
diff changeset
   323
static void
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   324
list_all(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb)
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   325
{
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   326
	struct list_res	res;
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   327
	size_t		i;
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   328
	int		*uidl = imsg->data;
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   329
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   330
	for (i = 0; i < m.nmsgs; i++) {
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   331
		if (m.msgs_index[i]->flags & F_DELE)
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   332
			continue;
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   333
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   334
		res.idx = i;
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   335
		res.uidl = *uidl;
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   336
		if (*uidl) {
20
efd945b7f3d2 hash is a fixed length string. Copying is always done to same length
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents: 18
diff changeset
   337
			(void)strlcpy(res.u.hash, m.msgs_index[i]->hash,
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   338
			    sizeof(res.u.hash));
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   339
		} else
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   340
			res.u.sz = m.msgs_index[i]->sz;
26
b20d78c55e91 knf and whitespace fixes.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 20
diff changeset
   341
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   342
		imsgev_xcompose(iev, IMSG_MAILDROP_LISTALL,
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   343
		    imsg->hdr.peerid, 0, -1, &res, sizeof(res),
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   344
		    "maildrop_list");
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   345
	}
26
b20d78c55e91 knf and whitespace fixes.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 20
diff changeset
   346
18
1d773aa5e87e Mark uidl correctly in list_res for the terminal. Fixes UIDL command
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   347
	res.uidl = *uidl;
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   348
	/* terminal sentinel: hash = "" and sz = 0 */
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   349
	if (*uidl)
20
efd945b7f3d2 hash is a fixed length string. Copying is always done to same length
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents: 18
diff changeset
   350
		(void)strlcpy(res.u.hash, "", sizeof(res.u.hash));
2
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   351
	else
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   352
		res.u.sz = 0;
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   353
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   354
	imsgev_xcompose(iev, IMSG_MAILDROP_LISTALL, imsg->hdr.peerid,
6e7b98264ea2 Simplify list_all handling. Send an imsg for each msg instead of
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   355
	    0, -1, &res, sizeof(res), "maildrop_list");
0
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   356
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   357
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   358
static void
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   359
needfd(struct imsgev *iev)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   360
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   361
	fatalx("maildrop should never need an fd");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   362
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   363
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   364
static void
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   365
sig_handler(int sig, short event, void *arg)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   366
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   367
	switch (sig) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   368
	case SIGINT:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   369
	case SIGTERM:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   370
		event_loopexit(NULL);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   371
	}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   372
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   373
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   374
extern struct m_backend m_backend_mbox;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   375
extern struct m_backend m_backend_maildir;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   376
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   377
static struct m_backend *
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   378
m_backend_lookup(enum m_type type)
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   379
{
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   380
	switch (type) {
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   381
	case M_MBOX:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   382
		return &m_backend_mbox;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   383
		break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   384
	case M_MAILDIR:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   385
		return &m_backend_maildir;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   386
		break;
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   387
	default:
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   388
		fatalx("m_backend_lookup: invalid m_type");
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   389
	};
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   390
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   391
	return (NULL);
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   392
}
9e2cb1ed20b1 Import pop3d.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   393