]> arthur.barton.de Git - netatalk.git/commitdiff
Merge master
authorFrank Lahm <franklahm@googlemail.com>
Wed, 1 Jun 2011 14:03:25 +0000 (16:03 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Wed, 1 Jun 2011 14:03:25 +0000 (16:03 +0200)
52 files changed:
1  2 
bin/ad/ad.h
bin/ad/ad_cp.c
etc/afpd/Makefile.am
etc/afpd/afp_config.c
etc/afpd/afp_config.h
etc/afpd/afp_dsi.c
etc/afpd/afp_options.c
etc/afpd/auth.c
etc/afpd/auth.h
etc/afpd/desktop.c
etc/afpd/desktop.h
etc/afpd/directory.c
etc/afpd/directory.h
etc/afpd/extattrs.c
etc/afpd/file.c
etc/afpd/file.h
etc/afpd/filedir.c
etc/afpd/filedir.h
etc/afpd/fork.c
etc/afpd/fork.h
etc/afpd/gettok.c
etc/afpd/icon.h
etc/afpd/main.c
etc/afpd/messages.c
etc/afpd/misc.h
etc/afpd/ofork.c
etc/afpd/status.c
etc/afpd/status.h
etc/afpd/uam.c
etc/afpd/uam_auth.h
etc/afpd/volume.c
etc/afpd/volume.h
etc/cnid_dbd/cnid_metad.c
include/atalk/Makefile.am
include/atalk/directory.h
include/atalk/dsi.h
include/atalk/globals.h
include/atalk/paths.h
include/atalk/server_child.h
include/atalk/uam.h
include/atalk/util.h
include/atalk/uuid.h
include/atalk/volume.h
libatalk/acl/cache.c
libatalk/acl/cache.h
libatalk/acl/uuid.c
libatalk/cnid/dbd/cnid_dbd.c
libatalk/dsi/dsi_getsess.c
libatalk/dsi/dsi_stream.c
libatalk/util/server_child.c
libatalk/util/server_ipc.c
macros/netatalk.m4

diff --cc bin/ad/ad.h
Simple merge
diff --cc bin/ad/ad_cp.c
Simple merge
index 9b3fcae6063c5ecd7379a5e90642d841dc860a21,bcc8a17d460d32511dd029c742c472bcde882d8a..34edab51f9c439a68b8f8656715ea19c4ebe27ae
@@@ -3,9 -3,10 +3,9 @@@
  pkgconfdir = @PKGCONFDIR@
  
  sbin_PROGRAMS = afpd
- noinst_PROGRAMS = hash
+ noinst_PROGRAMS = hash fce
  
  afpd_SOURCES = \
 -      afp_asp.c \
        afp_avahi.c \
        afp_config.c \
        afp_dsi.c \
Simple merge
index 7a603512af2c8538896a3a05a429bded201a0ae8,7d5c482a16951a17c4e87923a099b8d5069b0c14..022a6e65d41e1c979fb7597408b41fb1dd47c139
@@@ -1,9 -1,17 +1,8 @@@
  #ifndef AFPD_CONFIG_H
  #define AFPD_CONFIG_H 1
  
 -#ifdef HAVE_SYS_CDEFS_H
 -#include <sys/cdefs.h>
 -#endif /* HAVE_SYS_CDEFS_H */
 -
  #include <atalk/server_child.h>
- #include "globals.h"
 -#include <atalk/atp.h>
+ #include <atalk/globals.h>
  
  typedef struct AFPConfig {
      AFPObj obj;
index dfebaca0fb8f20e1781d46388afc469635a9bd07,0e9a21640ef303a656bdb0b0851eac686f44aa14..bde1818bd7a1598ceedb48626671b45de674e9e6
  #include <atalk/dsi.h>
  #include <atalk/compat.h>
  #include <atalk/util.h>
 -
 +#include <atalk/locking.h>
+ #include <atalk/uuid.h>
+ #include <atalk/paths.h>
+ #include <atalk/server_ipc.h>
+ #include <atalk/fce_api.h>
- #include "globals.h"
+ #include <atalk/globals.h>
 +
  #include "switch.h"
  #include "auth.h"
  #include "fork.h"
Simple merge
diff --cc etc/afpd/auth.c
Simple merge
diff --cc etc/afpd/auth.h
index e7f141ba0f426f07bf7685bebc07fbac90498252,d26354f38d972a58400d41bbcb2d78d47ab3e09d..1d4792454204c36ac28311d1f6c698d78b31a793
@@@ -6,9 -8,15 +6,9 @@@
  #ifndef AFPD_AUTH_H
  #define AFPD_AUTH_H 1
  
 -#ifdef HAVE_LIMITS_H
  #include <limits.h>
 -#endif /* HAVE_LIMITS_H */
 -
 -#ifdef HAVE_SYS_CDEFS_H
 -#include <sys/cdefs.h>
 -#endif /* HAVE_SYS_CDEFS_H */
  
- #include "globals.h"
+ #include <atalk/globals.h>
  
  struct afp_versions {
      char      *av_name;
Simple merge
index c9d0e99e3f22b39c98725d0bd98afa2125d0f476,a220a478ee7eebf19841f3c69fcb2f43217ab32f..ccaa1654ab3b9c63a8f1c57b9c5ed3a679cee469
@@@ -26,7 -26,8 +26,8 @@@
  #ifndef AFPD_DESKTOP_H
  #define AFPD_DESKTOP_H 1
  
- #include "globals.h"
 -#include <sys/cdefs.h>
+ #include <atalk/globals.h>
++
  #include "volume.h"
  
  struct savedt {
index df01ccc4b63e5a93fe345dfe3d0003ef9cab58b0,fe628e0c61b9fc692420bed1c87171b7d9b2f2cf..b139cbcd661952e1ebe5aef0ecdf6a7c605706ed
@@@ -1485,8 -1487,31 +1487,31 @@@ int getdirparams(const struct vol *vol
                     (1 << DIRPBIT_FINFO)))) {
  
          ad_init(&ad, vol->v_adouble, vol->v_ad_options);
 -        if ( !ad_metadata( upath, ADFLAGS_CREATE|ADFLAGS_DIR, &ad) ) {
 +        if ( !ad_metadata( upath, ADFLAGS_DIR, &ad) )
              isad = 1;
+             if (ad.ad_md->adf_flags & O_CREAT) {
+                 /* We just created it */
+                 if (s_path->m_name == NULL) {
+                     if ((s_path->m_name = utompath(vol,
+                                                    upath,
+                                                    dir->d_did,
+                                                    utf8_encoding())) == NULL) {
+                         LOG(log_error, logtype_afpd,
+                             "getdirparams(\"%s\"): can't assign macname",
+                             cfrombstr(dir->d_fullpath));
+                         return AFPERR_MISC;
+                     }
+                 }
+                 ad_setname(&ad, s_path->m_name);
+                 ad_setid( &ad,
+                           s_path->st.st_dev,
+                           s_path->st.st_ino,
+                           dir->d_did,
+                           dir->d_pdid,
+                           vol->v_stamp);
+                 ad_flush( &ad);
+             }
+         }
      }
  
      pdid = dir->d_pdid;
Simple merge
Simple merge
diff --cc etc/afpd/file.c
index b5a896373683c88e7380af2da72c36e6ca06f98c,ec85f37a52e0dfdefb79335b05e447bb970138ea..549f19ddfd4e06bebd0634648a406419fcb02587
@@@ -741,11 -769,14 +742,12 @@@ int afp_createfile(AFPObj *obj, char *i
          return AFPERR_MISC;
      }
  
 -    (void)get_id(vol, adp, &st, dir->d_did, upath, strlen(upath));
 -
 -    ad_flush( adp);
 +    (void)get_id(vol, &ad, &st, dir->d_did, upath, strlen(upath));
  
 +    ad_flush(&ad);
 +    ad_close(&ad, ADFLAGS_DF|ADFLAGS_HF );
+     fce_register_new_file(s_path);
  
 -    ad_close( adp, ADFLAGS_DF|ADFLAGS_HF );
 -
  createfile_done:
      curdir->d_offcnt++;
  
diff --cc etc/afpd/file.h
index bd9f77645eb29f9d7e73f52b3724053fa14c83e8,077cd1203b214f98eebccb634fc8b83c82593dcc..654ce83061a4612f08e35e999fafd3271e5141fd
  
  /*#include <sys/stat.h>*/ /* including it here causes some confusion */
  #include <sys/param.h>
 -#include <sys/cdefs.h>
 -#include <netatalk/endian.h>
 +#include <arpa/inet.h>
  #include <atalk/adouble.h>
+ #include <atalk/globals.h>
  
- #include "globals.h"
  #include "volume.h"
  #include "directory.h"
  
Simple merge
index 9645bc00823e01b95fc9dd26424d8d60b9b5d5e1,5daf73f3c975bf0fb000f00a56d77c621b1a62a2..02c9ac15b5382ed99c5ee4cf7a84166d4e85cfda
@@@ -1,8 -1,13 +1,8 @@@
  #ifndef AFPD_FILEDIR_H
  #define AFPD_FILEDIR_H 1
  
 -#include <sys/cdefs.h>
  #include <sys/stat.h>
- #include "globals.h"
+ #include <atalk/globals.h>
  #include "volume.h"
  
  extern struct afp_options default_options;
diff --cc etc/afpd/fork.c
index 4133eebdbe40544bee0f1d77810f617ee8fb865a,00436dbc01ab8dd4f29e654e9fd533eea7c99ab7..e075945cc5253aa8d796790f029aab97db845aae
  #endif /* HAVE_CONFIG_H */
  
  #include <stdio.h>
 -
  #include <string.h>
  #include <errno.h>
 -
 -#include <atalk/adouble.h>
 -#include <atalk/logger.h>
 -
  #include <sys/param.h>
  #include <sys/socket.h>
 -
 -#include <netatalk/at.h>
 +#include <inttypes.h>
  
- #include <netatalk/at.h>
  #include <atalk/dsi.h>
 -#include <atalk/atp.h>
 -#include <atalk/asp.h>
  #include <atalk/afp.h>
 +#include <atalk/adouble.h>
 +#include <atalk/logger.h>
  #include <atalk/util.h>
  #include <atalk/cnid.h>
 +#include <atalk/bstradd.h>
+ #include <atalk/globals.h>
  
  #include "fork.h"
  #include "file.h"
diff --cc etc/afpd/fork.h
Simple merge
Simple merge
diff --cc etc/afpd/icon.h
index 2c90683afc86fb6bd7bb104311b3e9b7fb9cda75,c3214a0a762b71cc84e4f469f0c14d99dc95451a..c26b6fd63e4e56cc647155f9f47e850a0274523f
@@@ -6,7 -8,8 +6,7 @@@
  #ifndef AFPD_ICON_H
  #define AFPD_ICON_H 1
  
- #include "globals.h"
 -#include <sys/cdefs.h>
+ #include <atalk/globals.h>
  
  static const unsigned char apple_atalk_icon[] = { /* default appletalk icon */
      0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
diff --cc etc/afpd/main.c
index 37bb4bd4a0916ba6c54ce5b074fa081edca47fe1,63452d9e350fc8ceea033a82c889027c544c504e..68785537e3d7c945e7035577989a5aa3e73a47f7
  #include <sys/poll.h>
  #include <errno.h>
  #include <sys/wait.h>
+ #include <sys/resource.h>
  
 +#include <atalk/logger.h>
  #include <atalk/adouble.h>
 -
--#include <netatalk/at.h>
  #include <atalk/compat.h>
  #include <atalk/dsi.h>
 -#include <atalk/atp.h>
 -#include <atalk/asp.h>
  #include <atalk/afp.h>
  #include <atalk/paths.h>
  #include <atalk/util.h>
  #include <atalk/server_child.h>
  #include <atalk/server_ipc.h>
 +#include <atalk/errchk.h>
 +#include <atalk/locking.h>
+ #include <atalk/globals.h>
  
- #include "globals.h"
 +#include "event2/event.h"
 +#include "event2/http.h"
 +#include "event2/rpc.h"
 +
  #include "afp_config.h"
  #include "status.h"
  #include "fork.h"
@@@ -112,12 -112,24 +114,20 @@@ static void fd_reset_listening_sockets(
  /* ------------------ */
  static void afp_goaway(int sig)
  {
-     switch( sig ) {
 -        AFPConfig *config;
 -
 -#ifndef NO_DDP
 -    asp_kill(sig);
 -#endif /* ! NO_DDP */
++    AFPConfig *config;
  
-     case SIGTERM :
-         LOG(log_note, logtype_afpd, "AFP Server shutting down on SIGTERM");
-         AFPConfig *config;
+     switch( sig ) {
  
+     case SIGTERM:
+     case SIGQUIT:
+         switch (sig) {
+         case SIGTERM:
+             LOG(log_note, logtype_afpd, "AFP Server shutting down on SIGTERM");
+             break;
+         case SIGQUIT:
+             LOG(log_note, logtype_afpd, "AFP Server shutting down on SIGQUIT, NOT disconnecting clients");
+             break;
+         }
          if (server_children)
              server_child_kill(server_children, CHILD_DSIFORK, sig);
  
@@@ -314,19 -361,19 +359,25 @@@ int main(int ac, char **av
      }
      pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
  
 -    /* Register CNID  */
 +    /* Initialize */
      cnid_init();
 -
 +    if (locktable_init("XXX") != 0)
 +        exit(EXITERR_SYS);
 +#if 0
 +    if (rpc_init("127.0.0.1", 4701) != 0)
 +        exit(EXITERR_SYS);
 +#endif
 +    
      /* watch atp, dsi sockets and ipc parent/child file descriptor. */
+     disasociated_ipc_fd = ipc_server_uds(_PATH_AFP_IPC);
      fd_set_listening_sockets();
  
+     /* set limits */
+     (void)setlimits();
      afp_child_t *child;
+     int fd[2];  /* we only use one, but server_child_add expects [2] */
+     pid_t pid;
  
      /* wait for an appleshare connection. parent remains in the loop
       * while the children get handled by afp_over_{asp,dsi}.  this is
Simple merge
diff --cc etc/afpd/misc.h
index 33a83432c88243aec33451f596199d3f328f9145,9f3d70bfc71df244b58189f45ab5c5f5854cdb82..b18826df7be9cb2907672161f5ce0ca38df362cb
@@@ -1,7 -1,12 +1,7 @@@
  #ifndef AFPD_MISC_H
  #define AFPD_MISC_H 1
  
- #include "globals.h"
 -#include <sys/cdefs.h>
+ #include <atalk/globals.h>
  
  /* FP functions */
  /* messages.c */
index 7e2d3d57630a3b28a76011d227db44abacc8a5e0,2d2600895cb5cc37a730a84a5bb1bdb1b9c6380e..4e0eb886901718f4a0a4f79d183714e1a1f14ea2
@@@ -404,14 -432,15 +397,20 @@@ int of_closefork(struct ofork *ofork
              }
          }
      }
+     /* Somone has used write_fork, we assume file was changed, register it to file change event api */
+     if (ofork->of_flags & AFPFORK_MODIFIED) {
+         fce_register_file_modification(ofork);
+     }
      ret = 0;
 -    if ( ad_close( ofork->of_ad, adflags ) < 0 ) {
 -        ret = -1;
 +
 +    ad_unlock(ofork->of_ad, ofork->of_refnum);
 +    
 +    if (ad_unref(ofork->of_ad) == 0) {
 +        if ( ad_close( ofork->of_ad, 0 ) < 0 ) {
 +            ret = -1;
 +        }
      }
  
      of_dealloc( ofork );
index 24b6b8077a9223203a4fe4e78e817ee29113aa61,f89615b1091dc3c2d88feeff8b5c5858378fe94f..0782228ad952c3b99c31274cea6abacbf44489b0
  #endif /* BSD4_4 */
  #endif
  
 -#include <netatalk/at.h>
 -#include <netatalk/endian.h>
 +#include <arpa/inet.h>
 +
  #include <atalk/dsi.h>
 -#include <atalk/atp.h>
 -#include <atalk/asp.h>
 -#include <atalk/nbp.h>
  #include <atalk/unicode.h>
  #include <atalk/util.h>
+ #include <atalk/globals.h>
  
- #include "globals.h"  /* includes <netdb.h> */
  #include "status.h"
  #include "afp_config.h"
  #include "icon.h"
index 260ca852a1dbaec6ba6aec606a4fd5250e81852e,ae16bb49c0cc2fb6d1cf50088e667e6351c60ff1..6bae26fa6c8bc7b98c2bcb50c5252684a050c64a
@@@ -1,8 -1,11 +1,9 @@@
  #ifndef AFPD_STATUS_H
  #define AFPD_STATUS_H 1
  
 -#include <sys/cdefs.h>
  #include <atalk/dsi.h>
- #include "globals.h"
 -#include <atalk/asp.h>
+ #include <atalk/globals.h>
  #include "afp_config.h"
  
  /* we use these to prevent whacky alignment problems */
diff --cc etc/afpd/uam.c
Simple merge
Simple merge
index 23bd2c16444d62e68ed614fd60b1e1191f4e8ff7,faf142c402bbe21c99029b135cfc3f23f8ed8a14..1b442093239c31fc8dc190a65625b591868d0fca
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
+ #include <inttypes.h>
+ #include <time.h>
  
 -#include <atalk/asp.h>
  #include <atalk/dsi.h>
  #include <atalk/adouble.h>
  #include <atalk/afp.h>
  #include <atalk/logger.h>
  #include <atalk/vfs.h>
  #include <atalk/uuid.h>
 +#include <atalk/ea.h>
  #include <atalk/bstrlib.h>
  #include <atalk/bstradd.h>
+ #include <atalk/ftw.h>
+ #include <atalk/globals.h>
+ #include <atalk/fce_api.h>
  
  #ifdef CNID_DB
  #include <atalk/cnid.h>
Simple merge
Simple merge
index b2084834fb63127b5b189883d9c26c8344ab68fc,e4939e29082a5954c7f5cac4eeac6da43f658d24..fb1d55dc16839a2025b6d8904cfa39e81dafb3ea
@@@ -1,51 -1,11 +1,53 @@@
  # Makefile.am for include/atalk/
  
  atalkincludedir = $(includedir)/atalk
 +
  atalkinclude_HEADERS = \
 -      adouble.h vfs.h aep.h afp.h asp.h atp.h boolean.h \
 -      cnid.h compat.h ddp.h dsi.h ldapconfig.h list.h logger.h \
 -      nbp.h netddp.h pap.h paths.h queue.h rtmp.h server_child.h \
 -      server_ipc.h tdb.h uam.h unicode.h util.h uuid.h volinfo.h \
 -      zip.h ea.h acl.h unix.h directory.h hash.h volume.h
 +      adouble.h \
 +      afp.h \
 +      vfs.h \
 +      cnid.h \
 +      locking.h \
 +      logger.h \
 +      paths.h \
 +      unicode.h \
 +      util.h \
 +      volinfo.h \
 +      ea.h \
 +      acl.h \
 +      unix.h \
 +      volume.h
 +
 +noinst_HEADERS = \
 +      directory.h \
 +      hash.h \
 +      zip.h \
 +      uuid.h \
 +      queue.h \
 +      server_child.h \
 +      server_ipc.h \
 +      tdb.h \
 +      uam.h \
 +      cnid_dbd_private.h \
 +      cnid_private.h \
 +      bstradd.h \
 +      bstrlib.h \
 +      errchk.h \
 +      ftw.h \
 +      talloc.h \
 +      tevent.h \
 +      tsocket.h \
 +      boolean.h \
 +      compat.h \
 +      dsi.h \
 +      ldapconfig.h \
-       list.h
++      list.h \
++      globals.h \
++      fce_api.h
  
 -noinst_HEADERS = cnid_dbd_private.h cnid_private.h bstradd.h bstrlib.h errchk.h ftw.h globals.h fce_api.h
 +BUILT_SOURCES = lockrpc.gen.h
 +EXTRADIST = lockrpc.gen.h
 +lockrpc.gen.h: $(top_srcdir)/libevent/event_rpcgen.py $(top_srcdir)/libatalk/rpc/lockrpc.rpc
 +      cd $(top_srcdir)/libatalk/rpc/ \
 +              && $(top_srcdir)/libevent/event_rpcgen.py lockrpc.rpc \
-               && mv lockrpc.gen.h $(top_srcdir)/include/atalk
++              && mv lockrpc.gen.h $(top_srcdir)/include/atalk
Simple merge
index 7b90b38e561ab4c70eaee95c32718c889b5ddfb5,6c8236d750992e84c03db2e0f28fe0ee49d27f47..baaa960c9f031f838c025f4856231975ee406f23
@@@ -6,15 -6,20 +6,16 @@@
  #ifndef _ATALK_DSI_H 
  #define _ATALK_DSI_H
  
 -#include <sys/cdefs.h>
  #include <sys/types.h>
  #include <sys/time.h>
 +#include <sys/socket.h>
  #include <signal.h>
 -
 +#include <arpa/inet.h>
  #include <netinet/in.h>
++
  #include <atalk/afp.h>
  #include <atalk/server_child.h>
 -#include <netatalk/endian.h>
 -
 -#ifdef __OpenBSD__
 -#include <sys/socket.h>
 -#endif
+ #include <atalk/globals.h>
  
  /* What a DSI packet looks like:
   0                               32
index 0000000000000000000000000000000000000000,cca15f575ace63d295d9b7755584f7cef52845a5..f1b8bd5389a0af63e7f0d3c6490980accccdf487
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,168 +1,151 @@@
 -#include <sys/cdefs.h>
+ /*
+  * Copyright (c) 1990,1993 Regents of The University of Michigan.
+  * All Rights Reserved.  See COPYRIGHT.
+  */
+ #ifndef AFPD_GLOBALS_H
+ #define AFPD_GLOBALS_H 1
+ #include <sys/param.h>
 -#ifdef FORCE_UIDGID
 -/* set up a structure for this */
 -typedef struct uidgidset_t {
 -    uid_t uid;
 -    gid_t gid;
 -} uidgidset;
 -#endif /* FORCE_UIDGID */
 -
+ #ifdef ADMIN_GRP
+ #include <grp.h>
+ #include <sys/types.h>
+ #endif /* ADMIN_GRP */
+ #ifdef HAVE_NETDB_H
+ #include <netdb.h>  /* this isn't header-protected under ultrix */
+ #endif /* HAVE_NETDB_H */
+ #include <netatalk/at.h>
+ #include <atalk/afp.h>
+ #include <atalk/compat.h>
+ #include <atalk/unicode.h>
+ #include <atalk/uam.h>
+ /* #define DOSFILELEN 12 */             /* Type1, DOS-compat*/
+ #define MACFILELEN 31                   /* Type2, HFS-compat */
+ #define UTF8FILELEN_EARLY 255           /* Type3, early Mac OS X 10.0-10.4.? */
+ /* #define UTF8FILELEN_NAME_MAX 765 */  /* Type3, 10.4.?- , getconf NAME_MAX */
+ /* #define UTF8FILELEN_SPEC 0xFFFF */   /* Type3, spec on document */
+ /* #define HFSPLUSFILELEN 510 */        /* HFS+ spec, 510byte = 255codepoint */
+ #define MAXUSERLEN 256
+ #define OPTION_DEBUG         (1 << 0)
+ #define OPTION_USERVOLFIRST  (1 << 1)
+ #define OPTION_NOUSERVOL     (1 << 2)
+ #define OPTION_PROXY         (1 << 3)
+ #define OPTION_CUSTOMICON    (1 << 4)
+ #define OPTION_NOSLP         (1 << 5)
+ #define OPTION_ANNOUNCESSH   (1 << 6)
+ #define OPTION_UUID          (1 << 7)
+ #define OPTION_ACL2MACCESS   (1 << 8)
+ #define OPTION_NOZEROCONF    (1 << 9)
 -    struct at_addr ddpaddr;
+ /* a couple of these options could get stuck in unions to save
+  * space. */
+ struct afp_volume_name {
+     time_t     mtime;
+     char       *name;
+     char       *full_name;
+     int        loaded;
+ };
+ struct afp_options {
+     int connections, transports, tickleval, timeout, server_notif, flags, dircachesize;
+     int sleep;                  /* Maximum time allowed to sleep (in tickles) */
+     int disconnected;           /* Maximum time in disconnected state (in tickles) */
+     unsigned int tcp_sndbuf, tcp_rcvbuf;
+     unsigned char passwdbits, passwdminlen, loginmaxfail;
+     u_int32_t server_quantum;
+     int dsireadbuf; /* scale factor for sizefof(dsi->buffer) = server_quantum * dsireadbuf */
+     char hostname[MAXHOSTNAMELEN + 1], *server, *ipaddr, *port, *configfile;
 -#ifdef FORCE_UIDGID
 -    int                 force_uid;
 -    uidgidset         uidgid;
 -#endif
+     char *uampath, *fqdn;
+     char *pidfile;
+     char *sigconffile;
+     char *uuidconf;
+     struct afp_volume_name defaultvol, systemvol, uservol;
+     int  closevol;
+     char *guest, *loginmesg, *keyfile, *passwdfile;
+     char *uamlist;
+     char *authprintdir;
+     char *signatureopt;
+     unsigned char signature[16];
+     char *k5service, *k5realm, *k5keytab;
+     char *unixcodepage,*maccodepage;
+     charset_t maccharset, unixcharset; 
+     mode_t umask;
+     mode_t save_mask;
+ #ifdef ADMIN_GRP
+     gid_t admingid;
+ #endif /* ADMIN_GRP */
+     int    volnamelen;
+     /* default value for winbind authentication */
+     char *ntdomain, *ntseparator;
+     char *logconfig;
+     char *mimicmodel;
+ };
+ #define AFPOBJ_TMPSIZ (MAXPATHLEN)
+ typedef struct _AFPObj {
+     int proto;
+     unsigned long servernum;
+     void *handle;               /* either (DSI *) or (ASP *) */
+     void *config; 
+     struct afp_options options;
+     char *Obj, *Type, *Zone;
+     char username[MAXUSERLEN];
+     void (*logout)(void), (*exit)(int);
+     int (*reply)(void *, int);
+     int (*attention)(void *, AFPUserBytes);
+     /* to prevent confusion, only use these in afp_* calls */
+     char oldtmp[AFPOBJ_TMPSIZ + 1], newtmp[AFPOBJ_TMPSIZ + 1];
+     void *uam_cookie; /* cookie for uams */
+     struct session_info  sinfo;
+     uid_t uid;        /* client running user id */
+     int ipc_fd; /* anonymous PF_UNIX socket for IPC with afpd parent */
 -#ifndef NO_DDP
 -extern void afp_over_asp (AFPObj *);
 -#endif /* NO_DDP */
+ } AFPObj;
+ /* typedef for AFP functions handlers */
+ typedef int (*AFPCmd)(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf,  size_t *rbuflen);
+ /* afp_dsi.c */
+ extern AFPObj *AFPobj;
+ extern int            afp_version;
+ extern int            afp_errno;
+ extern unsigned char  nologin;
+ extern struct dir     *curdir;
+ extern char           getwdbuf[];
+ /* FIXME CNID */
+ extern const char *Cnid_srv;
+ extern const char *Cnid_port;
+ extern int  get_afp_errno   (const int param);
+ extern void afp_options_init (struct afp_options *);
+ extern int afp_options_parse (int, char **, struct afp_options *);
+ extern int afp_options_parseline (char *, struct afp_options *);
+ extern void afp_options_free (struct afp_options *,
+                                       const struct afp_options *);
+ extern void setmessage (const char *);
+ extern void readmessage (AFPObj *);
+ /* gettok.c */
+ extern void initline   (int, char *);
+ extern int  parseline  (int, char *);
+ /* afp_util.c */
+ extern const char *AfpNum2name (int );
+ extern const char *AfpErr2name(int err);
+ /* directory.c */
+ extern struct dir rootParent;
+ extern void afp_over_dsi (AFPObj *);
+ #endif /* globals.h */
Simple merge
Simple merge
Simple merge
index 1a428bda88de08f5166f3bfe9c8c1176e92aaf4c,277ac98975d7d430d50d999cfe6eb57ba7447bbb..5149acd9c308104913e0955d399e1507f95689fa
  #define AFP_ASSERT(b)
  #endif /* NDEBUG */
  
 +#ifndef MIN
 +#define MIN(a, b)  ((a) < (b) ? (a) : (b))
 +#endif
 +
 +#ifndef MAX
 +#define MAX(a, b)  ((a) > (b) ? (a) : (b))
 +#endif
 +
  #define STRCMP(a,b,c) (strcmp(a,c) b 0)
 +#define ZERO_STRUCT(a) memset(&(a), 0, sizeof(a))
 +#define ZERO_STRUCTP(a) memset((a), 0, sizeof(a))
  
+ #if BYTE_ORDER == BIG_ENDIAN
+ #define hton64(x)       (x)
+ #define ntoh64(x)       (x)
+ #else /* BYTE_ORDER == BIG_ENDIAN */
+ #define hton64(x)       ((uint64_t) (htonl(((x) >> 32) & 0xffffffffLL)) | \
+                          (uint64_t) ((htonl(x) & 0xffffffffLL) << 32))
+ #define ntoh64(x)       (hton64(x))
+ #endif /* BYTE_ORDER == BIG_ENDIAN */
  #ifdef WITH_SENDFILE
  extern ssize_t sys_sendfile (int __out_fd, int __in_fd, off_t *__offset,size_t __count);
  #endif
index 7746768116d5d96f34ece35fa1d97eaa01b3ce0f,ebaf2b851d392e9115356a8487eb878f6de60a11..ba47fd09a224db3eb73c424d4bc253198216b8da
  #define UUID_BINSIZE 16
  #define UUID_STRINGSIZE 36
  
 -typedef unsigned char *uuidp_t;
 +typedef const unsigned char *uuidp_t;
  typedef unsigned char atalk_uuid_t[UUID_BINSIZE];
  
- typedef enum {UUID_USER = 1, UUID_GROUP, UUID_LOCAL} uuidtype_t;
+ typedef enum {UUID_USER   = 0,
+               UUID_GROUP  = 1,
+               UUID_ENOENT = 4} /* used as bit flag */
+     uuidtype_t;
+ #define UUIDTYPESTR_MASK 3
  extern char *uuidtype[];
  
  /* afp_options.c needs these. defined in libatalk/ldap.c */
@@@ -40,10 -44,11 +44,11 @@@ extern char *ldap_uid_attr
   * Interface
   ********************************************************/
  
 -extern int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid);
 -extern int getnamefromuuid( const uuidp_t uuidp, char **name, uuidtype_t *type);
 -
 +extern int getuuidfromname( const char *name, uuidtype_t type, unsigned char *uuid);
 +extern int getnamefromuuid( const unsigned char *uuid, char **name, uuidtype_t *type);
  extern void localuuid_from_id(unsigned char *buf, uuidtype_t type, unsigned int id);
 -extern const char *uuid_bin2string(unsigned char *uuid);
 -extern void uuid_string2bin( const char *uuidstring, uuidp_t uuid);
 +extern const char *uuid_bin2string(const unsigned char *uuid);
 +extern void uuid_string2bin( const char *uuidstring, unsigned char *uuid);
+ extern void uuidcache_dump(void);
 +
  #endif /* AFP_UUID_H */
Simple merge
index ee4d3f2295494306d54ca28853181e77ea8d93bd,9fe8405ff72a3e9b9e749cbbeb8b97ce5e559d8f..86bc34dcfd59bf4bbb81c9785a072b502fda4e4c
@@@ -184,14 -190,17 +190,17 @@@ cleanup
      return ret;
  }
  
- /* 
-  * Caller provides buffer uuid for result
+ /*!
+  * Search cache by name and uuid type
+  *
+  * @args name     (r)  name to search
+  * @args type     (rw) type (user or group) of name, returns found type here which might
+  *                     mark it as a negative entry
+  * @args uuid     (w)  found uuid is returned here
+  * @returns       0 on sucess, entry found
+  *                -1 no entry found
   */
- int search_cachebyname( const char *name, uuidtype_t type, unsigned char *uuid) {
 -int search_cachebyname(const char *name, uuidtype_t *type, uuidp_t uuid) {
++int search_cachebyname( const char *name, uuidtype_t *type, unsigned char *uuid) {
      int ret;
      unsigned char hash;
      cacheduser_t *entry;
index c83be1cd16dbd4a2152724c2343838b6a0f15d90,252d7da2681742cda7772c43eb793f76204853ab..11731a26c69d5bdeb683be1667a8c2c6bd351e03
   * Interface
   ********************************************************/
  
- /* 
-  *   name: search for this name
-  *   type: of type USER or GROUP
-  *   uuid: if found copies uuid into this buffer
-  * returns 0 on success, !=0 if not found or on errors
-  */
- extern int search_cachebyname( const char *name, uuidtype_t type, unsigned char *uuid);
- /* 
-  *   inname: name
-  *   inuuid: uuid
-  *   type: USER or GROUP
-  *   (uid: unused)
-  * returns 0 on success, !=0 on memory errors
-  */
 -extern int search_cachebyname( const char *name, uuidtype_t *type, uuidp_t uuid);
++extern int search_cachebyname( const char *name, uuidtype_t *type, unsigned char *uuid);
  extern int add_cachebyname( const char *inname, const uuidp_t inuuid, const uuidtype_t type, const unsigned long uid);
- /* same as above but for the uuid cache */
  extern int search_cachebyuuid( uuidp_t uuidp, char **name, uuidtype_t *type);
  extern int add_cachebyuuid( uuidp_t inuuid, const char *inname, uuidtype_t type, const unsigned long uid);
  
index 28f8e1b4e52228d997e3beb81a18b77903ccb148,fc64c0455f486f8004be22bea32ba12346c4a6b1..4fad0407ae5b1fa60a8ea2243d68037313b79608
@@@ -101,12 -100,12 +101,12 @@@ void uuid_string2bin( const char *uuids
  
  }
  
- /*! 
+ /*!
   * Convert 16 byte binary uuid to neat ascii represantation including dashes.
-  * 
+  *
   * Returns pointer to static buffer.
   */
 -const char *uuid_bin2string(unsigned char *uuid) {
 +const char *uuid_bin2string(const unsigned char *uuid) {
      static char uuidstring[UUID_STRINGSIZE + 1];
  
      int i = 0;
   *   type: and type (UUID_USER or UUID_GROUP)
   *   uuid: pointer to uuid_t storage that the caller must provide
   * returns 0 on success !=0 on errror
-  */  
+  */
 -int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) {
 +int getuuidfromname( const char *name, uuidtype_t type, unsigned char *uuid) {
      int ret = 0;
+     uuidtype_t mytype = type;
+     char nulluuid[16] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
  #ifdef HAVE_LDAP
      char *uuid_string = NULL;
  #endif
Simple merge
Simple merge
Simple merge
Simple merge
index f00f83b39494d9d2be6e67414ba1c69c9feefca4,87ffa7763bf8848ed943147738ab690709ac8278..c258398d847d242944eb989d6348e59c84d2290e
@@@ -231,5 -336,10 +334,9 @@@ int ipc_child_write(int fd, uint16_t co
  
     LOG(log_debug, logtype_afpd, "ipc_child_write(%s)", ipc_cmd_str[command]);
  
-    return write(fd, block, len+IPC_HEADERLEN );
+    if ((ret = writet(fd, block, len+IPC_HEADERLEN, 0, 1)) != len + IPC_HEADERLEN) {
+        return -1;
+    }
+    return 0;
  }
 -
index f90603d0d37e20e4bf6c30cc2e0a764656398c68,0000000000000000000000000000000000000000..6a32499079c6c5d58fed13632bbf9b14f354cf20
mode 100644,000000..100644
--- /dev/null
@@@ -1,773 -1,0 +1,788 @@@
-                               [samba_cv_HAVE_ACL_GET_PERM_NP=yes],
-                               [samba_cv_HAVE_ACL_GET_PERM_NP=no])
 +dnl Kitchen sink for configuration macros
 +
 +dnl Check for optional admin group support
 +AC_DEFUN([AC_NETATALK_ADMIN_GROUP], [
 +    netatalk_cv_admin_group=yes
 +    AC_MSG_CHECKING([for administrative group support])
 +    AC_ARG_ENABLE(admin-group,
 +          [  --disable-admin-group   disable admin group],[
 +            if test x"$enableval" = x"no"; then
 +                       AC_DEFINE(ADMIN_GRP, 0, [Define if the admin group should be enabled])
 +                       netatalk_cv_admin_group=no
 +                       AC_MSG_RESULT([no])
 +              else
 +                       AC_DEFINE(ADMIN_GRP, 1, [Define if the admin group should be enabled])
 +                       AC_MSG_RESULT([yes])
 +            fi],[
 +              AC_DEFINE(ADMIN_GRP, 1, [Define if the admin group should be enabled])
 +              AC_MSG_RESULT([yes])
 +      ])
 +])
 +
 +dnl Check for optional cracklib support
 +AC_DEFUN([AC_NETATALK_CRACKLIB], [
 +netatalk_cv_with_cracklib=no
 +AC_ARG_WITH(cracklib,
 +      [  --with-cracklib=DICT    enable/set location of cracklib dictionary],[
 +      if test "x$withval" != "xno" ; then
 +              cracklib="$withval"
 +              AC_CHECK_LIB(crack, main, [
 +                      AC_DEFINE(USE_CRACKLIB, 1, [Define if cracklib should be used])
 +                      LIBS="$LIBS -lcrack"
 +                      if test "$cracklib" = "yes"; then
 +                              cracklib="/usr/$atalk_libname/cracklib_dict"
 +                      fi
 +                      AC_DEFINE_UNQUOTED(_PATH_CRACKLIB, "$cracklib",
 +                              [path to cracklib dictionary])
 +                      AC_MSG_RESULT([setting cracklib dictionary to $cracklib])
 +                      netatalk_cv_with_cracklib=yes
 +                      ],[
 +                      AC_MSG_ERROR([cracklib not found!])
 +                      ]
 +              )
 +      fi
 +      ]
 +)
 +AC_MSG_CHECKING([for cracklib support])
 +AC_MSG_RESULT([$netatalk_cv_with_cracklib])
 +])
 +
 +dnl Check whether to enable debug code
 +AC_DEFUN([AC_NETATALK_DEBUG], [
 +AC_MSG_CHECKING([whether to enable verbose debug code])
 +AC_ARG_ENABLE(debug,
 +      [  --enable-debug          enable verbose debug code],[
 +      if test "$enableval" != "no"; then
 +              if test "$enableval" = "yes"; then
 +                      AC_DEFINE(DEBUG, 1, [Define if verbose debugging information should be included])
 +              else
 +                      AC_DEFINE_UNQUOTED(DEBUG, $enableval, [Define if verbose debugging information should be included])
 +              fi 
 +              AC_MSG_RESULT([yes])
 +      else
 +              AC_MSG_RESULT([no])
 +        AC_DEFINE(NDEBUG, 1, [Disable assertions])
 +      fi
 +      ],[
 +              AC_MSG_RESULT([no])
 +        AC_DEFINE(NDEBUG, 1, [Disable assertions])
 +      ]
 +)
 +])
 +
 +dnl Check whethe to disable tickle SIGALARM stuff, which eases debugging
 +AC_DEFUN([AC_NETATALK_DEBUGGING], [
 +AC_MSG_CHECKING([whether to enable debugging with debuggers])
 +AC_ARG_ENABLE(debugging,
 +      [  --enable-debugging      disable SIGALRM timers and DSI tickles (eg for debugging with gdb/dbx/...)],[
 +      if test "$enableval" != "no"; then
 +              if test "$enableval" = "yes"; then
 +                      AC_DEFINE(DEBUGGING, 1, [Define if you want to disable SIGALRM timers and DSI tickles])
 +              else
 +                      AC_DEFINE_UNQUOTED(DEBUGGING, $enableval, [Define if you want to disable SIGALRM timers and DSI tickles])
 +              fi 
 +              AC_MSG_RESULT([yes])
 +      else
 +              AC_MSG_RESULT([no])
 +      fi
 +      ],[
 +              AC_MSG_RESULT([no])
 +      ]
 +)
 +
 +])
 +
 +dnl Check for optional shadow password support
 +AC_DEFUN([AC_NETATALK_SHADOW], [
 +netatalk_cv_use_shadowpw=no
 +AC_ARG_WITH(shadow,
 +      [  --with-shadow           enable shadow password support [[auto]]],
 +      [netatalk_cv_use_shadowpw="$withval"],
 +      [netatalk_cv_use_shadowpw=auto]
 +)
 +
 +if test "x$netatalk_cv_use_shadowpw" != "xno"; then
 +    AC_CHECK_HEADER([shadow.h])
 +    if test x"$ac_cv_header_shadow_h" = x"yes"; then
 +      netatalk_cv_use_shadowpw=yes
 +      AC_DEFINE(SHADOWPW, 1, [Define if shadow passwords should be used])
 +    else 
 +      if test "x$shadowpw" = "xyes"; then
 +        AC_MSG_ERROR([shadow support not available])
 +      else
 +              netatalk_cv_use_shadowpw=no
 +      fi
 +    fi 
 +fi
 +
 +AC_MSG_CHECKING([whether shadow support should be enabled])
 +if test "x$netatalk_cv_use_shadowpw" = "xyes"; then
 +      AC_MSG_RESULT([yes])
 +else
 +      AC_MSG_RESULT([no])
 +fi
 +])
 +
 +dnl Check for optional valid-shell-check support
 +AC_DEFUN([AC_NETATALK_SHELL_CHECK], [
 +netatalk_cv_use_shellcheck=yes
 +AC_MSG_CHECKING([whether checking for a valid shell should be enabled])
 +AC_ARG_ENABLE(shell-check,
 +      [  --disable-shell-check   disable checking for a valid shell],[
 +      if test "$enableval" = "no"; then 
 +              AC_DEFINE(DISABLE_SHELLCHECK, 1, [Define if shell check should be disabled])
 +              AC_MSG_RESULT([no])
 +              netatalk_cv_use_shellcheck=no
 +      else
 +              AC_MSG_RESULT([yes])
 +      fi
 +      ],[
 +              AC_MSG_RESULT([yes])
 +      ]
 +)
 +])
 +
 +dnl Check for optional sysv initscript install
 +AC_DEFUN([AC_NETATALK_SYSV_STYLE], [
 +    AC_ARG_WITH(sysv-style,
 +                [  --with-sysv-style       use OS specific sysv config [[redhat|suse|gentoo|netbsd|debian]]],
 +                sysv_style="$withval", sysv_style=none
 +    )
 +    case "$sysv_style" in 
 +    "redhat")
 +          AC_MSG_RESULT([enabling redhat-style sysv support])
 +        ;;
 +    "suse")
 +          AC_MSG_RESULT([enabling suse-style sysv support])
 +        ;;
 +    "gentoo")
 +          AC_MSG_RESULT([enabling gentoo-style sysv support])
 +        ;;
 +    "netbsd")
 +          AC_MSG_RESULT([enabling netbsd-style sysv support])
 +        ;;
 +    "debian")
 +          AC_MSG_RESULT([enabling debian-style sysv support])
 +        ;;
 +    *)
 +          AC_MSG_RESULT([disabling sysv support])
 +        ;;
 +    esac
 +])
 +
 +dnl OS specific configuration
 +AC_DEFUN([AC_NETATALK_OS_SPECIFIC], [
 +case "$host_os" in
 +      *aix*)                          this_os=aix ;;
 +      *freebsd*)                      this_os=freebsd ;;
 +      *hpux11*)                       this_os=hpux11 ;;
 +      *irix*)                         this_os=irix ;;
 +      *linux*)                        this_os=linux ;;
 +      *osx*)                          this_os=macosx ;;
 +      *darwin*)                       this_os=macosx ;;
 +      *netbsd*)                       this_os=netbsd ;;
 +      *openbsd*)                      this_os=openbsd ;;
 +      *osf*)                          this_os=tru64 ;;
 +      *solaris*)                      this_os=solaris ;;
 +esac
 +
 +case "$host_cpu" in
 +      i386|i486|i586|i686|k7)         this_cpu=x86 ;;
 +      alpha)                                          this_cpu=alpha ;;
 +      mips)                                           this_cpu=mips ;;
 +      powerpc|ppc)                            this_cpu=ppc ;;
 +esac
 +
 +dnl --------------------- operating system specific flags (port from sys/*)
 +
 +dnl ----- FreeBSD specific -----
 +if test x"$this_os" = "xfreebsd"; then 
 +      AC_MSG_RESULT([ * FreeBSD specific configuration])
 +      AC_DEFINE(BSD4_4, 1, [BSD compatiblity macro])
 +      AC_DEFINE(FREEBSD, 1, [Define if OS is FreeBSD])
 +      AC_DEFINE(SENDFILE_FLAVOR_BSD, 1, [Define if the sendfile() function uses BSD semantics])
 +    AC_DEFINE(OPEN_NOFOLLOW_ERRNO, EMLINK, errno returned by open with O_NOFOLLOW)
 +fi
 +
 +dnl ----- Linux specific -----
 +if test x"$this_os" = "xlinux"; then 
 +      AC_MSG_RESULT([ * Linux specific configuration])
 +      
 +      dnl ----- check if we need the quotactl wrapper
 +    AC_CHECK_HEADERS(linux/dqblk_xfs.h,,
 +              [AC_CHECK_HEADERS(linux/xqm.h linux/xfs_fs.h)
 +              AC_CHECK_HEADERS(xfs/libxfs.h xfs/xqm.h xfs/xfs_fs.h)]
 +      )
 +
 +
 +      dnl ----- as far as I can tell, dbtob always does the wrong thing
 +      dnl ----- on every single version of linux I've ever played with.
 +      dnl ----- see etc/afpd/quota.c
 +      AC_DEFINE(HAVE_BROKEN_DBTOB, 1, [Define if dbtob is broken])
 +
 +      netatalk_cv_linux_sendfile=yes
 +      AC_MSG_CHECKING([use sendfile syscall])
 +        AC_ARG_ENABLE(sendfile,
 +          [  --disable-sendfile       disable linux sendfile syscall],[
 +              if test x"$enableval" = x"no"; then
 +                      netatalk_cv_linux_sendfile=no
 +                      AC_MSG_RESULT([no])
 +              else
 +                      AC_MSG_RESULT([yes])
 +
 +              fi
 +          ],[
 +              AC_MSG_RESULT([yes])
 +      ]
 +
 +       )
 +
 +      if test x"$netatalk_cv_linux_sendfile" = "xyes"; then 
 +          AC_CACHE_CHECK([for linux sendfile support],netatalk_cv_HAVE_SENDFILE,[
 +          AC_TRY_LINK([#include <sys/sendfile.h>],
 +[\
 +int tofd, fromfd;
 +off_t offset;
 +size_t total;
 +ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
 +],
 +netatalk_cv_HAVE_SENDFILE=yes,netatalk_cv_HAVE_SENDFILE=no)])
 +
 +# Try and cope with broken Linux sendfile....
 +          AC_CACHE_CHECK([for broken linux sendfile support],netatalk_cv_HAVE_BROKEN_LINUX_SENDFILE,[
 +          AC_TRY_LINK([\
 +#if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64)
 +#undef _FILE_OFFSET_BITS
 +#endif
 +#include <sys/sendfile.h>],
 +[\
 +int tofd, fromfd;
 +off_t offset;
 +size_t total;
 +ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
 +],
 +netatalk_cv_HAVE_BROKEN_LINUX_SENDFILE=yes,netatalk_cv_HAVE_BROKEN_LINUX_SENDFILE=no,netatalk_cv_HAVE_BROKEN_SENDFILE=cross)])
 +
 +          if test x"$netatalk_cv_HAVE_SENDFILE" = x"yes"; then
 +              AC_DEFINE(HAVE_SENDFILE,1,[Whether sendfile() is available])
 +              AC_DEFINE(SENDFILE_FLAVOR_LINUX,1,[Whether linux sendfile() API is available])
 +              AC_DEFINE(WITH_SENDFILE,1,[Whether sendfile() should be used])
 +          elif test x"$netatalk_cv_HAVE_BROKEN_LINUX_SENDFILE" = x"yes"; then
 +              AC_DEFINE(SENDFILE_FLAVOR_LINUX,1,[Whether linux sendfile() API is available])
 +              AC_DEFINE(LINUX_BROKEN_SENDFILE_API,1,[Whether (linux) sendfile() is broken])
 +              AC_DEFINE(WITH_SENDFILE,1,[Whether sendfile should be used])
 +          else
 +              netatalk_cv_linux_sendfile=no
 +              AC_MSG_RESULT(no);
 +          fi
 +      fi
 +
 +      need_dash_r=no
 +fi
 +
 +dnl ----- Mac OSX specific -----
 +if test x"$this_os" = "xmacosx"; then 
 +      AC_MSG_RESULT([ * Mac OSX specific configuration])
 +      AC_DEFINE(BSD4_4, 1, [BSD compatiblity macro])
 +      AC_DEFINE(HAVE_2ARG_DBTOB, 1, [Define if dbtob takes two arguments])
 +      dnl AC_DEFINE(NO_DLFCN_H)
 +      AC_DEFINE(NO_QUOTA_SUPPORT, 1, [Define if Quota support should be disabled])
 +      AC_DEFINE(MACOSX_SERVER, 1, [Define if compiling for MacOS X Server])
 +fi
 +
 +dnl ----- NetBSD specific -----
 +if test x"$this_os" = "xnetbsd"; then 
 +      AC_MSG_RESULT([ * NetBSD specific configuration])
 +      AC_DEFINE(BSD4_4, 1, [BSD compatiblity macro])
 +      AC_DEFINE(NETBSD, 1, [Define if OS is NetBSD])
 +    AC_DEFINE(OPEN_NOFOLLOW_ERRNO, EFTYPE, errno returned by open with O_NOFOLLOW)
 +
 +      CFLAGS="-I\$(top_srcdir)/sys/netbsd $CFLAGS"
 +      need_dash_r=yes 
 +
 +      dnl ----- NetBSD does not have crypt.h, uses unistd.h -----
 +      AC_DEFINE(UAM_DHX, 1, [Define if the DHX UAM modules should be compiled])
 +fi
 +
 +dnl ----- OpenBSD specific -----
 +if test x"$this_os" = "xopenbsd"; then 
 +      AC_MSG_RESULT([ * OpenBSD specific configuration])
 +      dnl ----- OpenBSD does not have crypt.h, uses unistd.h -----
 +      AC_DEFINE(UAM_DHX, 1, [Define if the DHX UAM modules should be compiled])
 +fi
 +
 +dnl ----- Solaris specific -----
 +if test x"$this_os" = "xsolaris"; then 
 +      AC_MSG_RESULT([ * Solaris specific configuration])
 +      AC_DEFINE(__svr4__, 1, [Solaris compatibility macro])
 +      AC_DEFINE(_ISOC9X_SOURCE, 1, [Compatibility macro])
 +      AC_DEFINE(NO_STRUCT_TM_GMTOFF, 1, [Define if the gmtoff member of struct tm is not available])
 +      AC_DEFINE(SOLARIS, 1, [Solaris compatibility macro])
 +      CFLAGS="-I\$(top_srcdir)/sys/generic $CFLAGS"
 +      need_dash_r=yes
 +      sysv_style=solaris
 +
 +      solaris_module=no
 +      AC_MSG_CHECKING([if we can build Solaris kernel module])
 +      if test -x /usr/ccs/bin/ld && test x"$netatalk_cv_ddp_enabled" = x"yes" ; then
 +              solaris_module=yes
 +      fi
 +      AC_MSG_RESULT([$solaris_module])
 +
 +      COMPILE_64BIT_KMODULE=no
 +      KCFLAGS=""
 +      KLDFLAGS=""
 +      COMPILE_KERNEL_GCC=no
 +
 +      if test "$solaris_module" = "yes"; then
 +         dnl Solaris kernel module stuff
 +           AC_MSG_CHECKING([if we have to build a 64bit kernel module])
 +
 +         # check for isainfo, if not found it has to be a 32 bit kernel (<=2.6)       
 +         if test -x /usr/bin/isainfo; then
 +              # check for 64 bit platform
 +              if isainfo -kv | grep '^64-bit'; then
 +                      COMPILE_64BIT_KMODULE=yes
 +              fi
 +         fi
 +
 +         AC_MSG_RESULT([$COMPILE_64BIT_KMODULE])
 +
 +         if test "${GCC}" = yes; then
 +              COMPILE_KERNEL_GCC=yes
 +              if test "$COMPILE_64BIT_KMODULE" = yes; then
 +              
 +                        AC_MSG_CHECKING([if we can build a 64bit kernel module])
 +                      
 +                        case `$CC --version 2>/dev/null` in
 +                      [[12]].* | 3.0.*)
 +                              COMPILE_64BIT_KMODULE=no
 +                              COMPILE_KERNEL_GCC=no   
 +                              solaris_module=no;;
 +                      *)
 +                              # use for 64 bit
 +                              KCFLAGS="-m64"
 +                              #KLDFLAGS="-melf64_sparc"
 +                              KLDFLAGS="-64";;
 +                      esac    
 +                      
 +                      AC_MSG_RESULT([$COMPILE_64BIT_KMODULE])
 +                      
 +              else
 +                      KCFLAGS=""
 +                      KLDFLAGS=""
 +              fi
 +              KCFLAGS="$KCFLAGS -D_KERNEL -Wall -Wstrict-prototypes"
 +           else
 +              if test "$COMPILE_64BIT_KMODULE" = yes; then
 +                # use Sun CC (for a 64-bit kernel, uncomment " -xarch=v9 -xregs=no%appl ")
 +                      KCFLAGS="-xarch=v9 -xregs=no%appl"
 +                      KLDFLAGS="-64"
 +              else
 +                      KCFLAGS=""
 +                      KLDFLAGS=""
 +              fi
 +              KCFLAGS="-D_KERNEL $KCFLAGS -mno-app-regs -munaligned-doubles -fpcc-struct-return"
 +         fi
 +
 +           AC_CACHE_CHECK([for timeout_id_t],netatalk_cv_HAVE_TIMEOUT_ID_T,[
 +           AC_TRY_LINK([\
 +#include <sys/stream.h>
 +#include <sys/ddi.h>],
 +[\
 +timeout_id_t dummy;
 +],
 +netatalk_cv_HAVE_TIMEOUT_ID_T=yes,netatalk_cv_HAVE_TIMEOUT_ID_T=no,netatalk_cv_HAVE_TIMEOUT_ID_T=cross)])
 +
 +         AC_DEFINE(HAVE_TIMEOUT_ID_T, test x"$netatalk_cv_HAVE_TIMEOUT_ID" = x"yes", [define for timeout_id_t])
 +      fi
 +
 +      AC_SUBST(COMPILE_KERNEL_GCC)
 +      AC_SUBST(COMPILE_64BIT_KMODULE)
 +      AC_SUBST(KCFLAGS)
 +      AC_SUBST(KLDFLAGS)
 +fi
 +
 +])
 +
 +dnl Check for building PGP UAM module
 +AC_DEFUN([AC_NETATALK_PGP_UAM], [
 +AC_MSG_CHECKING([whether the PGP UAM should be build])
 +AC_ARG_ENABLE(pgp-uam,
 +      [  --enable-pgp-uam        enable build of PGP UAM module],[
 +      if test "$enableval" = "yes"; then 
 +              if test "x$neta_cv_have_openssl" = "xyes"; then 
 +                      AC_DEFINE(UAM_PGP, 1, [Define if the PGP UAM module should be compiled])
 +                      compile_pgp=yes
 +                      AC_MSG_RESULT([yes])
 +              else
 +                      AC_MSG_RESULT([no])
 +              fi
 +      fi
 +      ],[
 +              AC_MSG_RESULT([no])
 +      ]
 +)
 +])
 +
 +dnl Check for building Kerberos V UAM module
 +AC_DEFUN([AC_NETATALK_KRB5_UAM], [
 +netatalk_cv_build_krb5_uam=no
 +AC_ARG_ENABLE(krbV-uam,
 +      [  --enable-krbV-uam       enable build of Kerberos V UAM module],
 +      [
 +              if test x"$enableval" = x"yes"; then
 +                      NETATALK_GSSAPI_CHECK([
 +                              netatalk_cv_build_krb5_uam=yes
 +                      ],[
 +                              AC_MSG_ERROR([need GSSAPI to build Kerberos V UAM])
 +                      ])
 +              fi
 +      ]
 +      
 +)
 +
 +AC_MSG_CHECKING([whether Kerberos V UAM should be build])
 +if test x"$netatalk_cv_build_krb5_uam" = x"yes"; then
 +      AC_MSG_RESULT([yes])
 +else
 +      AC_MSG_RESULT([no])
 +fi
 +AM_CONDITIONAL(USE_GSSAPI, test x"$netatalk_cv_build_krb5_uam" = x"yes")
 +])
 +
 +dnl Check for overwrite the config files or not
 +AC_DEFUN([AC_NETATALK_OVERWRITE_CONFIG], [
 +AC_MSG_CHECKING([whether configuration files should be overwritten])
 +AC_ARG_ENABLE(overwrite,
 +      [  --enable-overwrite      overwrite configuration files during installation],
 +      [OVERWRITE_CONFIG="${enable_overwrite}"],
 +      [OVERWRITE_CONFIG="no"]
 +)
 +AC_MSG_RESULT([$OVERWRITE_CONFIG])
 +AC_SUBST(OVERWRITE_CONFIG)
 +])
 +
 +dnl Check for LDAP support, for client-side ACL visibility
 +AC_DEFUN([AC_NETATALK_LDAP], [
 +AC_MSG_CHECKING(for LDAP (necessary for client-side ACL visibility))
 +AC_ARG_WITH(ldap,
 +    [AS_HELP_STRING([--with-ldap],
 +        [LDAP support (default=auto)])],
 +    [ case "$withval" in
 +      yes|no)
 +          with_ldap="$withval"
 +                ;;
 +      *)
 +          with_ldap=auto
 +          ;;
 +      esac ])
 +AC_MSG_RESULT($with_ldap)
 +
 +if test x"$with_ldap" != x"no" ; then
 +      AC_CHECK_HEADER([ldap.h], with_ldap=yes,
 +        [ if test x"$with_ldap" = x"yes" ; then
 +            AC_MSG_ERROR([Missing LDAP headers])
 +        fi
 +              with_ldap=no
 +        ])
 +      AC_CHECK_LIB(ldap, ldap_init, with_ldap=yes,
 +        [ if test x"$with_ldap" = x"yes" ; then
 +            AC_MSG_ERROR([Missing LDAP library])
 +        fi
 +              with_ldap=no
 +        ])
 +fi
 +
 +if test x"$with_ldap" = x"yes"; then
 +      AC_DEFINE(HAVE_LDAP,1,[Whether LDAP is available])
 +fi
 +])
 +
 +dnl Check for ACL support
 +AC_DEFUN([AC_NETATALK_ACL], [
 +AC_MSG_CHECKING(whether to support ACLs)
 +AC_ARG_WITH(acls,
 +    [AS_HELP_STRING([--with-acls],
 +        [Include ACL support (default=auto)])],
 +    [ case "$withval" in
 +      yes|no)
 +          with_acl_support="$withval"
 +                ;;
 +      *)
 +          with_acl_support=auto
 +          ;;
 +      esac ],
 +    [with_acl_support=auto])
 +AC_MSG_RESULT($with_acl_support)
 +
 +if test x"$with_acl_support" = x"no"; then
 +      AC_MSG_RESULT(Disabling ACL support)
 +      AC_DEFINE(HAVE_NO_ACLS,1,[Whether no ACLs support should be built in])
 +else
 +    with_acl_support=yes
 +fi
 +
 +if test x"$with_acl_support" = x"yes" ; then
 +      AC_MSG_NOTICE(checking whether ACL support is available:)
 +      case "$host_os" in
 +      *sysv5*)
 +              AC_MSG_NOTICE(Using UnixWare ACLs)
 +              AC_DEFINE(HAVE_UNIXWARE_ACLS,1,[Whether UnixWare ACLs are available])
 +              ;;
 +      *solaris*)
 +              AC_MSG_NOTICE(Using solaris ACLs)
 +              AC_DEFINE(HAVE_SOLARIS_ACLS,1,[Whether solaris ACLs are available])
 +              ACL_LIBS="$ACL_LIBS -lsec"
 +              ;;
 +      *hpux*)
 +              AC_MSG_NOTICE(Using HPUX ACLs)
 +              AC_DEFINE(HAVE_HPUX_ACLS,1,[Whether HPUX ACLs are available])
 +              ;;
 +      *irix*)
 +              AC_MSG_NOTICE(Using IRIX ACLs)
 +              AC_DEFINE(HAVE_IRIX_ACLS,1,[Whether IRIX ACLs are available])
 +              ;;
 +      *aix*)
 +              AC_MSG_NOTICE(Using AIX ACLs)
 +              AC_DEFINE(HAVE_AIX_ACLS,1,[Whether AIX ACLs are available])
 +              ;;
 +      *osf*)
 +              AC_MSG_NOTICE(Using Tru64 ACLs)
 +              AC_DEFINE(HAVE_TRU64_ACLS,1,[Whether Tru64 ACLs are available])
 +              ACL_LIBS="$ACL_LIBS -lpacl"
 +              ;;
 +      *darwin*)
 +              AC_MSG_NOTICE(ACLs on Darwin currently not supported)
 +              AC_DEFINE(HAVE_NO_ACLS,1,[Whether no ACLs support is available])
 +              ;;
 +      *)
 +              AC_CHECK_LIB(acl,acl_get_file,[ACL_LIBS="$ACL_LIBS -lacl"])
 +              case "$host_os" in
 +              *linux*)
 +                      AC_CHECK_LIB(attr,getxattr,[ACL_LIBS="$ACL_LIBS -lattr"])
 +                      ;;
 +              esac
 +              AC_CACHE_CHECK([for POSIX ACL support],netatalk_cv_HAVE_POSIX_ACLS,[
 +                      acl_LIBS=$LIBS
 +                      LIBS="$LIBS $ACL_LIBS"
 +                      AC_TRY_LINK([
 +                              #include <sys/types.h>
 +                              #include <sys/acl.h>
 +                      ],[
 +                              acl_t acl;
 +                              int entry_id;
 +                              acl_entry_t *entry_p;
 +                              return acl_get_entry(acl, entry_id, entry_p);
 +                      ],
 +                      [netatalk_cv_HAVE_POSIX_ACLS=yes],
 +                      [netatalk_cv_HAVE_POSIX_ACLS=no
 +                with_acl_support=no])
 +                      LIBS=$acl_LIBS
 +              ])
 +              if test x"$netatalk_cv_HAVE_POSIX_ACLS" = x"yes"; then
 +                      AC_MSG_NOTICE(Using POSIX ACLs)
 +                      AC_DEFINE(HAVE_POSIX_ACLS,1,[Whether POSIX ACLs are available])
 +                      AC_CACHE_CHECK([for acl_get_perm_np],netatalk_cv_HAVE_ACL_GET_PERM_NP,[
 +                              acl_LIBS=$LIBS
 +                              LIBS="$LIBS $ACL_LIBS"
 +                              AC_TRY_LINK([
 +                                      #include <sys/types.h>
 +                                      #include <sys/acl.h>
 +                              ],[
 +                                      acl_permset_t permset_d;
 +                                      acl_perm_t perm;
 +                                      return acl_get_perm_np(permset_d, perm);
 +                              ],
++                              [netatalk_cv_HAVE_ACL_GET_PERM_NP=yes],
++                              [netatalk_cv_HAVE_ACL_GET_PERM_NP=no])
 +                              LIBS=$acl_LIBS
 +                      ])
 +                      if test x"netatalk_cv_HAVE_ACL_GET_PERM_NP" = x"yes"; then
 +                              AC_DEFINE(HAVE_ACL_GET_PERM_NP,1,[Whether acl_get_perm_np() is available])
 +                      fi
++
++
++                       AC_CACHE_CHECK([for acl_from_mode], netatalk_cv_HAVE_ACL_FROM_MODE,[
++                               acl_LIBS=$LIBS
++                               LIBS="$LIBS $ACL_LIBS"
++                AC_CHECK_FUNCS(acl_from_mode,
++                               [netatalk_cv_HAVE_ACL_FROM_MODE=yes],
++                               [netatalk_cv_HAVE_ACL_FROM_MODE=no])
++                               LIBS=$acl_LIBS
++                       ])
++                       if test x"netatalk_cv_HAVE_ACL_FROM_MODE" = x"yes"; then
++                               AC_DEFINE(HAVE_ACL_FROM_MODE,1,[Whether acl_from_mode() is available])
++                       fi
++
 +              else
 +                      AC_MSG_NOTICE(ACL support is not avaliable)
 +                      AC_DEFINE(HAVE_NO_ACLS,1,[Whether no ACLs support is available])
 +              fi
 +              ;;
 +    esac
 +fi
 +
 +if test x"$with_acl_support" = x"yes" ; then
++   AC_CHECK_HEADERS([acl/libacl.h])
 +    AC_DEFINE(HAVE_ACLS,1,[Whether ACLs support is available])
 +    AC_SUBST(ACL_LIBS)
 +fi
 +])
 +
 +dnl Check for Extended Attributes support
 +AC_DEFUN([AC_NETATALK_EXTENDED_ATTRIBUTES], [
 +neta_cv_eas="ad"
 +neta_cv_eas_sys_found=no
 +neta_cv_eas_sys_not_found=no
 +
 +AC_CHECK_HEADERS(sys/attributes.h attr/xattr.h sys/xattr.h sys/extattr.h sys/uio.h sys/ea.h)
 +
 +case "$this_os" in
 +
 +  *osf*)
 +      AC_SEARCH_LIBS(getproplist, [proplist])
 +      AC_CHECK_FUNCS([getproplist fgetproplist setproplist fsetproplist],
 +                   [neta_cv_eas_sys_found=yes],
 +                   [neta_cv_eas_sys_not_found=yes])
 +      AC_CHECK_FUNCS([delproplist fdelproplist add_proplist_entry get_proplist_entry],,
 +                   [neta_cv_eas_sys_not_found=yes])
 +      AC_CHECK_FUNCS([sizeof_proplist_entry],,
 +                   [neta_cv_eas_sys_not_found=yes])
 +  ;;
 +
 +  *solaris*)
 +      AC_CHECK_FUNCS([attropen],
 +                   [neta_cv_eas_sys_found=yes],
 +                   [neta_cv_eas_sys_not_found=yes])
 +  ;;
 +
 +  'freebsd')
 +    AC_CHECK_FUNCS([extattr_delete_fd extattr_delete_file extattr_delete_link],
 +                   [neta_cv_eas_sys_found=yes],
 +                   [neta_cv_eas_sys_not_found=yes])
 +    AC_CHECK_FUNCS([extattr_get_fd extattr_get_file extattr_get_link],,
 +                   [neta_cv_eas_sys_not_found=yes])
 +    AC_CHECK_FUNCS([extattr_list_fd extattr_list_file extattr_list_link],,
 +                   [neta_cv_eas_sys_not_found=yes])
 +    AC_CHECK_FUNCS([extattr_set_fd extattr_set_file extattr_set_link],,
 +                   [neta_cv_eas_sys_not_found=yes])
 +  ;;
 +
 +  *freebsd4* | *dragonfly* )
 +    AC_DEFINE(BROKEN_EXTATTR, 1, [Does extattr API work])
 +  ;;
 +
 +  *)
 +      AC_SEARCH_LIBS(getxattr, [attr])
 +
 +    if test "x$neta_cv_eas_sys_found" != "xyes" ; then
 +       AC_CHECK_FUNCS([getxattr lgetxattr fgetxattr listxattr llistxattr],
 +                      [neta_cv_eas_sys_found=yes],
 +                      [neta_cv_eas_sys_not_found=yes])
 +         AC_CHECK_FUNCS([flistxattr removexattr lremovexattr fremovexattr],,
 +                      [neta_cv_eas_sys_not_found=yes])
 +         AC_CHECK_FUNCS([setxattr lsetxattr fsetxattr],,
 +                      [neta_cv_eas_sys_not_found=yes])
 +    fi
 +
 +    if test "x$neta_cv_eas_sys_found" != "xyes" ; then
 +         AC_CHECK_FUNCS([getea fgetea lgetea listea flistea llistea],
 +                      [neta_cv_eas_sys_found=yes],
 +                      [neta_cv_eas_sys_not_found=yes])
 +         AC_CHECK_FUNCS([removeea fremoveea lremoveea setea fsetea lsetea],,
 +                      [neta_cv_eas_sys_not_found=yes])
 +    fi
 +
 +    if test "x$neta_cv_eas_sys_found" != "xyes" ; then
 +         AC_CHECK_FUNCS([attr_get attr_list attr_set attr_remove],,
 +                      [neta_cv_eas_sys_not_found=yes])
 +       AC_CHECK_FUNCS([attr_getf attr_listf attr_setf attr_removef],,
 +                      [neta_cv_eas_sys_not_found=yes])
 +    fi
 +  ;;
 +esac
 +
 +# Do xattr functions take additional options like on Darwin?
 +if test x"$ac_cv_func_getxattr" = x"yes" ; then
 +      AC_CACHE_CHECK([whether xattr interface takes additional options], smb_attr_cv_xattr_add_opt, [
 +              old_LIBS=$LIBS
 +              LIBS="$LIBS $ACL_LIBS"
 +              AC_TRY_COMPILE([
 +                      #include <sys/types.h>
 +                      #if HAVE_ATTR_XATTR_H
 +                      #include <attr/xattr.h>
 +                      #elif HAVE_SYS_XATTR_H
 +                      #include <sys/xattr.h>
 +                      #endif
 +              ],[
 +                      getxattr(0, 0, 0, 0, 0, 0);
 +              ],
 +              [smb_attr_cv_xattr_add_opt=yes],
 +              [smb_attr_cv_xattr_add_opt=no;LIBS=$old_LIBS])
 +      ])
 +      if test x"$smb_attr_cv_xattr_add_opt" = x"yes"; then
 +              AC_DEFINE(XATTR_ADD_OPT, 1, [xattr functions have additional options])
 +      fi
 +fi
 +
 +if test "x$neta_cv_eas_sys_found" = "xyes" ; then
 +   if test "x$neta_cv_eas_sys_not_found" != "xyes" ; then
 +      neta_cv_eas="$neta_cv_eas | sys"
 +   fi
 +fi
 +AC_DEFINE_UNQUOTED(EA_MODULES,["$neta_cv_eas"],[Available Extended Attributes modules])
 +])
 +
 +dnl Check for libsmbsharemodes from Samba for Samba/Netatalk access/deny/share modes interop
 +dnl Defines "neta_cv_have_smbshmd" to "yes" or "no"
 +dnl AC_SUBST's "SMB_SHAREMODES_CFLAGS" and "SMB_SHAREMODES_LDFLAGS"
 +dnl AM_CONDITIONAL's "USE_SMB_SHAREMODES"
 +AC_DEFUN([AC_NETATALK_SMB_SHAREMODES], [
 +    neta_cv_have_smbshmd=no
 +    AC_ARG_WITH(smbsharemodes-lib,
 +                [  --with-smbsharemodes-lib=PATH        PATH to libsmbsharemodes lib from Samba],
 +                [SMB_SHAREMODES_LDFLAGS="-L$withval -lsmbsharemodes"]
 +    )
 +    AC_ARG_WITH(smbsharemodes-include,
 +                [  --with-smbsharemodes-include=PATH    PATH to libsmbsharemodes header from Samba],
 +                [SMB_SHAREMODES_CFLAGS="-I$withval"]
 +    )
 +    AC_ARG_WITH(smbsharemodes,
 +                [AS_HELP_STRING([--with-smbsharemodes],[Samba interop (default is yes)])],
 +                [use_smbsharemodes=$withval],
 +                [use_smbsharemodes=yes]
 +    )
 +
 +    if test x"$use_smbsharemodes" = x"yes" ; then
 +        AC_MSG_CHECKING([whether to enable Samba/Netatalk access/deny/share-modes interop])
 +
 +        saved_CFLAGS="$CFLAGS"
 +        saved_LDFLAGS="$LDFLAGS"
 +        CFLAGS="$SMB_SHAREMODES_CFLAGS $CFLAGS"
 +        LDFLAGS="$SMB_SHAREMODES_LDFLAGS $LDFLAGS"
 +
 +        AC_LINK_IFELSE(
 +            [#include <unistd.h>
 +             #include <stdio.h>
 +             #include <sys/time.h>
 +             #include <time.h>
 +             #include <stdint.h>
 +             /* From messages.h */
 +             struct server_id {
 +                 pid_t pid;
 +             };
 +             #include "smb_share_modes.h"
 +             int main(void) { (void)smb_share_mode_db_open(""); return 0;}],
 +            [neta_cv_have_smbshmd=yes]
 +        )
 +
 +        AC_MSG_RESULT($neta_cv_have_smbshmd)
 +        AC_SUBST(SMB_SHAREMODES_CFLAGS, [$SMB_SHAREMODES_CFLAGS])
 +        AC_SUBST(SMB_SHAREMODES_LDFLAGS, [$SMB_SHAREMODES_LDFLAGS])
 +        CFLAGS="$saved_CFLAGS"
 +        LDFLAGS="$saved_LDFLAGS"
 +    fi
 +
 +    AM_CONDITIONAL(USE_SMB_SHAREMODES, test x"$neta_cv_have_smbshmd" = x"yes")
 +])