watchman/Options.h (48 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <stdio.h>
#include <string>
namespace watchman {
struct Flags {
int show_help = 0;
#ifndef _WIN32
int inetd_style = 0;
#endif
int no_site_spawner = 0;
int show_version = 0;
std::string named_pipe_path;
std::string unix_sock_name;
std::string pid_file;
int persistent = 0;
int dont_save_state = 0;
std::string watchman_state_file;
int json_input_arg = 0;
std::string output_encoding;
std::string server_encoding;
int foreground = 0;
int no_pretty = 0;
int no_spawn = 0;
int no_local = 0;
std::string test_state_dir;
};
extern Flags flags;
enum ArgType {
OPT_NONE,
REQ_STRING,
REQ_INT,
};
struct OptDesc {
/* name of long option: --optname */
const char* optname;
/* if non-zero, short option character */
int shortopt;
/* help text shown in the usage information */
const char* helptext;
/* whether we accept an argument */
ArgType argtype;
/* if an argument was provided, *val will be set to
* point to the option value.
* Because we only update the option if one was provided
* by the user, you can safely pre-initialize the val
* pointer to your choice of default.
* */
void* val;
/* if argtype != OPT_NONE, this is the label used to
* refer to the argument in the help text. If left
* blank, we'll use the string "ARG" as a generic
* alternative */
const char* arglabel;
// Whether this option should be passed to the child
// when spawning the daemon
int is_daemon;
#define IS_DAEMON 1
#define NOT_DAEMON 0
};
/**
* Populates the globals in `flags`.
*/
void parseOptions(int* argcp, char*** argvp, char*** daemon_argv);
// The following are largely for internal use.
bool w_getopt(OptDesc* opts, int* argcp, char*** argvp, char*** daemon_argv);
[[noreturn]] void usage(struct watchman_getopt* opts, FILE* where);
void print_command_list_for_help(FILE* where);
} // namespace watchman