~james-page/ubuntu/raring/dovecot/autopkgtest

« back to all changes in this revision

Viewing changes to src/log/doveadm-connection.c

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2012-06-11 11:11:54 UTC
  • mfrom: (1.15.2) (4.1.27 sid)
  • Revision ID: package-import@ubuntu.com-20120611111154-678cwbdj6ktgsv1h
Tags: 1:2.1.7-1ubuntu1
* Merge from Debian unstable, remaining changes:
  + Add mail-stack-delivery package:
    - Update d/rules
    - d/control: convert existing dovecot-postfix package to a dummy
      package and add new mail-stack-delivery package.
    - Update maintainer scripts.
    - Rename d/dovecot-postfix.* to debian/mail-stack-delivery.*
    - d/mail-stack-delivery.preinst: Move previously installed backups and
      config files to a new package namespace.
    - d/mail-stack-delivery.prerm: Added to handle downgrades.
  + Use Snakeoil SSL certificates by default:
    - d/control: Depend on ssl-cert.
    - d/dovecot-core.postinst: Relax grep for SSL_* a bit.
  + Add autopkgtest to debian/tests/*.
  + Add ufw integration:
    - d/dovecot-core.ufw.profile: new ufw profile.
    - d/rules: install profile in dovecot-core.
    - d/control: dovecot-core - suggest ufw.
  + d/{control,rules}: enable PIE hardening.
  + d/dovecot-core.dirs: Added usr/share/doc/dovecot-core
  + Add apport hook:
    - d/rules, d/source_dovecot.py
  + Add upstart job:
    - d/rules, d/dovecot-core.dovecot.upstart, d/control,
      d/dovecot-core.dirs, dovecot-imapd.{postrm, postinst, prerm},
      d/dovecot-pop3d.{postinst, postrm, prerm}.
      d/mail-stack-deliver.postinst: Convert init script to upstart.
  + d/control: Added Pre-Depends: dpkg (>= 1.15.6) to dovecot-dbg to support
    xz compression in Ubuntu.
  + d/control: Demote dovecot-common Recommends: to Suggests: to prevent
    install of extra packages on upgrade.
  + d/patches/dovecot-drac.patch: Updated with version for dovecot >= 2.0.0.
  + d/control: Drop B-D on systemd.
* Dropped changes:
  + d/patches/fix-racey-restart.patch: part of 2.1.x, no longer required.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (c) 2012 Dovecot authors, see the included COPYING file */
 
2
 
 
3
#include "lib.h"
 
4
#include "ostream.h"
 
5
#include "str.h"
 
6
#include "strescape.h"
 
7
#include "master-service.h"
 
8
#include "log-error-buffer.h"
 
9
#include "doveadm-connection.h"
 
10
 
 
11
#include <unistd.h>
 
12
 
 
13
struct doveadm_connection {
 
14
        struct log_error_buffer *errorbuf;
 
15
 
 
16
        int fd;
 
17
        struct ostream *output;
 
18
};
 
19
 
 
20
static void doveadm_connection_destroy(struct doveadm_connection **_conn);
 
21
 
 
22
static int doveadm_connection_send_errors(struct doveadm_connection *conn)
 
23
{
 
24
        struct log_error_buffer_iter *iter;
 
25
        const struct log_error *error;
 
26
        string_t *str = t_str_new(256);
 
27
        int ret = 0;
 
28
 
 
29
        iter = log_error_buffer_iter_init(conn->errorbuf);
 
30
        while ((error = log_error_buffer_iter_next(iter)) != NULL) {
 
31
                str_truncate(str, 0);
 
32
                str_printfa(str, "%s\t%ld\t",
 
33
                            failure_log_type_names[error->type],
 
34
                            (long)error->timestamp);
 
35
                str_tabescape_write(str, error->prefix);
 
36
                str_append_c(str, '\t');
 
37
                str_tabescape_write(str, error->text);
 
38
                str_append_c(str, '\n');
 
39
                if (o_stream_send(conn->output,
 
40
                                  str_data(str), str_len(str)) < 0) {
 
41
                        ret = -1;
 
42
                        break;
 
43
                }
 
44
        }
 
45
        log_error_buffer_iter_deinit(&iter);
 
46
        return ret;
 
47
}
 
48
 
 
49
static int doveadm_output(struct doveadm_connection *conn)
 
50
{
 
51
        int ret;
 
52
 
 
53
        if ((ret = o_stream_flush(conn->output)) != 0) {
 
54
                /* error / finished */
 
55
                doveadm_connection_destroy(&conn);
 
56
        }
 
57
        return 1;
 
58
}
 
59
 
 
60
void doveadm_connection_create(struct log_error_buffer *errorbuf, int fd)
 
61
{
 
62
        struct doveadm_connection *conn;
 
63
 
 
64
        conn = i_new(struct doveadm_connection, 1);
 
65
        conn->errorbuf = errorbuf;
 
66
        conn->fd = fd;
 
67
        conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE);
 
68
        if (doveadm_connection_send_errors(conn) < 0)
 
69
                doveadm_connection_destroy(&conn);
 
70
        else {
 
71
                o_stream_set_flush_callback(conn->output, doveadm_output, conn);
 
72
                o_stream_set_flush_pending(conn->output, TRUE);
 
73
        }
 
74
}
 
75
 
 
76
static void doveadm_connection_destroy(struct doveadm_connection **_conn)
 
77
{
 
78
        struct doveadm_connection *conn = *_conn;
 
79
 
 
80
        *_conn = NULL;
 
81
 
 
82
        o_stream_destroy(&conn->output);
 
83
        if (close(conn->fd) < 0)
 
84
                i_error("close(doveadm connection) failed: %m");
 
85
        i_free(conn);
 
86
 
 
87
        master_service_client_connection_destroyed(master_service);
 
88
}