/*
- * $Id: afp_dsi.c,v 1.52 2010-03-08 19:49:59 franklahm Exp $
+ * $Id: afp_dsi.c,v 1.53 2010-03-30 12:55:26 franklahm Exp $
*
* Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu)
* Copyright (c) 1990,1993 Regents of The University of Michigan.
if ( afp_switch[ function ] != NULL ) {
dsi->datalen = DSI_DATASIZ;
child.flags |= CHILD_RUNNING;
+
+ LOG(log_debug, logtype_afpd, "<== Start AFP command: %s", AfpNum2name(function));
+
err = (*afp_switch[function])(obj,
(char *)&dsi->commands, dsi->cmdlen,
(char *)&dsi->data, &dsi->datalen);
+
+ LOG(log_debug, logtype_afpd, "==> Finished AFP command: %s -> %s",
+ AfpNum2name(function), AfpErr2name(err));
+
child.flags &= ~CHILD_RUNNING;
#ifdef FORCE_UIDGID
/* bring everything back to old euid, egid */
/*
- * $Id: fork.c,v 1.72 2010-02-26 12:31:02 didg Exp $
+ * $Id: fork.c,v 1.73 2010-03-30 12:55:26 franklahm Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
case EFBIG :
case ENOSPC :
return( AFPERR_DFULL );
+ case EACCES:
+ return AFPERR_ACCESS;
default :
LOG(log_error, logtype_afpd, "afp_write(%s): ad_write: %s", of_name(ofork), strerror(errno) );
return( AFPERR_PARAM );
/*
- * $Id: adouble.h,v 1.54 2010-03-12 15:16:49 franklahm Exp $
+ * $Id: adouble.h,v 1.55 2010-03-30 12:55:26 franklahm Exp $
* Copyright (c) 1990,1991 Regents of The University of Michigan.
* All Rights Reserved.
*
} adf_lock_t;
struct ad_fd {
- int adf_fd;
+ int adf_fd; /* -1: invalid, -2: symlink */
#ifndef HAVE_PREAD
off_t adf_off;
/*
- * $Id: ad_flush.c,v 1.13 2010-02-10 14:05:37 franklahm Exp $
+ * $Id: ad_flush.c,v 1.14 2010-03-30 12:55:26 franklahm Exp $
*
* Copyright (c) 1990,1991 Regents of The University of Michigan.
* All Rights Reserved.
{
int err = 0;
- if (( adflags & ADFLAGS_DF ) && ad_data_fileno(ad) != -1 &&
- !(--ad->ad_data_fork.adf_refcount)) {
- if (ad->ad_data_fork.adf_syml!=0){
+ if ((adflags & ADFLAGS_DF)
+ && ad_data_fileno(ad) >= 0
+ && --ad->ad_data_fork.adf_refcount == 0) {
+ if (ad->ad_data_fork.adf_syml !=0) {
free(ad->ad_data_fork.adf_syml);
- ad->ad_data_fork.adf_syml=0;
- }else{
- if ( close( ad_data_fileno(ad) ) < 0 ) {
- err = -1;
- }
+ ad->ad_data_fork.adf_syml = 0;
+ } else {
+ if ( close( ad_data_fileno(ad) ) < 0 )
+ err = -1;
}
ad_data_fileno(ad) = -1;
adf_lock_free(&ad->ad_data_fork);
/*
- * $Id: ad_lock.c,v 1.19 2010-02-26 12:57:50 didg Exp $
+ * $Id: ad_lock.c,v 1.20 2010-03-30 12:55:26 franklahm Exp $
*
* Copyright (c) 1998,1999 Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT for more information.
/* ----------------------- */
static int set_lock(int fd, int cmd, struct flock *lock)
{
- if (!fd) {
- /* We assign fd = 0 for symlinks -> do nothing */
+ if (fd == -2) {
+ /* We assign fd = -2 for symlinks -> do nothing */
if (cmd == F_GETLK)
lock->l_type = F_UNLCK;
return 0;
/*
- * $Id: ad_open.c,v 1.72 2010-03-12 15:16:49 franklahm Exp $
+ * $Id: ad_open.c,v 1.73 2010-03-30 12:55:26 franklahm Exp $
*
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
* Copyright (c) 1990,1991 Regents of The University of Michigan.
ad->ad_data_fork.adf_fd =open( path, hoflags | O_NOFOLLOW, admode );
- if (ad->ad_data_fork.adf_fd < 0 ) {
+ if (ad->ad_data_fork.adf_fd == -1) {
if ((errno == EACCES || errno == EROFS) && !(oflags & O_RDWR)) {
hoflags = oflags;
ad->ad_data_fork.adf_fd = open( path, hoflags | O_NOFOLLOW, admode );
}
- if (ad->ad_data_fork.adf_fd < 0 && errno == ELOOP) {
+ if (ad->ad_data_fork.adf_fd == -1 && errno == ELOOP) {
int lsz;
- if (oflags != O_RDONLY)
- return -1;
-
ad->ad_data_fork.adf_syml = malloc(PATH_MAX+1);
lsz = readlink(path, ad->ad_data_fork.adf_syml, PATH_MAX);
if (lsz <= 0) {
free(ad->ad_data_fork.adf_syml);
return -1;
}
- ad->ad_data_fork.adf_syml[lsz]=0;
+ ad->ad_data_fork.adf_syml[lsz] = 0;
ad->ad_data_fork.adf_syml = realloc(ad->ad_data_fork.adf_syml,lsz+1);
- // XX
- ad->ad_data_fork.adf_fd = 0;
+ ad->ad_data_fork.adf_fd = -2; /* -2 means its a symlink */
}
}
- if ( ad->ad_data_fork.adf_fd < 0)
+ if ( ad->ad_data_fork.adf_fd == -1 )
return -1;
AD_SET(ad->ad_data_fork.adf_off);
/*
- * $Id: ad_write.c,v 1.10 2009-10-13 22:55:37 didg Exp $
+ * $Id: ad_write.c,v 1.11 2010-03-30 12:55:26 franklahm Exp $
*
* Copyright (c) 1990,1995 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
{
struct stat st;
ssize_t cc;
+
+ if (ad_data_fileno(ad) == -2) {
+ /* It's a symlink */
+ errno = EACCES;
+ return -1;
+ }
if ( eid == ADEID_DFORK ) {
if ( end ) {