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.
53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
/*
|
|
* This file is part of Jehanne.
|
|
*
|
|
* Copyright (C) 2016 Giacomo Tesio <giacomo@tesio.it>
|
|
*
|
|
* Jehanne is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, version 2 of the License.
|
|
*
|
|
* Jehanne is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Jehanne. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include <u.h>
|
|
#include <libc.h>
|
|
|
|
int verbose = 1;
|
|
|
|
void
|
|
main(void)
|
|
{
|
|
int ret = 0; // success
|
|
uint64_t start, end;
|
|
char *msg;
|
|
|
|
start = sys_nsec();
|
|
sleep(1);
|
|
end = sys_nsec();
|
|
|
|
if (end <= start)
|
|
ret = 1;
|
|
|
|
if (verbose)
|
|
print("nsec: start %llx, end %llx\n", start, end);
|
|
if(ret){
|
|
msg = smprint("nsec: FAIL: start %llx end %llx",
|
|
start, end);
|
|
print("%s\n", msg);
|
|
exits(msg);
|
|
}
|
|
|
|
int fd;
|
|
fd = open("#|", ORDWR);
|
|
sys_mount(fd, -1, "/tmp", MREPL, "", 'M');
|
|
|
|
print("PASS\n");
|
|
exits("PASS");
|
|
}
|