~jan-kneschke/mysql-proxy/packet-tracking-assertions

« back to all changes in this revision

Viewing changes to src/network-mysqld-masterinfo.c

  • Committer: Kay Roepke
  • Author(s): Jan Kneschke
  • Date: 2008-01-23 22:00:28 UTC
  • Revision ID: kay@mysql.com-20080123220028-hq2xqb69apa75fnx
first round on mysql-shell based on the proxy code

this is mostly a verification if the proxy-code is flexible enough to handle 
all three scenarios of: client, server and forwarding (proxy)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $%BEGINLICENSE%$
2
 
 Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
3
 
 
4
 
 This program is free software; you can redistribute it and/or
5
 
 modify it under the terms of the GNU General Public License as
6
 
 published by the Free Software Foundation; version 2 of the
7
 
 License.
8
 
 
9
 
 This program is distributed in the hope that it will be useful,
10
 
 but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
 
 GNU General Public License for more details.
13
 
 
14
 
 You should have received a copy of the GNU General Public License
15
 
 along with this program; if not, write to the Free Software
16
 
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
 
 02110-1301  USA
18
 
 
19
 
 $%ENDLICENSE%$ */
20
 
#include <stdlib.h>
21
 
 
22
 
#include "glib-ext.h"
23
 
#include "network-mysqld-masterinfo.h"
24
 
 
25
 
#define C(x) x, sizeof(x) - 1
26
 
#define S(x) x->str, x->len
27
 
 
28
 
network_mysqld_masterinfo_t * network_mysqld_masterinfo_new(void) {
29
 
        network_mysqld_masterinfo_t *info;
30
 
 
31
 
        info = g_new0(network_mysqld_masterinfo_t, 1);
32
 
 
33
 
        info->master_log_file   = g_string_new(NULL);
34
 
        info->master_host       = g_string_new(NULL);
35
 
        info->master_user       = g_string_new(NULL);
36
 
        info->master_password   = g_string_new(NULL);
37
 
        
38
 
        info->master_ssl_ca     = g_string_new(NULL);
39
 
        info->master_ssl_capath = g_string_new(NULL);
40
 
        info->master_ssl_cert   = g_string_new(NULL);
41
 
        info->master_ssl_cipher = g_string_new(NULL);
42
 
        info->master_ssl_key    = g_string_new(NULL);
43
 
 
44
 
        return info;
45
 
}
46
 
 
47
 
void network_mysqld_masterinfo_free(network_mysqld_masterinfo_t *info) {
48
 
        if (!info) return;
49
 
 
50
 
        g_string_free(info->master_log_file, TRUE);
51
 
        g_string_free(info->master_host, TRUE);
52
 
        g_string_free(info->master_user, TRUE);
53
 
        g_string_free(info->master_password, TRUE);
54
 
        
55
 
        g_string_free(info->master_ssl_ca, TRUE);
56
 
        g_string_free(info->master_ssl_capath, TRUE);
57
 
        g_string_free(info->master_ssl_cert, TRUE);
58
 
        g_string_free(info->master_ssl_cipher, TRUE);
59
 
        g_string_free(info->master_ssl_key, TRUE);
60
 
 
61
 
        g_free(info);
62
 
}
63
 
 
64
 
/**
65
 
 * get \n terminated strings 
66
 
 */
67
 
 
68
 
static int network_mysqld_masterinfo_get_string(network_packet *packet, GString *str) {
69
 
        guint i;
70
 
 
71
 
        g_return_val_if_fail(packet, -1);
72
 
        g_return_val_if_fail(str, -1);
73
 
 
74
 
        for (i = packet->offset; i < packet->data->len; i++) {
75
 
                const char c = packet->data->str[i];
76
 
 
77
 
                if (c == '\n') break;
78
 
        }
79
 
 
80
 
        if (packet->data->str[i] == '\n') {
81
 
                g_string_assign_len(str, packet->data->str + packet->offset, i - packet->offset);
82
 
 
83
 
                packet->offset = i + 1; /* start the next string after our \n */
84
 
 
85
 
                return 0;
86
 
        } 
87
 
 
88
 
        return -1;
89
 
}
90
 
 
91
 
