pwd -LP
This commit is contained in:
parent
0a3a8c55e4
commit
3172b979dc
2
ln.1
2
ln.1
|
@ -19,7 +19,7 @@ be linked into the given directory.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
.B \-s
|
.B \-s
|
||||||
create a symbolic link.
|
create a symlink.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.IR cp (1),
|
.IR cp (1),
|
||||||
.IR link (2),
|
.IR link (2),
|
||||||
|
|
4
ls.c
4
ls.c
|
@ -186,8 +186,8 @@ output(Entry *ent)
|
||||||
if(ent->mode & S_IWOTH) mode[8] = 'w';
|
if(ent->mode & S_IWOTH) mode[8] = 'w';
|
||||||
if(ent->mode & S_IXOTH) mode[9] = 'x';
|
if(ent->mode & S_IXOTH) mode[9] = 'x';
|
||||||
|
|
||||||
if(ent->mode & S_ISUID) mode[3] = (mode[3] == 'x' ? 's' : 'S');
|
if(ent->mode & S_ISUID) mode[3] = (mode[3] == 'x') ? 's' : 'S';
|
||||||
if(ent->mode & S_ISGID) mode[6] = (mode[6] == 'x' ? 's' : 'S');
|
if(ent->mode & S_ISGID) mode[6] = (mode[6] == 'x') ? 's' : 'S';
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pw = getpwuid(ent->uid);
|
pw = getpwuid(ent->uid);
|
||||||
|
|
9
pwd.1
9
pwd.1
|
@ -3,8 +3,17 @@
|
||||||
pwd \- print working directory
|
pwd \- print working directory
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B pwd
|
.B pwd
|
||||||
|
.RB [ \-LP ]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B pwd
|
.B pwd
|
||||||
prints the path of the current working directory.
|
prints the path of the current working directory.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.B \-L
|
||||||
|
logical path, uses $PWD (default).
|
||||||
|
.TP
|
||||||
|
.B \-P
|
||||||
|
physical path, avoids all symlinks.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
|
.IR cd (1),
|
||||||
.IR getcwd (3)
|
.IR getcwd (3)
|
||||||
|
|
37
pwd.c
37
pwd.c
|
@ -1,11 +1,44 @@
|
||||||
/* See LICENSE file for copyright and license details. */
|
/* See LICENSE file for copyright and license details. */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
static const char *getpwd(const char *cwd);
|
||||||
|
|
||||||
int
|
int
|
||||||
main(void)
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
puts(agetcwd());
|
char *cwd, c;
|
||||||
|
char mode = 'L';
|
||||||
|
|
||||||
|
while((c = getopt(argc, argv, "LP")) != -1)
|
||||||
|
switch(c) {
|
||||||
|
case 'L':
|
||||||
|
case 'P':
|
||||||
|
mode = c;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
cwd = agetcwd();
|
||||||
|
puts((mode == 'L') ? getpwd(cwd) : cwd);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
getpwd(const char *cwd)
|
||||||
|
{
|
||||||
|
const char *pwd;
|
||||||
|
struct stat cst, pst;
|
||||||
|
|
||||||
|
if(!(pwd = getenv("PWD")) || pwd[0] != '/' || stat(pwd, &pst) != 0)
|
||||||
|
return cwd;
|
||||||
|
if(stat(cwd, &cst) != 0)
|
||||||
|
eprintf("stat %s:", cwd);
|
||||||
|
if(pst.st_dev == cst.st_dev && pst.st_ino == cst.st_ino)
|
||||||
|
return pwd;
|
||||||
|
else
|
||||||
|
return cwd;
|
||||||
|
}
|
||||||
|
|
2
touch.c
2
touch.c
|
@ -50,7 +50,7 @@ touch(const char *str)
|
||||||
eprintf("stat %s:", str);
|
eprintf("stat %s:", str);
|
||||||
if(cflag)
|
if(cflag)
|
||||||
return;
|
return;
|
||||||
if((fd = creat(str, O_RDONLY|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0)
|
if((fd = creat(str, O_EXCL|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0)
|
||||||
eprintf("creat %s:", str);
|
eprintf("creat %s:", str);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user