X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fadouble%2Fad_conv.c;h=2a75ec62b576bb25a6ade1a269cee52db5c98bba;hb=145e887d405fa335dc7cb045782c876f045d3b3e;hp=10284dbbbb551faecc8e45da6f0a0885b7c53e24;hpb=8fed5c3721b742930a3789f58c104d2a7a234dcf;p=netatalk.git diff --git a/libatalk/adouble/ad_conv.c b/libatalk/adouble/ad_conv.c index 10284dbb..2a75ec62 100644 --- a/libatalk/adouble/ad_conv.c +++ b/libatalk/adouble/ad_conv.c @@ -57,15 +57,23 @@ static int ad_conv_v22ea_hf(const char *path, const struct stat *sp, const struc EC_INIT; struct adouble adv2; struct adouble adea; - const char *adpath; int adflags; uint32_t ctime, mtime, afpinfo = 0; char *emptyad; - LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): BEGIN", fullpathname(path)); + LOG(log_debug, logtype_ad,"ad_conv_v22ea_hf(\"%s\"): BEGIN", fullpathname(path)); + + switch (S_IFMT & sp->st_mode) { + case S_IFREG: + case S_IFDIR: + break; + default: + return 0; + } ad_init(&adea, vol); ad_init_old(&adv2, AD_VERSION2, adea.ad_options); + adflags = S_ISDIR(sp->st_mode) ? ADFLAGS_DIR : 0; /* Open and lock adouble:v2 file */ @@ -97,20 +105,22 @@ static int ad_conv_v22ea_hf(const char *path, const struct stat *sp, const struc goto copy; } - LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): default adouble", fullpathname(path), ret); + LOG(log_debug, logtype_ad,"ad_conv_v22ea_hf(\"%s\"): default adouble", fullpathname(path), ret); goto EC_CLEANUP; copy: /* Create a adouble:ea meta EA */ - LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): copying adouble", fullpathname(path), ret); - EC_ZERO_LOG( ad_open(&adea, path, adflags | ADFLAGS_HF | ADFLAGS_RDWR | ADFLAGS_CREATE) ); + LOG(log_debug, logtype_ad,"ad_conv_v22ea_hf(\"%s\"): copying adouble", fullpathname(path), ret); + EC_ZERO_LOGSTR( ad_open(&adea, path, adflags | ADFLAGS_HF | ADFLAGS_RDWR | ADFLAGS_CREATE), + "ad_conv_v22ea_hf(\"%s\"): error creating metadata EA: %s", + fullpathname(path), strerror(errno)); EC_ZERO_LOG( ad_copy_header(&adea, &adv2) ); ad_flush(&adea); EC_CLEANUP: EC_ZERO_LOG( ad_close(&adv2, ADFLAGS_HF | ADFLAGS_SETSHRMD) ); EC_ZERO_LOG( ad_close(&adea, ADFLAGS_HF | ADFLAGS_SETSHRMD) ); - LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): END: %d", fullpathname(path), ret); + LOG(log_debug, logtype_ad,"ad_conv_v22ea_hf(\"%s\"): END: %d", fullpathname(path), ret); EC_EXIT; } @@ -120,7 +130,14 @@ static int ad_conv_v22ea_rf(const char *path, const struct stat *sp, const struc struct adouble adv2; struct adouble adea; - LOG(log_debug, logtype_default,"ad_conv_v22ea_rf(\"%s\"): BEGIN", fullpathname(path)); + LOG(log_debug, logtype_ad,"ad_conv_v22ea_rf(\"%s\"): BEGIN", fullpathname(path)); + + switch (S_IFMT & sp->st_mode) { + case S_IFREG: + break; + default: + return 0; + } if (S_ISDIR(sp->st_mode)) return 0; @@ -140,12 +157,14 @@ static int ad_conv_v22ea_rf(const char *path, const struct stat *sp, const struc EC_ZERO_LOG( copy_fork(ADEID_RFORK, &adea, &adv2) ); adea.ad_rlen = adv2.ad_rlen; ad_flush(&adea); + fchmod(ad_reso_fileno(&adea), sp->st_mode & 0666); + fchown(ad_reso_fileno(&adea), sp->st_uid, sp->st_gid); } EC_CLEANUP: EC_ZERO_LOG( ad_close(&adv2, ADFLAGS_HF | ADFLAGS_RF) ); EC_ZERO_LOG( ad_close(&adea, ADFLAGS_HF | ADFLAGS_RF) ); - LOG(log_debug, logtype_default,"ad_conv_v22ea_rf(\"%s\"): END: %d", fullpathname(path), ret); + LOG(log_debug, logtype_ad,"ad_conv_v22ea_rf(\"%s\"): END: %d", fullpathname(path), ret); EC_EXIT; } @@ -155,20 +174,26 @@ static int ad_conv_v22ea(const char *path, const struct stat *sp, const struct v const char *adpath; int adflags = S_ISDIR(sp->st_mode) ? ADFLAGS_DIR : 0; - EC_ZERO( ad_conv_v22ea_hf(path, sp, vol) ); - EC_ZERO( ad_conv_v22ea_rf(path, sp, vol) ); + become_root(); + + if (ad_conv_v22ea_hf(path, sp, vol) != 0) + goto delete; + if (ad_conv_v22ea_rf(path, sp, vol) != 0) + goto delete; +delete: EC_NULL( adpath = ad_path(path, adflags) ); - LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): deleting adouble:v2 file: \"%s\"", + LOG(log_debug, logtype_ad,"ad_conv_v22ea_hf(\"%s\"): deleting adouble:v2 file: \"%s\"", path, fullpathname(adpath)); - become_root(); - EC_ZERO_LOG( unlink(adpath) ); - unbecome_root(); + unlink(adpath); EC_CLEANUP: if (errno == ENOENT) EC_STATUS(0); + + unbecome_root(); + EC_EXIT; } @@ -179,25 +204,41 @@ static int ad_conv_dehex(const char *path, const struct stat *sp, const struct v { EC_INIT; static char buf[MAXPATHLEN]; - const char *adpath, *p; int adflags = S_ISDIR(sp->st_mode) ? ADFLAGS_DIR : 0; bstring newpath = NULL; + static bstring str2e = NULL; + static bstring str2f = NULL; + static bstring strdot = NULL; + static bstring strcolon = NULL; + char *newadpath = NULL; + + if (str2e == NULL) { + str2e = bfromcstr(":2e"); + str2f = bfromcstr(":2f"); + strdot = bfromcstr("."); + strcolon = bfromcstr(":"); + } - LOG(log_debug, logtype_default,"ad_conv_dehex(\"%s\"): BEGIN", fullpathname(path)); + LOG(log_debug, logtype_ad,"ad_conv_dehex(\"%s\"): BEGIN", fullpathname(path)); *newpathp = NULL; - if ((p = strchr(path, ':')) == NULL) + if (((strstr(path, ":2e")) == NULL) && ((strstr(path, ":2f")) == NULL) ) goto EC_CLEANUP; EC_NULL( newpath = bfromcstr(path) ); - EC_ZERO( bfindreplace(newpath, bfromcstr(":2e"), bfromcstr("."), 0) ); - EC_ZERO( bfindreplace(newpath, bfromcstr(":2f"), bfromcstr(":"), 0) ); + EC_ZERO( bfindreplace(newpath, str2e, strdot, 0) ); + EC_ZERO( bfindreplace(newpath, str2f, strcolon, 0) ); become_root(); - if (adflags != ADFLAGS_DIR) - rename(vol->ad_path(path, 0), vol->ad_path(bdata(newpath), 0)); + if (adflags != ADFLAGS_DIR) { + if ((newadpath = strdup(vol->ad_path(bdata(newpath), 0))) == NULL) { + unbecome_root(); + EC_FAIL; + } + rename(vol->ad_path(path, 0), newadpath); + } rename(path, bdata(newpath)); unbecome_root(); @@ -207,6 +248,8 @@ static int ad_conv_dehex(const char *path, const struct stat *sp, const struct v EC_CLEANUP: if (newpath) bdestroy(newpath); + if (newadpath) + free(newadpath); EC_EXIT; } @@ -226,11 +269,14 @@ int ad_convert(const char *path, const struct stat *sp, const struct vol *vol, c EC_INIT; const char *p; - LOG(log_debug, logtype_default,"ad_convert(\"%s\"): BEGIN", fullpathname(path)); + LOG(log_debug, logtype_ad,"ad_convert(\"%s\"): BEGIN", fullpathname(path)); if (newpath) *newpath = NULL; + if (vol->v_flags & AFPVOL_RO) + EC_EXIT_STATUS(0); + if ((vol->v_adouble == AD_VERSION_EA) && !(vol->v_flags & AFPVOL_NOV2TOEACONV)) EC_ZERO( ad_conv_v22ea(path, sp, vol) ); @@ -241,7 +287,7 @@ int ad_convert(const char *path, const struct stat *sp, const struct vol *vol, c } EC_CLEANUP: - LOG(log_debug, logtype_default,"ad_convert(\"%s\"): END: %d", fullpathname(path), ret); + LOG(log_debug, logtype_ad,"ad_convert(\"%s\"): END: %d", fullpathname(path), ret); EC_EXIT; }