📄 ntpipe.c
字号:
for (i = 0; i < nvec; i++) {
apr_size_t rd = vec[i].iov_len;
if ((rv = ntp_socket_send((apr_socket_t *)con,
vec[i].iov_base, &rd)) != APR_SUCCESS) {
*len = written;
return rv;
}
written += rd;
}
*len = written;
return APR_SUCCESS;
}
static apr_status_t ntp_socket_cleanup(void *data)
{
tcn_socket_t *s = (tcn_socket_t *)data;
if (s->net->cleanup) {
(*s->net->cleanup)(s->opaque);
s->net->cleanup = NULL;
}
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&ntp_cleared);
#endif
return APR_SUCCESS;
}
static tcn_nlayer_t ntp_socket_layer = {
TCN_SOCKET_NTPIPE,
ntp_cleanup,
ntp_socket_close,
ntp_socket_shutdown,
ntp_socket_opt_get,
ntp_socket_opt_set,
ntp_socket_timeout_get,
ntp_socket_timeout_set,
ntp_socket_send,
ntp_socket_sendv,
ntp_socket_recv
};
static BOOL create_DACL(LPSECURITY_ATTRIBUTES psa)
{
return ConvertStringSecurityDescriptorToSecurityDescriptor(
NTSD_STRING,
SDDL_REVISION_1,
&(psa->lpSecurityDescriptor),
NULL);
}
TCN_IMPLEMENT_CALL(jlong, Local, create)(TCN_STDARGS, jstring name,
jlong pool)
{
apr_pool_t *p = J2P(pool, apr_pool_t *);
tcn_socket_t *s = NULL;
tcn_ntp_conn_t *con = NULL;
TCN_ALLOC_CSTRING(name);
UNREFERENCED(o);
TCN_ASSERT(pool != 0);
#ifdef TCN_DO_STATISTICS
ntp_created++;
#endif
con = (tcn_ntp_conn_t *)apr_pcalloc(p, sizeof(tcn_ntp_conn_t));
con->pool = p;
con->mode = TCN_NTP_UNKNOWN;
con->nmax = PIPE_UNLIMITED_INSTANCES;
con->timeout = DEFTIMEOUT;
con->sndbuf = DEFSIZE;
con->rcvbuf = DEFSIZE;
if (J2S(name)) {
strncpy(con->name, J2S(name), MAX_PATH);
con->name[MAX_PATH] = '\0';
TCN_FREE_CSTRING(name);
}
else
strcpy(con->name, DEFNAME);
con->sa.nLength = sizeof(con->sa);
con->sa.bInheritHandle = TRUE;
if (!create_DACL(&con->sa)) {
tcn_ThrowAPRException(e, apr_get_os_error());
return 0;
}
s = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
s->pool = p;
s->net = &ntp_socket_layer;
s->opaque = con;
apr_pool_cleanup_register(p, (const void *)s,
ntp_socket_cleanup,
apr_pool_cleanup_null);
fflush(stderr);
return P2J(s);
}
TCN_IMPLEMENT_CALL(jint, Local, bind)(TCN_STDARGS, jlong sock,
jlong sa)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
UNREFERENCED_STDARGS;
UNREFERENCED(sa);
TCN_ASSERT(sock != 0);
if (s->net->type == TCN_SOCKET_NTPIPE) {
tcn_ntp_conn_t *c = (tcn_ntp_conn_t *)s->opaque;
c->mode = TCN_NTP_SERVER;
return APR_SUCCESS;
}
else
return APR_EINVAL;
}
TCN_IMPLEMENT_CALL(jint, Local, listen)(TCN_STDARGS, jlong sock,
jint backlog)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
if (s->net->type == TCN_SOCKET_NTPIPE) {
tcn_ntp_conn_t *c = (tcn_ntp_conn_t *)s->opaque;
c->mode = TCN_NTP_SERVER;
if (backlog > 0)
c->nmax = backlog;
else
c->nmax = PIPE_UNLIMITED_INSTANCES;
return APR_SUCCESS;
}
else
return APR_EINVAL;
}
TCN_IMPLEMENT_CALL(jlong, Local, accept)(TCN_STDARGS, jlong sock)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_pool_t *p = NULL;
tcn_socket_t *a = NULL;
tcn_ntp_conn_t *con = NULL;
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_THROW_IF_ERR(apr_pool_create(&p, s->pool), p);
if (s->net->type == TCN_SOCKET_NTPIPE) {
tcn_ntp_conn_t *c = (tcn_ntp_conn_t *)s->opaque;
con = (tcn_ntp_conn_t *)apr_pcalloc(p, sizeof(tcn_ntp_conn_t));
con->pool = p;
con->mode = TCN_NTP_SERVER;
con->nmax = c->nmax;
con->timeout = c->timeout;
strcpy(con->name, c->name);
con->h_pipe = CreateNamedPipe(con->name,
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
con->nmax,
con->sndbuf,
con->rcvbuf,
con->timeout,
&c->sa);
if (con->h_pipe == INVALID_HANDLE_VALUE) {
tcn_ThrowAPRException(e, apr_get_os_error());
goto cleanup;
}
/* Block until a client connects */
if (!ConnectNamedPipe(con->h_pipe, NULL)) {
DWORD err = GetLastError();
if (err != ERROR_PIPE_CONNECTED) {
CloseHandle(con->h_pipe);
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(err));
goto cleanup;
}
}
/* Create overlapped events */
con->rd_event = CreateEvent(NULL, TRUE, FALSE, NULL);
con->rd_o.hEvent = con->rd_event;
con->wr_event = CreateEvent(NULL, TRUE, FALSE, NULL);
con->wr_o.hEvent = con->wr_event;
}
else {
tcn_ThrowAPRException(e, APR_ENOTIMPL);
goto cleanup;
}
if (con) {
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&ntp_accepted);
#endif
a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
a->pool = p;
a->net = &ntp_socket_layer;
a->opaque = con;
apr_pool_cleanup_register(p, (const void *)a,
ntp_socket_cleanup,
apr_pool_cleanup_null);
}
return P2J(a);
cleanup:
if (p)
apr_pool_destroy(p);
return 0;
}
TCN_IMPLEMENT_CALL(jint, Local, connect)(TCN_STDARGS, jlong sock,
jlong sa)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_pool_t *p = NULL;
tcn_socket_t *a = NULL;
tcn_ntp_conn_t *con = NULL;
UNREFERENCED(o);
UNREFERENCED(sa);
TCN_ASSERT(sock != 0);
if (s->net->type != TCN_SOCKET_NTPIPE)
return APR_ENOTSOCK;
con = (tcn_ntp_conn_t *)s->opaque;
if (con->mode == TCN_NTP_SERVER)
return APR_EINVAL;
con->mode = TCN_NTP_CLIENT;
while (TRUE) {
con->h_pipe = CreateFile(con->name,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (con->h_pipe != INVALID_HANDLE_VALUE)
break;
if (GetLastError() == ERROR_PIPE_BUSY) {
/* All pipe instances are busy, so wait for
* timeout value specified by the server process in
* the CreateNamedPipe function.
*/
if (!WaitNamedPipe(con->name, NMPWAIT_USE_DEFAULT_WAIT))
return apr_get_os_error();
}
else
return apr_get_os_error();
}
/* Create overlapped events */
con->rd_event = CreateEvent(NULL, TRUE, FALSE, NULL);
con->rd_o.hEvent = con->rd_event;
con->wr_event = CreateEvent(NULL, TRUE, FALSE, NULL);
con->wr_o.hEvent = con->wr_event;
return APR_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -