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

taosdata / TDengine / #3548

04 Dec 2024 01:03PM UTC coverage: 59.846% (-0.8%) from 60.691%
#3548

push

travis-ci

web-flow
Merge pull request #29033 from taosdata/fix/calculate-vnode-memory-used

fix/calculate-vnode-memory-used

118484 of 254183 branches covered (46.61%)

Branch coverage included in aggregate %.

199691 of 277471 relevant lines covered (71.97%)

18794141.86 hits per line

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

58.12
/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
#ifdef _TD_DARWIN_64
17
#include <pwd.h>
18
#endif
19

20
#include "shellInt.h"
21
#include "version.h"
22

23
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
24
#include "cus_name.h"
25
#else
26
#ifndef CUS_PROMPT
27
#define CUS_PROMPT "taos"
28
#endif
29
#endif
30

31
#define TAOS_CONSOLE_PROMPT_CONTINUE "   -> "
32

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

59
#ifdef WEBSOCKET
60
#define SHELL_DSN     "Use dsn to connect to the cloud server or to a remote server which provides WebSocket connection."
61
#define SHELL_REST    "Use RESTful mode when connecting."
62
#define SHELL_TIMEOUT "Set the timeout for websocket query in seconds, default is 30."
63
#endif
64

65
static int32_t shellParseSingleOpt(int32_t key, char *arg);
66

67
void shellPrintHelp() {
×
68
  char indent[] = "  ";
×
69
  printf("Usage: %s [OPTION...] \r\n\r\n", CUS_PROMPT);
×
70
  printf("%s%s%s%s\r\n", indent, "-a,", indent, SHELL_AUTH);
×
71
  printf("%s%s%s%s\r\n", indent, "-A,", indent, SHELL_GEN_AUTH);
×
72
  printf("%s%s%s%s\r\n", indent, "-B,", indent, SHELL_BI_MODE);
×
73
  printf("%s%s%s%s\r\n", indent, "-c,", indent, SHELL_CFG_DIR);
×
74
  printf("%s%s%s%s\r\n", indent, "-C,", indent, SHELL_DMP_CFG);
×
75
  printf("%s%s%s%s\r\n", indent, "-d,", indent, SHELL_DB);
×
76
  printf("%s%s%s%s\r\n", indent, "-f,", indent, SHELL_FILE);
×
77
  printf("%s%s%s%s\r\n", indent, "-h,", indent, SHELL_HOST);
×
78
  printf("%s%s%s%s\r\n", indent, "-k,", indent, SHELL_CHECK);
×
79
  printf("%s%s%s%s\r\n", indent, "-l,", indent, SHELL_PKT_LEN);
×
80
  printf("%s%s%s%s\r\n", indent, "-n,", indent, SHELL_NET_ROLE);
×
81
  printf("%s%s%s%s\r\n", indent, "-N,", indent, SHELL_PKT_NUM);
×
82
#if defined(LINUX)
83
  printf("%s%s%s%s\r\n", indent, "-o,", indent, SHELL_LOG_OUTPUT);
×
84
#endif
85
  printf("%s%s%s%s\r\n", indent, "-p,", indent, SHELL_PASSWORD);
×
86
  printf("%s%s%s%s\r\n", indent, "-P,", indent, SHELL_PORT);
×
87
  printf("%s%s%s%s\r\n", indent, "-r,", indent, SHELL_RAW_TIME);
×
88
  printf("%s%s%s%s\r\n", indent, "-s,", indent, SHELL_CMD);
×
89
  printf("%s%s%s%s\r\n", indent, "-t,", indent, SHELL_STARTUP);
×
90
  printf("%s%s%s%s\r\n", indent, "-u,", indent, SHELL_USER);
×
91
#ifdef WEBSOCKET
92
  printf("%s%s%s%s\r\n", indent, "-E,", indent, SHELL_DSN);
93
  printf("%s%s%s%s\r\n", indent, "-R,", indent, SHELL_REST);
94
  printf("%s%s%s%s\r\n", indent, "-T,", indent, SHELL_TIMEOUT);
95
#endif
96
  printf("%s%s%s%s\r\n", indent, "-w,", indent, SHELL_WIDTH);
×
97
  printf("%s%s%s%s\r\n", indent, "-V,", indent, SHELL_VERSION);
×
98
#ifdef CUS_EMAIL
99
  printf("\r\n\r\nReport bugs to %s.\r\n", CUS_EMAIL);
100
#else
101
  printf("\r\n\r\nReport bugs to %s.\r\n", "support@taosdata.com");
×
102
#endif
103
}
×
104

