Annotation of embedaddon/mtr/packet/command_unix.c, revision 1.1.1.1
1.1 misho 1: /*
2: mtr -- a network diagnostic tool
3: Copyright (C) 2016 Matt Kimball
4:
5: This program is free software; you can redistribute it and/or modify
6: it under the terms of the GNU General Public License version 2 as
7: published by the Free Software Foundation.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
17: */
18:
19: #include "command.h"
20:
21: #include <errno.h>
22: #include <fcntl.h>
23: #include <string.h>
24: #include <stdio.h>
25: #include <stdlib.h>
26: #include <unistd.h>
27:
28: /*
29: Initialize the command buffer and put the command stream in
30: non-blocking mode.
31: */
32: void init_command_buffer(
33: struct command_buffer_t *command_buffer,
34: int command_stream)
35: {
36: int flags;
37:
38: memset(command_buffer, 0, sizeof(struct command_buffer_t));
39: command_buffer->command_stream = command_stream;
40:
41: /* Get the current command stream flags */
42: flags = fcntl(command_stream, F_GETFL, 0);
43: if (flags == -1) {
44: perror("Unexpected command stream error");
45: exit(EXIT_FAILURE);
46: }
47:
48: /* Set the O_NONBLOCK bit */
49: if (fcntl(command_stream, F_SETFL, flags | O_NONBLOCK)) {
50: perror("Unexpected command stream error");
51: exit(EXIT_FAILURE);
52: }
53: }
54:
55: /* Read currently available data from the command stream */
56: int read_commands(
57: struct command_buffer_t *buffer)
58: {
59: int space_remaining =
60: COMMAND_BUFFER_SIZE - buffer->incoming_read_position - 1;
61: char *read_position =
62: &buffer->incoming_buffer[buffer->incoming_read_position];
63: int read_count;
64: int command_stream = buffer->command_stream;
65:
66: read_count = read(command_stream, read_position, space_remaining);
67:
68: /* If the command stream has been closed, read will return zero. */
69: if (read_count == 0) {
70: errno = EPIPE;
71: return -1;
72: }
73:
74: if (read_count > 0) {
75: /* Account for the newly read data */
76: buffer->incoming_read_position += read_count;
77: }
78:
79: if (read_count < 0) {
80: /* EAGAIN simply means there is no available data to read */
81: /* EINTR indicates we received a signal during read */
82: if (errno != EINTR && errno != EAGAIN) {
83: perror("Unexpected command buffer read error");
84: exit(EXIT_FAILURE);
85: }
86: }
87:
88: return 0;
89: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>