BadVPN – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /**
2 * @file stdbuf_cmdline.h
3 * @author Ambroz Bizjak <ambrop7@gmail.com>
4 *
5 * @section LICENSE
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the author nor the
15 * names of its contributors may be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * @section DESCRIPTION
30 *
31 * Builds command line for running a program via stdbuf.
32 */
33  
34 #ifndef BADVPN_STDBUF_CMDLINE_H
35 #define BADVPN_STDBUF_CMDLINE_H
36  
37 #include <string.h>
38  
39 #include <misc/debug.h>
40 #include <misc/cmdline.h>
41 #include <misc/balloc.h>
42  
43 /**
44 * Builds the initial part of command line for calling a program via stdbuf
45 * with standard output buffering set to line-buffered.
46 *
47 * @param out {@link CmdLine} to append the result to. Note than on failure, only
48 * some part of the cmdline may have been appended.
49 * @param stdbuf_exec full path to stdbuf executable
50 * @param exec path to the executable. Must not contain nulls.
51 * @param exec_len number of characters in exec
52 * @return 1 on success, 0 on failure
53 */
54 static int build_stdbuf_cmdline (CmdLine *out, const char *stdbuf_exec, const char *exec, size_t exec_len) WARN_UNUSED;
55  
56 int build_stdbuf_cmdline (CmdLine *out, const char *stdbuf_exec, const char *exec, size_t exec_len)
57 {
58 ASSERT(!memchr(exec, '\0', exec_len))
59  
60 if (!CmdLine_AppendMulti(out, 3, stdbuf_exec, "-o", "L")) {
61 goto fail1;
62 }
63  
64 if (exec[0] == '/') {
65 if (!CmdLine_AppendNoNull(out, exec, exec_len)) {
66 goto fail1;
67 }
68 } else {
69 bsize_t size = bsize_add(bsize_fromsize(exec_len), bsize_fromsize(3));
70 char *real_exec = BAllocSize(size);
71 if (!real_exec) {
72 goto fail1;
73 }
74  
75 memcpy(real_exec, "./", 2);
76 memcpy(real_exec + 2, exec, exec_len);
77 real_exec[2 + exec_len] = '\0';
78  
79 int res = CmdLine_Append(out, real_exec);
80 free(real_exec);
81 if (!res) {
82 goto fail1;
83 }
84 }
85  
86 return 1;
87  
88 fail1:
89 return 0;
90 }
91  
92 #endif