X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Fadouble%2Fad_open.c;h=b4e7c3a58cad0c8d92d547bc635a8ed92ce86db5;hp=6e9dc85c33eb1f7e74db2c041d6aa17ddc02d416;hb=refs%2Ftags%2Fafter-renameat;hpb=59a2b6f4e58dfa6db2487c25abdb58bce17c8fc8 diff --git a/libatalk/adouble/ad_open.c b/libatalk/adouble/ad_open.c index 6e9dc85c..b4e7c3a5 100644 --- a/libatalk/adouble/ad_open.c +++ b/libatalk/adouble/ad_open.c @@ -1,5 +1,5 @@ /* - * $Id: ad_open.c,v 1.71 2010-03-07 18:27:59 didg Exp $ + * $Id: ad_open.c,v 1.72 2010-03-12 15:16:49 franklahm Exp $ * * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -1586,6 +1586,41 @@ int ad_metadata(const char *name, int flags, struct adouble *adp) return ret; } +/* + * @brief openat like wrapper for ad_metadata + */ +int ad_metadataat(int dirfd, const char *name, int flags, struct adouble *adp) +{ + int ret = 0; + int cwdfd = -1; + + if (dirfd != -1) { + if ((cwdfd = open(".", O_RDONLY) == -1) || (fchdir(dirfd) != 0)) { + ret = -1; + goto exit; + } + } + + if (ad_metadata(name, flags, adp) < 0) { + ret = -1; + goto exit; + } + + if (dirfd != -1) { + if (fchdir(cwdfd) != 0) { + LOG(log_error, logtype_afpd, "ad_openat: cant chdir back, exiting"); + exit(EXITERR_SYS); + } + } + +exit: + if (cwdfd != -1) + close(cwdfd); + + return ret; + +} + /* ----------------------------------- */ static int new_rfork(const char *path, struct adouble *ad, int adflags) { @@ -1665,3 +1700,39 @@ int ad_refresh(struct adouble *ad) return ad->ad_ops->ad_header_read(ad, NULL); } + +int ad_openat(int dirfd, /* dir fd openat like */ + const char *path, + int adflags, + int oflags, + int mode, + struct adouble *ad) +{ + int ret = 0; + int cwdfd = -1; + + if (dirfd != -1) { + if ((cwdfd = open(".", O_RDONLY) == -1) || (fchdir(dirfd) != 0)) { + ret = -1; + goto exit; + } + } + + if (ad_open(path, adflags, oflags, mode, ad) < 0) { + ret = -1; + goto exit; + } + + if (dirfd != -1) { + if (fchdir(cwdfd) != 0) { + LOG(log_error, logtype_afpd, "ad_openat: cant chdir back, exiting"); + exit(EXITERR_SYS); + } + } + +exit: + if (cwdfd != -1) + close(cwdfd); + + return ret; +}