The installation of the NetCon software product is accomplished thought the various installation mechanisms native to the particular operating system platform. In general all the installation procedures accomplish the following tasks.
Provide for repeated clean installation, removal, upgrade and re-configuration in any run level.
Properly register the NetCon software package with the system administration facility.
Transfer the software from the Media to system and un-compress.
Create all required sub-directories .
"/usr/lib/netcon" and required sub-directories.
"/sys" and required sub-directories.
"/netware"
Modify the system start-up procedure to start NetCon late in the multi-user mode.
Add the kernel components to the system.
Set up or modify, if required, the master and slave pseudo terminal devices "/dev/ptty" and "/dev/ttyp".
Selection of network type 802.3. TYPEII or Token-Ring.
Selection of network adapter and quantity.
Edit the "/usr/bin/netcon.rc" start-up file to add the network type and adapter information.
Re-link the kernel on SCO.
The NetCon install script is run from the systems install mechanism.
Source Location: varies by platform.
INSTALL
PROCEDURE SHELL SCRIPT Install ();
{install software}
BEGIN
IF /usr/bin/netcon.rc exist
stop netcon
remove netcon
ELSE
IF the directories do not exits
create /netware, /sys, /sys/system, /sys/login, /sys/mail, /sys/ public
get network type, from user
get number of network adapters, from user
get network adapter, from user
edit /usr/bin/netcon.rc add netclink and netcconfig and report lines
run system kernel module add functions
link /usr/bin/netcon.rc to /etc/rc2.d/S90netcon
add group everyone
add user supervisor
END;
SUN Solaris 2.x
Installation program; "pkgadd".
Start-up file; "/etc/rc2.d/S90netcon" symbolic link to "/usr/bin/netcon.rc".
Procedures to add kernel components;
"modload /kernel/fs/TFS" Adds all NetCon kernel code TFS VFS file system, IPX/SPX, etc.
"add_drv /kernel/drv/Str" Common code to build DLPI interface devices only /dev/str*_*".
"add_drv /kernel/drv/netc" Common code to build Socket devices only "/dev/netcon*".
Installation scripts;
Source location: scripts/scripts.sun
"pkfinfo" Contains Identification information.
"prototype" Contains distribution contents, location, perms and checksums.
"preinstall" Run before package installed removes NetCon etc.
"postinstall" NetCon install script.
"preremove" Stops NetCon.
Installation program "none" NetCon installation script "/tmp/ncinstall".
Startup file; "/etc/rc.local" calls "/usr/bin/netcon.rc".
Installation script; "/tmp/ncinstall".
Source location: scripts/scripts.sun/install.sh
Installation program "custom".
Startup file "/etc/rc2.d/S90netcon" linked to "/usr/bin/netcon.rc".
Installation Scripts;
Source location: scripts/scripts.sco/netconfig and scripts/scripts.sco
"/etc/perms" Distribution contents, location, perms etc.
"/tmp/init.netcon" Installation scripts stub to call "netconfig" to do real installation.
"/usr/lib/netconfig/info/netcon" Identification information.
"/usr/lib/netconfig/init/netcon" NetCon install script.
"/usr/lib/netconfig/remove/netcon" NetCon remove script.
"/usr/lib/custom/netcon.rmv" Custom removal script.
Installation program "installp"
Startup file "/etc/rc.local" calls "/usr/bin/netcon.rc".
Source location: scripts/scripts.aix
pkgadd(), custom(), installp()
After the installation is complete the next step in implementing NetCon is to load the kernel level modules. This is accomplished as follows:
SCO requires that the kernel be relinked to add new kernel modules. This relinking takes place during the installation.
During the boot process the loadable kernel module "/usr/lib/netcon/netcdd" is loaded.
During the boot process loadable kernel modules "/usr/lib/netcon/netconsun4.o" or "/usr/lib/netcon/netconsun4c.o" are installed with the configuration scripts.
During the boot process the loadable modules "/kernel/fs/TFS", "/kernel/drv/Str" and "/kernel/drv/netc" are loaded into the kernel. The associated devices are built in the "/device/pseudo" directory and linked to the "/dev/" directory.
The NetCon Solaris 2.x version kernel code is implemented as Solaris 2.x DDI/DDK compliant loadable leaf drivers. The Solaris kernel is self-configuring. During the boot the system sets up a kernel-resident device information tree call devinfo. The NetCon Drivers contain a Virtual File System (VFS) entry for the (TFS) NetWare compatible network file system. This requires that the NetCon drivers be loaded into the virtual file system switch table vfssw[] during early boot and before the system enters multiuser mode. When the Solaris system enters multiuser mode the switch table is terminated with a NULL (0) entry and no other valid entries can be added.
NOTE: drivers must have been previously added to the system during the installation process with add_drv() for device drivers and mod_load() for the file system.
1. The system copies the driver into the kernel virtual memory area and calls _init(9e) routine in each module which must call the kernel routine mod_install(9f) to link the driver to the devinfo node entry. The NetCon drivers/file system are;
/kernel/fs/TFS
/kernel/drv/Str
/kernel/drv/netc
2. The system reads the driver's configuration file (xx.conf) and adds information to the drivers devinfo node.
/kernel/drv/Str.conf
/kernel/drv/netc.conf
3. The drivers identify(9e), probe(9e), and attach(9e) routines are then called.
If all the steps complete successfully the devices are now accessible and its open(9e) routine can be called.
BOOT
PROCEDURE KERNEL CODE boot();
{Solaris Kernel Boot Strap}
BEGIN
build devinfo
CALL _init() in /kernel/fs/TFS
CALL _init() in /kernel/drv/Str
CALL _init() in /kernel/drv/netc
CALL _info() in /kernel/fs/TFS
CALL _info() in /kernel/drv/Str
CALL _info() in /kernel/drv/netc
CALL Str_identify()
CALL netc_identify()
CALL Str_attach()
CALL netc_attach()
ENTER multiuser mode
CALL netcon.rc
END;
For complete details on all the drivers entry points see Module I and Module II. The NetCon startup script netcon.rc is the subject of the next chapter.
The NetCon software is started during later phases of the boot process by the "/usr/bin/netcon.rc script file. This file was modified during the installation phase and should contain the appropriate network type and network adapter configuration information.
The "/usr/bin/netcon.rc" script provides the following functions;
Load the kernel modules if not already loaded by relinking or during bootup ("/usr/lib/netcon_load").
Links (Streams I_LINK) the network adapter DLPI/LLI driver to the IPX/SPX protocol stack through a minor device indicating the correct network type and interface number ("/usr/bin/netclink").
Configure and start the IPX/SPX protocol stack ("/usr/bin/netcconfigure").
Start the password mapping daemon which also sets the network number and ("/usr/bin/netcpass") prints the "New IPX Address".
Prints the new IPX/SPX configuration ("/usr/bin/netcconfigure").
Starts the server daemons ("/usr/bin/netcserv").
Starts the terminal server daemon ("/usr/bin/netcvt").
Starts the sql interface or netbios ("/usr/bin/netcorasaql", "/usr/bin/netcnblink").
Mounts the indicated NetWare servers.
Stops NetCon during shutdown.
SCO
SUN Solaris 2.x
"/usr/bin/netcon.rc" linked to "/etc/rc2.d/S90netcon".
AIX
"/etc/inittab" "rcnetcon" entry added.
SUN OS 4.1.3
"/usr/bin/netcon.rc" called from "/etc/rc.local".
After the startup of NetCon the following daemon/processes/threads should be running.
/usr/bin/netclink 1 process
/usr/bin/netcpass 1 process
/usr/bin/netcserv 1 server daemon, 2 SAP, 1 RIP, plus 1 for each connection and printer.
/usr/bin/netcvt 1 terminal server daemon plus 2 for each connection.
The NetCon start up script is run only by the system startup and shutdown mechanism.
Source locations: scripts/scripts.xxx/netcon.rc
NETCON.RC
PROCEDURE SHELL SCRIPT netcon.rc (start|stop);
{Start|Stop NetCon software}
BEGIN
set execution path
SWITCH on first parameter
CASE start
load kernel modules if not already loaded
CALL netclink, link netcon to hardware driver
CALL netcconfig, configure and start IPX/SPX
CALL netcpass, password mapping daemon
CALL netcconfig, report IPX/SPX configurations
CALL netcserv, start server daemon
CALL netcvt, start terminal server daemon
CALL netcorasql, start sql interface
CALL netcmount mount netware servers
CASE Stop
find all netcon daemons and kill then
END;
At this point NetCon is fully functional and ready to provide network file, print and terminal services to DOS/Windows clients and NetWare file and print services to Unix users. The next 7 chapters will provide the details on how each module functions and how they interact and combine to provide these services.
Unix Operating Systems, both AT&T and BSD, are designed from the ground up to support many different types of network operating systems in very standard ways. This networking support comes in many forms ie:
i) User level network libraries and interfaces (AT&T TLI/Streams, BSD Sockets/Mbuf). ii) The ability to add NEW kernel level device drivers for network adapters (Ethernet, Token-Ring, FDDI). iii) The ability to add NEW kernel level protocol stacks (TCP/IP IPX, OSI). iv) The ability to add NEW kernel level network file systems (NFS, DFS, RFS, TFS). NetCon was designed to take advantage of all of these features. That is to say NetCon supports AT&T Streams, BSD Sockets, loadable IPX protocol stack and drivers and loadable TFS Network file systems.
The following chapters will discuss the details of NetCon implementation of these standards based features.
NetCon implements its kernel modules as Unix/POSIX device drivers and file systems. AT&T Unix system device drivers and file systems share a common method of adding new members. That is they add new members to an array of structures called device or file system switch tables. These member structures contain device information and more importantly pointers to functions required by Unix devices or file systems. The index number of the structures entry into this array is the devices MAJOR number, in the case of a file system it is the file system number and or name. Device minor numbers are for the devices own internal use only and are not in any way used by the Unix system.
There are currently two methods in general use for adding AT&T drivers and file systems, NetCon uses both. The first is AT&T System V release 3.2 style used by SCO and the second is AT&T system V release 4.0 used by SUN, AIX, UnixWare etc. The main differences between these two versions, as far as NetCon is concerned, is that the older 3.2 version uses a kernel that requires you to Re-link the binaries to add new devices or file systems. The 4.0 release supports loadable drivers and file systems. Also, the 3.2 version utilizes a "file system type" (fssw[]) switch table, the 4.0 version uses a more modern Virtual File System (VFS, vfssw[]). Both versions support AT&T Streams and NetCon provides BSD 4.2 SOCKET support to systems that do not provide their own, natively.
Unix drivers and file systems both have a pre-defined set of required entry points. Each new driver or file system, as it is loaded or linked to the system, must provide pointers to these required functions and may provide pointers to the optional functions.
The NetCon software consists of TWO (2) kernel levels. Module I is a IPX/SPX protocol stack and Module II is a file system. Both modules can be either linked or loaded depending on the operating system.
Module I is the IPX/SPX protocol stack which has two devices associated with it. The first device is the upper User level Socket interface which is a character device "/dev/netcon". The second device is the lower hardware LLI/DLPI interface which is a Streams device. Character and Streams devices provide a different set of entry points. Character devices provide the traditional open, close, read, write and ioctl functions and a NULL for the "streamtab" structure pointer. While streams drivers have NULL pointers for the open, close, read, write and ioctl function and a valid pointer to a streamtab structure containing pointers to Streams open and close functions as well as the Stream queue put and service procedure. The put and service procedures are the primary entry points in Streams drivers or modules. The Streams open and close procedure are only used to link the driver to the hardware device or other streams modules.
Module II is the NetCon TFS (Tony's Fast Network File System) file system module which consists of a linkable fstypsw or loadable vfssw file system depending on the platform.
The Unix kernel, upon receiving a system call from a user process, first checks the FILE system type, if the call is on a regular file the corresponding "File System Operations" are called. Otherwise if the system call is on a Special device file (protocol stack or device driver) then the "Device's Operations" are called.
The Unix kernel upon receiving a system call on a special device file first determines if the device is a streams device or a regular device by whether the device has a valid pointer to a streamtab structure or valid pointers to regular device entry points (open, close, read, write, ioctl). Both streams and regular devices have both common and administration entry points.
The Unix kernel, upon receiving a system call on a regular file, dispatches that call to the appropriate file system or vnode operation.
In the case of SCO the procedures in "fstypsw" are called. These include both "file System" and "file" operations. Solaris has separate structures for "file System" operation "vfops" and file operations "vnodeops".
Entry points call by the system during boot.
Entry Point Module Source
_init() II TFS kernel/sockets/machdep/tfs_sun.c
_init() I Str kernel/sockets/machdep/Strsun.c
_init() I netc kernel/sockets/machdep/netcsun.c
Str_identify() I Str kernel/sockets/machdep/Strsun.c
Str_attach() I Str kernel/sockets/machdep/Strsun.c
netc_identify() I netc kernel/sockets/machdep/netcsun.c
netc_attach() I netc kernel/sockets/machdep/netcsun.c
Programs and Kernel Entry points called during startup.
Program Entry Points Module Source
netclink VII etc/netclink.c
STR1open() I kernel/sockets/if/if_str.c
Str_top_put() I "
Str_bot_pu() I "
netcconfig VII etc/netcconfig.c
netc_open() I kernel/sockets/sys/ pd_driver.c
netc_ioctl() I "
ifioctl() I kernel/sockets/net/if.c
netcpass III etc/netcpass.c
netc_open() I kernel/sockets/sys/ pd_driver.c
netc_ioctl() I "
NETC_init() II kernel/netnetc/netcinit.c
NETC_admin() II kernel/netnetc/ netcadm.c
Programs and Kernel Entry points called during normal operation.
Program Entry Points Module Source
netcserv IV server/serv/main.c
netc_open() I kernel/sockets/sys/ pd_driver.c netc_ioctl() I "
Str_bot_put I kernel/sockets/if/if_str.c
netcvt/netcorasql IV server/serv/spxvt.c
netc_open() I kernel/sockets/sys/ pd_driver.c netc_ioctl() I "
Str_bot_put I kernel/sockets/if/if_str.c
netcmount III etc/netcmount.c
netc_open() I kernel/sockets/sys/ pd_driver.c
netc_ioctl() I "
NETC_admin() II kernel/netnetc/ netcadm.c
netcon VII menus/menu.c
netcprint III nprint/netcprint.c
The NetCon IPX/SPX protocol stack is derived from the BSD 4.3 XNS (Xerox Network System) protocol stack with modification to accommodate NetWare.
NetCon has one (1) regular character device that is used as the User level entry point for ALL NetCon processes. This device is never seen or accessed directly by any user programs but instead it is accessed indirectly by making BSD SOCKET system calls from the NetCon socket library "libsock.a". This device "/dev/netcon" is referred to as our PESUDO SOCKET DEVICE and provides the means for all communication between the NetCon User Level daemon/processes/programs and the kernel level NetCon IPX/SPX protocol stack and thus the network. This communication between the NetCon kernel and user processes utilizes the ioctl() system call on the "/dev/netcon" device.
Before the IPX/SPX protocol stack can be used it must be initialized this is done at boot time by the "netcpass" daemon. User level processes have access to the IPX/SPX stack through BSD socket system calls (libsock.a). Before a program can use the network a socket of address family AF_NS type SOCK_DGRAM (IPX) or SOCK_STREAM (SPX) must be opened and bound to a valid IPX/SPX port number and optionally a IPX address if no address is supplied the hosts network number and address are used. After the socket is open and bound to a address then a Socket send() call will send a packet to the network and a socket recv() will post a receive and sleep until awakened by a packet received from the network addressed to the correct IPX port number.
Posting a socket receive Pseudo Code
PROCEDURE USER CODE recv()
(open a socket, bind port number and receive a packet from the network)
BEGIN
CALL socket(), Open a socket AF_NS, SOCK_DGRAM, STREAM
CALL bind(), bind socket to a IPX/SPX port number
CALL recv(), post a pending receiver
END
PROCEDURE KERNEL CODE recv()
(post a pending receive in the kernel to receive a packet)
BEGIN
CALL copyin, copy uio structure from user to kernel space
CALL receivit(),
CALL soreceive(), to post receive to socket
CALL sleep(), wait to be awoken by incomming data
CALL copyout(), copy receive data to user
END
PROCEDURE KERNEL CODE STR_bot_put();
(Stream module entry point called from network card driver, putnext())
BEGIN
IF M_DATA
drop 14 byte Ethernet header form RAW 802.3 packet
CALL putq(), queue packet on read queue
return
SWITCH (PRIMITIVE) {
CASE DL_UNITDATA_IND:
call putq()
}
END
PROCEDURE KERNEL CODE STR_bot_srv();
(Stream module read queue service routine scheduled after a putq())
BEGIN
LOOP
dequeue packet with getq()
call STR_recv()
END
PROCEDURE KERNEL CODE STR_recv();
(Stream module packet receive routine)
BEGIN
check interface is running
adjust token-ring packet
CALL mutex_enter()
add mbuf wrapper to mblks
CALL nsinput()
CALL mutex_exit()
END
PROCEDURE KERNEL CODE nsinput();
(IPX/SPX input routine)
BEGIN
check for runt packets
get IPX packet length
check for ODD packet length and adjust to correct IPX packet length
process IPX checksum
IF packet is a broadcast and should be routed
CALL idp_forward()
IF packet is NOT our packet
CALL idp_forward()
CALL NETCinput(), Client packet input
IF Client packet
return
CALL nspcblookup(), lookup pending IPX/SPX receives
SWITCH(packet type)
CASE IPX receive pending for port number
CALL idp_input()
return
CASE SPX receive pending for port number
CALL spp_input()
return
free packet
END
PROCEDURE KERNEL CODE idp_input()
(IPX server input routine called from nsinput)
BEGIN
drop IPX header
CALL sbappendaddr(). queue data on pending receive queue
CALL sorwakeup(), wakeup receive queue
return
END
PROCEDURE KERNEL CODE spp_input()
(SPX server input routine called from nsinput)
BEGIN
END
PROCEDURE USER PROCESS send()
(send a IPX/SPX data packet to the network)
BEGIN
CALL socket(), open a socket
CALL bind(), bind socket to a port number
CALL send() or sendto(), to send the packet
END
PROCEDURE KERNEL CODE send()
(send a data packet to the network)
BEGIN
CALL copyin(), copy uio structure from user to kernel
CALL sosend()
END
PROCEDURE KERNEL CODE sosend()
(send a data packet to the network)
BEGIN
check state, connection and free buffers
LOOP(data to send)
CALL allocb(), allocate a packet buffer for the data (mblk_t)
CALL uiomove(), copy data from user space to mblk_t
CALL pr_usrreq(), ipd_usrreq for (IPX) or spp_usrreq for (SPX), req = PRU_SEND.
END
PROCEDURE KERNEL CODE idp_usrreq()
(process IPX user request)
BEGIN
check for rights and connection
SWITCH(request)
CASE PRU_SEND
CALL idp_output()
END
PROCEDURE KERNEL CODE idp_output()
(send IPX data packet)
BEGIN
CALL allocb(), allocate mblk_t for IPX header, fill in add to front of data mblk_t
allocate and fill out a routing structure for packet
CALL ns_output()
Determine the hardware interface on which to send packet from route
CALL allocb(), allocate mblkt_t and fill with MAC header add to front of IPX header.
CALL allocb(), allocate mblk_t and fill with LLI/DLPI header add to front of MAC header.
CALL putnext(), calls the hardware drivers write put routine to write the packet to the network
IF MAC address equals broadcast or our address
CALL nsinput(), loopback client to server
END
STR1open()
STR1close()
STR_top_put()
STR_bot_srv()
STR_bot_put()
sockets()
bind()
send(), sendto()
recv(), recvfrom()
accept()
connect()
setsockopt()
Boot Time, initialization (Administration) Entry Points Solaris only.
Structure dev_ops <sys/devops.h>
/dev/str*_* /dev/netcon
_init _init _init
_fini _fini _fini
getinfo Strgetinfo netc_getinfo
identify Stridentify netc_identify
probe Strprobe -
attach Strattach netc_attach
detach Strdetach netc_detach
RunTime
Structure; Solaris cb_ops <sys/devops.h>
SCO cdevsw <sys/conf.h>
streamtab, qinit <sys/stream.h>
open - netc_open
close - netc_close
read - netc_read
write - netc_write
ioctl - netc_ioctl
streamtab STR1info
Stream Write (To Network, outgoing control or packets)
put STR_top_put -
service - -
open STR1open -
close STR1close -
Stream Read (From Network, incomming packets)
put STR_bot_put -
service STR_bot_srv -
open - -
close - -
The NetCon TFS file system is implemented in two ways. The first is the older AT&T system V release 3.2 "file system type switch table" which utilizes the inode abstraction to describe files and directories. The second is the newer VFS virtual file system developed by SUN and UC at Berkeley and now a part of AT&T System V release 4. The VFS file system uses vnodes rather than inodes to describe files and directories. The main difference between inodes and vnodes is the OS allocates and maintains the network vnodes and passes a pointer to them with each call while the TFS file system must allocate and maintain its own inodes.
The TFS file system operations are too numerous and complex to attempt to describe in this document. For details on any of the TFS procedures refer to the source code using the Entry points shown in their chapter as a guide. We will, however, attempt to describe the general procedure for mounting a NetWare Server volume as a Unix directory and what occurs when a Unix user attempts to use the mounted NetWare directories..
Structures; Solaris vfsops <sys/vfs.h>, vnodeops <sys/vnode.h>
SCO fstypsw <conf.h>
Procedure SCO Solaris AIX NETCcall
mount TFSmount TFSvfs_mount TFSaix_mount
unmout TFSumount TFSvfs_umount TFSaix_umount
root - TFSvfs_root TFSaix_root
statvfs - TFSvfs_statfs TFSaix_statfs
init TFSinit -
iput TFSiput TFSsun_remove
iupdate TFSiupdate -
readi TFSreadi TFSsun_rd
writei TFSwritei TFSsun_wr
truncate TFSitrunc -
statf TFSstatf
namei TFSnamei
openi TFSopeni TFSsun_open
closei TFSclosei TFSsun_close
update TFSupdate -
access TFSaccess - TFSaix_access
getdirentries TFSgetdents TFSsun_readdir TFSgetdents
allocmap TFSallocmap - TFSaix_map
freemap TFSfreemap - TFSaix_unmap
readmap TFSreadmap -
setattr TFSsetattr TFSsun_setattr TFSaix_setattr
notify TFSnotify -
fcntl TFSfcntl -
fsinfo TFSfsinfo -
ioctl TFSioctl TFSsun_ioctl TFSaix_ioctl
security TFSsecurity -
select - TFSsun_select, TFSaix_select
getattr - TFSsun_getattr, TFSstatf
lookup - TFSsun_lookup, TFSaix_lookup
create - TFSsun_create, TFSaix_create
link - TFSsun_link, TFSaix_link
rename - TFSsun_rename, TFSaix_rename
mkdir - TFSsun_mkdir, TFSaix_mkdir
rmdir - TFSsun_rmdir, TFSaix_rmdir
getdents - TFSgetdents, TFSgetdents
symlink - TFSsun_symlink, TFSaix_symlink
readlink - TFSsun_readlink, TFSaix_readlink
fsync - TFSsun_fsync, TFSaix_fsync
rele - TFSsun_rele, TFSaix_rele
fid - TFSsun_fid, TFSaix_fid
rwlock - TFSsun_rwlock,
rwunlock - TFSsun_rwunlock,
seek - TFSsun_seek,
cmp - TFSsun_cmp,
frlock - TFSsun_frlock,
space - TFSsun_space,
realvp - TFSsun_realvp,
getpage - TFSsun_getpage,
putpage - TFSsun_putpage,
map - TFSsun_map, TFSaix_map
addmap - TFSsun_addmap,
delmap - TFSsun_delmap, TFSaix_unmap
poll - TFSsun_poll,
dump - TFSsun_dump,
pathconf - TFSsun_pathconf,
pageio - TFSsun_pageio,
ctl - TFSsun_ctl,
Mounting a NetWare volume is accomplished by issuing a "netcmount" command.
Example:
# netcmount netware:sys:/ /mnt
This command will issue a mount() system call for a "TFS" file system with the correct syntax for the particular operating system which in turn will call the "TFS" mount entry point. The following Pseudo Code is an example for a VFS file system, the file "system type" is similar.
PROCEDURE KERNEL CODE TFSvfs_mount()
(mount a TFS file system)
BEGIN
CALL mutex_enter(), mutual exclusive lock text/executable
TEST user is root
TEST mount point is a directory not a file
TEST valid mount data structure
CALL copyin(), to copy the mount data structure from user the kernel space
CALL TFS_cmount()
CALL mutex_exit(), unlock text
END
PROCEDURE KERNEL CODE TFS_cmount()
(mount a TFS file system)
BEGIN
TEST that TFS file system is started/initialized
LOCATE the TFS_fsinfo structure,
CALL copyin(), copyin mount point and remote server, volume, dir
CALL NETC_mount(), TFS_fsinfo->nf_mount() yet another switch table
END
PROCEDURE KERNEL CODE NETC_mount()
(mount a NetWare volume)
BEGIN
GET server name, volume and directory
CALL TFSgetfreei(), get network inode SET ops to TFSsun_vnodeops
CALL NETC_gen_dir_inum(), get a unique vnode number
CALL NETC_init(), initialize if netcpass did not
CALL NETC_getconnbyname(), connect and login to NetWare server
CALL NETC_create_dir_handle, map a netware volume
fill in vnode structure and directroy point ISROOT
CALL makedevice(), new major, minor for mount dir
END
PROCEDURE KERNEL CODE access()
(change dircctory to a mounted a NetWare volume vnodeops "access" is called)
BEGIN
CALL TFSsun_access(), called by O/S from "access" entry in TFSsun_vnodeops
END
The NetCon client utilities provide the essential services required for a Unix system to perform as a NetWare client. As with DOS most of the important data structures required by the NetCon client reside in the kernel code. These data structures are the Server, Connection and User table. The "netcpass" daemon provides a means to update the tables from the user space that is to say the NetCon Servers BINDERY database. The "netcmount" utility allows mounting/mapping of a NetWare volume and netcprint will print to a NetWare printer. Details of the use of each of the utilities are provided in the "Users Guide" and the "Command Reference" manuals.
PROCEDURE USER CODE netcpass main()
(map Unix uid to NetWare Object id)
BEGIN
Process options;
-a Turn OFF automatic default users and groups for each Server
-d Turn on debugging print out
-f First time netcpass run to skip restart and run netcinit()
-o Old use "/usrl/lib/netcon/netcpasswd" file not BINDERY for mapping
IF NOT -f option
KILL currently running netcpass
IF -f option
BEGIN
CALL netcinit(), Initialize kernel & send SAP, if not initialized
SLEEP 30 seconds, Wait for all SAP replies to be received
END
CALL netcinit(), No affect if -f option
SLEEP 2 seconds
OPEN /usr/lib/netcon/.TFS_LOG, fifo file for interprocess communication
IF -o Old mapping file THEN
BEGIN
Read and Parse Old password mapping file "netcpasswd"
FOR each line parsed:
Make a connection to named server
Get User/Group Objid/uid from Bindery/getuid
Add entry to Kernel Mapping table.
END
ELSE
BEGIN
IF NOT -a option, auto mapping enabled THEN
BEGIN
Make a loopback connection to our server
WHILE (Reading Servers Objects (4) from BINDERY)
Create 3 MAPPED_USER Property for each Server, user, group, world default mapping IF none exist
END
Make a loopback connection to NetCon server
Get User/Group Objid/uid from Bindery/getuid
ADD entry to Kernel Mapping table, if not already there
Disconnect from NetCon server
END
LOOP FOREAVER:
BEGIN
WAIT for signal SIGINT IF received THEN:
Read from pipe fifo file, mapping entry
Make a loopback connection to NetCon server
Get User/Group Objid/uid from Bindery/getuid
ADD/UPDATE entry to Kernel Mapping table
Disconnect from NetCon server
WAIT for Request from Kernel IF received THEN:
Read from Kernel mapping entry
Make a loopback connection to NetCon server
Get User/Group Objid/uid from Bindery/getuid
UPDATE entry to Kernel Mapping table
Disconnect from NetCon server
END
END
PROCEDURE USER CODE netcmount main()
(Mount NetWare Server:Volume as a Unix directory)
BEGIN
Process options
Must have at least Three arguments program, remote directory, local directory
Must have Two colons ":" in remote directory string
-r Read Only
Remove leading "/" slashes and convert to Remote to Upper case
BUILD a mnt structure
GET File-System number for type "TFS"
CALL mount(), for type "TFS"
UPDATE "/etc/mnttab"
END
PROCEDURE USER CODE netcprint main()
()
BEGIN
Process options
-d Debugging output on to STDOUT
-s [server_name} NetWare Server name required
-q [queue_name] NetWare Printer/Queue name Required
-j [job_name] Jobname
-t [title] Title
-n [copies] Numbers of Copies
-u Quit no output
Create a connection to Netware Server
Login to NetWare server using mapping entries
Check "/SYS/MAIL/USER_OBJECTID/PRINTCON.DAT" if exist use printer configuration
Check "/SYS/PUBLIC/NET$PRN.DAT" if exist get printer defintion
GET printer initialization/reset sequence
GET form name
GET queue ID
GET Print server name
FILL in JOB and FORM structures
MAIN LOOP WHILE GET ARGUMENTS (files to print)
BEGIN
CREATE a print queue JOB entry on the server, set to NOT_READY
CREATE/OPEN a print queue file on server
Write local file on STDIN to print queue file on server
CLOSE print queue file on server
SET print queue JOB entry on server to READY
END
END
PROCEDURE USER CODE netcon main()
()
BEGIN
Process options
END
Module IV - User level Server Services.
PROCEDURE USER CODE netcserv main()
(NetCon file and bindery server Daemon )
BEGIN
Process options
-c Caching OFF
-d Debugging on
-s Turbo-Write OFF
-w {SAP_wait_time] Wait time in sec for SAP reply
-a [Device] Turbo device
-t [queue_timeout] Print queue timeout 600sec
-r RIP broadcast OFF
-p Printing OFF
-o [Oracle_port] Oracle SQL SPX port number for SAP
-i [internal_net_number] Internal Network Number default 0xaaff
SET umask 000
SET signals
INITIALIZE connection list
READ volumes to export for "/usr/lib/netcon/netcexport"
OPEN BINDERY read into SHARED VIRTUAL MEMORY, "/usr/lib/netcon/*.dat
IF NOT -p option THEN
CALL lpstat -t read printers Set up Print servers and Print Queues
REBUILD Bindery from Unix users and groups
CALL RIP(), Start RIP Daemon
CALL SAP(), Start SAP DAEMON
CALL PSERVER(), Start a Print server for each Unix Spooler
CALL setpgrp(), Set new process group
FORK(), parent exits child continues
CALL socket(AF_NS, SOCK_DGRAM, 0), Open a IPX socket
CALL setsockopt(DONT_ROUTE), send directly to interface
CALL bind(), Bind to Net INTERNAL_NET_NUMBER, Host 0, Port 0x451
CALL setsockopt(), Get Socket header on input
MAIN LOOP CONNECTION REQUEST: Forever
BEGIN
CALL recvform(), WAIT to receive a CONNECTION request from network
IF SIZE OK and CONNECTION request THEN:
BEGIN
GET ROUTING and IPX HEADER
SET connection table
FORK parent CONTINUES
CHILD CALL server(), file/bindery server
END
ELSE
SEND error, CONTINUE
END
END
PROCEDURE USER CODE server()
(Main File/Bindery server LOOP)
BEGIN
CALL socket(AF_NS, SOCK_DGRAM, 0), open a new socket
CALL connect(), Set Kernel connection table with Remote Client Address/Local Address associated.
CALL setsockopt(), set DEFAULT_HEADERS, DONT_ROUTE, Buffer to 32K
CALL getsockname(), Get the local address
CALL bind(), Bind to Net: Internal_net_number, Host: 1, Port: 0x451
SET up connection table
SET up Request/Reply Structures
OPEN RAW DEVICE for TURBO writes
CALL MakeDirectoryHandle(), Set up SYS:LOGIN
CALL conn_reply(), Send connection reply
MAIN SEVER LOOP FOREVER:
BEGIN
CALL recvfrom(), WAIT for request for Client
Check packet size, Drop if small
IF Sequence Number = last Sequence Number Then
SEND error reply, continue
SET New Sequence and Task Number
IF PACKET TYPE 0x2222 REQUEST THEN:
BEGIN
CALL Request(), Process NCP request
CALL Reply(), Send Reply to Request Back to Client
CONTINUE
END
ELSE IF PACKET TYPE 0x5555 or 0x1111 THEN: Disconnect or new Connect
EXIT
END
END
PROCEDURE USER CODE sap()
(Service Advertising Protocol Server Daemon)
BEGIN
SET Signals
CALL socket(), Open a socket
CALL ioctl(), Get interface address
GET Internal Net Number
CALL add_fileserver_to_bindery(), Add file Server Name and Address to BINDERY
CALL setsockopt(), Set BROADCAST, DONT_ROUTE
CALL bind(), Bind to SAP port 0x452
FORK A NEW PROCESS
CHILD MAIN LOOP FOREVER:
BEGIN
CALL setpgrp(), Set process group
CALL recvform(), WAIT to receive a SAP request
SWITCH SAP TYPE;
CASE RESPONSE:
CALL add_fileserver_to_bindery()
CASE QUERY:
CALL send() ,Send SAP reply.
END
PARENT MAIN LOOP FOREVER:
BEGIN
CALL add_fileserver_to_bindery(), ADD/Update entry
CALL send(), Send SAP packet
CALL send(), Send RIP packet
SLEEP 30/60 seconds
END
END
PROCEDURE USER CODE rip()
(Routing Information Protocol Server Daemon)
BEGIN
SET Signals
CALL socket(), Open a socket
CALL ioctl(), Get interface address
CALL setsockopt(), Set BROADCAST, DONT_ROUTE
CALL bind(), Bind to RIP port 0x453
MAIN LOOP FOREVER:
BEGIN
CALL recvfrom(), WAIT to receive a RIP packet
SWITCH RIP TYPE;
CASE RESPONSE:
Add routing entry to Kernel routing Table
CASE QUERY:
CALL send() ,Send RIP reply.
END
END
PROCEDURE USER CODE pserver()
(NetCon Print Server Daemon)
BEGIN
CALL serpgrp(), Set Process group
WHILE READ READ UNIX Printers from BINDERY
BEGIN
CALL fork(), FORK a CHILD PROCESS for each Printer
END
Parent process Exits
CHILD MAIN LOOP FOREVER:
BEGIN
CALL open(), OPEN printer Status file
WHILE READ Jobs in Printer Status File
CALL service_queue(), Service print queue
SLEEP 30 seconds
END
END
PROCEDURE USER CODE service_queue()
(Print server queue service routine)
BEGIN
CALL GetBinderyObject(), Get Print queue object id
CALL open(), Open queue status file "/sys/system/objid.qdr/qstatus.sys"
CALL read(), Read queue status file get JOB NUMBER
IF PRINT JOBS PENDING THEN
BEGIN
CALL MakeJobDescriptionFile(), Make a file name "/sys/system/QUEUE_OBJID.qdr/JOB_NUMBER.job"
CALL open(), Open Job File
CALL read(), Read Job header
IF JOB is NOT_READY THEN
IF JOB IN QUEUE UNDER 10 minuts
EXIT
IF JOB NOT FOR THIS SERVER
EXIT
DECREMENT JOB COUNTER
DELETE Job Description File
CALL system(lp), Execute lp on job file
SLEEP 5
DELETE Job File
END
END
PROCEDURE USER CODE netcvt main()
(SPX terminal Server Daemon)
BEGIN
Process options
-d Debugging output to STDOUT
-s [Start numbert} Start Out Pseudo TTYS at this number
FORK A NEW PROCESS, Disassociate for controlling terminal
PARENT Exits
CALL socket(), Open a SPX socket AF_NS, SOCK_STREAM, 0
CALL bind(), Bind to Port 0x85fa
CALL listen(), To listen for a SPX Connection request on this Port
MAIN LOOP FOREVER:
BEGIN
CALL accept(), Wait for a connection request on Port
FORK WRITER, Start a Writer process
END
WRITER:
CALL get_ptty(), Get the Next free Pueudo tty
CALL execl(/bin/ogin) on pseudo tty
FORK READER, Fork a Reader process/thread
PARENT WRITER LOOP WHILE recv() FROM NetWork
CALL write(), Write data from Network to Pseudo tty
CHILD READER LOOP WHILE read() FROM Pseudo tty
CALL send(), Send data read for Pseudo tty to NetWork
END
PROCEDURE USER CODE netcorasql main()
(SQL SPX/TCP/IP Interface Daemon)
BEGIN
Process options
FORK A NEW PROCESS
CHILD MAIN LOOP FOREVER:
BEGIN
END
PARENT MAIN LOOP FOREVER:
BEGIN
END
END
PROCEDURE DOS CODE ncterm main()
(DOS Network Terminal Emulator)
BEGIN
Load color configuration data, if any (file: ncterm.cfg).
Determine video and keyboard types.
Process command-line options:
-v Show version.
-x DebugMask Turn on debug display.
-1 Single-session only; no multi-screens.
-e Emulate Select startup emulation (default = ANSI).
-m MouseFile Mouse-translation file.
Server Name of terminal server.
UserName Login name.
Password Login password.
Check mouse availability and initialize, if -m request.
Verify SPX installation.
Open IPX socket.
IF command-line server supplied,
Connect to server.
IF command-line username and password supplied,
Login to server.
IF now connected to a server,
Set menu-selection to Terminal Mode.
ELSE
Display menu.
MAIN LOOP until user requests termination.
BEGIN
(Process user menu selections.)
CASE menu-selection
Terminal Mode:
Call term() - terminal emulator function.
IF NOT program-exit return from term(),
Save terminal screen.
Display menu.
Emulation:
Cycle to next available emulation.
Call emulation initialization function.
Capture:
IF capture is OFF
Prompt for pathname of a capture file.
Save subsequent terminal input into
this file.
ELSE (capture is ON)
Stop saving terminal input to capture
file.
Display menu.
MAIN LOOP until user requests termination.
BEGIN
(Process user menu selections.)
CASE menu-selection
Terminal Mode:
Call term() - terminal emulator function.
IF NOT program-exit return from term(),
Save terminal screen.
Display menu.
Emulation:
Cycle to next available emulation.
Call emulation initialization function.
Capture:
IF capture is OFF
Prompt for pathname of a capture file.
Save subsequent terminal input into
this file.
ELSE (capture is ON)
Stop saving terminal input to capture
file.
Close capture file.
Call DOS:
Spawn a DOS command.com shell. Any terminal
sessions are suspended but not disconnected.
Type EXIT at the DOS prompt to return to the
ncterm session.
Hangup:
Close the terminal session in the
currently selected multi-screen.
Quit:
Cleanup and exit ncterm.
ENDCASE
END
END
PROCEDURE DOS CODE ncterm term()
(Terminal Emulation function)
BEGIN
Display terminal screen.
Prompt for server if not connected.
LOOP WHILE NOT terminal-mode exit request
Send network input to emulator for display.
Keyboard input received from emulator is output to network.
Process terminal-mode keyboard commands:
^Home Exit terminal mode, display menu.
^PrintScreen Toggle printer ON/OFF.
^S/^Q User XON/XOFF request.
<Alt>1,2, or 3 Switch to another multi-screen.
<Alt>H Hangup current session.
<Alt>Q Quit ncterm, closing all sessions.
ENDLOOP
Close the terminal session in the currently selected multi-screen.
Quit:
Cleanup and exit ncterm.
ENDCASE
END
END
PROCEDURE DOS CODE ncterm term()
(Terminal Emulation function)
BEGIN
Display terminal screen.
Prompt for server if not connected.
LOOP WHILE NOT terminal-mode exit request
Send network input to emulator for display.
Keyboard input received from emulator for display.
Process terminal-mode keyboard commands:
^Home Exit terminal mode, display menu.
^PrintScreen Toggle printer ON/OFF.
^S/^Q User XON/XOFF request.
<Alt>1,2 or3 Switch to another multi-screen.
<Alt>H Hangup current session.
<Alt>Q Quit ncterm, closing all sessions.
ENDLOOP
END
NCLOGIN>EXE Pseudo Code
PROCEDURE DOS CODE nclogin main()
(DOS Login to NetCon Server)
BEGIN
Verify brand
Process options:
-d Turn on debug display.
Server Name of server to login to.
UserName Login name.
Password Login password
IF no user specified,
Prompt for login name.
Get default connection id from netware driver.
IF a server was specified,
Attach to server.
IF already attached,
Get connection id for this server.
Set preferred connection id to id just obtained.
Login to server.
IF login failed (0xff) and we have a password,
Convert password to uppercase.
Login to server.
IF login failed,
Exit program.
IF default connection id not same as current connection id,
Detach from server on default id.
Set Primary and Preferred connection id to current id.
FOR all local drives with a directory handle,
Deallocate directory handle.
Set current drive to network drive (if the current drive is a local drive, the local drive will be hidden until the network drive is unmapped or logged out).
END
NCMAP.EXE Pseudo Code
PROCEDURE DOS CODE ncmap main()
(DOS Drive Mapping to NetCon Server)
BEGIN
Save preferred connection id.
Process options:
x Turn on debug display.
d:=[server/]pathname Map drive d: to server/pathname.
DEL d: Unmap drive d:.
IF no command-line arguments,
SHOW current mapped drives.
ELSE IF this is a DEL (delete mapped drive) request,
FOR each mapped drive specified,
Deallocate the associated directory handle.
ELSE
FOR each drive mapping requested,
Call NetWare to ADD the drive mapping.
Get user's login info and log user in, if necessary.
Restore preferred connection id.
END
NCAPTURE.EXE Pseudo Code
PROCEDURE DOS CODE ncapture main()
(DOS Printer Redirector to NetCon Server)
BEGIN
Process options and arguments:
S=server Server name.
Q=queue Queue name.
L=num LPT number: 1, 2, or 3.
SHow Display current printer redirection status.
Off=num|ALL Stop redirection of specified LPT# or all.
T=time-out Set time-out seconds from 1-1000, or 0 = off.
NCSLIST.EXE Pseudo Code
PROCEDURE DOS CODE ncslist main()
(DOS NetCon/NetWare Server List)
BEGIN
MAIN LOOP - Scan bindery for file servers.
FOR EACH file server found in bindery,
Print server name, network address, and connect status.
END FOR
END
NCLOGOUT.EXE Pseudo Code
PROCEDURE DOS CODE nclogout main()
(DOS Logout of NetCon Server)
BEGIN
IF no command-line arguments,
Call NW LogOut() - Log out from all logged-in servers.
ELSE FOR EACH file server named on the command-line,
Call NW LogOutFromFileServer() to log out of server.
END