• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4898

26 Dec 2025 09:58AM UTC coverage: 65.061% (-0.7%) from 65.717%
#4898

push

travis-ci

web-flow
feat: support encryption of configuration files, data files and metadata files (#33801)

350 of 1333 new or added lines in 31 files covered. (26.26%)

2796 existing lines in 159 files now uncovered.

184024 of 282850 relevant lines covered (65.06%)

113940470.33 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

76.59
/tools/shell/src/shellArguments.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#include "shellInt.h"
17
#include "../../inc/pub.h"
18
char   configDirShell[PATH_MAX] = {0};
19

20
#define TAOS_CONSOLE_PROMPT_CONTINUE "   -> "
21

22
#define SHELL_HOST     "The server FQDN to connect. The default host is localhost."
23
#define SHELL_PORT     "The TCP/IP port number to use for the connection."
24
#define SHELL_USER     "The user name to use when connecting to the server."
25
#define SHELL_PASSWORD "The password to use when connecting to the server."
26
#define SHELL_TOKEN    "The token to use when connecting to the server."
27
#define SHELL_AUTH     "The auth string to use when connecting to the server."
28
#define SHELL_GEN_AUTH "Generate auth string from password."
29
#define SHELL_CFG_DIR  "Configuration directory."
30
#define SHELL_DMP_CFG  "Dump configuration."
31
#define SHELL_CMD      "Commands to run without enter the shell."
32
#define SHELL_RAW_TIME "Output time as uint64_t."
33
#define SHELL_FILE     "Script to run without enter the shell."
34
#define SHELL_DB       "Database to use when connecting to the server."
35
#define SHELL_CHECK    "Check the service status."
36
#define SHELL_STARTUP  "Check the details of the service status."
37
#define SHELL_WIDTH    "Set the default binary display width, default is 30."
38
#define SHELL_NET_ROLE "Net role when network connectivity test, options: client|server."
39
#define SHELL_PKT_LEN  "Packet length used for net test, default is 1024 bytes."
40
#define SHELL_PKT_NUM  "Packet numbers used for net test, default is 100."
41
#define SHELL_BI_MODE  "Set BI mode"
42
#define SHELL_VERSION  "Print program version."
43
#define SHELL_DSN      "Use dsn to connect to the cloud server or to a remote server which provides WebSocket connection."
44
#define SHELL_TIMEOUT  "Set the timeout for WebSocket query in seconds, default is 30."
45
#define SHELL_LOG_OUTPUT                                                                                              \
46
  "Specify log output. Options:\n\r\t\t\t     stdout, stderr, /dev/null, <directory>, <directory>/<filename>, "       \
47
  "<filename>\n\r\t\t\t     * If OUTPUT contains an absolute directory, logs will be stored in that directory "       \
48
  "instead of logDir.\n\r\t\t\t     * If OUTPUT contains a relative directory, logs will be stored in the directory " \
49
  "combined with logDir and the relative directory."
50

51
#ifdef WEBSOCKET
52
#define SHELL_DRIVER_DEFAULT "0." // todo simon -> 1
53
#else
54
#define SHELL_DRIVER_DEFAULT "0."
55
#endif
56

57
static int32_t shellParseSingleOpt(int32_t key, char *arg);
58

59
void shellPrintHelp() {
×
60
  char indent[] = "  ";
×
61
  printf("Usage: %s [OPTION...] \r\n\r\n", CUS_PROMPT);
×
62
  printf("%s%s%s%s\r\n", indent, "-a,", indent, SHELL_AUTH);
×
63
  printf("%s%s%s%s\r\n", indent, "-A,", indent, SHELL_GEN_AUTH);
×
64
  printf("%s%s%s%s\r\n", indent, "-B,", indent, SHELL_BI_MODE);
×
65
  printf("%s%s%s%s\r\n", indent, "-c,", indent, SHELL_CFG_DIR);
×
66
  printf("%s%s%s%s\r\n", indent, "-C,", indent, SHELL_DMP_CFG);
×
67
  printf("%s%s%s%s\r\n", indent, "-d,", indent, SHELL_DB);
×
68
  printf("%s%s%s%s\r\n", indent, "-f,", indent, SHELL_FILE);
×
69
  printf("%s%s%s%s\r\n", indent, "-h,", indent, SHELL_HOST);
×
70
  printf("%s%s%s%s\r\n", indent, "-k,", indent, SHELL_CHECK);
×
71
  printf("%s%s%s%s\r\n", indent, "-l,", indent, SHELL_PKT_LEN);
×
72
  printf("%s%s%s%s\r\n", indent, "-n,", indent, SHELL_NET_ROLE);
×
UNCOV
73
  printf("%s%s%s%s\r\n", indent, "-N,", indent, SHELL_PKT_NUM);
×
74
#if defined(LINUX)
UNCOV
75
  printf("%s%s%s%s\r\n", indent, "-o,", indent, SHELL_LOG_OUTPUT);
×
76
#endif
77
  printf("%s%s%s%s\r\n", indent, "-p,", indent, SHELL_PASSWORD);
×
78
#ifdef TD_ENTERPRISE
79
  printf("%s%s%s%s\r\n", indent, "-q,", indent, SHELL_TOKEN);
×
80
#endif
81
  printf("%s%s%s%s\r\n", indent, "-P,", indent, SHELL_PORT);
×
82
  printf("%s%s%s%s\r\n", indent, "-r,", indent, SHELL_RAW_TIME);
×
83
  printf("%s%s%s%s\r\n", indent, "-s,", indent, SHELL_CMD);
×
84
  printf("%s%s%s%s\r\n", indent, "-t,", indent, SHELL_STARTUP);
×
85
  printf("%s%s%s%s\r\n", indent, "-u,", indent, SHELL_USER);
×
86
  printf("%s%s%s%s\r\n", indent, "-E,", indent, OLD_DSN_DESC);
×
87
  printf("%s%s%s%s\r\n", indent, "-T,", indent, SHELL_TIMEOUT);
×
UNCOV
88
  printf("%s%s%s%s\r\n", indent, "-w,", indent, SHELL_WIDTH);
×
UNCOV
89
  printf("%s%s%s%s\r\n", indent, "-V,", indent, SHELL_VERSION);
×
90
  printf("%s%s%s%s\r\n", indent, "-X,", indent, DSN_DESC);
×
UNCOV
91
  printf("%s%s%s%s\r\n", indent, "-Z,", indent, DRIVER_DESC);
×
92

93
#ifdef CUS_EMAIL
94
  printf("\r\n\r\nReport bugs to %s.\r\n", CUS_EMAIL);
×
95
#else
96
  printf("\r\n\r\nReport bugs to %s.\r\n", "support@taosdata.com");
97
#endif
UNCOV
98
}
×
99

100
#if defined(LINUX) && !defined(TD_ASTRA)
101
#include <argp.h>
102
#ifdef _ALPINE
103
#include <termios.h>
104
#else
105
#include <termio.h>
106
#endif
107

108
const char *argp_program_version = td_version;
109
#ifdef CUS_EMAIL
110
const char *argp_program_bug_address = CUS_EMAIL;
111
#else
112
const char *argp_program_bug_address = "support@taosdata.com";
113
#endif
114

115
static struct argp_option shellOptions[] = {
116
    {"host", 'h', "HOST", 0, SHELL_HOST},
117
    {"port", 'P', "PORT", 0, SHELL_PORT},
118
    {"user", 'u', "USER", 0, SHELL_USER},
119
    {0, 'p', 0, 0, SHELL_PASSWORD},
120
#ifdef TD_ENTERPRISE
121
    {0, 'q', 0, 0, SHELL_TOKEN},
122
#endif
123
    {"auth", 'a', "AUTH", 0, SHELL_AUTH},
124
    {"generate-auth", 'A', 0, 0, SHELL_GEN_AUTH},
125
    {"config-dir", 'c', "DIR", 0, SHELL_CFG_DIR},
126
    {"dump-config", 'C', 0, 0, SHELL_DMP_CFG},
127
    {"commands", 's', "COMMANDS", 0, SHELL_CMD},
128
    {"raw-time", 'r', 0, 0, SHELL_RAW_TIME},
129
    {"file", 'f', "FILE", 0, SHELL_FILE},
130
    {"database", 'd', "DATABASE", 0, SHELL_DB},
131
    {"check", 'k', 0, 0, SHELL_CHECK},
132
    {"startup", 't', 0, 0, SHELL_STARTUP},
133
    {"display-width", 'w', "WIDTH", 0, SHELL_WIDTH},
134
    {"netrole", 'n', "NETROLE", 0, SHELL_NET_ROLE},
135
    {"pktlen", 'l', "PKTLEN", 0, SHELL_PKT_LEN},
136
    {"cloud-dsn", 'E', "DSN", 0, OLD_DSN_DESC},
137
    {"timeout", 'T', "SECONDS", 0, SHELL_TIMEOUT},
138
    {"pktnum", 'N', "PKTNUM", 0, SHELL_PKT_NUM},
139
    {"bimode", 'B', 0, 0, SHELL_BI_MODE},
140
    {"log-output", 'o', "OUTPUT", 0, SHELL_LOG_OUTPUT},
141
    {"dsn", 'X', "DSN", 0, DSN_DESC},
142
    {DRIVER_OPT, 'Z', "DRIVER", 0, DRIVER_DESC},
143
    {0},
144
};
145

146
static error_t shellParseOpt(int32_t key, char *arg, struct argp_state *state) { return shellParseSingleOpt(key, arg); }
4,542,349✔
147

148
static struct argp shellArgp = {shellOptions, shellParseOpt, "", ""};
149

150
static int32_t shellParseArgsUseArgp(int argc, char *argv[]) {
750,066✔
151
  argp_program_version = shell.info.programVersion;
750,066✔
152
  error_t err = argp_parse(&shellArgp, argc, argv, 0, 0, &shell.args);
750,066✔
153
  return (err != 0);
749,637✔
154
}
155

156
#endif
157

158
#ifndef ARGP_ERR_UNKNOWN
159
#define ARGP_ERR_UNKNOWN E2BIG
160
#endif
161

162
static int32_t shellParseSingleOpt(int32_t key, char *arg) {
4,542,349✔
163
  SShellArgs *pArgs = &shell.args;
4,542,349✔
164

165
  switch (key) {
4,542,349✔
166
    case 'h':
685✔
167
      pArgs->host = arg;
685✔
168
      break;
685✔
169
    case 'P':
681✔
170
      pArgs->port = atoi(arg);
681✔
171
      if (pArgs->port == 0) {
681✔
172
        pArgs->port = -1;
110✔
173
      } else {
174
        pArgs->port_inputted = true;
571✔
175
      }
176
      break;
681✔
177
    case 'u':
504✔
178
      pArgs->user = arg;
504✔
179
      break;
504✔
180
    case 'p':
444✔
181
      break;
444✔
182
    case 'q':
52✔
183
      break;
52✔
184
    case 'a':
117✔
185
      pArgs->auth = arg;
117✔
186
      break;
117✔
187
    case 'A':
43✔
188
      pArgs->is_gen_auth = true;
43✔
189
      break;
43✔
190
    case 'B':
108✔
191
      pArgs->is_bi_mode = true;
108✔
192
      break;
108✔
193
    case 'c':
40,415✔
194
      pArgs->cfgdir = arg;
40,415✔
195
      break;
40,415✔
196
    case 'C':
40✔
197
      pArgs->is_dump_config = true;
40✔
198
      break;
40✔
199
    case 's':
695,184✔
200
      pArgs->commands = arg;
695,184✔
201
      break;
695,184✔
202
    case 'r':
56✔
203
      pArgs->is_raw_time = true;
56✔
204
      break;
56✔
205
    case 'f':
53,358✔
206
      tstrncpy(pArgs->file, arg, sizeof(pArgs->file));
53,358✔
207
      break;
53,358✔
208
    case 'd':
124✔
209
      pArgs->database = arg;
124✔
210
      break;
124✔
211
    case 'k':
126✔
212
      pArgs->is_check = true;
126✔
213
      break;
126✔
214
    case 't':
40✔
215
      pArgs->is_startup = true;
40✔
216
      break;
40✔
217
    case 'w':
106✔
218
      pArgs->displayWidth = atoi(arg);
106✔
219
      break;
106✔
220
    case 'n':
56✔
221
      pArgs->netrole = arg;
56✔
222
      break;
56✔
223
    case 'l':
108✔
224
      pArgs->pktLen = atoi(arg);
108✔
225
      break;
108✔
226
    case 'N':
108✔
227
      pArgs->pktNum = atoi(arg);
108✔
228
      break;
108✔
229
#if defined(LINUX)
230
    case 'o':
129✔
231
      if (strlen(arg) >= PATH_MAX) {
129✔
232
        printf("failed to set log output since length overflow, max length is %d\r\n", PATH_MAX);
×
233
        return TSDB_CODE_INVALID_CFG;
×
234
      }
235
      tsLogOutput = taosMemoryMalloc(PATH_MAX);
129✔
236
      if (!tsLogOutput) {
129✔
UNCOV
237
        printf("failed to set log output: '%s' since %s\r\n", arg, tstrerror(terrno));
×
UNCOV
238
        return terrno;
×
239
      }
240
      if (taosExpandDir(arg, tsLogOutput, PATH_MAX) != 0) {
129✔
UNCOV
241
        printf("failed to expand log output: '%s' since %s\r\n", arg, tstrerror(terrno));
×
UNCOV
242
        return terrno;
×
243
      }
244
      break;
129✔
245
#endif
246
    case 'E':
296✔
247
    case 'X':
248
      pArgs->dsn = arg;
296✔
249
      break;
296✔
250
    case 'T':
140✔
251
      pArgs->timeout = atoi(arg);
140✔
252
      break;
140✔
253
    case 'Z':
759✔
254
      pArgs->connMode = getConnMode(arg);
759✔
255
      break;
733✔
UNCOV
256
    case 'V':
×
UNCOV
257
      pArgs->is_version = true;
×
UNCOV
258
      break;
×
UNCOV
259
    case '?':
×
UNCOV
260
      pArgs->is_help = true;
×
UNCOV
261
      break;
×
UNCOV
262
    case 1:
×
UNCOV
263
      pArgs->abort = 1;
×
UNCOV
264
      break;
×
265
    default:
3,748,670✔
266
      return ARGP_ERR_UNKNOWN;
3,748,670✔
267
  }
268
  return 0;
793,653✔
269
}
270
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) || defined(_TD_DARWIN_64) || defined(TD_ASTRA)
271