105
#ifdef LINUX
106
#include <argp.h>
107
#ifdef _ALPINE
108
#include <termios.h>
109
#else
110
#include <termio.h>
111
#endif
112

113
const char *argp_program_version = td_version;
114
#ifdef CUS_EMAIL
115
const char *argp_program_bug_address = CUS_EMAIL;
116
#else
117
const char *argp_program_bug_address = "support@taosdata.com";
118
#endif
119

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

151
static error_t shellParseOpt(int32_t key, char *arg, struct argp_state *state) { return shellParseSingleOpt(key, arg); }
7,164✔
152

153
static struct argp shellArgp = {shellOptions, shellParseOpt, "", ""};
154

155
static void shellParseArgsUseArgp(int argc, char *argv[]) {
1,057✔
156
  argp_program_version = shell.info.programVersion;
1,057✔
157
  argp_parse(&shellArgp, argc, argv, 0, 0, &shell.args);
1,057✔
158
}
1,043✔
159

160
#endif
161

162
#ifndef ARGP_ERR_UNKNOWN
163
#define ARGP_ERR_UNKNOWN E2BIG
164
#endif
165

166
static int32_t shellParseSingleOpt(int32_t key, char *arg) {
7,164✔
167
  SShellArgs *pArgs = &shell.args;
7,164✔
168

169
  switch (key) {
7,164!
170
    case 'h':
707✔
171
      pArgs->host = arg;
707✔
172
#ifdef WEBSOCKET
173
      pArgs->cloud = false;
174
#endif
175
      break;
707✔
176
    case 'P':
78✔
177
      pArgs->port = atoi(arg);
78✔
178
#ifdef WEBSOCKET
179
      pArgs->cloud = false;
180
#endif
181
      if (pArgs->port == 0) pArgs->port = -1;
78✔
182
      break;
78✔
183
    case 'u':
4✔
184
      pArgs->user = arg;
4✔
185
      break;
4✔
186
    case 'p':
3✔
187
      break;
3✔
188
    case 'a':
2✔
189
      pArgs->auth = arg;
2✔
190
      break;
2✔
191
    case 'A':
1✔
192
      pArgs->is_gen_auth = true;
1✔
193
      break;
1✔
194
    case 'B':
×
195
      pArgs->is_bi_mode = true;
×
196
      break;
×
197
    case 'c':
113✔
198
#ifdef WEBSOCKET
199
      pArgs->cloud = false;
200
#endif
201
      pArgs->cfgdir = arg;
113✔
202
      break;
113✔
203
    case 'C':
×
204
      pArgs->is_dump_config = true;
×
205
      break;
×
206
    case 's':
208✔
207
      pArgs->commands = arg;
208✔
208
      break;
208✔
209
    case 'r':
×
210
      pArgs->is_raw_time = true;
×
211
      break;
×
212
    case 'f':
808✔
213
      tstrncpy(pArgs->file, arg, sizeof(pArgs->file));
808✔
214
      break;
808✔
215
    case 'd':
2✔
216
      pArgs->database = arg;
2✔
217
      break;
2✔
218
    case 'k':
3✔
219
      pArgs->is_check = true;
3✔
220
      break;
3✔
221
    case 't':
×
222
      pArgs->is_startup = true;
×
223
      break;
×
224
    case 'w':
×
225
      pArgs->displayWidth = atoi(arg);
×
226
      break;
×
227
    case 'n':
1✔
228
      pArgs->netrole = arg;
1✔
229
      break;
1✔
230
    case 'l':
1✔
231
      pArgs->pktLen = atoi(arg);
1✔
232
      break;
1✔
233
    case 'N':
1✔
234
      pArgs->pktNum = atoi(arg);
1✔
235
      break;
1✔
236
#if defined(LINUX)
237
    case 'o':
3✔
238
      if (strlen(arg) >= PATH_MAX) {
3!
239
        printf("failed to set log output since length overflow, max length is %d\n", PATH_MAX);
×
240
        return TSDB_CODE_INVALID_CFG;
×
241
      }
242
      tsLogOutput = taosMemoryMalloc(PATH_MAX);
3✔
243
      if (!tsLogOutput) {
3!
244
        printf("failed to set log output: '%s' since %s\n", arg, tstrerror(terrno));
×
245
        return terrno;
×
246
      }
247
      if (taosExpandDir(arg, tsLogOutput, PATH_MAX) != 0) {
3!
248
        printf("failed to expand log output: '%s' since %s\n", arg, tstrerror(terrno));
×
249
        return terrno;
×
250
      }
251
      break;
3✔
252
#endif
253
#ifdef WEBSOCKET
254
    case 'R':
255
      pArgs->restful = true;
256
      break;
257
    case 'E':
258
      pArgs->dsn = arg;
259
      pArgs->cloud = true;
260
      break;
261
    case 'T':
262
      pArgs->timeout = atoi(arg);
263
      break;
264
#endif
265
    case 'V':
×
266
      pArgs->is_version = true;
×
267
      break;
×
268
    case '?':
×
269
      pArgs->is_help = true;
×
270
      break;
×
271
    case 1:
×
272
      pArgs->abort = 1;
×
273
      break;
×
274
    default:
5,229✔
275
      return ARGP_ERR_UNKNOWN;
5,229✔
276
  }
277
  return 0;
1,935✔
278
}
279
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) || defined(_TD_DARWIN_64)
280
int32_t shellParseArgsWithoutArgp(int argc, char *argv[]) {
281
  SShellArgs *pArgs = &shell.args;
282

283
  for (int i = 1; i < argc; i++) {
284
    if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--usage") == 0
285
            || strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "/?") == 0) {
286
      shellParseSingleOpt('?', NULL);
287
      return 0;
288
    }
