1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
5 * Copyright (C) 2001-2010, Eduardo Silva P. <edsiper@gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Library General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
38 struct mk_iov
*mk_iov_create(int n
, int offset
)
42 iov
= mk_mem_malloc(sizeof(struct mk_iov
));
43 iov
->iov_idx
= offset
;
44 iov
->io
= mk_mem_malloc_z(n
* sizeof(struct iovec
));
45 iov
->buf_to_free
= mk_mem_malloc(n
* sizeof(char *));
53 int mk_iov_add_entry(struct mk_iov
*mk_io
, char *buf
, int len
,
54 mk_pointer sep
, int free
)
57 mk_io
->io
[mk_io
->iov_idx
].iov_base
= (unsigned char *) buf
;
58 mk_io
->io
[mk_io
->iov_idx
].iov_len
= len
;
60 mk_io
->total_len
+= len
;
64 if (mk_io
->iov_idx
> mk_io
->size
) {
65 printf("\nDEBUG IOV :: ERROR, Broken array size in:");
66 printf("\n '''%s'''", buf
);
73 mk_io
->io
[mk_io
->iov_idx
].iov_base
= sep
.data
;
74 mk_io
->io
[mk_io
->iov_idx
].iov_len
= sep
.len
;
76 mk_io
->total_len
+= sep
.len
;
79 if (free
== MK_IOV_FREE_BUF
) {
80 _mk_iov_set_free(mk_io
, buf
);
83 return mk_io
->iov_idx
;
86 int mk_iov_set_entry(struct mk_iov
*mk_io
, char *buf
, int len
,
89 mk_io
->io
[idx
].iov_base
= buf
;
90 mk_io
->io
[idx
].iov_len
= len
;
91 mk_io
->total_len
+= len
;
93 if (free
== MK_IOV_FREE_BUF
) {
94 _mk_iov_set_free(mk_io
, buf
);
100 void _mk_iov_set_free(struct mk_iov
*mk_io
, char *buf
)
102 mk_io
->buf_to_free
[mk_io
->buf_idx
] = (char *) buf
;
106 ssize_t
mk_iov_send(int fd
, struct mk_iov
*mk_io
, int to
)
110 if (to
== MK_IOV_SEND_TO_SOCKET
) {
111 n
= writev(fd
, mk_io
->io
, mk_io
->iov_idx
);
118 else if (to
== MK_IOV_SEND_TO_PIPE
) {
119 /* for some reason, vmsplice is not working as expected for us,
120 * maybe we need to fix something here, at the moment
121 * we will keep using writev to push the iovec struct to the pipe
125 * (const struct iovec *) mk_io->io,
131 n
= writev(fd
, mk_io
->io
, mk_io
->iov_idx
);
135 MK_TRACE("writev() error on FD %i", fd
);
144 void mk_iov_free(struct mk_iov
*mk_io
)
146 mk_iov_free_marked(mk_io
);
147 mk_mem_free(mk_io
->buf_to_free
);
148 mk_mem_free(mk_io
->io
);
152 void mk_iov_free_marked(struct mk_iov
*mk_io
)
156 limit
= mk_io
->buf_idx
;
158 for (i
= 0; i
< limit
; i
++) {
161 printf("\nDEBUG IOV :: going free (idx: %i/%i): %s", i
,
162 limit
, mk_io
->buf_to_free
[i
]);
165 mk_mem_free(mk_io
->buf_to_free
[i
]);
172 void mk_iov_print(struct mk_iov
*mk_io
)
176 for (i
= 0; i
< mk_io
->iov_idx
; i
++) {
177 printf("\n%i len=%i)\n'%s'", i
, mk_io
->io
[i
].iov_len
,
178 (char *) mk_io
->io
[i
].iov_base
);
183 void mk_iov_separators_init()
185 mk_pointer_set(&mk_iov_crlf
, MK_IOV_CRLF
);
186 mk_pointer_set(&mk_iov_lf
, MK_IOV_LF
);
187 mk_pointer_set(&mk_iov_space
, MK_IOV_SPACE
);
188 mk_pointer_set(&mk_iov_slash
, MK_IOV_SLASH
);
189 mk_pointer_set(&mk_iov_none
, MK_IOV_NONE
);
190 mk_pointer_set(&mk_iov_equal
, MK_IOV_EQUAL
);