272
int32_t shellParseArgsWithoutArgp(int argc, char *argv[]) {
273
  SShellArgs *pArgs = &shell.args;
274
  int32_t     ret = 0;
275

276
  for (int i = 1; i < argc; i++) {
277
    if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--usage") == 0
278
            || strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "/?") == 0) {
279
      return shellParseSingleOpt('?', NULL);
280
    }
281

282
    char   *key = argv[i];
283
    if (key[0] != '-') {
284
      fprintf(stderr, "invalid option %s\r\n", key);
285
      return -1;
286
    }
287
    int32_t keyLen = strlen(key);
288

289
    if (key[1] == 'h' || key[1] == 'P' || key[1] == 'u' || key[1] == 'a' || key[1] == 'c' || key[1] == 's' ||
290
        key[1] == 'f' || key[1] == 'd' || key[1] == 'w' || key[1] == 'n' || key[1] == 'l' || key[1] == 'N' ||
291
        key[1] == 'E' || key[1] == 'T' || key[1] == 'X' || key[1] == 'Z') {
292
      if (keyLen > 2) {
293
        ret = shellParseSingleOpt(key[1], key + 2);
294
      } else if ((i + 1 >= argc) || (argv[i + 1][0] == '-')) {
295
        fprintf(stderr, "option %s requires an argument\r\n", key);
296
        return -1;
297
      } else {
298
        ret = shellParseSingleOpt(key[1], argv[i + 1]);
299
        i++;
300
      }
301
    } else if (key[1] == 'p' || key[1] == 'q') {
302
      // -p and -q can be used with or without argument (read from stdin or command line)
303
      if (keyLen > 2) {
304
        ret = shellParseSingleOpt(key[1], key + 2);
305
      } else {
306
        ret = shellParseSingleOpt(key[1], NULL);
307
      }
308
    } else if (keyLen != 2) {
309
      fprintf(stderr, "invalid option %s\r\n", key);
310
      return -1;
311
    } else if (key[1] == 'A' || key[1] == 'C' || key[1] == 'r' || key[1] == 'k' || key[1] == 't' ||
312
               key[1] == 'V' || key[1] == '?' || key[1] == 1 || key[1] == 'R'|| key[1] == 'B') {
313
      ret = shellParseSingleOpt(key[1], NULL);
314
    } else {
315
      fprintf(stderr, "invalid option %s\r\n", key);
316
      return -1;
317
    }
