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

taosdata / TDengine / #3796

31 Mar 2025 10:39AM UTC coverage: 30.372% (-7.1%) from 37.443%
#3796

push

travis-ci

happyguoxy
test:add test cases

69287 of 309062 branches covered (22.42%)

Branch coverage included in aggregate %.

118044 of 307720 relevant lines covered (38.36%)

278592.15 hits per line

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

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

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

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

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

89
#ifdef CUS_EMAIL
90
  printf("\r\n\r\nReport bugs to %s.\r\n", CUS_EMAIL);
×
91
#else
92
  printf("\r\n\r\nReport bugs to %s.\r\n", "support@taosdata.com");
93
#endif
94
}
×
95

96
#if defined(LINUX) && !defined(TD_ASTRA)
97
#include <argp.h>
98
#ifdef _ALPINE
99
#include <termios.h>
100
#else
101
#include <termio.h>
102
#endif
103

104
const char *argp_program_version = td_version;
105
#ifdef CUS_EMAIL
106
const char *argp_program_bug_address = CUS_EMAIL;
107
#else
108
const char *argp_program_bug_address = "support@taosdata.com";
109
#endif
110

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

139
static error_t shellParseOpt(int32_t key, char *arg, struct argp_state *state) { return shellParseSingleOpt(key, arg); }
439✔
140

141
static struct argp shellArgp = {shellOptions, shellParseOpt, "", ""};
142

143
static int32_t shellParseArgsUseArgp(int argc, char *argv[]) {
63✔
144
  argp_program_version = shell.info.programVersion;
63✔
145
  error_t err = argp_parse(&shellArgp, argc, argv, 0, 0, &shell.args);
63✔
146
  return (err != 0);
62✔
147
}
148

149
#endif
150

151
#ifndef ARGP_ERR_UNKNOWN
152
#define ARGP_ERR_UNKNOWN E2BIG
153
#endif
154

155
static int32_t shellParseSingleOpt(int32_t key, char *arg) {
439✔
156
  SShellArgs *pArgs = &shell.args;
439✔
157

158
  switch (key) {
439!
159
    case 'h':
4✔
160
      pArgs->host = arg;
4✔
161
      break;
4✔
162
    case 'P':
4✔
163
      pArgs->port = atoi(arg);
4✔
164
      if (pArgs->port == 0) {
4!
165
        pArgs->port = -1;
×
166
      } else {
167
        pArgs->port_inputted = true;
4✔
168
      }
169
      break;
4✔
170
    case 'u':
×
171
      pArgs->user = arg;
×
172
      break;
×
173
    case 'p':
×
174
      break;
×
175
    case 'a':
×
176
      pArgs->auth = arg;
×
177
      break;
×
178
    case 'A':
×
179
      pArgs->is_gen_auth = true;
×
180
      break;
×
181
    case 'B':
×
182
      pArgs->is_bi_mode = true;
×
183
      break;
×
184
    case 'c':
58✔
185
      pArgs->cfgdir = arg;
58✔
186
      break;
58✔
187
    case 'C':
×
188
      pArgs->is_dump_config = true;
×
189
      break;
×
190
    case 's':
5✔
191
      pArgs->commands = arg;
5✔
192
      break;
5✔
193
    case 'r':
×
194
      pArgs->is_raw_time = true;
×
195
      break;
×
196
    case 'f':
57✔
197
      tstrncpy(pArgs->file, arg, sizeof(pArgs->file));
57✔
198
      break;
57✔
199
    case 'd':
×
200
      pArgs->database = arg;
×
201
      break;
×
202
    case 'k':
×
203
      pArgs->is_check = true;
×
204
      break;
×
205
    case 't':
×
206
      pArgs->is_startup = true;
×
207
      break;
×
208
    case 'w':
×
209
      pArgs->displayWidth = atoi(arg);
×
210
      break;
×
211
    case 'n':
×
212
      pArgs->netrole = arg;
×
213
      break;
×
214
    case 'l':
×
215
      pArgs->pktLen = atoi(arg);
×
216
      break;
×
217
    case 'N':
×
218
      pArgs->pktNum = atoi(arg);
×
219
      break;
×
220
#if defined(LINUX)
221
    case 'o':
×
222
      if (strlen(arg) >= PATH_MAX) {
×
223
        printf("failed to set log output since length overflow, max length is %d\r\n", PATH_MAX);
×
224
        return TSDB_CODE_INVALID_CFG;
×
225
      }
226
      tsLogOutput = taosMemoryMalloc(PATH_MAX);
×
227
      if (!tsLogOutput) {
×
228
        printf("failed to set log output: '%s' since %s\r\n", arg, tstrerror(terrno));
×
229
        return terrno;
×
230
      }
231
      if (taosExpandDir(arg, tsLogOutput, PATH_MAX) != 0) {
×
232
        printf("failed to expand log output: '%s' since %s\r\n", arg, tstrerror(terrno));
×
233
        return terrno;
×
234
      }
235
      break;
×
236
#endif
237
    case 'E':
×
238
    case 'X':
239
      pArgs->dsn = arg;
×
240
      break;
×
241
    case 'T':
×
242
      pArgs->timeout = atoi(arg);
×
243
      break;
×
244
    case 'Z':
×
245
      pArgs->connMode = getConnMode(arg);
×
246
      break;
×
247
    case 'V':
×
248
      pArgs->is_version = true;
×
249
      break;
×
250
    case '?':
×
251
      pArgs->is_help = true;
×
252
      break;
×
253
    case 1:
×
254
      pArgs->abort = 1;
×
255
      break;
×
256
    default:
311✔
257
      return ARGP_ERR_UNKNOWN;
311✔
258
  }
259
  return 0;
128✔
260
}
261
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) || defined(_TD_DARWIN_64) || defined(TD_ASTRA)
262

