/* Copyright (c) 2010-2012 Red Hat, Inc. This file is part of GlusterFS. This file is licensed to you under your choice of the GNU Lesser General Public License, version 3 or any later version (LGPLv3 or later), or the GNU General Public License, version 2 (GPLv2), in all cases as published by the Free Software Foundation. */ #include #include #include #include #include #ifndef _CONFIG_H #define _CONFIG_H #include "config.h" #endif #include "cli.h" #include "cli-mem-types.h" #define CMDBUFSIZ 1024 void * cli_batch (void *d) { struct cli_state *state = NULL; int ret = 0; state = d; ret = cli_cmd_process (state, state->argc, state->argv); gf_log ("", GF_LOG_INFO, "Exiting with: %d", ret); exit (-ret); return NULL; } void * cli_input (void *d) { struct cli_state *state = NULL; int ret = 0; char cmdbuf[CMDBUFSIZ]; char *cmd = NULL; size_t len = 0; state = d; for (;;) { printf ("%s", state->prompt); cmd = fgets (cmdbuf, CMDBUFSIZ, stdin); if (!cmd) break; len = strlen(cmd); if (len > 0 && cmd[len - 1] == '\n') //strip trailing \n cmd[len - 1] = '\0'; ret = cli_cmd_process_line (state, cmd); if (ret != 0 && state->mode & GLUSTER_MODE_ERR_FATAL) break; } exit (-ret); return NULL; } int cli_input_init (struct cli_state *state) { int ret = 0; if (state->argc) { ret = pthread_create (&state->input, NULL, cli_batch, state); return ret; } if (isatty (STDIN_FILENO)) { state->prompt = "gluster> "; cli_rl_enable (state); } else { state->prompt = ""; state->mode = GLUSTER_MODE_SCRIPT | GLUSTER_MODE_ERR_FATAL; } if (!state->rl_enabled) ret = pthread_create (&state->input, NULL, cli_input, state); return ret; } og message and jumps to a label called \texttt{err} after setting op\_ret and op\_errno appropriately. It is recommended to use this template. \vspace{2ex} \textsl{Good}: \begin{verbatim} VALIDATE(frame); VALIDATE(this); VALIDATE(inode); \end{verbatim} \section*{$\bullet$ Never rely on precedence of operators} Never write code that relies on the precedence of operators to execute correctly. Such code can be hard to read and someone else might not know the precedence of operators as accurately as you do. \vspace{2ex} \textsl{Bad}: \begin{verbatim} if (op_ret == -1 && errno != ENOENT) \end{verbatim} \textsl{Good}: \begin{verbatim} if ((op_ret == -1) && (errno != ENOENT)) \end{verbatim} \section*{$\bullet$ Use exactly matching types} Use a variable of the exact type declared in the manual to hold the return value of a function. Do not use an ``equivalent'' type. \vspace{2ex} \textsl{Bad}: \begin{verbatim} int len = strlen (path); \end{verbatim} \textsl{Good}: \begin{verbatim} size_t len = strlen (path); \end{verbatim} \section*{$\bullet$ Never write code such as \texttt{foo->bar->baz}; check every pointer} Do not write code that blindly follows a chain of pointer references. Any pointer in the chain may be \texttt{NULL} and thus cause a crash. Verify that each pointer is non-null before following it. \se