#include <sys/errno.h>
#include <sys/types.h>
#include <sys/param.h>
#include <machine/spl.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/filedesc.h>
#include <sys/fcntl.h>
#include <sys/mbuf.h>
#include <sys/malloc.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <net/if_var.h>
#include <netat/sysglue.h>
#include <netat/appletalk.h>
#include <netat/at_var.h>
#include <netat/at_pcb.h>
#include <netat/debug.h>
int (*sys_ATsocket)() = 0;
int (*sys_ATgetmsg)() = 0;
int (*sys_ATputmsg)() = 0;
int (*sys_ATPsndreq)() = 0;
int (*sys_ATPsndrsp)() = 0;
int (*sys_ATPgetreq)() = 0;
int (*sys_ATPgetrsp)() = 0;
extern at_state_t at_state;
extern at_ifaddr_t *ifID_home;
int ATsocket(proc, uap, retval)
void *proc;
struct {
int proto;
} *uap;
int *retval;
{
int err;
if (sys_ATsocket) {
if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
*retval = -1;
err = ENOTREADY;
} else {
*retval = (*sys_ATsocket)(uap->proto, &err, proc);
}
} else {
*retval = -1;
err = ENXIO;
}
return err;
}
int ATgetmsg(proc, uap, retval)
void *proc;
struct {
int fd;
void *ctlptr;
void *datptr;
int *flags;
} *uap;
int *retval;
{
int err;
if (sys_ATgetmsg) {
if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
*retval = -1;
err = ENOTREADY;
} else {
*retval =
(*sys_ATgetmsg)(uap->fd, uap->ctlptr, uap->datptr,
uap->flags, &err, proc);
}
} else {
*retval = -1;
err = ENXIO;
}
return err;
}
int ATputmsg(proc, uap, retval)
void *proc;
struct {
int fd;
void *ctlptr;
void *datptr;
int flags;
} *uap;
int *retval;
{
int err;
if (sys_ATputmsg) {
if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
*retval = -1;
err = ENOTREADY;
} else {
*retval =
(*sys_ATputmsg)(uap->fd, uap->ctlptr, uap->datptr,
uap->flags, &err, proc);
}
} else {
*retval = -1;
err = ENXIO;
}
return err;
}
int ATPsndreq(proc, uap, retval)
void *proc;
struct {
int fd;
unsigned char *buf;
int len;
int nowait;
} *uap;
int *retval;
{
int err;
if (sys_ATPsndreq) {
if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
*retval = -1;
err = ENOTREADY;
} else {
*retval =
(*sys_ATPsndreq)(uap->fd, uap->buf, uap->len,
uap->nowait, &err, proc);
}
} else {
*retval = -1;
err= ENXIO;
}
return err;
}
int ATPsndrsp(proc, uap, retval)
void *proc;
struct {
int fd;
unsigned char *respbuff;
int resplen;
int datalen;
} *uap;
int *retval;
{
int err;
if (sys_ATPsndrsp) {
if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
*retval = -1;
err = ENOTREADY;
} else {
*retval =
(*sys_ATPsndrsp)(uap->fd, uap->respbuff,
uap->resplen, uap->datalen, &err, proc);
}
} else {
*retval = -1;
err = ENXIO;
}
return err;
}
int ATPgetreq(proc, uap, retval)
void *proc;
struct {
int fd;
unsigned char *buf;
int buflen;
} *uap;
int *retval;
{
int err;
if (sys_ATPgetreq) {
if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
*retval = -1;
err = ENOTREADY;
} else {
*retval =
(*sys_ATPgetreq)(uap->fd, uap->buf, uap->buflen,
&err, proc);
}
} else {
*retval = -1;
err = ENXIO;
}
return err;
}
int ATPgetrsp(proc, uap, retval)
void *proc;
struct {
int fd;
unsigned char *bdsp;
} *uap;
int *retval;
{
int err = 0;
if (sys_ATPgetrsp) {
if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
*retval = -1;
err = ENOTREADY;
} else {
*retval =
(*sys_ATPgetrsp)(uap->fd, uap->bdsp, &err, proc);
}
} else {
*retval = -1;
err = ENXIO;
}
return err;
}
int atalk_closeref(fp, grefp)
struct file *fp;
gref_t **grefp;
{
if ((*grefp = (gref_t *)fp->f_data)) {
fp->f_data = 0;
return(0);
}
return(EBADF);
}
int atalk_openref(gref, retfd, proc)
gref_t *gref;
int *retfd;
struct proc *proc;
{
extern int _ATread(), _ATwrite(),_ATioctl(), _ATselect(), _ATclose();
static struct fileops fileops =
{_ATread, _ATwrite, _ATioctl, _ATselect, _ATclose};
int err, fd;
struct file *fp;
thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
if ((err = falloc(proc, &fp, &fd)) != 0) {
thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
return err;
}
fp->f_flag = FREAD|FWRITE;
fp->f_type = DTYPE_ATALK+1;
fp->f_ops = &fileops;
*fdflags(proc, fd) &= ~UF_RESERVED;
*retfd = fd;
fp->f_data = (void *)gref;
thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
return 0;
}
int atalk_getref(fp, fd, grefp, proc)
struct file *fp;
int fd;
gref_t **grefp;
struct proc *proc;
{
thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
if (fp == 0) {
int error = fdgetf(proc, fd, &fp);
if (error) {
*grefp = (gref_t *) 0;
thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
return EBADF;
}
}
if ((*grefp = (gref_t *)fp->f_data) == 0) {
thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
return EBADF;
}
if ((*grefp)->errno) {
thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
return (int)(*grefp)->errno;
}
thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
return 0;
}