289

290
    char   *key = argv[i];
291
    int32_t keyLen = strlen(key);
292
    if (keyLen != 2) {
293
      fprintf(stderr, "invalid option %s\r\n", key);
294
      return -1;
295
    }
296
    if (key[0] != '-') {
297
      fprintf(stderr, "invalid option %s\r\n", key);
298
      return -1;
299
    }
300

301
    if (key[1] == 'h' || key[1] == 'P' || key[1] == 'u'
302
            || key[1] == 'a' || key[1] == 'c' || key[1] == 's'
303
            || key[1] == 'f' || key[1] == 'd' || key[1] == 'w'
304
            || key[1] == 'n' || key[1] == 'l' || key[1] == 'N'
305
#ifdef WEBSOCKET
306
        || key[1] == 'E' || key[1] == 'T'
307
#endif
308
    ) {
309
      if (i + 1 >= argc) {
310
        fprintf(stderr, "option %s requires an argument\r\n", key);
311
        return -1;
312
      }
313
      char *val = argv[i + 1];
314
      if (val[0] == '-') {
315
        fprintf(stderr, "option %s requires an argument\r\n", key);
316
        return -1;
317
      }
318
      shellParseSingleOpt(key[1], val);
319
      i++;
320
    } else if (key[1] == 'p' || key[1] == 'A' || key[1] == 'C'
321
                || key[1] == 'r' || key[1] == 'k'
322
                || key[1] == 't' || key[1] == 'V'
323
                || key[1] == '?' || key[1] == 1
324
#ifdef WEBSOCKET
325
            ||key[1] == 'R'
326
#endif
327
    ) {
328
      shellParseSingleOpt(key[1], NULL);
329
    } else {
330
      fprintf(stderr, "invalid option %s\r\n", key);
331
      return -1;
332
    }
333
  }
334

335
  return 0;
336
}
337
#endif
338

