fis-gtm/sr_unix/gtmsecshr.h

141 lines
4.5 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#ifndef _GTMSECSHR
#define _GTMSECSHR
/* To enable debugging of gtmsecshr, uncomment #define immediately below */
/* #define DEBUG_GTMSECSHR */
#ifdef DEBUG_GTMSECSHR
# define LOGFLAGS (LOG_USER | LOG_INFO)
# define DBGGSSHR(x) syslog x
#else
# define DBGGSSHR(x)
#endif
#define ABSOLUTE_PATH(X) ('/' == X[0])
#define GTMSECSHR_MESG_TIMEOUT 30
#define GTMSECSHR_PERMS 0666
/* Exit codes from gtmsecshr - note matching text entries are in message table in secshr_client.c */
#define NORMALEXIT 0
#define SETUIDROOT 1
#define INVTRANSGTMSECSHR 2
#define UNABLETOEXECGTMSECSHR 3
#define GNDCHLDFORKFLD 4
#define SEMGETERROR 5
#define SEMAPHORETAKEN 6
#define SYSLOGHASERRORDETAIL 7
#define UNABLETOCHDIR 8
#define UNABLETODETERMINEPATH 9
#define NOTGTMSECSHR 10
#define BADGTMDISTDIR 11
#define LASTEXITCODE 11 /* Should have same value as last error code */
/* return codes with gtmsecshr*/
#define INVLOGNAME 20
#define BINDERR 21
#define SOCKETERR 22
#define UNLINKERR 23
#define FTOKERR 24
/* special flag from gtmsecshr_sock_init for client if could not get normal socket name */
#define ONETIMESOCKET -1
/* arguments for gtmsecshr_sock_init */
#define SERVER 0
#define CLIENT 1
#define GTMSECSHR_SOCK_DIR GTM_TMP_ENV
#define DEFAULT_GTMSECSHR_SOCK_DIR DEFAULT_GTM_TMP
#define GTMSECSHR_SOCK_PREFIX "gtm_secshr"
#define GTMSECSHR_DIR_SUFFIX "/gtmsecshrdir"
#define GTMSECSHR_EXECUTABLE "gtmsecshr"
#define GTMSECSHR_PATH GTM_DIST_LOG "/" GTMSECSHR_EXECUTABLE
#define ROOTUID 0
#ifdef SHORT_GTMSECSHR_TIMEOUT
# define MAX_TIMEOUT_VALUE 30
#else
# ifdef DEBUG
# define MAX_TIMEOUT_VALUE 60 /* Give secshr timeout/startup some excercise in DEBUG mode */
# else
# define MAX_TIMEOUT_VALUE 6000
# endif
#endif
#define MAX_ID_LEN 8
#define MAX_MESG 2048
#define MAX_SECSHR_SOCKFILE_NAME_LEN (SIZEOF(GTMSECSHR_SOCK_PREFIX) + MAX_DIGITS_IN_INT)
typedef struct ipcs_mesg_struct
{
int semid;
int shmid;
time_t gt_sem_ctime;
time_t gt_shm_ctime;
unsigned int fn_len;
char fn[GTM_PATH_MAX];
} ipcs_mesg;
typedef struct gtmsecshr_mesg_struct
{
int code; /* To gtmsecshr: requested gtmsecshr_mesg_type function code.
* From gtmsecshr: return code (0 or errno).
*/
unsigned int comkey; /* Unique key per version keeps from having cross-version issues */
boolean_t usesecshr; /* Copy of client's gtm_usesecshr flag. Only used in debug build but always kept
* for alignment.
*/
pid_t pid; /* Process id of sender */
unsigned long seqno; /* Used only by client to validate response is for message sent */
union
{
int4 id; /* Can be pid, semid or shmid */
char path[GTM_PATH_MAX];
ipcs_mesg db_ipcs;
} mesg;
} gtmsecshr_mesg;
/* include <stddef.h> for offsetof() */
#define GTM_MESG_HDR_SIZE offsetof(gtmsecshr_mesg, mesg.id)
/* Version V6.0-000 largely re-built the interface between gtmsecshr client and server. Later versions should strive to
* not change the order or placement of the message codes below. If a message becomes obsolete, rename the code to be
* prefixed with "UNUSED_". This is so for future versions, if a security bug is found, we can take the source, compile
* it for the relevant version and refresh just this module (assuming the client doesn't have issues).
*/
enum gtmsecshr_mesg_type
{
/* Starting here, these are request codes put in mesg.code. They are returned unchanged except in case of error */
WAKE_MESSAGE = 1,
REMOVE_SEM,
REMOVE_SHM,
REMOVE_FILE,
CONTINUE_PROCESS,
FLUSH_DB_IPCS_INFO,
/* From here down are response codes. These codes are never processed but all except INVALID_COMMAND (for which there is
* no response) can be returned to client.
*/
INVALID_COMMAND = 0x8000, /* No response given */
INVALID_COMKEY
};
int validate_receiver(gtmsecshr_mesg *buf, char *rundir, int rundir_len, int save_code);
void service_request(gtmsecshr_mesg *buf, int msglen, char *rundir, int rundir_len);
int4 gtmsecshr_sock_init(int caller);
void gtmsecshr_sock_cleanup(int);
int4 gtmsecshr_pathname_init(int caller, char *execpath, int execpathln);
int continue_proc(pid_t pid);
#endif