263
int32_t shellParseArgsWithoutArgp(int argc, char *argv[]) {
264
  SShellArgs *pArgs = &shell.args;
265
  int32_t     ret = 0;
266

267
  for (int i = 1; i < argc; i++) {
268
    if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--usage") == 0
269
            || strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "/?") == 0) {
270
      return shellParseSingleOpt('?', NULL);
271
    }
272

273
    char   *key = argv[i];
274
    int32_t keyLen = strlen(key);
275
    if (keyLen != 2) {
276
      fprintf(stderr, "invalid option %s\r\n", key);
277
      return -1;
278
    }
279
    if (key[0] != '-') {
280
      fprintf(stderr, "invalid option %s\r\n", key);
281
      return -1;
282
    }
283

284
    if (key[1] == 'h' || key[1] == 'P' || key[1] == 'u' || key[1] == 'a' || key[1] == 'c' || key[1] == 's' ||
285
        key[1] == 'f' || key[1] == 'd' || key[1] == 'w' || key[1] == 'n' || key[1] == 'l' || key[1] == 'N' ||
286
        key[1] == 'E' || key[1] == 'T' || key[1] == 'X' || key[1] == 'Z') {
287
      if (i + 1 >= argc) {
288
        fprintf(stderr, "option %s requires an argument\r\n", key);
289
        return -1;
290
      }
291
      char *val = argv[i + 1];
292
      if (val[0] == '-') {
293
        fprintf(stderr, "option %s requires an argument\r\n", key);
294
        return -1;
295
      }
296
      ret = shellParseSingleOpt(key[1], val);
297
      i++;
298
    } else if (key[1] == 'p' || key[1] == 'A' || key[1] == 'C' || key[1] == 'r' || key[1] == 'k' || key[1] == 't' ||
299
               key[1] == 'V' || key[1] == '?' || key[1] == 1 || key[1] == 'R'|| key[1] == 'B') {
300
      ret = shellParseSingleOpt(key[1], NULL);
301
    } else {
302
      fprintf(stderr, "invalid option %s\r\n", key);
303
      return -1;
304
    }
305

306
    if (ret != 0) {
307
      return ret;
308
    }
309
  }
310

311
  return 0;
312
}
313
#endif
314

315
static void shellInitArgs(int argc, char *argv[]) {
63✔
316
  for (int i = 1; i < argc; i++) {
320✔
317
    if (strncmp(argv[i], "-p", 2) == 0) {
257!
318
      // printf(shell.info.clientVersion, taos_get_client_info());
319
      if (strlen(argv[i]) == 2) {
×
320
        printf("Enter password: ");
×
321
        taosSetConsoleEcho(false);
×
322
        if (scanf("%255s", shell.args.password) > 1) {
×
323
          fprintf(stderr, "password reading error\n");
×
324
        }
325
        taosSetConsoleEcho(true);
×
326
        if (EOF == getchar()) {
×
327
          fprintf(stderr, "getchar() return EOF\r\n");
×
328
        }
329
      } else {
330
        tstrncpy(shell.args.password, (char *)(argv[i] + 2), sizeof(shell.args.password));
×
331
        strcpy(argv[i], "-p");
×
332
      }
333
      printf("\r\n");
×
334
    }
335
  }
336
  if (strlen(shell.args.password) == 0) {
63!
337
    tstrncpy(shell.args.password, TSDB_DEFAULT_PASS, sizeof(shell.args.password));
63✔
338
  }
339

340
  SShellArgs *pArgs = &shell.args;
63✔
341
  pArgs->user = TSDB_DEFAULT_USER;
63✔
342
  pArgs->pktLen = SHELL_DEF_PKG_LEN;
63✔
343
  pArgs->pktNum = SHELL_DEF_PKG_NUM;
63✔
344
  pArgs->displayWidth = SHELL_DEFAULT_MAX_BINARY_DISPLAY_WIDTH;
63✔
345
  pArgs->timeout = SHELL_WS_TIMEOUT;
63✔
346

347
  shell.exit = false;
63✔
348
}
63✔
349

