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

taosdata / TDengine / #4760

25 Sep 2025 05:58AM UTC coverage: 58.866%. Remained the same
#4760

push

travis-ci

web-flow
enh: taos command line support '-uroot' on windows (#33055)

135700 of 293169 branches covered (46.29%)

Branch coverage included in aggregate %.

204479 of 284720 relevant lines covered (71.82%)

25399510.59 hits per line

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

76.5
/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); }
21,303✔
140

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

143
static int32_t shellParseArgsUseArgp(int argc, char *argv[]) {
3,251✔
144
  argp_program_version = shell.info.programVersion;
3,251✔
145
  error_t err = argp_parse(&shellArgp, argc, argv, 0, 0, &shell.args);
3,251✔
146
  return (err != 0);
3,215✔
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) {
21,303✔
156
  SShellArgs *pArgs = &shell.args;
21,303✔
157

158
  switch (key) {
21,303!
159
    case 'h':
1,375✔
160
      pArgs->host = arg;
1,375✔
161
      break;
1,375✔
162
    case 'P':
133✔
163
      pArgs->port = atoi(arg);
133✔
164
      if (pArgs->port == 0) {
133✔
165
        pArgs->port = -1;
4✔
166
      } else {
167
        pArgs->port_inputted = true;
129✔
168
      }
169
      break;
133✔
170
    case 'u':
17✔
171
      pArgs->user = arg;
17✔
172
      break;
17✔
173
    case 'p':
14✔
174
      break;
14✔
175
    case 'a':
4✔
176
      pArgs->auth = arg;
4✔
177
      break;
4✔
178
    case 'A':
1✔
179
      pArgs->is_gen_auth = true;
1✔
180
      break;
1✔
181
    case 'B':
6✔
182
      pArgs->is_bi_mode = true;
6✔
183
      break;
6✔
184
    case 'c':
339✔
185
      pArgs->cfgdir = arg;
339✔
186
      break;
339✔
187
    case 'C':
2✔
188
      pArgs->is_dump_config = true;
2✔
189
      break;
2✔
190
    case 's':
1,676✔
191
      pArgs->commands = arg;
1,676✔
192
      break;
1,676✔
193
    case 'r':
2✔
194
      pArgs->is_raw_time = true;
2✔
195
      break;
2✔
196
    case 'f':
1,514✔
197
      tstrncpy(pArgs->file, arg, sizeof(pArgs->file));
1,514✔
198
      break;
1,514✔
199
    case 'd':
4✔
200
      pArgs->database = arg;
4✔
201
      break;
4✔
202
    case 'k':
3✔
203
      pArgs->is_check = true;
3✔
204
      break;
3✔
205
    case 't':
2✔
206
      pArgs->is_startup = true;
2✔
207
      break;
2✔
208
    case 'w':
6✔
209
      pArgs->displayWidth = atoi(arg);
6✔
210
      break;
6✔
211
    case 'n':
1✔
212
      pArgs->netrole = arg;
1✔
213
      break;
1✔
214
    case 'l':
5✔
215
      pArgs->pktLen = atoi(arg);
5✔
216
      break;
5✔
217
    case 'N':
5✔
218
      pArgs->pktNum = atoi(arg);
5✔
219
      break;
5✔
220
#if defined(LINUX)
221
    case 'o':
3✔
222
      if (strlen(arg) >= PATH_MAX) {
3!
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);
3!
227
      if (!tsLogOutput) {
3!
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) {
3!
232
        printf("failed to expand log output: '%s' since %s\r\n", arg, tstrerror(terrno));
×
233
        return terrno;
×
234
      }
235
      break;
3✔
236
#endif
237
    case 'E':
17✔
238
    case 'X':
239
      pArgs->dsn = arg;
17✔
240
      break;
17✔
241
    case 'T':
5✔
242
      pArgs->timeout = atoi(arg);
5✔
243
      break;
5✔
244
    case 'Z':
58✔
245
      pArgs->connMode = getConnMode(arg);
58✔
246
      break;
56✔
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:
16,111✔
257
      return ARGP_ERR_UNKNOWN;
16,111✔
258
  }
259
  return 0;
5,190✔
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
    if (key[0] != '-') {
275
      fprintf(stderr, "invalid option %s\r\n", key);
276
      return -1;
277
    }
278
    int32_t keyLen = strlen(key);
279

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

303
    if (ret != 0) {
304
      return ret;
305
    }
306
  }
307

308
  return 0;
309
}
310
#endif
311

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

337
  SShellArgs *pArgs = &shell.args;
