env_to_vec(args);
DEFINE_CONF_VARS(usage);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
EntityName ename(*g_conf.name);
const char *me = argv[0];
}
}
- common_init(nargs, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(nargs, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
if (do_help) {
usage();
argv_to_vec(argc, argv, args);
env_to_vec(args);
- g_conf.daemonize = true;
- g_conf.pid_file = 0;
- g_conf.log_per_instance = true;
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON,
+ CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS);
keyring_init(&g_conf);
vector<const char*> nargs;
}
// we need to handle the forking ourselves.
- bool daemonize = g_conf.daemonize;
- g_conf.daemonize = false;
-
int fd[2] = {0, 0}; // parent's, child's
pid_t childpid = 0;
- if (daemonize) {
+ if (g_conf.daemonize) {
int r = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
if (r < 0) {
cerr << "cfuse[" << getpid() << "]: unable to create socketpair: " << strerror(errno) << std::endl;
cout << "cfuse[" << getpid() << "]: starting ceph client" << std::endl;
- messenger->start();
+ messenger->start(false); // Do not daemonize here
// start client
client->init();
// wait for messenger to finish
messenger->wait();
- if (daemonize) {
+ if (g_conf.daemonize) {
//cout << "child signalling parent with " << r << std::endl;
int32_t out = r;
int ret = safe_write(fd[1], &out, sizeof(out));
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_MDS, CODE_ENVIRONMENT_DAEMON);
+ common_init(args, CEPH_ENTITY_TYPE_MDS, CODE_ENVIRONMENT_DAEMON, 0);
keyring_init(&g_conf);
// mds specific args
messenger->set_policy(entity_name_t::TYPE_CLIENT,
SimpleMessenger::Policy::stateful_server(supported, 0));
- messenger->start();
+ messenger->start(g_conf.daemonize);
// start mds
MDS *mds = new MDS(g_conf.name->get_id().c_str(), messenger, &mc);
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_MON, CODE_ENVIRONMENT_DAEMON);
+ common_init(args, CEPH_ENTITY_TYPE_MON, CODE_ENVIRONMENT_DAEMON, 0);
keyring_init(&g_conf);
FOR_EACH_ARG(args) {
messenger->set_default_send_priority(CEPH_MSG_PRIO_HIGH);
Monitor *mon = new Monitor(g_conf.name->get_id(), &store, messenger, &monmap);
- messenger->start(); // may daemonize
+ messenger->start(g_conf.daemonize);
uint64_t supported =
CEPH_FEATURE_UID |
}
md_config_t *common_preinit(const CephInitParameters &iparams,
- enum code_environment_t code_env)
+ enum code_environment_t code_env, int flags)
{
// set code environment
g_code_env = code_env;
switch (code_env) {
case CODE_ENVIRONMENT_DAEMON:
conf->daemonize = true;
- conf->log_dir = strdup("/var/log/ceph");
- conf->pid_file = strdup("/var/run/ceph/$type.$id.pid");
+ if (!(flags & CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS)) {
+ conf->log_dir = strdup("/var/log/ceph");
+ conf->pid_file = strdup("/var/run/ceph/$type.$id.pid");
+ }
conf->log_to_stderr = LOG_TO_STDERR_SOME;
break;
default:
}
void common_init(std::vector < const char* >& args,
- uint32_t module_type, code_environment_t code_env)
+ uint32_t module_type, code_environment_t code_env, int flags)
{
CephInitParameters iparams =
ceph_argparse_early_args(args, module_type);
- md_config_t *conf = common_preinit(iparams, code_env);
+ md_config_t *conf = common_preinit(iparams, code_env, flags);
int ret = conf->parse_config_files(iparams.get_conf_files());
if (ret == -EDOM) {
class md_config_t;
class CephInitParameters;
+enum common_init_flags_t {
+ // Set up defaults that make sense for an unprivileged deamon
+ CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS = 0x1,
+};
+
int keyring_init(md_config_t *conf);
md_config_t *common_preinit(const CephInitParameters &iparams,
- enum code_environment_t code_env);
+ enum code_environment_t code_env, int flags);
void common_init(std::vector < const char* >& args,
- uint32_t module_type, code_environment_t code_env);
+ uint32_t module_type, code_environment_t code_env, int flags);
#endif
env_to_vec(args);
vector<const char *>::iterator args_iter;
- common_init(args, CEPH_ENTITY_TYPE_OSD, CODE_ENVIRONMENT_DAEMON);
+ common_init(args, CEPH_ENTITY_TYPE_OSD, CODE_ENVIRONMENT_DAEMON, 0);
ceph_heap_profiler_init();
return 1;
}
- client_messenger->start();
- messenger_hb->start(true); // only need to daemon() once
- cluster_messenger->start(true);
+ client_messenger->start(g_conf.daemonize);
+ messenger_hb->start(false); // do not daemonize (only need to daemonize once)
+ cluster_messenger->start(false); // do not daemonize (only need to daemonize once)
// start osd
err = osd->init();
vector<const char*> args;
argv_to_vec(argc, argv, args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
keyring_init(&g_conf);
parse_syn_options(args); // for SyntheticClient
SyntheticClient *syn = new SyntheticClient(client);
clients.push_back(client);
synclients.push_back(syn);
- messengers[i]->start();
+ messengers[i]->start(false); // do not daemonize
}
for (list<SyntheticClient*>::iterator p = synclients.begin();
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
vec_to_argv(args, argc, argv);
// start up network
SimpleMessenger *messenger = new SimpleMessenger();
messenger->bind();
- g_conf.daemonize = false; // not us!
- messenger->start();
+ messenger->start(false); // do not daemonize
messenger->register_entity(entity_name_t::CLIENT());
messenger->add_dispatcher_head(&dispatcher);
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
// args
if (args.size() != 4)
argv_to_vec(argc, argv, args);
// The libceph API needs to be fixed so that we don't have to call
// common_init here. Libraries should never call common_init.
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_LIBRARY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_LIBRARY, 0);
keyring_init(&g_conf);
//monmap
//at last the client
client = new Client(messenger, monclient);
- messenger->start();
+ messenger->start(false); // do not daemonize
client->init();
}
++i;
}
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
FOR_EACH_ARG(args) {
usage_exit();
messenger->add_dispatcher_head(this);
- messenger->start(1);
+ messenger->start(false); // do not daemonize
messenger->add_dispatcher_head(this);
dout(1) << "setting wanted keys" << dendl;
// TODO: store this conf pointer in the RadosClient and use it as our
// configuration
- md_config_t *conf = common_preinit(iparams, CODE_ENVIRONMENT_LIBRARY);
+ md_config_t *conf = common_preinit(iparams, CODE_ENVIRONMENT_LIBRARY, 0);
conf->parse_env(); // environment variables override
++rados_initialized;
messenger->register_entity(entity_name_t::CLIENT());
messenger->add_dispatcher_head(this);
- messenger->start(true);
+ messenger->start(false); // do not daemonize
monc->set_want_keys(CEPH_ENTITY_TYPE_MON|CEPH_ENTITY_TYPE_OSD|CEPH_ENTITY_TYPE_MDS);
monc->set_messenger(messenger);
messenger = smessenger = new SimpleMessenger();
smessenger->register_entity(entity_name_t::CLIENT(-1));
messenger->add_dispatcher_head(this);
- smessenger->start(true); // do not daemonize!
+ smessenger->start(false); // do not daemonize!
temp_msgr = true;
}
return 0;
}
-int SimpleMessenger::start(bool nodaemon)
+int SimpleMessenger::start(bool daemonize)
{
// register at least one entity, first!
assert(my_type >= 0);
lock.Unlock();
// daemonize?
- if (g_conf.daemonize && !nodaemon) {
+ if (daemonize) {
int num_threads = Thread::get_num_threads();
if (num_threads > 1) {
derr << "messenger.start BUG: there are " << num_threads - 1
int bind(entity_addr_t& bind_addr, int64_t force_nonce = -1);
int bind(int64_t force_nonce = -1) { return bind(g_conf.public_addr, force_nonce); }
- int start(bool nodaemon = false);
+ int start(bool daemonize);
void wait();
int write_pid_file(int pid);
env_to_vec(args);
DEFINE_CONF_VARS(usage);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
const char *me = argv[0];
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
keyring_init(&g_conf);
vector<const char*> nargs;
env_to_vec(args);
int opt_cmd = OPT_NO_CMD;
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
keyring_init(&g_conf);
const char *poolname = NULL;
argv_to_vec(argc, (const char **)argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
keyring_init(&g_conf);
const char *user_id = 0;
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
keyring_init(&g_conf);
// args
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
DoutStreambuf<char> *dos = new DoutStreambuf<char>();
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
DEFINE_CONF_VARS(usage);
FOR_EACH_ARG(args) {
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
int ret;
Mutex safe_timer_lock("safe_timer_lock");
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
// args
if (args.size() < 2) return -1;
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
vec_to_argv(args, argc, argv);
messenger->set_default_send_priority(CEPH_MSG_PRIO_HIGH);
messenger->add_dispatcher_head(&dispatcher);
- rank->start();
+ rank->start(false); // do not daemonize
int isend = 0;
if (whoami == 0)
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
keyring_init(&g_conf);
vec_to_argv(args, argc, argv);
// start up network
messenger = new SimpleMessenger();
messenger->register_entity(entity_name_t::CLIENT());
- messenger->start();
+ messenger->start(false); // do not daemonize
messenger->add_dispatcher_head(&dispatcher);
g.lock.Lock();
argv_to_vec(argc, argv, args);
env_to_vec(args);
- common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY);
+ common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
keyring_init(&g_conf);
vec_to_argv(args, argc, argv);