350
static int32_t shellCheckArgs() {
62✔
351
  SShellArgs *pArgs = &shell.args;
62✔
352
  if (pArgs->host != NULL && (strlen(pArgs->host) <= 0 || strlen(pArgs->host) > TSDB_FQDN_LEN)) {
62!
353
    printf("Invalid host:%s\r\n", pArgs->host);
×
354
    return -1;
×
355
  }
356

357
  if (pArgs->user != NULL && (strlen(pArgs->user) <= 0 || strlen(pArgs->user) > TSDB_USER_LEN)) {
62!
358
    printf("Invalid user:%s\r\n", pArgs->user);
×
359
    return -1;
×
360
  }
361

362
  if (pArgs->auth != NULL && (strlen(pArgs->auth) <= 0 || strlen(pArgs->auth) > TSDB_PASSWORD_LEN)) {
62!
363
    printf("Invalid auth:%s\r\n", pArgs->auth);
×
364
    return -1;
×
365
  }
366

367
  if (pArgs->database != NULL && (strlen(pArgs->database) <= 0 || strlen(pArgs->database) > TSDB_DB_NAME_LEN)) {
62!
368
    printf("Invalid database:%s\r\n", pArgs->database);
×
369
    return -1;
×
370
  }
371

372
  if (pArgs->file[0] != 0) {
62✔
373
    char fullname[PATH_MAX] = {0};
57✔
374
    if (taosExpandDir(pArgs->file, fullname, PATH_MAX) == 0) {
57!
375
      tstrncpy(pArgs->file, fullname, PATH_MAX);
57✔
376
    }
377
  }
378

379
  if (pArgs->cfgdir != NULL) {
62✔
380
    if (strlen(pArgs->cfgdir) <= 0 || strlen(pArgs->cfgdir) >= PATH_MAX) {
58!
381
      printf("Invalid cfgdir:%s\r\n", pArgs->cfgdir);
×
382
      return -1;
×
383
    } else {
384
      if (taosExpandDir(pArgs->cfgdir, configDirShell, PATH_MAX) != 0) {
58!
385
        tstrncpy(configDirShell, pArgs->cfgdir, PATH_MAX);
×
386
      }
387
      // check cfg dir exist
388
      /*
389
      if(!taosIsDir(configDirShell)) {
390
        printf("folder not exist. cfgdir:%s  expand:%s\r\n", pArgs->cfgdir, configDirShell);
391
        configDirShell[0] = 0;
392
        return -1;          
393
      }*/  
394
    }
395
  }
396

397
  if (pArgs->commands != NULL && (strlen(pArgs->commands) <= 0)) {
62!
398
    printf("Invalid commands:%s\r\n", pArgs->commands);
×
399
    return -1;
×
400
  }
401

402
  if (pArgs->netrole != NULL && !(strcmp(pArgs->netrole, "client") == 0 || strcmp(pArgs->netrole, "server") == 0)) {
62!
403
    printf("Invalid netrole:%s\r\n", pArgs->netrole);
×
404
    return -1;
×
405
  }
406

407
  if (/*pArgs->password != NULL && */ (strlen(pArgs->password) <= 0)) {
62!
408
    printf("Invalid password\r\n");
×
409
    return -1;
×
410
  }
411

412
  if (pArgs->port < 0 || pArgs->port > 65535) {
62!
413
    printf("Invalid port\r\n");
×
414
    return -1;
×
415
  }
416

417
  if (pArgs->pktLen < SHELL_MIN_PKG_LEN || pArgs->pktLen > SHELL_MAX_PKG_LEN) {
62!
418
    printf("Invalid pktLen:%d, range:[%d, %d]\r\n", pArgs->pktLen, SHELL_MIN_PKG_LEN, SHELL_MAX_PKG_LEN);
×
419
    return -1;
×
420
  }
421

422
  if (pArgs->pktNum < SHELL_MIN_PKG_NUM || pArgs->pktNum > SHELL_MAX_PKG_NUM) {
62!
423
    printf("Invalid pktNum:%d, range:[%d, %d]\r\n", pArgs->pktNum, SHELL_MIN_PKG_NUM, SHELL_MAX_PKG_NUM);
×
424
    return -1;
×
425
  }
426

427
  if (pArgs->displayWidth <= 0 || pArgs->displayWidth > 10 * 1024) {
62!
428
    printf("Invalid displayWidth:%d, range:[1, 10 * 1024]\r\n", pArgs->displayWidth);
×
429
    return -1;
×
430
  }
431

432
  return 0;
62✔
433
}
434