318

319
    if (ret != 0) {
320
      return ret;
321
    }
322
  }
323

324
  return 0;
325
}
326
#endif
327

328
static void shellInitArgs(int argc, char *argv[]) {
750,066✔
329
  for (int i = 1; i < argc; i++) {
2,335,493✔
330
    if (strncmp(argv[i], "-p", 2) == 0) {
1,585,923✔
331
      // password
332
      memset(shell.args.password, 0, sizeof(shell.args.password));
444✔
333
      if (strlen(argv[i]) == 2) {
444✔
334
        printf("Enter password: ");
39✔
335
        taosSetConsoleEcho(false);
39✔
336
        if (scanf("%255s", shell.args.password) != 1) {
39✔
UNCOV
337
          fprintf(stderr, "password reading error\n");
×
338
        }
339
        taosSetConsoleEcho(true);
39✔
340
        if (EOF == getchar()) {
39✔
341
          fprintf(stderr, "getchar() return EOF\r\n");
39✔
342
        }
343
      } else {
344
        tstrncpy(shell.args.password, (char *)(argv[i] + 2), sizeof(shell.args.password) - 1);
405✔
345
        strcpy(argv[i], "-p");
405✔
346
      }
347
      printf("\r\n");
444✔
348
      break;
444✔
349
    }
350
#ifdef TD_ENTERPRISE      
351
    else if (strncmp(argv[i], "-q", 2) == 0) {
1,585,479✔
352
      // token
353
      memset(shell.args.token, 0, sizeof(shell.args.token));
52✔
354
      if (strlen(argv[i]) == 2) {
52✔
355
        printf("Enter token: ");
13✔
356
        taosSetConsoleEcho(false);
13✔
357
        if (scanf("%255s", shell.args.token) != 1) {
13✔
UNCOV
358
          fprintf(stderr, "token reading error\n");
×
359
        }
360
        taosSetConsoleEcho(true);
13✔
361
        if (EOF == getchar()) {
13✔
UNCOV
362
          fprintf(stderr, "getchar() return EOF\r\n");
×
363
        }
364
      } else {
365
        tstrncpy(shell.args.token, (char *)(argv[i] + 2), sizeof(shell.args.token) - 1);  
39✔
366
        strcpy(argv[i], "-q");
39✔
367
      }
368
      printf("\r\n");
52✔
369
      break;
52✔
370
    }
371
#endif
372
  }
373

374
  // default password
375
  if (strlen(shell.args.password) == 0) {
750,066✔
376
    tstrncpy(shell.args.password, TSDB_DEFAULT_PASS, sizeof(shell.args.password));
749,622✔
377
  }
378

379
  SShellArgs *pArgs = &shell.args;
750,066✔
380
  pArgs->user = TSDB_DEFAULT_USER;
750,066✔
381
  pArgs->pktLen = SHELL_DEF_PKG_LEN;
750,066✔
382
  pArgs->pktNum = SHELL_DEF_PKG_NUM;
750,066✔
383
  pArgs->displayWidth = SHELL_DEFAULT_MAX_BINARY_DISPLAY_WIDTH;
750,066✔
384
  pArgs->timeout = SHELL_WS_TIMEOUT;
750,066✔
385

386
  shell.exit = false;
750,066✔
387
}
750,066✔
388

