blob: 7fa684e09e513a2e9d8cf124f42c69619eaa3adb [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __YARN_CONTAINER_EXECUTOR_CONFIG_H__
#define __YARN_CONTAINER_EXECUTOR_CONFIG_H__
#ifdef __FreeBSD__
#define _WITH_GETLINE
#endif
#include "config.h"
#define CONF_FILENAME "container-executor.cfg"
// When building as part of a Maven build this value gets defined by using
// container-executor.conf.dir property. See:
// hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
// for details.
// NOTE: if this ends up being a relative path it gets resolved relative to
// the location of the container-executor binary itself, not getwd(3)
#ifndef HADOOP_CONF_DIR
#error HADOOP_CONF_DIR must be defined
#endif
#include <stddef.h>
// Configuration data structures.
struct kv_pair {
const char *key;
const char *value;
};
struct section {
int size;
char *name;
struct kv_pair **kv_pairs;
};
struct configuration {
int size;
struct section **sections;
};
/**
* Function to ensure that the configuration file and all of the containing
* directories are only writable by root. Otherwise, an attacker can change
* the configuration and potentially cause damage.
*
* @param file_name name of the config file
*
* @returns 0 if permissions are correct, non-zero on error
*/
int check_configuration_permissions(const char *file_name);
/**
* Return a string with the configuration file path name resolved via
* realpath(3). Relative path names are resolved relative to the second
* argument and not getwd(3). It's up to the caller to free the returned
* value.
*
* @param file_name name of the config file
* @param root the path against which relative path names are to be resolved
*
* @returns the resolved configuration file path
*/
char* resolve_config_path(const char *file_name, const char *root);
/**
* Read the given configuration file into the specified configuration struct.
* It's the responsibility of the caller to call free_configurations to free
* the allocated memory. The function will check to ensure that the
* configuration file has the appropriate owner and permissions.
*
* @param file_path name of the configuration file to be read
* @param cfg the configuration structure to be filled.
*
* @return 0 on success, non-zero if there was an error
*/
int read_config(const char *file_path, struct configuration *cfg);
/**
* Get the value for a key in the specified section. It's up to the caller to
* free the memory used for storing the return value.
*
* @param key key the name of the key
* @param section the section to be looked up
*
* @return pointer to the value if the key was found, null otherwise
*/
char* get_section_value(const char *key, const struct section *section);
/**
* Function to get the values for a given key in the specified section.
* The value is split by ",". It's up to the caller to free the memory used
* for storing the return values.
*
* @param key the key to be looked up
* @param section the section to be looked up
*
* @return array of values, null if the key was not found
*/
char** get_section_values(const char *key, const struct section *section);
/**
* Function to get the values for a given key in the specified section.
* The value is split by the specified delimiter. It's up to the caller to
* free the memory used for storing the return values.
*
* @param key the key to be looked up
* @param section the section to be looked up
* @param delimiter the delimiter to be used to split the value
*
* @return array of values, null if the key was not found
*/
char** get_section_values_delimiter(const char *key, const struct section *section,
const char *delim);
/**
* Get the value for a key in the specified section in the specified
* configuration. It's up to the caller to free the memory used for storing
* the return value.
*
* @param key key the name of the key
* @param section the name section to be looked up
* @param cfg the configuration to be used
*
* @return pointer to the value if the key was found, null otherwise
*/
char* get_configuration_value(const char *key, const char* section,
const struct configuration *cfg);
/**
* Function to get the values for a given key in the specified section in the
* specified configuration. The value is split by ",". It's up to the caller to
* free the memory used for storing the return values.
*
* @param key the key to be looked up
* @param section the name of the section to be looked up
* @param cfg the configuration to be looked up
*
* @return array of values, null if the key was not found
*/
char** get_configuration_values(const char *key, const char* section,
const struct configuration *cfg);
/**
* Function to get the values for a given key in the specified section in the
* specified configuration. The value is split by the specified delimiter.
* It's up to the caller to free the memory used for storing the return values.
*
* @param key the key to be looked up
* @param section the name of the section to be looked up
* @param cfg the section to be looked up
* @param delimiter the delimiter to be used to split the value
*
* @return array of values, null if the key was not found
*/
char** get_configuration_values_delimiter(const char *key, const char* section,
const struct configuration *cfg, const char *delimiter);
/**
* Function to retrieve the specified section from the configuration.
*
* @param section the name of the section to retrieve
* @param cfg the configuration structure to use
*
* @return pointer to section struct containing details of the section
* null on error
*/
struct section* get_configuration_section(const char *section,
const struct configuration *cfg);
/**
* Method to free an allocated config struct.
*
* @param cfg pointer to the structure to free
*/
void free_configuration(struct configuration *cfg);
/**
* If str is a string of the form key=val, find 'key'
*
* @param input The input string
* @param out Where to put the output string.
* @param out_len The length of the output buffer.
*
* @return -ENAMETOOLONG if out_len is not long enough;
* -EINVAL if there is no equals sign in the input;
* 0 on success
*/
int get_kv_key(const char *input, char *out, size_t out_len);
/**
* If str is a string of the form key=val, find 'val'
*
* @param input The input string
* @param out Where to put the output string.
* @param out_len The length of the output buffer.
*
* @return -ENAMETOOLONG if out_len is not long enough;
* -EINVAL if there is no equals sign in the input;
* 0 on success
*/
int get_kv_value(const char *input, char *out, size_t out_len);
char *get_config_path(const char* argv0);
#endif