2.11BSD/sys/sys/sys_kern.c
/*
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* sys_kern.c 1.2 (2.11BSD) 1997/1/30
*/
#include "param.h"
#include "../machine/seg.h"
#include "user.h"
#include "file.h"
#include "socketvar.h"
#include "inode.h"
#include "proc.h"
#include "namei.h"
#include "mbuf.h"
#include "map.h"
int knetisr;
netcrash()
{
panic("Network crashed");
}
/*
* These next entry points exist to allow the network kernel to
* access components of structures that exist in kernel data space.
*/
netpsignal(p, sig) /* XXX? sosend, sohasoutofband, sowakeup */
struct proc *p; /* if necessary, wrap psignal in save/restor */
int sig;
{
mapinfo map;
savemap(map);
psignal(p, sig);
restormap(map);
}
struct proc *
netpfind(pid)
int pid;
{
register struct proc *p;
mapinfo map;
savemap(map);
p = pfind(pid);
restormap(map);
return(p);
}
void
fpflags(fp, set, clear)
struct file *fp;
int set, clear;
{
fp->f_flag |= set;
fp->f_flag &= ~clear;
}
void
fadjust(fp, msg, cnt)
struct file *fp;
int msg, cnt;
{
fp->f_msgcount += msg;
fp->f_count += cnt;
}
fpfetch(fp, fpp)
struct file *fp, *fpp;
{
*fpp = *fp;
return(fp->f_count);
}
void
unpdet(ip)
struct inode *ip;
{
ip->i_socket = 0;
irele(ip);
}
unpbind(path, len, ipp, unpsock)
char *path;
int len;
struct inode **ipp;
struct socket *unpsock;
{
/*
* As far as I could find out, the 'path' is in the _u area because
* a fake mbuf was MBZAP'd in bind(). The inode pointer is in the
* kernel stack so we can modify it. SMS
*/
register struct inode *ip;
char pth[MLEN];
int error;
struct nameidata nd;
register struct nameidata *ndp = &nd;
bcopy(path, pth, len);
NDINIT(ndp, CREATE, FOLLOW, UIO_SYSSPACE, pth);
ndp->ni_dirp[len - 2] = 0;
*ipp = 0;
ip = namei(ndp);
if (ip) {
iput(ip);
return(EADDRINUSE);
}
if (u.u_error || !(ip = maknode(IFSOCK | 0777, ndp))) {
error = u.u_error;
u.u_error = 0;
return(error);
}
*ipp = ip;
ip->i_socket = unpsock;
iunlock(ip);
return(0);
}
unpconn(path, len, so2, ipp)
char *path;
int len;
struct socket **so2;
struct inode **ipp;
{
register struct inode *ip;
char pth[MLEN];
int error;
struct nameidata nd;
register struct nameidata *ndp = &nd;
bcopy(path, pth, len);
if (!len)
return(EINVAL); /* paranoia */
NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, pth);
ndp->ni_dirp[len - 2] = 0;
ip = namei(ndp);
*ipp = ip;
if (!ip || access(ip, IWRITE)) {
error = u.u_error;
u.u_error = 0;
return(error);
}
if ((ip->i_mode & IFMT) != IFSOCK)
return(ENOTSOCK);
*so2 = ip->i_socket;
if (*so2 == 0)
return(ECONNREFUSED);
return(0);
}
unpgc1(beginf, endf)
struct file **beginf, **endf;
{
register struct file *fp;
for (*beginf = fp = file; fp < fileNFILE; fp++)
fp->f_flag &= ~(FMARK|FDEFER);
*endf = fileNFILE;
}
unpdisc(fp)
struct file *fp;
{
--fp->f_msgcount;
return(closef(fp));
}