435
int32_t shellParseArgs(int32_t argc, char *argv[]) {
63✔
436
  shellInitArgs(argc, argv);
63✔
437
  shell.info.clientVersion =
63✔
438
      "Welcome to the %s Command Line Interface, %s Client Version:%s \r\n"
439
      "Copyright (c) 2025 by %s, all rights reserved.\r\n\r\n";
440
#ifdef CUS_NAME
441
  strcpy(shell.info.cusName, CUS_NAME);
63✔
442
#else
443
  strcpy(shell.info.cusName, "TDengine");
444
#endif
445
  char promptContinueFormat[32] = {0};
63✔
446
#ifdef CUS_PROMPT
447
  sprintf(shell.info.promptHeader, "%s> ", CUS_PROMPT);
63✔
448
  sprintf(promptContinueFormat, "%%%zus> ", strlen(CUS_PROMPT));
63✔
449
#else
450
  sprintf(shell.info.promptHeader, "taos> ");
451
  sprintf(promptContinueFormat, "%%%zus> ", strlen("taos"));
452
#endif
453
  sprintf(shell.info.promptContinue, promptContinueFormat, " ");
63✔
454
  shell.info.promptSize = strlen(shell.info.promptHeader);
63✔
455
#ifdef TD_ENTERPRISE
456
  snprintf(shell.info.programVersion, sizeof(shell.info.programVersion),
63✔
457
           "%s\n%s version: %s compatible_version: %s\ngit: %s\ngitOfInternal: %s\nbuild: %s", TD_PRODUCT_NAME,
458
           CUS_PROMPT, td_version, td_compatible_version, td_gitinfo, td_gitinfoOfInternal, td_buildinfo);
459
#else
460
  snprintf(shell.info.programVersion, sizeof(shell.info.programVersion),
461
           "%s\n%s version: %s compatible_version: %s\ngit: %s\nbuild: %s", TD_PRODUCT_NAME, CUS_PROMPT, td_version,
462
           td_compatible_version, td_gitinfo, td_buildinfo);
463
#endif
464

465
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
466
  shell.info.osname = "Windows";
467
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "C:/TDengine/%s", SHELL_HISTORY_FILE);
468
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
469
#elif defined(_TD_DARWIN_64)
470
  shell.info.osname = "Darwin";
471
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "%s/%s", getpwuid(getuid())->pw_dir, SHELL_HISTORY_FILE);
472
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
473
#elif defined(TD_ASTRA)
474
  shell.info.osname = "Astra";
475
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "C:%sTDengine%s%s", TD_DIRSEP, TD_DIRSEP,
476
           SHELL_HISTORY_FILE);  // TD_ASTRA_TODO getenv("HOME")
477
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
478
#else
479
  shell.info.osname = "Linux";
63✔
480
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "%s/%s", getenv("HOME"), SHELL_HISTORY_FILE);
63✔
481
  if (shellParseArgsUseArgp(argc, argv) != 0) return -1;
63!
482
  if (shell.args.abort) {
62!
483
    return -1;
×
484
  }
485
#endif
486

487
  return shellCheckArgs();
62✔
488
}
489

490
int32_t getDsnEnv() {
62✔
491
  if (shell.args.connMode == CONN_MODE_NATIVE) {
62!
492
    if (shell.args.dsn != NULL) {
×
493
      fprintf(stderr, DSN_NATIVE_CONFLICT);
×
494
      return -1;
×
495
    }
496
  } else {
497
    if (shell.args.dsn != NULL) {
62!
498
      return 0;
×
499
    } else {
500
      // read cloud
501
      shell.args.dsn = getenv("TDENGINE_CLOUD_DSN");
62✔
502
      if (shell.args.dsn && strlen(shell.args.dsn) > 4) {
62!
503
        fprintf(stderr, "Use the environment variable TDENGINE_CLOUD_DSN:%s as the input for the DSN option.\r\n",
×
504
                shell.args.dsn);
505
        return 0;
×
506
      }
507

508
      // read local
509
      shell.args.dsn = getenv("TDENGINE_DSN");
62✔
510
      if (shell.args.dsn && strlen(shell.args.dsn) > 4) {
62!
511
        fprintf(stderr, "Use the environment variable TDENGINE_DSN:%s as the input for the DSN option.\r\n",
×
512
                shell.args.dsn);
513
        return 0;
×
514
      }
515
      shell.args.dsn = NULL;
62✔
516
    }
517
  }
518

519
  return 0;
62✔
520
}
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