|
|
c0069e |
#ifndef TOKSVC_DRIVER_IMPL_H
|
|
|
c0069e |
#define TOKSVC_DRIVER_IMPL_H
|
|
|
c0069e |
|
|
|
c0069e |
#include <psxtypes/psxtypes.h>
|
|
|
c0069e |
#include <ntapi/ntapi.h>
|
|
|
c0069e |
|
|
|
c0069e |
#include <stdint.h>
|
|
|
c0069e |
#include <stdio.h>
|
|
|
c0069e |
|
|
|
c0069e |
#include <toksvc/toksvc.h>
|
|
|
c0069e |
#include "argv/argv.h"
|
|
|
c0069e |
|
|
|
c0069e |
#define TOKS_OPTV_ELEMENTS 64
|
|
|
d73408 |
#define TOKS_MAX_WAITERS 4000
|
|
|
c0069e |
|
|
|
c0069e |
extern const struct argv_option toks_default_options[];
|
|
|
c0069e |
extern const ntapi_vtbl * toks_ntapi;
|
|
|
c0069e |
|
|
|
79252f |
size_t toks_strlen(const char * ch);
|
|
|
79252f |
char * toks_strcpy(char * dst, const char * src);
|
|
|
79252f |
|
|
|
79252f |
void * toks_calloc(size_t n, size_t size);
|
|
|
79252f |
void toks_free(void *);
|
|
|
79252f |
|
|
|
c0069e |
#define ntapi toks_ntapi
|
|
|
c0069e |
|
|
|
c0069e |
enum app_tags {
|
|
|
c0069e |
TAG_HELP,
|
|
|
c0069e |
TAG_VERSION,
|
|
|
c0069e |
TAG_DAEMON,
|
|
|
c0069e |
TAG_SYSROOT,
|
|
|
618937 |
TAG_UUID,
|
|
|
236509 |
TAG_ROOTUUID,
|
|
|
486fcd |
TAG_CONNECT,
|
|
|
c847e3 |
TAG_TOKENS,
|
|
|
520f51 |
TAG_ABORT,
|
|
|
02451d |
TAG_ACQUIRE,
|
|
|
867b30 |
TAG_RELEASE,
|
|
|
b27e56 |
TAG_TIMEOUT,
|
|
|
79252f |
TAG_REFSTR,
|
|
|
e3e583 |
TAG_PID,
|
|
|
201fd7 |
TAG_SYSPID,
|
|
|
35e873 |
TAG_CTRLPID,
|
|
|
35e873 |
TAG_CSYSPID,
|
|
|
ed52e5 |
TAG_LOGFILE,
|
|
|
ee5c9c |
TAG_LOGLEVEL,
|
|
|
bd4f0c |
TAG_NTOKENSGET,
|
|
|
0f44d8 |
TAG_NTOKENSSET,
|
|
|
7f4116 |
TAG_LOGLEVELGET,
|
|
|
7f4116 |
TAG_LOGLEVELSET,
|
|
|
0b7161 |
TAG_GETSVCINFO,
|
|
|
0b7161 |
TAG_LOGSVCINFO,
|
|
|
eb3ecd |
TAG_GETTOKINFO,
|
|
|
5e0b43 |
TAG_LOGTOKINFO,
|
|
|
c0069e |
};
|
|
|
c0069e |
|
|
|
2f270e |
struct toks_ticks {
|
|
|
2f270e |
nt_filetime pcfreq;
|
|
|
2f270e |
int32_t (*qpc)(nt_filetime *);
|
|
|
2f270e |
};
|
|
|
2f270e |
|
|
|
c0069e |
struct toks_driver_ctx_impl {
|
|
|
c0069e |
nt_rtdata * rtdata;
|
|
|
c0069e |
struct toks_common_ctx cctx;
|
|
|
c0069e |
struct toks_driver_ctx ctx;
|
|
|
2f270e |
struct toks_ticks ticks;
|
|
|
c847e3 |
struct toks_token * tokens;
|
|
|
d73408 |
struct toks_waiter * waiters;
|
|
|
02451d |
struct _nt_port_keys keys;
|
|
|
b27e56 |
int64_t timeout;
|
|
|
79252f |
char * refstr;
|
|
|
2f270e |
void * hevent;
|
|
|
00069c |
void * hsvcdir;
|
|
|
500bc3 |
void * hpiddir;
|
|
|
00069c |
void * hsvclink;
|
|
|
486fcd |
void * hservice;
|
|
|
83e502 |
void * hserver;
|
|
|
ed52e5 |
void * hlog;
|
|
|
3fc30f |
void * htmpfs;
|
|
|
d73408 |
int nwaiters;
|
|
|
c847e3 |
int ntokens;
|
|
|
8f6a66 |
int atokens;
|
|
|
e3e583 |
int tokpid;
|
|
|
201fd7 |
int tsyspid;
|
|
|
35e873 |
int ctrlpid;
|
|
|
35e873 |
int csyspid;
|
|
|
0021e3 |
struct toks_uuid uuid;
|
|
|
0021e3 |
struct _nt_guid guid;
|
|
|
c0069e |
};
|
|
|
c0069e |
|
|
|
0021e3 |
static inline void toks_uuid_to_guid(const struct toks_uuid * uuid, struct _nt_guid * guid)
|
|
|
0021e3 |
{
|
|
|
0021e3 |
guid->data1 = uuid->data1;
|
|
|
0021e3 |
guid->data2 = uuid->data2;
|
|
|
0021e3 |
guid->data3 = uuid->data3;
|
|
|
0021e3 |
|
|
|
0021e3 |
guid->data4[0] = uuid->data4[0];
|
|
|
0021e3 |
guid->data4[1] = uuid->data4[1];
|
|
|
0021e3 |
guid->data4[2] = uuid->data4[2];
|
|
|
0021e3 |
guid->data4[3] = uuid->data4[3];
|
|
|
0021e3 |
guid->data4[4] = uuid->data4[4];
|
|
|
0021e3 |
guid->data4[5] = uuid->data4[5];
|
|
|
0021e3 |
guid->data4[6] = uuid->data4[6];
|
|
|
0021e3 |
guid->data4[7] = uuid->data4[7];
|
|
|
0021e3 |
}
|
|
|
0021e3 |
|
|
|
0021e3 |
static inline void toks_guid_to_uuid(const struct _nt_guid * guid, struct toks_uuid * uuid)
|
|
|
0021e3 |
{
|
|
|
0021e3 |
uuid->data1 = guid->data1;
|
|
|
0021e3 |
uuid->data2 = guid->data2;
|
|
|
0021e3 |
uuid->data3 = guid->data3;
|
|
|
0021e3 |
|
|
|
0021e3 |
uuid->data4[0] = guid->data4[0];
|
|
|
0021e3 |
uuid->data4[1] = guid->data4[1];
|
|
|
0021e3 |
uuid->data4[2] = guid->data4[2];
|
|
|
0021e3 |
uuid->data4[3] = guid->data4[3];
|
|
|
0021e3 |
uuid->data4[4] = guid->data4[4];
|
|
|
0021e3 |
uuid->data4[5] = guid->data4[5];
|
|
|
0021e3 |
uuid->data4[6] = guid->data4[6];
|
|
|
0021e3 |
uuid->data4[7] = guid->data4[7];
|
|
|
0021e3 |
}
|
|
|
0021e3 |
|
|
|
c0069e |
static inline struct toks_driver_ctx_impl * toks_get_driver_ictx(const struct toks_driver_ctx * dctx)
|
|
|
c0069e |
{
|
|
|
c0069e |
uintptr_t addr;
|
|
|
c0069e |
|
|
|
c0069e |
if (dctx) {
|
|
|
c0069e |
addr = (uintptr_t)dctx - offsetof(struct toks_driver_ctx_impl,ctx);
|
|
|
c0069e |
return (struct toks_driver_ctx_impl *)addr;
|
|
|
c0069e |
}
|
|
|
c0069e |
|
|
|
c0069e |
return 0;
|
|
|
c0069e |
}
|
|
|
c0069e |
|
|
|
618937 |
static inline nt_rtdata * toks_get_driver_rtdata(const struct toks_driver_ctx * dctx)
|
|
|
618937 |
{
|
|
|
618937 |
struct toks_driver_ctx_impl * ictx;
|
|
|
618937 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
618937 |
return ictx->rtdata;
|
|
|
618937 |
}
|
|
|
618937 |
|
|
|
b27e56 |
static inline int64_t toks_get_driver_timeout(const struct toks_driver_ctx * dctx)
|
|
|
b27e56 |
{
|
|
|
b27e56 |
struct toks_driver_ctx_impl * ictx;
|
|
|
b27e56 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
b27e56 |
return ictx->timeout;
|
|
|
b27e56 |
}
|
|
|
b27e56 |
|
|
|
b27e56 |
static inline void toks_set_driver_timeout(const struct toks_driver_ctx * dctx, int64_t timeout)
|
|
|
b27e56 |
{
|
|
|
b27e56 |
struct toks_driver_ctx_impl * ictx;
|
|
|
b27e56 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
b27e56 |
ictx->timeout = timeout;
|
|
|
b27e56 |
}
|
|
|
b27e56 |
|
|
|
2f270e |
static inline void * toks_get_driver_hevent(const struct toks_driver_ctx * dctx)
|
|
|
2f270e |
{
|
|
|
2f270e |
struct toks_driver_ctx_impl * ictx;
|
|
|
2f270e |
ictx = toks_get_driver_ictx(dctx);
|
|
|
2f270e |
return ictx->hevent;
|
|
|
2f270e |
}
|
|
|
2f270e |
|
|
|
00069c |
static inline void * toks_get_driver_hsvcdir(const struct toks_driver_ctx * dctx)
|
|
|
00069c |
{
|
|
|
00069c |
struct toks_driver_ctx_impl * ictx;
|
|
|
00069c |
ictx = toks_get_driver_ictx(dctx);
|
|
|
00069c |
return ictx->hsvcdir;
|
|
|
00069c |
}
|
|
|
00069c |
|
|
|
00069c |
static inline void toks_set_driver_hsvcdir(const struct toks_driver_ctx * dctx, void * hsvcdir)
|
|
|
00069c |
{
|
|
|
00069c |
struct toks_driver_ctx_impl * ictx;
|
|
|
00069c |
ictx = toks_get_driver_ictx(dctx);
|
|
|
00069c |
ictx->hsvcdir = hsvcdir;
|
|
|
00069c |
}
|
|
|
00069c |
|
|
|
500bc3 |
static inline void * toks_get_driver_hpiddir(const struct toks_driver_ctx * dctx)
|
|
|
500bc3 |
{
|
|
|
500bc3 |
struct toks_driver_ctx_impl * ictx;
|
|
|
500bc3 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
500bc3 |
return ictx->hpiddir;
|
|
|
500bc3 |
}
|
|
|
500bc3 |
|
|
|
500bc3 |
static inline void toks_set_driver_hpiddir(const struct toks_driver_ctx * dctx, void * hpiddir)
|
|
|
500bc3 |
{
|
|
|
500bc3 |
struct toks_driver_ctx_impl * ictx;
|
|
|
500bc3 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
500bc3 |
ictx->hpiddir = hpiddir;
|
|
|
500bc3 |
}
|
|
|
500bc3 |
|
|
|
00069c |
static inline void * toks_get_driver_hsvclink(const struct toks_driver_ctx * dctx)
|
|
|
00069c |
{
|
|
|
00069c |
struct toks_driver_ctx_impl * ictx;
|
|
|
00069c |
ictx = toks_get_driver_ictx(dctx);
|
|
|
00069c |
return ictx->hsvclink;
|
|
|
00069c |
}
|
|
|
00069c |
|
|
|
00069c |
static inline void toks_set_driver_hsvclink(const struct toks_driver_ctx * dctx, void * hsvclink)
|
|
|
00069c |
{
|
|
|
00069c |
struct toks_driver_ctx_impl * ictx;
|
|
|
00069c |
ictx = toks_get_driver_ictx(dctx);
|
|
|
00069c |
ictx->hsvclink = hsvclink;
|
|
|
00069c |
}
|
|
|
00069c |
|
|
|
486fcd |
static inline void * toks_get_driver_hservice(const struct toks_driver_ctx * dctx)
|
|
|
486fcd |
{
|
|
|
486fcd |
struct toks_driver_ctx_impl * ictx;
|
|
|
486fcd |
ictx = toks_get_driver_ictx(dctx);
|
|
|
486fcd |
return ictx->hservice;
|
|
|
486fcd |
}
|
|
|
486fcd |
|
|
|
486fcd |
static inline void toks_set_driver_hservice(const struct toks_driver_ctx * dctx, void * hservice)
|
|
|
486fcd |
{
|
|
|
486fcd |
struct toks_driver_ctx_impl * ictx;
|
|
|
486fcd |
ictx = toks_get_driver_ictx(dctx);
|
|
|
486fcd |
ictx->hservice = hservice;
|
|
|
486fcd |
}
|
|
|
486fcd |
|
|
|
83e502 |
static inline void * toks_get_driver_hserver(const struct toks_driver_ctx * dctx)
|
|
|
83e502 |
{
|
|
|
83e502 |
struct toks_driver_ctx_impl * ictx;
|
|
|
83e502 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
83e502 |
return ictx->hserver;
|
|
|
83e502 |
}
|
|
|
83e502 |
|
|
|
83e502 |
static inline void toks_set_driver_hserver(const struct toks_driver_ctx * dctx, void * hserver)
|
|
|
83e502 |
{
|
|
|
83e502 |
struct toks_driver_ctx_impl * ictx;
|
|
|
83e502 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
83e502 |
ictx->hserver = hserver;
|
|
|
83e502 |
}
|
|
|
83e502 |
|
|
|
02451d |
static inline struct _nt_port_keys * toks_get_driver_keys(const struct toks_driver_ctx * dctx)
|
|
|
02451d |
{
|
|
|
02451d |
struct toks_driver_ctx_impl * ictx;
|
|
|
02451d |
ictx = toks_get_driver_ictx(dctx);
|
|
|
02451d |
return &ictx->keys;
|
|
|
02451d |
}
|
|
|
02451d |
|
|
|
0021e3 |
static inline const struct toks_uuid * toks_get_driver_uuid(const struct toks_driver_ctx * dctx)
|
|
|
618937 |
{
|
|
|
618937 |
struct toks_driver_ctx_impl * ictx;
|
|
|
618937 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
618937 |
return &ictx->uuid;
|
|
|
618937 |
}
|
|
|
618937 |
|
|
|
0021e3 |
static inline const struct _nt_guid * toks_get_driver_guid(const struct toks_driver_ctx * dctx)
|
|
|
0021e3 |
{
|
|
|
0021e3 |
struct toks_driver_ctx_impl * ictx;
|
|
|
0021e3 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
0021e3 |
return &ictx->guid;
|
|
|
0021e3 |
}
|
|
|
0021e3 |
|
|
|
d73408 |
static inline int toks_get_driver_nwaiters(const struct toks_driver_ctx * dctx)
|
|
|
d73408 |
{
|
|
|
d73408 |
struct toks_driver_ctx_impl * ictx;
|
|
|
d73408 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
d73408 |
return ictx->nwaiters;
|
|
|
d73408 |
}
|
|
|
d73408 |
|
|
|
d73408 |
static inline void toks_set_driver_nwaiters(const struct toks_driver_ctx * dctx, int nwaiters)
|
|
|
d73408 |
{
|
|
|
d73408 |
struct toks_driver_ctx_impl * ictx;
|
|
|
d73408 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
d73408 |
ictx->nwaiters = nwaiters;
|
|
|
d73408 |
}
|
|
|
d73408 |
|
|
|
c847e3 |
static inline struct toks_token * toks_get_driver_tokens(const struct toks_driver_ctx * dctx)
|
|
|
c847e3 |
{
|
|
|
c847e3 |
struct toks_driver_ctx_impl * ictx;
|
|
|
c847e3 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
c847e3 |
return ictx->tokens;
|
|
|
c847e3 |
}
|
|
|
c847e3 |
|
|
|
c847e3 |
static inline int toks_get_driver_ntokens(const struct toks_driver_ctx * dctx)
|
|
|
c847e3 |
{
|
|
|
c847e3 |
struct toks_driver_ctx_impl * ictx;
|
|
|
c847e3 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
c847e3 |
return ictx->ntokens;
|
|
|
c847e3 |
}
|
|
|
c847e3 |
|
|
|
8f6a66 |
static inline void toks_set_driver_ntokens(const struct toks_driver_ctx * dctx, int ntokens)
|
|
|
8f6a66 |
{
|
|
|
8f6a66 |
struct toks_driver_ctx_impl * ictx;
|
|
|
8f6a66 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
8f6a66 |
ictx->ntokens = ntokens;
|
|
|
8f6a66 |
}
|
|
|
8f6a66 |
|
|
|
8f6a66 |
static inline int toks_get_driver_atokens(const struct toks_driver_ctx * dctx)
|
|
|
8f6a66 |
{
|
|
|
8f6a66 |
struct toks_driver_ctx_impl * ictx;
|
|
|
8f6a66 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
8f6a66 |
return ictx->atokens;
|
|
|
8f6a66 |
}
|
|
|
8f6a66 |
|
|
|
a644fe |
static inline void toks_set_driver_log_level(const struct toks_driver_ctx * dctx, int loglevel)
|
|
|
a644fe |
{
|
|
|
a644fe |
struct toks_driver_ctx_impl * ictx;
|
|
|
a644fe |
ictx = toks_get_driver_ictx(dctx);
|
|
|
a644fe |
ictx->cctx.loglevel = loglevel;
|
|
|
a644fe |
}
|
|
|
a644fe |
|
|
|
e3e583 |
static inline int toks_get_driver_tokpid(const struct toks_driver_ctx * dctx)
|
|
|
e3e583 |
{
|
|
|
e3e583 |
struct toks_driver_ctx_impl * ictx;
|
|
|
e3e583 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
e3e583 |
return ictx->tokpid;
|
|
|
e3e583 |
}
|
|
|
e3e583 |
|
|
|
201fd7 |
static inline int toks_get_driver_tsyspid(const struct toks_driver_ctx * dctx)
|
|
|
201fd7 |
{
|
|
|
201fd7 |
struct toks_driver_ctx_impl * ictx;
|
|
|
201fd7 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
201fd7 |
return ictx->tsyspid;
|
|
|
201fd7 |
}
|
|
|
201fd7 |
|
|
|
35e873 |
static inline int toks_get_driver_ctrlpid(const struct toks_driver_ctx * dctx)
|
|
|
35e873 |
{
|
|
|
35e873 |
struct toks_driver_ctx_impl * ictx;
|
|
|
35e873 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
35e873 |
return ictx->ctrlpid;
|
|
|
35e873 |
}
|
|
|
35e873 |
|
|
|
35e873 |
static inline int toks_get_driver_csyspid(const struct toks_driver_ctx * dctx)
|
|
|
35e873 |
{
|
|
|
35e873 |
struct toks_driver_ctx_impl * ictx;
|
|
|
35e873 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
35e873 |
return ictx->csyspid;
|
|
|
35e873 |
}
|
|
|
35e873 |
|
|
|
7c2549 |
static inline void * toks_get_driver_tmpfs(const struct toks_driver_ctx * dctx)
|
|
|
7c2549 |
{
|
|
|
7c2549 |
struct toks_driver_ctx_impl * ictx;
|
|
|
7c2549 |
ictx = toks_get_driver_ictx(dctx);
|
|
|
7c2549 |
return ictx->htmpfs;
|
|
|
7c2549 |
}
|
|
|
7c2549 |
|
|
|
79252f |
static inline char * toks_get_driver_refstr(const struct toks_driver_ctx * dctx)
|
|
|
79252f |
{
|
|
|
79252f |
struct toks_driver_ctx_impl * ictx;
|
|
|
79252f |
ictx = toks_get_driver_ictx(dctx);
|
|
|
79252f |
return ictx->refstr;
|
|
|
79252f |
}
|
|
|
79252f |
|
|
|
79252f |
static inline void toks_set_driver_refstr(const struct toks_driver_ctx * dctx, const char * refstr)
|
|
|
79252f |
{
|
|
|
79252f |
struct toks_driver_ctx_impl * ictx;
|
|
|
79252f |
ictx = toks_get_driver_ictx(dctx);
|
|
|
79252f |
|
|
|
79252f |
if (ictx->refstr) {
|
|
|
79252f |
toks_free(ictx->refstr);
|
|
|
79252f |
ictx->refstr = 0;
|
|
|
412c74 |
ictx->cctx.refstr = 0;
|
|
|
79252f |
}
|
|
|
79252f |
|
|
|
412c74 |
if (refstr && (ictx->refstr = toks_calloc(1,toks_strlen(refstr)+1))) {
|
|
|
79252f |
toks_strcpy(ictx->refstr,refstr);
|
|
|
412c74 |
ictx->cctx.refstr = ictx->refstr;
|
|
|
412c74 |
}
|
|
|
79252f |
}
|
|
|
79252f |
|
|
|
2f270e |
static inline void toks_query_performance_counters(const struct toks_driver_ctx * dctx, nt_filetime * ticks)
|
|
|
2f270e |
{
|
|
|
2f270e |
struct toks_driver_ctx_impl * ictx;
|
|
|
2f270e |
ictx = toks_get_driver_ictx(dctx);
|
|
|
2f270e |
|
|
|
2f270e |
if (!(ictx->ticks.qpc(ticks)))
|
|
|
2f270e |
ticks->quad = 0;
|
|
|
2f270e |
}
|
|
|
2f270e |
|
|
|
2eea44 |
int32_t toks_open_log_file(void ** hfile, void * hat, const char * arg, bool fprivate);
|
|
|
2a7aec |
int32_t toks_open_file(void ** hfile, void * hat, const char * arg, bool fprivate);
|
|
|
2a7aec |
int32_t toks_open_dir(void ** hfile, void * hat, const char * arg, bool fprivate);
|
|
|
2a7aec |
|
|
|
c0069e |
#endif
|