389
static int32_t shellCheckArgs() {
749,637✔
390
  SShellArgs *pArgs = &shell.args;
749,637✔
391
  if (pArgs->host != NULL && (strlen(pArgs->host) <= 0 || strlen(pArgs->host) > TSDB_FQDN_LEN)) {
749,637✔
392
    printf("Invalid host:%s\r\n", pArgs->host);
26✔
393
    return -1;
26✔
394
  }
395

396
  if (pArgs->user != NULL && (strlen(pArgs->user) <= 0 || strlen(pArgs->user) > TSDB_USER_LEN)) {
749,611✔
397
    printf("Invalid user:%s\r\n", pArgs->user);
26✔
398
    return -1;
26✔
399
  }
400

401
  if (pArgs->auth != NULL && (strlen(pArgs->auth) <= 0 || strlen(pArgs->auth) > TSDB_PASSWORD_LEN)) {
749,585✔
402
    printf("Invalid auth:%s\r\n", pArgs->auth);
13✔
403
    return -1;
13✔
404
  }
405

406
  if (pArgs->database != NULL && (strlen(pArgs->database) <= 0 || strlen(pArgs->database) > TSDB_DB_NAME_LEN)) {
749,572✔
UNCOV
407
    printf("Invalid database:%s\r\n", pArgs->database);
×
UNCOV
408
    return -1;
×
409
  }
410

411
  if (pArgs->file[0] != 0) {
749,572✔
412
    char fullname[PATH_MAX] = {0};
53,358✔
413
    if (taosExpandDir(pArgs->file, fullname, PATH_MAX) == 0) {
53,358✔
414
      tstrncpy(pArgs->file, fullname, PATH_MAX);
53,358✔
415
    }
416
  }
417

418
  if (pArgs->cfgdir != NULL) {
749,572✔
419
    if (strlen(pArgs->cfgdir) <= 0 || strlen(pArgs->cfgdir) >= PATH_MAX) {
40,373✔
UNCOV
420
      printf("Invalid cfgdir:%s\r\n", pArgs->cfgdir);
×
UNCOV
421
      return -1;
×
422
    } else {
423
      if (taosExpandDir(pArgs->cfgdir, configDirShell, PATH_MAX) != 0) {
40,373✔
UNCOV
424
        tstrncpy(configDirShell, pArgs->cfgdir, PATH_MAX);
×
425
      }
426
      // check cfg dir exist
427
      /*
428
      if(!taosIsDir(configDirShell)) {
429
        printf("folder not exist. cfgdir:%s  expand:%s\r\n", pArgs->cfgdir, configDirShell);
430
        configDirShell[0] = 0;
431
        return -1;          
432
      }*/  
433
    }
434
  }
435

436
  if (pArgs->commands != NULL && (strlen(pArgs->commands) <= 0)) {
749,572✔
437
    printf("Invalid commands:%s\r\n", pArgs->commands);
26✔
438
    return -1;
26✔
439
  }
440

441
  if (pArgs->netrole != NULL && !(strcmp(pArgs->netrole, "client") == 0 || strcmp(pArgs->netrole, "server") == 0)) {
749,546✔
UNCOV
442
    printf("Invalid netrole:%s\r\n", pArgs->netrole);
×
UNCOV
443
    return -1;
×
444
  }
445

446
  if (/*pArgs->password != NULL && */ (strlen(pArgs->password) <= 0)) {
749,546✔
UNCOV
447
    printf("Invalid password\r\n");
×
UNCOV
448
    return -1;
×
449
  }
450

451
  if (pArgs->port < 0 || pArgs->port > 65535) {
749,546✔
452
    printf("Invalid port\r\n");
110✔
453
    return -1;
110✔
454
  }
455

456
  if (pArgs->pktLen < SHELL_MIN_PKG_LEN || pArgs->pktLen > SHELL_MAX_PKG_LEN) {
749,436✔
457
    printf("Invalid pktLen:%d, range:[%d, %d]\r\n", pArgs->pktLen, SHELL_MIN_PKG_LEN, SHELL_MAX_PKG_LEN);
26✔
458
    return -1;
26✔
459
  }
460

461
  if (pArgs->pktNum < SHELL_MIN_PKG_NUM || pArgs->pktNum > SHELL_MAX_PKG_NUM) {
749,410✔
462
    printf("Invalid pktNum:%d, range:[%d, %d]\r\n", pArgs->pktNum, SHELL_MIN_PKG_NUM, SHELL_MAX_PKG_NUM);
26✔
463
    return -1;
26✔
464
  }
465

466
  if (pArgs->displayWidth <= 0 || pArgs->displayWidth > 10 * 1024) {
749,384✔
467
    printf("Invalid displayWidth:%d, range:[1, 10 * 1024]\r\n", pArgs->displayWidth);
26✔
468
    return -1;
26✔
469
  }
470

471
  return 0;
749,358✔
472
}
473