3,251✔
338
  pArgs->user = TSDB_DEFAULT_USER;
3,251✔
339
  pArgs->pktLen = SHELL_DEF_PKG_LEN;
3,251✔
340
  pArgs->pktNum = SHELL_DEF_PKG_NUM;
3,251✔
341
  pArgs->displayWidth = SHELL_DEFAULT_MAX_BINARY_DISPLAY_WIDTH;
3,251✔
342
  pArgs->timeout = SHELL_WS_TIMEOUT;
3,251✔
343

344
  shell.exit = false;
3,251✔
345
}
3,251✔
346

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

354
  if (pArgs->user != NULL && (strlen(pArgs->user) <= 0 || strlen(pArgs->user) > TSDB_USER_LEN)) {
3,213!
355
    printf("Invalid user:%s\r\n", pArgs->user);
2✔
356
    return -1;
2✔
357
  }
358

359
  if (pArgs->auth != NULL && (strlen(pArgs->auth) <= 0 || strlen(pArgs->auth) > TSDB_PASSWORD_LEN)) {
3,211!
360
    printf("Invalid auth:%s\r\n", pArgs->auth);
1✔
361
    return -1;
1✔
362
  }
363

364
  if (pArgs->database != NULL && (strlen(pArgs->database) <= 0 || strlen(pArgs->database) > TSDB_DB_NAME_LEN)) {
3,210!
365
    printf("Invalid database:%s\r\n", pArgs->database);
×
366
    return -1;
×
367
  }
368

369
  if (pArgs->file[0] != 0) {
3,210✔
370
    char fullname[PATH_MAX] = {0};
1,514✔
371
    if (taosExpandDir(pArgs->file, fullname, PATH_MAX) == 0) {
1,514!
372
      tstrncpy(pArgs->file, fullname, PATH_MAX);
1,514✔
373
    }
374
  }
375

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

394
  if (pArgs->commands != NULL && (strlen(pArgs->commands) <= 0)) {
3,210✔
395
    printf("Invalid commands:%s\r\n", pArgs->commands);
2✔
396
    return -1;
2✔
397
  }
398

399
  if (pArgs->netrole != NULL && !(strcmp(pArgs->netrole, "client") == 0 || strcmp(pArgs->netrole, "server") == 0)) {
3,208!
400
    printf("Invalid netrole:%s\r\n", pArgs->netrole);
×
401
    return -1;
×
402
  }
403

404
  if (/*pArgs->password != NULL && */ (strlen(pArgs->password) <= 0)) {
3,208!
405
    printf("Invalid password\r\n");
×
406
    return -1;
×
407
  }
408

409
  if (pArgs->port < 0 || pArgs->port > 65535) {
3,208!
410
    printf("Invalid port\r\n");
4✔
411
    return -1;
4✔
412
  }
413

414
  if (pArgs->pktLen < SHELL_MIN_PKG_LEN || pArgs->pktLen > SHELL_MAX_PKG_LEN) {
3,204!
415
    printf("Invalid pktLen:%d, range:[%d, %d]\r\n", pArgs->pktLen, SHELL_MIN_PKG_LEN, SHELL_MAX_PKG_LEN);
2✔
416
    return -1;
2✔
417
  }
418

419
  if (pArgs->pktNum < SHELL_MIN_PKG_NUM || pArgs->pktNum > SHELL_MAX_PKG_NUM) {
3,202!
420
    printf("Invalid pktNum:%d, range:[%d, %d]\r\n", pArgs->pktNum, SHELL_MIN_PKG_NUM, SHELL_MAX_PKG_NUM);
2✔
421
    return -1;
2✔
422
  }
423

424
  if (pArgs->displayWidth <= 0 || pArgs->displayWidth > 10 * 1024) {
3,200!
425
    printf("Invalid displayWidth:%d, range:[1, 10 * 1024]\r\n", pArgs->displayWidth);
2✔
426
    return -1;
2✔
427
  }
428

429
  return 0;
3,198✔
430
}
431

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

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

484
  return shellCheckArgs();
3,215✔
485
}
486

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

505
      // read local
506
      shell.args.dsn = getenv("TDENGINE_DSN");
3,155✔
507
      if (shell.args.dsn && strlen(shell.args.dsn) > 4) {
3,155✔
508
        fprintf(stderr, "Use the environment variable TDENGINE_DSN:%s as the input for the DSN option.\r\n",
1✔
509
                shell.args.dsn);
510
        return 0;
1✔
511
      }
512
      shell.args.dsn = NULL;
3,154✔
513
    }
514
  }
515

516
  return 0;
3,176✔
517
}
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