On Wed, May 18, 2022 at 6:26 AM Waldemar Kozaczuk <[email protected]> wrote:
> This patch implements the symlinkat() function and enhances > tst-symlink.cc to unit test it. > > Signed-off-by: Waldemar Kozaczuk <[email protected]> > --- > exported_symbols/osv_ld-musl.so.1.symbols | 1 + > exported_symbols/osv_libc.so.6.symbols | 1 + > fs/vfs/main.cc | 12 ++++++++++++ > tests/tst-symlink.cc | 18 +++++++++++++++--- > 4 files changed, 29 insertions(+), 3 deletions(-) > > diff --git a/exported_symbols/osv_ld-musl.so.1.symbols > b/exported_symbols/osv_ld-musl.so.1.symbols > index f1c61a3f..3db22e0d 100644 > --- a/exported_symbols/osv_ld-musl.so.1.symbols > +++ b/exported_symbols/osv_ld-musl.so.1.symbols > @@ -1081,6 +1081,7 @@ swab > swprintf > swscanf > symlink > +symlinkat > sync > syscall > sysconf > diff --git a/exported_symbols/osv_libc.so.6.symbols > b/exported_symbols/osv_libc.so.6.symbols > index 7ae57c38..e29059bb 100644 > --- a/exported_symbols/osv_libc.so.6.symbols > +++ b/exported_symbols/osv_libc.so.6.symbols > @@ -887,6 +887,7 @@ swprintf > __swprintf_chk > swscanf > symlink > +symlinkat > sync > syscall > sysconf > diff --git a/fs/vfs/main.cc b/fs/vfs/main.cc > index 4f0ce463..1b0d7c11 100644 > --- a/fs/vfs/main.cc > +++ b/fs/vfs/main.cc > @@ -1122,6 +1122,18 @@ int symlink(const char *oldpath, const char > *newpath) > return 0; > } > > +OSV_LIBC_API > +int symlinkat(const char *oldpath, int newdirfd, const char *newpath) > +{ > + if (newpath[0] == '/' || newdirfd == AT_FDCWD) { > + return symlink(oldpath, newpath); > + } > + > + return vfs_fun_at(newdirfd, newpath, [oldpath](const char > *absolute_path) { > + return symlink(oldpath, absolute_path); > + }); > And here again, if vfs_fun_at() did that at_fdcwd if() above, this code would have been even simpler. +} > + > TRACEPOINT(trace_vfs_unlink, "\"%s\"", const char*); > TRACEPOINT(trace_vfs_unlink_ret, ""); > TRACEPOINT(trace_vfs_unlink_err, "%d", int); > diff --git a/tests/tst-symlink.cc b/tests/tst-symlink.cc > index 978cfda3..1322e79e 100644 > --- a/tests/tst-symlink.cc > +++ b/tests/tst-symlink.cc > @@ -25,6 +25,9 @@ > > #define N1 "f1" > #define N2 "f2_AAA" > +#define N2B "f2_BBB" > +#define N2B "f2_BBB" > +#define N2C "f2_CCC" > #define N3 "f3" > #define N4 "f4" > #define N5 "f5" > @@ -91,6 +94,8 @@ int main(int argc, char **argv) > #endif > > report(chdir(TESTDIR) == 0, "chdir"); > + auto test_dir = opendir(TESTDIR); > + report(test_dir, "opendir"); > > /* > * test to check > @@ -115,6 +120,10 @@ int main(int argc, char **argv) > #else > report(symlink(N1, N2) == 0, "symlink"); > report(search_dir(TESTDIR, N2) == true, "search dir"); > + report(symlinkat(N1, dirfd(test_dir), N2B) == 0, "symlinkat"); > + report(search_dir(TESTDIR, N2B) == true, "search dir N2B"); > + report(symlinkat(N1, AT_FDCWD, N2C) == 0, "symlinkat"); > + report(search_dir(TESTDIR, N2C) == true, "search dir N2B"); > #endif > > #if defined(READ_ONLY_FS) > @@ -125,6 +134,8 @@ int main(int argc, char **argv) > #else > report(access(N1, R_OK | W_OK) == 0, "access"); > report(access(N2, R_OK | W_OK) == 0, "access"); > + report(access(N2B, R_OK | W_OK) == 0, "access"); > + report(access(N2C, R_OK | W_OK) == 0, "access"); > #endif > > rc = readlink(N2, path, sizeof(path)); > @@ -157,6 +168,8 @@ int main(int argc, char **argv) > error = errno; > report(rc < 0 && errno == ENOENT, "ENOENT expected"); > report(unlink(N2) == 0, "unlink"); > + report(unlinkat(dirfd(test_dir),N2B,0) == 0, "unlinkat"); > + report(unlinkat(dirfd(test_dir),N2C,0) == 0, "unlinkat"); > > /* > * IO Tests 1: write(file), read(symlink), truncate(symlink) > @@ -365,8 +378,6 @@ int main(int argc, char **argv) > report(search_dir(D2, N5) == true, "Symlink search"); > > report(rename(D2, D3) == 0, "rename(d2, d3)"); > - auto test_dir = opendir(TESTDIR); > - report(test_dir, "opendir"); > rc = readlinkat(dirfd(test_dir), D3, path, sizeof(path)); > report(rc >= 0, "readlinkat"); > path[rc] = 0; > @@ -381,7 +392,6 @@ int main(int argc, char **argv) > report(rc >= 0, "readlinkat"); > path[rc] = 0; > report(strcmp(path, D1) == 0, "readlinkat path"); > - report(closedir(test_dir) == 0, "closedir(test_dir)"); > rc = readlink(D3, path, sizeof(path)); > report(rc >= 0, "readlink"); > path[rc] = 0; > @@ -399,6 +409,8 @@ int main(int argc, char **argv) > report(rmdir(D4) == 0, "rmdir"); > #endif > > + report(closedir(test_dir) == 0, "closedir(test_dir)"); > + > #if defined(READ_ONLY_FS) > report(-1 == rmdir(TESTDIR) && errno == ENOTEMPTY, "rmdir"); > #else > -- > 2.34.1 > > -- > You received this message because you are subscribed to the Google Groups > "OSv Development" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/osv-dev/20220518032648.76794-1-jwkozaczuk%40gmail.com > . > -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/CANEVyjvM7%2ByUTzhht0j1NroME03k7DAP5oTZ6%2BnBn1miq%2Bpi8A%40mail.gmail.com.