339
static void shellInitArgs(int argc, char *argv[]) {
1,057✔
340
  for (int i = 1; i < argc; i++) {
4,926✔
341
    if (strncmp(argv[i], "-p", 2) == 0) {
3,869✔
342
      // printf(shell.info.clientVersion, taos_get_client_info());
343
      if (strlen(argv[i]) == 2) {
3!
344
        printf("Enter password: ");
×
345
        taosSetConsoleEcho(false);
×
346
        if (scanf("%128s", shell.args.password) > 1) {
×
347
          fprintf(stderr, "password reading error\n");
×
348
        }
349
        taosSetConsoleEcho(true);
×
350
        if (EOF == getchar()) {
×
351
          fprintf(stderr, "getchar() return EOF\r\n");
×
352
        }
353
      } else {
354
        tstrncpy(shell.args.password, (char *)(argv[i] + 2), sizeof(shell.args.password));
3✔
355
        strcpy(argv[i], "-p");
3✔
356
      }
357
    }
358
  }
359
  if (strlen(shell.args.password) == 0) {
1,057✔
360
    tstrncpy(shell.args.password, TSDB_DEFAULT_PASS, sizeof(shell.args.password));
1,054✔
361
  }
362

363
  SShellArgs *pArgs = &shell.args;
1,057✔
364
  pArgs->user = TSDB_DEFAULT_USER;
1,057✔
365
  pArgs->pktLen = SHELL_DEF_PKG_LEN;
1,057✔
366
  pArgs->pktNum = SHELL_DEF_PKG_NUM;
1,057✔
367
  pArgs->displayWidth = SHELL_DEFAULT_MAX_BINARY_DISPLAY_WIDTH;
1,057✔
368
}
1,057✔
369

370
static int32_t shellCheckArgs() {
1,043✔
371
  SShellArgs *pArgs = &shell.args;
1,043✔
372
  if (pArgs->host != NULL && (strlen(pArgs->host) <= 0 || strlen(pArgs->host) > TSDB_FQDN_LEN)) {
1,043!
373
    printf("Invalid host:%s\r\n", pArgs->host);
×
374
    return -1;
×
375
  }
376

377
  if (pArgs->user != NULL && (strlen(pArgs->user) <= 0 || strlen(pArgs->user) > TSDB_USER_LEN)) {
1,043!
378
    printf("Invalid user:%s\r\n", pArgs->user);
×
379
    return -1;
×
380
  }
381

382
  if (pArgs->auth != NULL && (strlen(pArgs->auth) <= 0 || strlen(pArgs->auth) > TSDB_PASSWORD_LEN)) {
1,043!
383
    printf("Invalid auth:%s\r\n", pArgs->auth);
×
384
    return -1;
×
385
  }
386

387
  if (pArgs->database != NULL && (strlen(pArgs->database) <= 0 || strlen(pArgs->database) > TSDB_DB_NAME_LEN)) {
1,043!
388
    printf("Invalid database:%s\r\n", pArgs->database);
×
389
    return -1;
×
390
  }
391

392
  if (pArgs->file[0] != 0) {
1,043✔
393
    char fullname[PATH_MAX] = {0};
808✔
394
    if (taosExpandDir(pArgs->file, fullname, PATH_MAX) == 0) {
808!
395
      tstrncpy(pArgs->file, fullname, PATH_MAX);
808✔
396
    }
397
  }
398

399
  if (pArgs->cfgdir != NULL) {
1,043✔
400
    if (strlen(pArgs->cfgdir) <= 0 || strlen(pArgs->cfgdir) >= PATH_MAX) {
112!
401
      printf("Invalid cfgdir:%s\r\n", pArgs->cfgdir);
×
402
      return -1;
×
403
    } else {
404
      if (taosExpandDir(pArgs->cfgdir, configDir, PATH_MAX) != 0) {
112!
405
        tstrncpy(configDir, pArgs->cfgdir, PATH_MAX);
×
406
      }
407
    }
408
  }
409

410
  if (pArgs->commands != NULL && (strlen(pArgs->commands) <= 0)) {
1,043!
411
    printf("Invalid commands:%s\r\n", pArgs->commands);
×
412
    return -1;
×
413
  }
414

415
  if (pArgs->netrole != NULL && !(strcmp(pArgs->netrole, "client") == 0 || strcmp(pArgs->netrole, "server") == 0)) {
1,043!
416
    printf("Invalid netrole:%s\r\n", pArgs->netrole);
×
417
    return -1;
×
418
  }
419

420
  if (/*pArgs->password != NULL && */ (strlen(pArgs->password) <= 0)) {
1,043!
421
    printf("Invalid password\r\n");
×
422
    return -1;
×
423
  }
424

425
  if (pArgs->port < 0 || pArgs->port > 65535) {
1,043!
426
    printf("Invalid port\r\n");
2✔
427
    return -1;
2✔
428
  }
429

430
  if (pArgs->pktLen < SHELL_MIN_PKG_LEN || pArgs->pktLen > SHELL_MAX_PKG_LEN) {
1,041!
431
    printf("Invalid pktLen:%d, range:[%d, %d]\r\n", pArgs->pktLen, SHELL_MIN_PKG_LEN, SHELL_MAX_PKG_LEN);
×
432
    return -1;
×
433
  }
434

435
  if (pArgs->pktNum < SHELL_MIN_PKG_NUM || pArgs->pktNum > SHELL_MAX_PKG_NUM) {
1,041!
436
    printf("Invalid pktNum:%d, range:[%d, %d]\r\n", pArgs->pktNum, SHELL_MIN_PKG_NUM, SHELL_MAX_PKG_NUM);
×
437
    return -1;
×
438
  }
439

440
  if (pArgs->displayWidth <= 0 || pArgs->displayWidth > 10 * 1024) {
1,041!
441
    printf("Invalid displayWidth:%d, range:[1, 10 * 1024]\r\n", pArgs->displayWidth);
×
442
    return -1;
×
443
  }
444

445
  return 0;
1,041✔
446
}
447

