summaryrefslogtreecommitdiffstats
path: root/sync_pipe_write.c
blob: c279e5765f496a670ef0f6fe8ffaa7cf88fff606 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* sync_pipe_write.c
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#include <config.h>

#include <string.h>

#include <glib.h>

#include <wsutil/file_util.h>
#include <wsutil/ws_assert.h>

#include "sync_pipe.h"

/****************************************************************************************************************/
/* sync_pipe handling */


/* write a single message header to the recipient pipe */
static ssize_t
sync_pipe_write_header(int pipe_fd, char indicator, unsigned int length)
{
    guchar header[1+3]; /* indicator + 3-byte len */

    ws_assert(length <= SP_MAX_MSG_LEN);

    /* write header (indicator + 3-byte len) */
    header[0] = indicator;
    header[1] = (length >> 16) & 0xFF;
    header[2] = (length >> 8) & 0xFF;
    header[3] = (length >> 0) & 0xFF;

    /* write header */
    return ws_write(pipe_fd, header, sizeof header);
}


/* Write a message, with a string body, to the recipient pipe in the
   standard format (1-byte message indicator, 3-byte message length
   (excluding length and indicator field), and the string.
   If msg is NULL, the message has only a length and indicator. */
void
sync_pipe_write_string_msg(int pipe_fd, char indicator, const char *msg)
{
    ssize_t ret;
    int len;

    /*ws_warning("write %d enter", pipe_fd);*/

    if(msg != NULL) {
        len = (int) strlen(msg) + 1;    /* including the terminating '\0'! */
    } else {
        len = 0;
    }

    /* write header (indicator + 3-byte len) */
    ret = sync_pipe_write_header(pipe_fd, indicator, len);
    if(ret == -1) {
        return;
    }

    /* write value (if we have one) */
    if(len) {
        /*ws_warning("write %d indicator: %c value len: %u msg: %s", pipe_fd, indicator, len, msg);*/
        ret = ws_write(pipe_fd, msg, len);
        if(ret == -1) {
            return;
        }
    } else {
        /*ws_warning("write %d indicator: %c no value", pipe_fd, indicator);*/
    }

    /*ws_warning("write %d leave", pipe_fd);*/
}


/* Size of buffer to hold decimal representation of
   signed/unsigned 64-bit int */
#define SP_DECISIZE 20

/* Write a message, with an unsigned integer body, to the recipient
   pipe in the standard format (1-byte message indicator, 3-byte
   message length (excluding length and indicator field), and the
   unsigned integer, as a string. */
void
sync_pipe_write_uint_msg(int pipe_fd, char indicator, unsigned int num)
{
    char count_str[SP_DECISIZE+1+1];

    snprintf(count_str, sizeof(count_str), "%u", num);
    sync_pipe_write_string_msg(pipe_fd, indicator, count_str);
}

/* Write a message, with an integer body, to the recipient pipe in the
   standard format (1-byte message indicator, 3-byte message length
   (excluding length and indicator field), and the unsigned integer,
   as a string. */
void
sync_pipe_write_int_msg(int pipe_fd, char indicator, int num)
{
    char count_str[SP_DECISIZE+1+1];

    snprintf(count_str, sizeof(count_str), "%d", num);
    sync_pipe_write_string_msg(pipe_fd, indicator, count_str);
}

/* Write a message, with a primary and secondary error message as the body,
   to the recipient pipe.  The header is an SP_ERROR_MSG header, with the
   length being the length of two string submessages; the submessages
   are the body of the message, with each submessage being a message
   with an indicator of SP_ERROR_MSG, the first message having the
   primary error message string and the second message having the secondary
   error message string. */
void
sync_pipe_write_errmsgs_to_parent(int pipe_fd, const char *error_msg,
                                  const char *secondary_error_msg)
{
    sync_pipe_write_header(pipe_fd, SP_ERROR_MSG,
                           (unsigned int) (strlen(error_msg) + 1 + 4 + strlen(secondary_error_msg) + 1 + 4));
    sync_pipe_write_string_msg(pipe_fd, SP_ERROR_MSG, error_msg);
    sync_pipe_write_string_msg(pipe_fd, SP_ERROR_MSG, secondary_error_msg);
}

/*
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
 *
 * Local variables:
 * c-basic-offset: 4
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 *
 * vi: set shiftwidth=4 tabstop=8 expandtab:
 * :indentSize=4:tabSize=8:noTabs=true:
 */