OpenVPN 3 Core Library
Loading...
Searching...
No Matches
argv.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12#ifndef OPENVPN_COMMON_ARGV_H
13#define OPENVPN_COMMON_ARGV_H
14
15#include <cstring> // memcpy
16
17#include <string>
18#include <vector>
19
20namespace openvpn {
21
22class Argv : public std::vector<std::string>
23{
24 public:
25 Argv(const size_t capacity = 16)
26 {
27 reserve(capacity);
28 }
29
30 std::string to_string() const
31 {
32 std::string ret;
33 bool first = true;
34 for (const auto &s : *this)
35 {
36 if (!first)
37 ret += ' ';
38 ret += s;
39 first = false;
40 }
41 return ret;
42 }
43};
44
46{
47 public:
48 explicit ArgvWrapper(const std::vector<std::string> &argv)
49 {
50 size_t i;
51 argc = argv.size();
52 cargv = new char *[argc + 1];
53 for (i = 0; i < argc; ++i)
54 cargv[i] = string_alloc(argv[i]);
55 cargv[i] = nullptr;
56 }
57
58 ArgvWrapper(ArgvWrapper &&rhs) noexcept
59 {
60 argc = rhs.argc;
61 cargv = rhs.cargv;
62 rhs.argc = 0;
63 rhs.cargv = nullptr;
64 }
65
67 {
68 del();
69 argc = rhs.argc;
70 cargv = rhs.cargv;
71 rhs.argc = 0;
72 rhs.cargv = nullptr;
73 return *this;
74 }
75
77 {
78 del();
79 }
80
81 char *const *c_argv() const noexcept
82 {
83 return cargv;
84 }
85
86 char **c_argv() noexcept
87 {
88 return cargv;
89 }
90
91 size_t c_argc() const noexcept
92 {
93 return argc;
94 }
95
96 private:
97 ArgvWrapper(const ArgvWrapper &) = delete;
98 ArgvWrapper &operator=(const ArgvWrapper &) = delete;
99
100 static char *string_alloc(const std::string &s)
101 {
102 const char *sdata = s.c_str();
103 const size_t slen = s.length();
104 char *ret = new char[slen + 1];
105 std::memcpy(ret, sdata, slen);
106 ret[slen] = '\0';
107 return ret;
108 }
109
110 void del()
111 {
112 for (size_t i = 0; i < argc; ++i)
113 delete[] cargv[i];
114 delete[] cargv;
115 }
116
117 size_t argc;
118 char **cargv;
119};
120
121} // namespace openvpn
122
123#endif
static char * string_alloc(const std::string &s)
Definition argv.hpp:100
ArgvWrapper & operator=(const ArgvWrapper &)=delete
size_t c_argc() const noexcept
Definition argv.hpp:91
char ** c_argv() noexcept
Definition argv.hpp:86
ArgvWrapper(const std::vector< std::string > &argv)
Definition argv.hpp:48
ArgvWrapper(ArgvWrapper &&rhs) noexcept
Definition argv.hpp:58
ArgvWrapper(const ArgvWrapper &)=delete
ArgvWrapper & operator=(ArgvWrapper &&rhs) noexcept
Definition argv.hpp:66
char *const * c_argv() const noexcept
Definition argv.hpp:81
std::string to_string() const
Definition argv.hpp:30
Argv(const size_t capacity=16)
Definition argv.hpp:25
std::string ret