474
int32_t shellParseArgs(int32_t argc, char *argv[]) {
750,066✔
475
  shellInitArgs(argc, argv);
750,066✔
476
  shell.info.clientVersion =
750,066✔
477
      "Welcome to the %s Command Line Interface, %s Client Version:%s \r\n"
478
      "Copyright (c) 2025 by %s, all rights reserved.\r\n\r\n";
479
#ifdef CUS_NAME
480
  strcpy(shell.info.cusName, CUS_NAME);
481
#else
482
  strcpy(shell.info.cusName, "TDengine TSDB");
750,066✔
483
#endif
484
  char promptContinueFormat[32] = {0};
750,066✔
485
#ifdef CUS_PROMPT
486
  sprintf(shell.info.promptHeader, "%s> ", CUS_PROMPT);
750,066✔
487
  sprintf(promptContinueFormat, "%%%zus> ", strlen(CUS_PROMPT));
750,066✔
488
#else
489
  sprintf(shell.info.promptHeader, "taos> ");
490
  sprintf(promptContinueFormat, "%%%zus> ", strlen("taos"));
491
#endif
492
  sprintf(shell.info.promptContinue, promptContinueFormat, " ");
750,066✔
493
  shell.info.promptSize = strlen(shell.info.promptHeader);
750,066✔
494
#ifdef TD_ENTERPRISE
495
  snprintf(shell.info.programVersion, sizeof(shell.info.programVersion),
750,066✔
496
           "%s\n%s version: %s compatible_version: %s\ngit: %s\ngitOfInternal: %s\nbuild: %s", TD_PRODUCT_NAME,
497
           CUS_PROMPT, td_version, td_compatible_version, td_gitinfo, td_gitinfoOfInternal, td_buildinfo);
498
#else
499
  snprintf(shell.info.programVersion, sizeof(shell.info.programVersion),
500
           "%s\n%s version: %s compatible_version: %s\ngit: %s\nbuild: %s", TD_PRODUCT_NAME, CUS_PROMPT, td_version,
501
           td_compatible_version, td_gitinfo, td_buildinfo);
502
#endif
503

504
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
505
  shell.info.osname = "Windows";
506
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "C:/TDengine/%s", SHELL_HISTORY_FILE);
507
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
508
#elif defined(_TD_DARWIN_64)
509
  shell.info.osname = "Darwin";
