/**
* Copyright © 2016 Mattias Andrée <maandree@member.fsf.org>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <time.h>
/**
* Settings from the command line.
*/
struct settings {
/**
* Print current status and exit?
*/
int print_status : 1;
/**
* Start without transition?
*/
int panic_start : 1;
/**
* Never transition, apart from at start?
*/
int panic_else : 1;
/**
* Set temperature, possibly with transition, and exit?
*/
int set_and_exit : 1;
/**
* Ignore calibrations?
*/
int ignore_calib : 1;
/**
* Apply negative image filter?
*/
int negative : 1;
/**
* Broadcast event with bus?
*/
int use_bus : 1;
/**
* -1 to decrease temperature,
* +1 to increase temperature,
* 0 to set temperature.
*/
int temp_direction;
/**
* The temperature, if use, the program will exit when it is done.
*/
long int temp;
/**
* The temperature at full daytime.
*/
long int day_temp;
/**
* The temperature at full night.
*/
long int night_temp;
/**
* The temperature when disabled.
*/
long int natural_temp;
/**
* Pathname to the hook script.
* Do not free this.
*/
char *hookpath;
/**
* The number of seconds the transition takes.
*/
struct timespec transition;
/**
* The number of kelvins per seconds the
* temperature is adjusted during transition.
*/
long int trans_speed;
/**
* The user's latitudinal position.
*/
double latitude;
/**
* The user's longitudinal position.
*/
double longitude;
/**
* The number of elements in `monitors_id` and in `monitors_arg`.
*/
size_t monitors_n;
/**
* Values for -d, -e, and -m, in order.
* Do not free its elements.
*/
char **monitors_id;
/**
* The option (the character after the dash)
* the option used in correspnding element
* in `monitors_id`.
*/
char *monitors_arg;
};
/**
* Parse the command line.
*
* @param argc The number of elements in `argv`.
* @param argv The commnad line arguments including the zeroth elemenet.
* @param settings Output parameter for the settings.
*/
void parse_command_line(int argc, char *argv[], struct settings *settings);
/**
* Marshal settings into a buffer.
*
* @param param The buffer, `NULL` if you want to know the required size.
* @param settings The settings to marshal.
* @return The size of the output.
*/
size_t marshal_settings(char *buffer, const struct settings *settings);
/**
* Unmarshal settings from a buffer.
*
* @param buffer The buffer.
* @param settings Output parameter for the settings, will be allocated.
* @return The number of unmarshalled bytes, 0 on error.
*/
size_t unmarshal_settings(char *buffer, struct settings **settings);