This way sleep() knows that it should not interrupt the process
to serve awake().
Also rename Proc.insyscall to Proc.inkernel since that's the meaning
of the flag, which is only read to serve awake()'s mechanics and
to accounttime(). Indeed faultAmd64 was setting insyscall to 1.
The "write on closed pipe" note should be posted only
if the write occurred on a closed pipe.
Before this fix, on any interrupt caused the note to be sent,
despite the pipe being open and fully working.
Awake can now interrupt several blocking syscalls (even
during note handling).
Among others, it can interrupt await, pread and pwrite.
It cannot interrupt several others for different reasons:
- awake cannot be interrupted by awake;
- syscalls like remove and create can be used for kernel comunication
and it would be hard to know if the effect occurred in the
receiving fs if they were interrupted;
- other syscalls do not need awake since they just provide access
to kernel infos (eg seek or fd2path)
NOTE: awakes registered before a note cannot occur during the note
handling and will be deferred till the next call to noted.
With this commit all functions declared in libc.h have been renamed
with the "jehanne_" prefix. This is done for several reason:
- it removes conflicts during symbol resolution when linking
standard C libraries like newlib or musl
- it allows programs depending on a standard C library to directly
link to a library depending on our non standard libc (eg libsec).
To ease transiction two files are provided:
- sys/include/lib9.h that can be included instead of <libc.h> to use
the old names (via a simple set of macros)
- sys/src/lib/c/lib9.c that can be compiled with a program where the
macro provided by lib9.h are too dumb (see for example rc or grep).
In the kernel port/lib.h has been modified accordingly and some of
the functions it directly provides has been renamed too (eg malloc
in qmalloc.c and print in devcons.c).
CID 155471 (#1 of 1): Buffer not null terminated (BUFFER_SIZE_WARNING)67.
buffer_size_warning: Calling strncpy with a maximum size argument of 256 bytes on destination array envcopy of size 256 bytes might leave the destination string unterminated.
OREAD and OWRITE are used as array indexes assuming that OREAD was zero
and OWRITE was one. Thus each related allocation reserved just 2 slot and
even Ep struct in usb.h reserved just 2 int for toggles.
Since OREAD is now 1 and OWRITE is 2 we have to allocate/reserve 3 slot
as long as we use them as array indexes (which we could change in the future).
Unfortunately this means we waste the index zero in those arrays that will
always be unused. This also means that, to loop in such arrays we must begin
with OREAD as index zero is always empty.
PRO-MEMORIA: if/when we introduce the walk() syscall, OSTAT might turn useless.
In that case we might remove it and thus consider to move back OREAD/OWRITE
to 0/1 respectively (which might or might not be a good idea, to be analyzed).
In Plan9 the create syscall fallback on a open(OTRUNC) if the
path provided already exists. This is actually a common requirement
as most programs (editors, cat...) simply requires that a file is
there and is empty, and doesn't care overwriting existing contents
(note that this is particularily sensible with something like fossil).
In Jehanne the application is responsible of actually handle this
"file exists" error but libc provides ocreate() to mimic the Plan9
behaviour. Note that ocreate introduce a subtle race too: the path
is walked several times if the file exists, thus it could misbehave
on concurrent namespace changes. However I guess this is not going to
happen often enough to care now.
NOTE we will probably address this rare race too, with a more drammatic change
to syscalls: a new walk() syscall that will provide an unopen fd.
Added wdir to devself and devproc:
- read '#0/wdir' to get the working directory of the calling process
NOTE that a read(fd, nil, -1) will return the negated length
of the working directory, just in case you want to
allocate the memory required
- read '/proc/n/wdir' to know the working directory of process n
(read(fd, nil, -1) still returns the negated length)
- write '#0/wdir' to change the working directory of the calling process
NOTE: no offset is allowed and the provided string must
be null terminated
- write '/proc/n/wdir' to change the working directory of process n
NOTE: no offset is allowed and the provided string must
be null terminated; moreover if another process change the working
directory change during the write, the current process will
receive an error.
In libc updated getwd() and chdir().
Also modified pwd to get advantage of the new file.
To test, run /arch/amd64/qa/kern/wdir.rc or simply try
% pwd
/usr/glenda
% echo -n /tmp > /proc/$pid/wdir
% pwd
/tmp
% cat '#0/wdir' && echo
/tmp
The expected use cases for wdir in devproc are rio and acme.
Also, note that we could theoretically remove the cd builtin
from rc and simply implement it as a rc function.
We don't do that to preserve rc portability to other OS.
Devself provides to each process access to its own structures.
So far it contains four files:
- pid
- ppid
- pipes used to implement pipe(2)
- segments used to implement segattach, segdetach and segfree
Jehanne is going to use a new file protocol, but Plan 9 is really
coupled with 9P2000.
Renamed fcall.h as 9P2000.h and introduced specific constants such
as NP_OREAD, NP_OWRITE and so on, so that we can use different values
in the kernel and new protocol.
Renamed devmnt to devninep, since it's actually a device serving 9P2000
file systems.
Also, fixed 9P2000 support in Jehanne, that was broken with the introduction
of OSTAT.