master
c 52 lines 1.24 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "../libnetdata.h"
4 #include "spawn_library.h"
5
6 BUFFER *argv_to_cmdline_buffer(const char **argv) {
7 BUFFER *wb = buffer_create(0, NULL);
8
9 for(size_t i = 0; argv[i] ;i++) {
10 const char *s = argv[i];
11 size_t len = strlen(s);
12 buffer_need_bytes(wb, len * 2 + 1);
13
14 bool needs_quotes = false;
15 for(const char *c = s; !needs_quotes && *c ; c++) {
16 switch(*c) {
17 case ' ':
18 case '\v':
19 case '\t':
20 case '\n':
21 case '"':
22 needs_quotes = true;
23 break;
24
25 default:
26 break;
27 }
28 }
29
30 if(needs_quotes && buffer_strlen(wb))
31 buffer_strcat(wb, " \"");
32 else if(buffer_strlen(wb))
33 buffer_putc(wb, ' ');
34
35 for(const char *c = s; *c ; c++) {
36 switch(*c) {
37 case '"':
38 buffer_putc(wb, '\\');
39 // fall through
40
41 default:
42 buffer_putc(wb, *c);
43 break;
44 }
45 }
46
47 if(needs_quotes)
48 buffer_strcat(wb, "\"");
49 }
50
51 return wb;
52 }