diff options
author | bp <bp@FreeBSD.org> | 2001-03-10 05:24:45 +0000 |
---|---|---|
committer | bp <bp@FreeBSD.org> | 2001-03-10 05:24:45 +0000 |
commit | dde32853641c8191e1074cc8a3d9b3ae9facfa27 (patch) | |
tree | 3496a4f9320d911a7b3ce90b4c45fe032119f1d2 /sys/netncp/ncp_subr.c | |
parent | 04dc7092d8850e0118c795388fd40cbe91ee027e (diff) | |
download | FreeBSD-src-dde32853641c8191e1074cc8a3d9b3ae9facfa27.zip FreeBSD-src-dde32853641c8191e1074cc8a3d9b3ae9facfa27.tar.gz |
Major update of NCP requester:
Use mchain API to work with mbuf chains.
Do not depend on INET and IPX options.
Allocate ncp_rq structure dynamically to prevent possible stack overflows.
Let ncp_request() dispose control structure if request failed.
Move all NCP wrappers to ncp_ncp.c file and all NCP request processing
functions to ncp_rq.c file.
Improve reconnection logic.
Misc style fixes.
Diffstat (limited to 'sys/netncp/ncp_subr.c')
-rw-r--r-- | sys/netncp/ncp_subr.c | 175 |
1 files changed, 36 insertions, 139 deletions
diff --git a/sys/netncp/ncp_subr.c b/sys/netncp/ncp_subr.c index 00c8503..4d208f9 100644 --- a/sys/netncp/ncp_subr.c +++ b/sys/netncp/ncp_subr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Boris Popov + * Copyright (c) 1999, 2000, 2001 Boris Popov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,10 +36,9 @@ #include <sys/proc.h> #include <sys/systm.h> #include <sys/kernel.h> +#include <sys/sysctl.h> #include <sys/malloc.h> #include <sys/time.h> -#include <sys/uio.h> -#include <sys/mbuf.h> #include <netncp/ncp.h> #include <netncp/ncp_conn.h> @@ -76,7 +75,8 @@ ncp_str_dup(char *s) { void -ncp_at_exit(struct proc *p) { +ncp_at_exit(struct proc *p) +{ struct ncp_conn *ncp, *nncp; if (ncp_conn_putprochandles(p) == 0) return; @@ -84,10 +84,9 @@ ncp_at_exit(struct proc *p) { ncp_conn_locklist(LK_EXCLUSIVE, p); for (ncp = SLIST_FIRST(&conn_list); ncp; ncp = nncp) { nncp = SLIST_NEXT(ncp, nc_next); - if (ncp->ref_cnt != 0) continue; if (ncp_conn_lock(ncp, p, p->p_ucred,NCPM_READ|NCPM_EXECUTE|NCPM_WRITE)) continue; - if (ncp_disconnect(ncp) != 0) + if (ncp_conn_free(ncp) != 0) ncp_conn_unlock(ncp,p); } ncp_conn_unlocklist(p); @@ -95,7 +94,26 @@ ncp_at_exit(struct proc *p) { } int -ncp_init(void) { +ncp_sysctlbyname(char *name, void *old, size_t *oldlenp, + void *new, size_t newlen, size_t *retval) +{ + int oid[CTL_MAXNAME]; + int nmlen, plen, error; + + oid[0] = 0; /* sysctl internal magic */ + oid[1] = 3; /* name2oid */ + nmlen = sizeof(oid); + error = kernel_sysctl(curproc, oid, 2, oid, &nmlen, name, strlen(name), &plen); + if (error) + return error; + error = kernel_sysctl(curproc, oid, plen / sizeof(int), old, oldlenp, + new, newlen, retval); + return error; +} + +int +ncp_init(void) +{ ncp_conn_init(); if (at_exit(ncp_at_exit)) { NCPFATAL("can't register at_exit handler\n"); @@ -105,32 +123,24 @@ ncp_init(void) { return 0; } -void -ncp_done(void) { - struct ncp_conn *ncp, *nncp; - struct proc *p = curproc; - +int +ncp_done(void) +{ + int error; + + error = ncp_conn_destroy(); + if (error) + return error; untimeout(ncp_timer,NULL,ncp_timer_handle); rm_at_exit(ncp_at_exit); - ncp_conn_locklist(LK_EXCLUSIVE, p); - for (ncp = SLIST_FIRST(&conn_list); ncp; ncp = nncp) { - nncp = SLIST_NEXT(ncp, nc_next); - ncp->ref_cnt = 0; - if (ncp_conn_lock(ncp, p, p->p_ucred,NCPM_READ|NCPM_EXECUTE|NCPM_WRITE)) { - NCPFATAL("Can't lock connection !\n"); - continue; - } - if (ncp_disconnect(ncp) != 0) - ncp_conn_unlock(ncp,p); - } - ncp_conn_unlocklist(p); - ncp_conn_destroy(); + return 0; } /* tick every second and check for watch dog packets and lost connections */ static void -ncp_timer(void *arg){ +ncp_timer(void *arg) +{ struct ncp_conn *conn; if(ncp_conn_locklist(LK_SHARED | LK_NOWAIT, NULL) == 0) { @@ -140,116 +150,3 @@ ncp_timer(void *arg){ } ncp_timer_handle = timeout(ncp_timer,NULL,NCP_TIMER_TICK); } - -int -ncp_get_bindery_object_id(struct ncp_conn *conn, - u_int16_t object_type, char *object_name, - struct ncp_bindery_object *target, - struct proc *p,struct ucred *cred) -{ - int error; - DECLARE_RQ; - - NCP_RQ_HEAD_S(23,53,p,cred); - ncp_rq_word_hl(rqp, object_type); - ncp_rq_pstring(rqp, object_name); - checkbad(ncp_request(conn,rqp)); - if (rqp->rpsize < 54) { - printf("ncp_rp_size %d < 54\n", rqp->rpsize); - error = EINVAL; - goto bad; - } - target->object_id = ncp_rp_dword_hl(rqp); - target->object_type = ncp_rp_word_hl(rqp); - ncp_rp_mem(rqp,(caddr_t)target->object_name, 48); - NCP_RQ_EXIT; - return error; -} - -int -ncp_read(struct ncp_conn *conn, ncp_fh *file, struct uio *uiop, struct ucred *cred) { - int error = 0, len = 0, retlen=0, tsiz, burstio; - DECLARE_RQ; - - tsiz = uiop->uio_resid; -#ifdef NCPBURST - burstio = (ncp_burst_enabled && tsiz > conn->buffer_size); -#else - burstio = 0; -#endif - - while (tsiz > 0) { - if (!burstio) { - len = min(4096 - (uiop->uio_offset % 4096), tsiz); - len = min(len, conn->buffer_size); - NCP_RQ_HEAD(72,uiop->uio_procp,cred); - ncp_rq_byte(rqp, 0); - ncp_rq_mem(rqp, (caddr_t)file, 6); - ncp_rq_dword(rqp, htonl(uiop->uio_offset)); - ncp_rq_word(rqp, htons(len)); - checkbad(ncp_request(conn,rqp)); - retlen = ncp_rp_word_hl(rqp); - if (uiop->uio_offset & 1) - ncp_rp_byte(rqp); - error = nwfs_mbuftouio(&rqp->mrp,uiop,retlen,&rqp->bpos); - NCP_RQ_EXIT; - } else { -#ifdef NCPBURST - error = ncp_burst_read(conn, file, tsiz, &len, &retlen, uiop, cred); -#endif - } - if (error) break; - tsiz -= retlen; - if (retlen < len) - break; - } - return (error); -} - -int -ncp_write(struct ncp_conn *conn, ncp_fh *file, struct uio *uiop, struct ucred *cred) -{ - int error = 0, len, tsiz, backup; - DECLARE_RQ; - - if (uiop->uio_iovcnt != 1) { - printf("%s: can't handle iovcnt>1 !!!\n", __FUNCTION__); - return EIO; - } - tsiz = uiop->uio_resid; - while (tsiz > 0) { - len = min(4096 - (uiop->uio_offset % 4096), tsiz); - len = min(len, conn->buffer_size); - if (len == 0) { - printf("gotcha!\n"); - } - /* rq head */ - NCP_RQ_HEAD(73,uiop->uio_procp,cred); - ncp_rq_byte(rqp, 0); - ncp_rq_mem(rqp, (caddr_t)file, 6); - ncp_rq_dword(rqp, htonl(uiop->uio_offset)); - ncp_rq_word_hl(rqp, len); - nwfs_uiotombuf(uiop,&rqp->mrq,len,&rqp->bpos); - checkbad(ncp_request(conn,rqp)); - if (len == 0) - break; - NCP_RQ_EXIT; - if (error) { - backup = len; - uiop->uio_iov->iov_base -= backup; - uiop->uio_iov->iov_len += backup; - uiop->uio_offset -= backup; - uiop->uio_resid += backup; - break; - } - tsiz -= len; - } - if (error) - uiop->uio_resid = tsiz; - switch (error) { - case NWE_INSUFFICIENT_SPACE: - error = ENOSPC; - break; - } - return (error); -} |