Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ (10.2) — Plan9 3rd Edition (Vita Nuova)

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

ref(10.2)

NEWCHAN(10.2)

NAME

newchan, chanfree, cclose, eqqid, eqchan, isdir, fdtochan, namec − channel operations

SYNOPSIS

Chan∗newchan(void);

voidchanfree(Chan ∗c)

inteqqid(Qid a, Qid b);

inteqchan(Chan ∗a, Chan ∗b, int pathonly);

voidisdir(Chan ∗c);

Chan∗fdtochan(Fgrp ∗f, int fd, int mode, int chkmnt, int iref);

Chan∗namec(char ∗pathname, int amode, int omode, ulong perm);

voidcclose(Chan ∗c);

DESCRIPTION

A value of type ­Chan represents a kernel channel for I/O and name space operations.  It has the following public structure:

typedef struct Chan{
ulong     offset;     /∗ current file offset ∗/
ushort    type;       /∗ driver name ∗/
ulong     dev;        /∗ instance number ∗/
ushort    mode;       /∗ open mode ∗/
ushort    flag;       /∗ COPEN set once opened ∗/
Qid       qid;        /∗ unique id (path, vers) ∗/
Path∗     path;       /∗ see ptenter(10.2) ∗/
} Chan;

­Newchan returns a pointer to a newly allocated channel (sleeping if necessary until memory is available).  Device drivers do not normally call newchan directly, but instead allocate channels using either devattach, when a process attaches to the device’s root, or devclone, when an existing channel is cloned; see devattach(10.2).

­Chanfree frees the channel structure ­c for reuse. 

­Eqqid returns 1 if ­Qid values ­a and ­b are equal (ie, both their ­path and ­vers members are equal); it returns 0 otherwise. 

­Eqchan returns 1 if ­a and ­b have the same qid, type and dev members (ie, they represent the same file); it returns 0 otherwise.  If ­pathonly is non-zero, the comparison of the two ­qid members compares only their ­path values, ignoring the version field vers. 

­Isdir checks that a given channel ­c is a directory.  If so, it returns; otherwise, it generates an error(10.2), Enotdir. 

The ­Fgrp structure represents an array of open files, each represented by a Chan, indexed by integer file descriptors.  A given ­Fgrp can be shared between processes. 

­Fdtochan returns a pointer to the ­Chan corresponding to file descriptor ­fd in file descriptor group ­f (almost invariably up->env->fgrp, the file descriptor group for the current process).  If ­mode is a valid mode for sys-open(2), typically OREAD, ­OWRITE or ORDWR, it must correspond to the mode with which ­fd was originally opened; if ­mode is -1, no check is made.  If ­chkmnt is non-zero, ­c must not be a channel in use by the mount driver mnt(3). On successful return, if ­iref is non-zero, the channel’s reference count has been incremented.  ­Fdtochan calls error(10.2) if it detects invalid uses, in particular an invalid file descriptor fd.

­Namec looks up a ­pathname in the current name space and returns a channel.  ­Amode determines the mode of look up, and must be one of the constants below:

­Aaccess Access file for information, as in the stat command or call. 

­Atodir Access file as directory (the ­CHDIR bit of its ­qid.path must be set). 

­Aopen Access for I/O. 

­Amount Access directory to be mounted upon. 

­Acreate File is to be created. 

If ­amode is ­Aopen or Acreate, ­omode should be a mode suitable for sys-open(2); if Acreate, ­perm should be valid file permissions.  In all other cases, ­omode and ­perm can be zero. 

­Cclose decrements the reference count on c; if no further references remain, it calls the corresponding device’s ­Dev.close to close the channel, and frees c.

DIAGNOSTICS

Most functions call error(10.2) on any sort of error.

SOURCE

­/os/port/chan.c
­/emu/chan.c

SEE ALSO

ref(10.2)

Plan 9  —  June 09, 2000

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026