// // aegis - project change supervisor // Copyright (C) 2004-2006, 2008, 2014 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or (at // your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #ifndef AE_CVS_SERVER_SERVER_H #define AE_CVS_SERVER_SERVER_H #include #include class response; // forward #define ROOT_PATH "/aegis" /** * The server_ty class is used to represent a CVS server connection * and authentication mode. */ struct server_ty { // private: const struct server_method_ty *vptr; struct net_ty *np; }; /** * The server_ty::run method is used to run the server. First * authentication will be performed, and then requests will be served. */ void server_run(server_ty *); /** * The destructor (actually, the delete operator) releases resources * used by the server. Use this when you are done with it. */ void server_delete(server_ty *); /** * The server_response_queue function is used to enqueue a response to * be transmaitted at the next server_response_flush(). */ void server_response_queue(server_ty *, response *); /** * The server_response_flush function is used to flush any pending * responses (if any) to the client. */ void server_response_flush(server_ty *); /** * The server_getline function is used to read one line from the client * (up to the next newline character or end of input). The newline is * not included in the returned string. Returns NULL if end-of-file * is reached. */ bool server_getline(server_ty *sp, nstring &result); /** * The server_file_mode_get function is used to read a file mode line * from the client and parse it into a valid file mode. */ int server_file_mode_get(server_ty *); /** * The server_file_contents_get function returns a pointer to an * input source suitabl for reading the contents of a file from. * Use input_delete when you are done with it. */ input::pointer server_file_contents_get(server_ty *); /** * The server_error function is used to queue an ok response to * the client. */ void server_ok(server_ty *); /** * The server_error function is used to queue an error response to * the client. */ void server_error(server_ty *, const char *fmt, ...) ATTR_PRINTF(2, 3); /** * The server_e function is used to queue an error response to * the client (it's informative, rather than fatal). */ void server_e(server_ty *, const char *fmt, ...) ATTR_PRINTF(2, 3); /** * The server_m function is used to queue an error response to * the client (it's stdout, rather than stderr). */ void server_m(server_ty *, const char *fmt, ...) ATTR_PRINTF(2, 3); /** * The server_root_required function is used to test if the Root request * has already been sent. If it has not, an error response complaining * that the Root request has yet to be received. if true (non-zero) * is returned, the calling request should short circuit. */ int server_root_required(server_ty *, const char *caption); /** * The server_directory_required function is used to test if at least * one Directory request has already been sent. If it has not, an * error response complaining that the Directory request has yet to * be received. If true (non-zero) is returned, the calling request * should short circuit. */ int server_directory_required(server_ty *, const char *caption); /** * The server_execute function is used to run a command and send the * stdout and stderr to the client. If the exit status is not zero, * an error message will be sent to the client, too. * * @param sp * Server context (client in particular) to run the command. * @param cmd * This is the command to be executed. * @returns * This function returns true (non-zero) on success, and false * (zero) on failure. */ int server_execute(server_ty *sp, string_ty *cmd); /** * The server_argument function is used to append the given string to * the argument list. */ void server_argument(server_ty *sp, string_ty *arg); /** * The server_argument function is used to append the given string to * the last argument on the argument list. */ void server_argumentx(server_ty *sp, string_ty *arg); /** * The server_accumulator_reset function is used to discard the most * recently accumulated lists of directories, entries and arguments. */ void server_accumulator_reset(server_ty *sp); /** * The server_file_info_find function is used to obtain file info for * the given root-relative file name. * * @param sp * The server object to operate on. * @param server_side * The server-side name of the file, including the module name, * but excluding ROOT_PATH/ * @param auto_alloc * True if the name should be allocated if not foind, false if it * should not. * @returns * The corresponding file_unfo_ty data structure. Returns NULL if * auto_alloc was false, and the necessary data was not found. */ struct file_info_ty *server_file_info_find(server_ty *sp, string_ty *server_side, int auto_alloc); /** * The server_mkdir function may be used to ensure that the relevant * client side directory exists. The parent directories will also be * created, if necessary. * * \param sp * The server context to work within. * \param client_side * The directory path to be created on the client side. * \param server_side * The corresponding directory path on the server side. */ void server_mkdir(server_ty *sp, string_ty *client_side, string_ty *server_side); /** * The server_mkdir_above function may be used to ensure that the * parent directory of the given client side path exists. * The all necessary parent directories will also be created. * * \param sp * The server context to work within. * \param client_side * The directory path to be created on the client side. * \param server_side * The corresponding directory path on the server side. */ void server_mkdir_above(server_ty *sp, string_ty *client_side, string_ty *server_side); /** * The server_updating_verbose function is used to issue "Updating * ..." message to the client. * * \param sp * The server context for the message. * \param client_side * The name of the file being updated. The directory is * extracted, and if different to last time, it is printed. */ void server_updating_verbose(server_ty *sp, string_ty *client_side); /** * The server_directory_find_client_side function is used to turn a * server-side path into a client-side path. This is done by looking * for the longest matching server side path, and using its corresponding * client side path to build the new client side path for the given file. * * \param sp * The server context for the operation. * \param server_side * The name of the file being operated upon. */ string_ty *server_directory_calc_client_side(server_ty *sp, string_ty *server_side); #endif // AE_CVS_SERVER_SERVER_H // vim: set ts=8 sw=4 et :