static int network_mysqld_masterinfo_get_int32(network_packet *packet, guint32 *_i) {
92
 
        GString *s;
93
 
        int err = 0;
94
 
 
95
 
        s = g_string_new(NULL);
96
 
        err = err || network_mysqld_masterinfo_get_string(packet, s);
97
 
        if (!err) {
98
 
                char *errptr;
99
 
                guint32 i;
100
 
 
101
 
                i = strtoul(s->str, &errptr, 0);
102
 
 
103
 
                err = err || (*errptr != '\0');
104
 
 
105
 
                if (!err) *_i = i;
106
 
        }
107
 
 
108
 
        g_string_free(s, TRUE);
109
 
 
110
 
        return err ? -1 : 0;
111
 
}
112
 
 
113
 
/**
114
 
 * get the master-info structure from the internal representation 
115
 
 */
116
 
int network_mysqld_masterinfo_get(network_packet *packet, network_mysqld_masterinfo_t *info) {
117
 
        int err = 0;
118
 
 
119
 
        g_return_val_if_fail(info, -1);
120
 
        g_return_val_if_fail(packet, -1);
121
 
 
122
 
        /*err = err || network_mysqld_masterinfo_get_int32(packet, &lines);*/
123
 
        /*info->master_lines = lines;*/
124
 
        err = err || network_mysqld_masterinfo_get_int32(packet, &(info->master_lines));
125
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_log_file);
126
 
        err = err || network_mysqld_masterinfo_get_int32(packet, &(info->master_log_pos));
127
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_host);
128
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_user);
129
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_password);
130
 
        err = err || network_mysqld_masterinfo_get_int32(packet, &(info->master_port));
131
 
        err = err || network_mysqld_masterinfo_get_int32(packet, &(info->master_connect_retry));
132
 
        err = err || network_mysqld_masterinfo_get_int32(packet, &(info->master_ssl));
133
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_ssl_ca);
134
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_ssl_capath);
135
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_ssl_cert);
136
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_ssl_cipher);
137
 
        err = err || network_mysqld_masterinfo_get_string(packet, info->master_ssl_key);
138
 
        if (info->master_lines >= 15) {
139
 
                err = err || network_mysqld_masterinfo_get_int32(packet, &(info->master_ssl_verify_server_cert));
140
 
        }
141
 
        return err ? -1 : 0;
142
 
}
143
 
 
144
 
static int network_mysqld_masterinfo_append_string(GString *packet, GString *s) {
145
 
        g_string_append_len(packet, S(s));
146
 
        g_string_append_c(packet, '\n');
147
 
 
148
 
        return 0;
149
 
}
150
 
 
151
 
static int network_mysqld_masterinfo_append_int32(GString *packet, guint32 i) {
152
 
        g_string_append_printf(packet, "%"G_GUINT32_FORMAT"\n", i);
153
 
 
154
 
        return 0;
155
 
}
156
 
 
157
 
 
158
 
int network_mysqld_masterinfo_append(GString *packet, network_mysqld_masterinfo_t *info) {
159
 
        int err = 0;
160
 
 
161
 
        g_return_val_if_fail(info, -1);
162
 
        g_return_val_if_fail(packet, -1);
163
 
 
164
 
        err = err || network_mysqld_masterinfo_append_int32(packet, info->master_lines);
165
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_log_file);
166
 
        err = err || network_mysqld_masterinfo_append_int32(packet, info->master_log_pos);
167
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_host);
168
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_user);
169
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_password);
170
 
        err = err || network_mysqld_masterinfo_append_int32(packet, info->master_port);
171
 
        err = err || network_mysqld_masterinfo_append_int32(packet, info->master_connect_retry);
172
 
        err = err || network_mysqld_masterinfo_append_int32(packet, info->master_ssl);
173
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_ssl_ca);
174
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_ssl_capath);
175
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_ssl_cert);
176
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_ssl_cipher);
177
 
        err = err || network_mysqld_masterinfo_append_string(packet, info->master_ssl_key);
178
 
        if (info->master_lines >= 15) {
179
 
                err = err || network_mysqld_masterinfo_append_int32(packet, info->master_ssl_verify_server_cert);
180
 
        }
181
 
 
182
 
        return err ? -1 : 0;
183
 
}
184