510
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "%s/%s", getpwuid(getuid())->pw_dir, SHELL_HISTORY_FILE);
511
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
512
#elif defined(TD_ASTRA)
513
  shell.info.osname = "Astra";
514
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "C:%sTDengine%s%s", TD_DIRSEP, TD_DIRSEP,
515
           SHELL_HISTORY_FILE);  // TD_ASTRA_TODO getenv("HOME")
516
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
517
#else
518
  shell.info.osname = "Linux";
750,066✔
519
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "%s/%s", getenv("HOME"), SHELL_HISTORY_FILE);
750,066✔
520
  if (shellParseArgsUseArgp(argc, argv) != 0) return -1;
750,066✔
521
  if (shell.args.abort) {
749,637✔
UNCOV
522
    return -1;
×
523
  }
524
#endif
525

526
  return shellCheckArgs();
749,637✔
527
}
528

529
int32_t getDsnEnv() {
749,259✔
530
  if (shell.args.connMode == CONN_MODE_NATIVE) {
749,259✔
531
    if (shell.args.dsn != NULL) {
304✔
532
      fprintf(stderr, DSN_NATIVE_CONFLICT);
13✔
533
      return -1;
13✔
534
    }
535
  } else {
536
    if (shell.args.dsn != NULL) {
748,955✔
537
      return 0;
283✔
538
    } else {
539
      // read cloud
540
      shell.args.dsn = getenv("TDENGINE_CLOUD_DSN");
748,672✔
541
      if (shell.args.dsn && strlen(shell.args.dsn) > 4) {
748,672✔
542
        fprintf(stderr, "Use the environment variable TDENGINE_CLOUD_DSN:%s as the input for the DSN option.\r\n",
26✔
543
                shell.args.dsn);
544
        return 0;
26✔
545
      }
546

547
      // read local
548
      shell.args.dsn = getenv("TDENGINE_DSN");
748,646✔
549
      if (shell.args.dsn && strlen(shell.args.dsn) > 4) {
748,646✔
550
        fprintf(stderr, "Use the environment variable TDENGINE_DSN:%s as the input for the DSN option.\r\n",
13✔
551
                shell.args.dsn);
552
        return 0;
13✔
553
      }
554
      shell.args.dsn = NULL;
748,633✔
555
    }
556
  }
557

558
  return 0;
748,924✔
559
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc