~ubuntu-branches/ubuntu/trusty/haproxy/trusty-updates

« back to all changes in this revision

Viewing changes to src/proto_uxst.c

  • Committer: Bazaar Package Importer
  • Author(s): Arnaud Cornet
  • Date: 2009-10-19 22:31:45 UTC
  • mfrom: (1.2.5 upstream)
  • mto: This revision was merged to the branch mainline in revision 10.
  • Revision ID: james.westby@ubuntu.com-20091019223145-rymupk5njs544bvp
ImportĀ upstreamĀ versionĀ 1.3.22

Show diffs side-by-side

added added

removed removed

Lines of Context:
78
78
        .nb_listeners = 0,
79
79
};
80
80
 
 
81
const char unix_sock_usage_msg[] =
 
82
        "Unknown command. Please enter one of the following commands only :\n"
 
83
        "  show info   : report information about the running process\n"
 
84
        "  show stat   : report counters for each proxy and server\n"
 
85
        "  show errors : report last request and response errors for each proxy\n"
 
86
        "  show sess   : report the list of current sessions\n"
 
87
        "\n";
 
88
 
 
89
const struct chunk unix_sock_usage = {
 
90
        .str = (char *)&unix_sock_usage_msg,
 
91
        .len = sizeof(unix_sock_usage_msg)-1
 
92
};
81
93
 
82
94
/********************************
83
95
 * 1) low-level socket functions
101
113
 
102
114
        /* 1. create socket names */
103
115
        if (!path[0]) {
104
 
                Alert("Invalid name for a UNIX socket. Aborting.\n");
 
116
                Alert("Invalid empty name for a UNIX socket. Aborting.\n");
105
117
                goto err_return;
106
118
        }
107
119
 
108
120
        ret = snprintf(tempname, MAXPATHLEN, "%s.%d.tmp", path, pid);
109
121
        if (ret < 0 || ret >= MAXPATHLEN) {
110
 
                Alert("name too long for UNIX socket. Aborting.\n");
 
122
                Alert("name too long for UNIX socket (%s). Aborting.\n", path);
111
123
                goto err_return;
112
124
        }
113
125
 
114
126
        ret = snprintf(backname, MAXPATHLEN, "%s.%d.bak", path, pid);
115
127
        if (ret < 0 || ret >= MAXPATHLEN) {
116
 
                Alert("name too long for UNIX socket. Aborting.\n");
 
128
                Alert("name too long for UNIX socket (%s). Aborting.\n", path);
117
129
                goto err_return;
118
130
        }
119
131
 
120
132
        /* 2. clean existing orphaned entries */
121
133
        if (unlink(tempname) < 0 && errno != ENOENT) {
122
 
                Alert("error when trying to unlink previous UNIX socket. Aborting.\n");
 
134
                Alert("error when trying to unlink previous UNIX socket (%s). Aborting.\n", path);
123
135
                goto err_return;
124
136
        }
125
137
 
126
138
        if (unlink(backname) < 0 && errno != ENOENT) {
127
 
                Alert("error when trying to unlink previous UNIX socket. Aborting.\n");
 
139
                Alert("error when trying to unlink previous UNIX socket (%s). Aborting.\n", path);
128
140
                goto err_return;
129
141
        }
130
142
 
131
143
        /* 3. backup existing socket */
132
144
        if (link(path, backname) < 0 && errno != ENOENT) {
133
 
                Alert("error when trying to preserve previous UNIX socket. Aborting.\n");
 
145
                Alert("error when trying to preserve previous UNIX socket (%s). Aborting.\n", path);
134
146
                goto err_return;
135
147
        }
136
148
 
141
153
 
142
154
        sock = socket(PF_UNIX, SOCK_STREAM, 0);
143
155
        if (sock < 0) {
144
 
                Alert("cannot create socket for UNIX listener. Aborting.\n");
 
156
                Alert("cannot create socket for UNIX listener (%s). Aborting.\n", path);
145
157
                goto err_unlink_back;
146
158
        }
147
159
 
148
160
        if (sock >= global.maxsock) {
149
 
                Alert("socket(): not enough free sockets for UNIX listener. Raise -n argument. Aborting.\n");
 
161
                Alert("socket(): not enough free sockets for UNIX listener (%s). Raise -n argument. Aborting.\n", path);
150
162
                goto err_unlink_temp;
151
163
        }
152
164
 
157
169
 
158
170
        if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
159
171
                /* note that bind() creates the socket <tempname> on the file system */
160
 
                Alert("cannot bind socket for UNIX listener. Aborting.\n");
 
172
                Alert("cannot bind socket for UNIX listener (%s). Aborting.\n", path);
161
173
                goto err_unlink_temp;
162
174
        }
163
175
 
164
176
        if (((uid != -1 || gid != -1) && (chown(tempname, uid, gid) == -1)) ||
165
177
            (mode != 0 && chmod(tempname, mode) == -1)) {
166
 
                Alert("cannot change UNIX socket ownership. Aborting.\n");
 
178
                Alert("cannot change UNIX socket ownership (%s). Aborting.\n", path);
167
179
                goto err_unlink_temp;
168
180
        }
169
181
 
170
182
        if (listen(sock, 0) < 0) {
171
 
                Alert("cannot listen to socket for UNIX listener. Aborting.\n");
 
183
                Alert("cannot listen to socket for UNIX listener (%s). Aborting.\n", path);
172
184
                goto err_unlink_temp;
173
185
        }
174
186
 
178
190
         * backname.
179
191
         */
180
192
        if (rename(tempname, path) < 0) {
181
 
                Alert("cannot switch final and temporary sockets for UNIX listener. Aborting.\n");
 
193
                Alert("cannot switch final and temporary sockets for UNIX listener (%s). Aborting.\n", path);
182
194
                goto err_rename;
183
195
        }
184
196
 
666
678
                        *p = '\0';
667
679
                        if (!unix_sock_parse_request(s, line)) {
668
680
                                /* invalid request */
669
 
                                buffer_shutw_now(s->rep);
 
681
                                stream_int_retnclose(s->req->prod, &unix_sock_usage);
670
682
                                s->ana_state = 0;
671
683
                                req->analysers = 0;
672
684
                                return 0;