8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-30 08:43:04 +01:00
firebird-mirror/src/jrd/svc.h

198 lines
5.7 KiB
C
Raw Normal View History

2001-05-23 15:26:42 +02:00
/*
* PROGRAM: JRD access method
* MODULE: svc.h
* DESCRIPTION: Service manager declarations
*
* The contents of this file are subject to the Interbase Public
* License Version 1.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.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#ifndef JRD_SVC_H
#define JRD_SVC_H
2001-12-24 03:51:06 +01:00
#include <stdio.h>
#include "../jrd/thd.h"
#include "../jrd/jrd_pwd.h"
2001-05-23 15:26:42 +02:00
#include "../jrd/isc.h"
#include "../jrd/svc_undoc.h"
#include "../jrd/svc_proto.h"
#include "../jrd/isc_s_proto.h"
2001-12-24 03:51:06 +01:00
#include "../jrd/jrd_blks.h"
#include "../include/fb_blk.h"
#include "../common/classes/array.h"
#include "../common/classes/SafeArg.h"
2001-12-24 03:51:06 +01:00
void SVC_STATUS_ARG(ISC_STATUS*& status, const MsgFormat::safe_cell& value);
void SVC_STATUS_ARG(ISC_STATUS*& status, const char* value);
2001-05-23 15:26:42 +02:00
namespace Jrd {
2001-05-23 15:26:42 +02:00
2004-05-06 02:18:09 +02:00
const ULONG SERVICE_VERSION = 2;
2001-05-23 15:26:42 +02:00
2004-05-06 02:18:09 +02:00
const int SVC_STDOUT_BUFFER_SIZE = 1024;
2001-05-23 15:26:42 +02:00
/* Flag of capabilities supported by the server */
//const ULONG WAL_SUPPORT = 0x1L; // Write Ahead Log
2004-05-06 02:18:09 +02:00
const ULONG MULTI_CLIENT_SUPPORT = 0x2L; /* SuperServer model (vs. multi-inet) */
const ULONG REMOTE_HOP_SUPPORT = 0x4L; /* Server can connect to other server */
//const ULONG NO_SVR_STATS_SUPPORT = 0x8L; // Does not support statistics
//const ULONG NO_DB_STATS_SUPPORT = 0x10L; // Does not support statistics
// Really the 16 bit LIBS here?
//const ULONG LOCAL_ENGINE_SUPPORT = 0x20L; // The local 16 bit engine
//const ULONG NO_FORCED_WRITE_SUPPORT = 0x40L; // Can not configure sync writes
//const ULONG NO_SHUTDOWN_SUPPORT = 0x80L; // Can not shutdown/restart databases
2004-05-06 02:18:09 +02:00
const ULONG NO_SERVER_SHUTDOWN_SUPPORT = 0x100L; /* Can not shutdown server */
const ULONG SERVER_CONFIG_SUPPORT = 0x200L; /* Can configure server */
const ULONG QUOTED_FILENAME_SUPPORT = 0x400L; /* Can pass quoted filenames in */
2001-05-23 15:26:42 +02:00
/* Range definitions for service actions. Any action outside of
this range is not supported */
2004-05-06 02:18:09 +02:00
const USHORT isc_action_min = 1;
const USHORT isc_action_max = 14;
2001-05-23 15:26:42 +02:00
/* Range definitions for service actions. Any action outside of
this range is not supported */
2004-05-06 02:18:09 +02:00
//define isc_info_min 50
//define isc_info_max 67
2001-05-23 15:26:42 +02:00
/* switches for username and password used when a username and/or password
* is specified by the client application
*/
#define USERNAME_SWITCH "-USER"
#define PASSWORD_SWITCH "-PASSWORD"
#ifdef SERVICE_THREAD
2001-05-23 15:26:42 +02:00
#define SERVICE_THD_PARAM "-svc_thd"
#else
#define SERVICE_THD_PARAM "-svc"
#endif
#ifdef TRUSTED_SERVICES
#define TRUSTED_USER_SWITCH "-TRUSTED_SVC"
2006-12-08 19:38:15 +01:00
#endif
2001-05-23 15:26:42 +02:00
/* Macro used to store services thread specific data */
/* Currently we store empty string, see bug #10394 */
// BRS 01/07/2004 commented
/*
#ifdef SUPERSERVER
#define SVC_PUTSPECIFIC_DATA {\
char t_data[] = {'\0'};\
thdd::putSpecificData((void*)t_data);\
}
#else
#define SVC_PUTSPECIFIC_DATA // nothing
#endif
*/
2002-10-26 14:34:46 +02:00
struct serv_entry; // forward decl.
2001-05-23 15:26:42 +02:00
/* Service manager block */
class Service : public pool_alloc<type_svc>
2001-05-24 16:54:26 +02:00
{
private:
ISC_STATUS_ARRAY svc_status_array;
Firebird::string svc_parsed_sw; // Here point elements of svc_argv
2001-12-24 03:51:06 +01:00
public:
Service(serv_entry *se, Firebird::MemoryPool& p);
~Service();
2001-05-24 16:54:26 +02:00
SLONG svc_handle; /* "handle" of process/thread running service */
ISC_STATUS* svc_status; /* status vector for svc_handle */
FILE* svc_input; /* input to service */
FILE* svc_output; /* output from service */
2001-05-24 16:54:26 +02:00
ULONG svc_stdout_head;
ULONG svc_stdout_tail;
UCHAR* svc_stdout;
Firebird::HalfStaticArray<const char*, 20> svc_argv;
2001-05-24 16:54:26 +02:00
ULONG svc_argc;
event_t svc_start_event[1]; /* fired once service has started successfully */
serv_entry* svc_service;
2001-05-24 16:54:26 +02:00
UCHAR* svc_resp_buf;
const UCHAR* svc_resp_ptr;
2001-05-24 16:54:26 +02:00
USHORT svc_resp_buf_len;
USHORT svc_resp_len;
USHORT svc_flags;
USHORT svc_user_flag;
USHORT svc_spb_version;
bool svc_do_shutdown;
Firebird::string svc_username;
Firebird::string svc_enc_password;
#ifdef TRUSTED_SERVICES
2006-12-08 19:38:15 +01:00
Firebird::string svc_trusted_login;
#endif
Firebird::string svc_switches; // Full set of switches
Firebird::string svc_perm_sw; // Switches, taken from services table
// and/or passed using spb_command_line
void svc_started();
void parseSwitches(); // Create svc_argv, svc_argc and svc_parsed_sw
2001-12-24 03:51:06 +01:00
};
2001-05-23 15:26:42 +02:00
/* Bitmask values for the svc_flags variable */
//const int SVC_eof = 1;
2004-05-03 23:43:56 +02:00
const int SVC_timeout = 2;
const int SVC_forked = 4;
const int SVC_detached = 8;
const int SVC_finished = 16;
const int SVC_thd_running = 32;
const int SVC_evnt_fired = 64;
const int SVC_cmd_line = 128;
2001-05-23 15:26:42 +02:00
// Method used to signify that the service started has done basic
// initialization and can be considered a successful startup.
#ifndef SERVICE_THREAD
2004-02-02 12:02:12 +01:00
inline void Service::svc_started()
2004-02-02 12:02:12 +01:00
{
// null definition, no overhead.
}
#else /* SERVICE_THREAD */
2004-02-02 12:02:12 +01:00
inline void Service::svc_started()
2004-02-02 12:02:12 +01:00
{
event_t* evnt_ptr = svc_start_event;
if (!(svc_flags & SVC_evnt_fired)) {
svc_flags |= SVC_evnt_fired;
2004-02-02 12:02:12 +01:00
ISC_event_post(evnt_ptr);
}
}
#endif /* SERVICE_THREAD */
2004-02-02 12:02:12 +01:00
typedef int (*pfn_svc_output)(Service*, const UCHAR*);
2004-02-02 12:02:12 +01:00
struct serv_entry
2004-02-02 12:02:12 +01:00
{
USHORT serv_action;
const TEXT* serv_name;
const TEXT* serv_std_switches;
const TEXT* serv_executable;
ThreadEntryPoint* serv_thd;
bool* serv_in_use;
};
} //namespace Jrd
#endif // JRD_SVC_H