448
int32_t shellParseArgs(int32_t argc, char *argv[]) {
1,057✔
449
  shellInitArgs(argc, argv);
1,057✔
450
  shell.info.clientVersion =
1,057✔
451
      "Welcome to the %s Command Line Interface, Client Version:%s\r\n"
452
      "Copyright (c) 2023 by %s, all rights reserved.\r\n\r\n";
453
#ifdef CUS_NAME
454
  strcpy(shell.info.cusName, CUS_NAME);
455
#else
456
  strcpy(shell.info.cusName, "TDengine");
1,057✔
457
#endif
458
  char promptContinueFormat[32] = {0};
1,057✔
459
#ifdef CUS_PROMPT
460
  sprintf(shell.info.promptHeader, "%s> ", CUS_PROMPT);
1,057✔
461
  sprintf(promptContinueFormat, "%%%zus> ", strlen(CUS_PROMPT));
1,057✔
462
#else
463
  sprintf(shell.info.promptHeader, "taos> ");
464
  sprintf(promptContinueFormat, "%%%zus> ", strlen("taos"));
465
#endif
466
  sprintf(shell.info.promptContinue, promptContinueFormat, " ");
1,057✔
467
  shell.info.promptSize = strlen(shell.info.promptHeader);
1,057✔
468
#ifdef TD_ENTERPRISE
469
  snprintf(shell.info.programVersion, sizeof(shell.info.programVersion),
1,057✔
470
           "%s\n%s version: %s compatible_version: %s\ngit: %s\ngitOfInternal: %s\nbuild: %s", TD_PRODUCT_NAME,
471
           CUS_PROMPT, td_version, td_compatible_version, td_gitinfo, td_gitinfoOfInternal, td_buildinfo);
472
#else
473
  snprintf(shell.info.programVersion, sizeof(shell.info.programVersion),
474
           "%s\n%s version: %s compatible_version: %s\ngit: %s\nbuild: %s", TD_PRODUCT_NAME, CUS_PROMPT, td_version,
475
           td_compatible_version, td_gitinfo, td_buildinfo);
476
#endif
477

478
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
479
  shell.info.osname = "Windows";
480
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "C:/TDengine/%s", SHELL_HISTORY_FILE);
481
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
482
#elif defined(_TD_DARWIN_64)
483
  shell.info.osname = "Darwin";
484
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "%s/%s", getpwuid(getuid())->pw_dir, SHELL_HISTORY_FILE);
485
  if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
486
#else
487
  shell.info.osname = "Linux";
1,057✔
488
  snprintf(shell.history.file, TSDB_FILENAME_LEN, "%s/%s", getenv("HOME"), SHELL_HISTORY_FILE);
1,057✔
489
  shellParseArgsUseArgp(argc, argv);
1,057✔
490
  // if (shellParseArgsWithoutArgp(argc, argv) != 0) return -1;
491
  if (shell.args.abort) {
1,043!
492
    return -1;
×
493
  }
494
#endif
495

496
  return shellCheckArgs();
1,043✔
497
}
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

© 2025 Coveralls, Inc