#include <sys/list.h>
#include <assert.h>
#include <alloca.h>
#include <door.h>
#include <errno.h>
#include <syslog.h>
#include <unistd.h>
#include <stdio.h>
#include <synch.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <strings.h>
#include <umem.h>
#include <smbsrv/smb_door.h>
#include <smbsrv/smb_xdr.h>
#include <smbsrv/smb_token.h>
#include <smbsrv/libmlsvc.h>
#include <smbsrv/libsmbns.h>
#include "smbd.h"
int
fksmbd_door_dispatch(smb_doorarg_t *da)
{
smbd_arg_t dop_arg;
smb_doorhdr_t *hdr;
char *rbuf = NULL;
char *argp = da->da_arg.data_ptr;
size_t arg_size = da->da_arg.data_size;
size_t hdr_size, rsize;
bzero(&dop_arg, sizeof (smbd_arg_t));
hdr = &dop_arg.hdr;
hdr_size = xdr_sizeof(smb_doorhdr_xdr, hdr);
if ((argp == NULL) || (arg_size < hdr_size)) {
syslog(LOG_DEBUG, "fksmbd_door_dispatch: bad args");
return (-1);
}
if (smb_doorhdr_decode(hdr, (uint8_t *)argp, hdr_size) == -1) {
syslog(LOG_DEBUG, "smbd_door_dispatch: header decode failed");
return (-1);
}
if ((hdr->dh_magic != SMB_DOOR_HDR_MAGIC) ||
(hdr->dh_flags != SMB_DF_FAKE_KERNEL)) {
syslog(LOG_DEBUG, "fksmbd_door_dispatch: invalid header");
return (-1);
}
dop_arg.opname = smb_doorhdr_opname(hdr->dh_op);
dop_arg.data = argp + hdr_size;
dop_arg.datalen = hdr->dh_datalen;
if (hdr->dh_op == SMB_DR_ASYNC_RESPONSE) {
syslog(LOG_DEBUG, "fksmbd_door_dispatch: ASYNC?");
return (-1);
}
(void) smbd_door_dispatch_op(&dop_arg);
rsize = dop_arg.rsize + hdr_size;
rbuf = umem_alloc(rsize, UMEM_DEFAULT);
if (rbuf == NULL) {
syslog(LOG_DEBUG, "fksmbd_door_dispatch[%s]: alloc %m",
dop_arg.opname);
return (-1);
}
if (dop_arg.rbuf != NULL) {
(void) memcpy(rbuf + hdr_size, dop_arg.rbuf, dop_arg.rsize);
free(dop_arg.rbuf);
}
hdr->dh_datalen = dop_arg.rsize;
(void) smb_doorhdr_encode(hdr, (uint8_t *)rbuf, hdr_size);
da->da_hdr = *hdr;
da->da_arg.rbuf = rbuf;
da->da_arg.rsize = rsize;
return (0);
}