comparison audacious/controlsocket.c @ 1582:d7af2755a397 trunk

[svn] - gcc 4.1.0, 4.1.1, 4.1.2 tree optimization workaround: Remove read_all() and write_all() routines. They had no effect nor merit here, and generally caused trouble.
author nenolod
date Mon, 14 Aug 2006 17:55:44 -0700
parents dae6b30c0148
children 58f3eb64f390
comparison
equal deleted inserted replaced
1581:68aec931b0b6 1582:d7af2755a397
240 started = TRUE; 240 started = TRUE;
241 g_cond_signal(start_cond); 241 g_cond_signal(start_cond);
242 g_mutex_unlock(status_mutex); 242 g_mutex_unlock(status_mutex);
243 } 243 }
244 244
245 static gint
246 write_all(gint fd, gconstpointer buf, size_t count)
247 {
248 size_t left = count;
249 gint written;
250
251 do {
252 if ((written = write(fd, buf, left)) < 0) {
253 count = -1;
254 break;
255 }
256 left -= written;
257 buf = (gchar *) buf + written;
258 }
259 while (left > 0);
260
261 return count - left;
262 }
263
264 static void 245 static void
265 ctrl_write_packet(gint fd, gpointer data, gint length) 246 ctrl_write_packet(gint fd, gpointer data, gint length)
266 { 247 {
267 ServerPktHeader pkthdr; 248 ServerPktHeader pkthdr;
268 249
269 pkthdr.version = XMMS_PROTOCOL_VERSION; 250 pkthdr.version = XMMS_PROTOCOL_VERSION;
270 pkthdr.data_length = length; 251 pkthdr.data_length = length;
271 if ((size_t)write_all(fd, &pkthdr, sizeof(ServerPktHeader)) < sizeof(pkthdr)) 252 if ((size_t)write(fd, &pkthdr, sizeof(ServerPktHeader)) < sizeof(pkthdr))
272 return; 253 return;
273 if (data && length > 0) 254 if (data && length > 0)
274 write_all(fd, data, length); 255 write(fd, data, length);
275 } 256 }
276 257
277 static void 258 static void
278 ctrl_write_gint(gint fd, gint val) 259 ctrl_write_gint(gint fd, gint val)
279 { 260 {
304 ctrl_write_packet(pkt->fd, NULL, 0); 285 ctrl_write_packet(pkt->fd, NULL, 0);
305 close(pkt->fd); 286 close(pkt->fd);
306 if (pkt->data) 287 if (pkt->data)
307 g_free(pkt->data); 288 g_free(pkt->data);
308 g_free(pkt); 289 g_free(pkt);
309 }
310
311 static gint
312 read_all(gint fd, gpointer buf, size_t count)
313 {
314 size_t left = count;
315 GTimer *timer;
316 gulong usec;
317 gint r;
318
319 timer = g_timer_new();
320
321 do {
322 if ((r = read(fd, buf, left)) < 0) {
323 count = -1;
324 break;
325 }
326 left -= r;
327 buf = (gchar *) buf + r;
328 g_timer_elapsed(timer, &usec);
329 }
330 while (left > 0 && usec <= CTRLSOCKET_IO_TIMEOUT_USEC);
331
332 g_timer_destroy(timer);
333 return count - left;
334 } 290 }
335 291
336 static gboolean 292 static gboolean
337 ctrlsocket_is_going(void) 293 ctrlsocket_is_going(void)
338 { 294 {
373 continue; 329 continue;
374 if ((fd = accept(ctrl_fd, (struct sockaddr *) &saddr, &len)) == -1) 330 if ((fd = accept(ctrl_fd, (struct sockaddr *) &saddr, &len)) == -1)
375 continue; 331 continue;
376 332
377 pkt = g_new0(PacketNode, 1); 333 pkt = g_new0(PacketNode, 1);
378 if ((size_t)read_all(fd, &pkt->hdr, sizeof(ClientPktHeader)) 334 if ((size_t)read(fd, &pkt->hdr, sizeof(ClientPktHeader))
379 < sizeof(ClientPktHeader)) { 335 < sizeof(ClientPktHeader)) {
380 g_free(pkt); 336 g_free(pkt);
381 continue; 337 continue;
382 } 338 }
383 339
384 if (pkt->hdr.data_length) { 340 if (pkt->hdr.data_length) {
385 size_t data_length = pkt->hdr.data_length; 341 size_t data_length = pkt->hdr.data_length;
386 pkt->data = g_malloc0(data_length); 342 pkt->data = g_malloc0(data_length);
387 if ((size_t)read_all(fd, pkt->data, data_length) < data_length) { 343 if ((size_t)read(fd, pkt->data, data_length) < data_length) {
388 g_free(pkt->data); 344 g_free(pkt->data);
389 g_free(pkt); 345 g_free(pkt);
390 g_warning("ctrlsocket_func(): Incomplete data packet dropped"); 346 g_warning("ctrlsocket_func(): Incomplete data packet dropped");
391 continue; 347 continue;
392 } 348 }