#include <arpa/inet.h>#include <ctype.h>#include <errno.h>#include <grp.h>#include <inttypes.h>#include <netdb.h>#include <netinet/in.h>#include <pwd.h>#include <regex.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/file.h>#include <sys/param.h>#include <sys/socket.h>#include <time.h>#include <utime.h>#include <bstrlib.h>#include <iniparser.h>#include <atalk/afp.h>#include <atalk/util.h>#include <atalk/logger.h>#include <atalk/ea.h>#include <atalk/globals.h>#include <atalk/iniparser_util.h>#include <atalk/errchk.h>#include <atalk/unix.h>#include <atalk/cnid.h>#include <atalk/dsi.h>#include <atalk/asp.h>#include <atalk/uuid.h>#include <atalk/netatalk_conf.h>Macros | |
| #define | VOLPASSLEN 8 |
| #define | UUID_PRINTABLE_STRING_LENGTH 37 |
| #define | IS_VAR(a, b) |
| #define | EABUFSZ 4 |
| #define | MAXPRESETLEN 100 |
| #define | MAXVAL 1024 |
Functions | |
| static int | rewrite_vol_uuid_conf (AFPObj *obj, struct vol *Volumes) |
| static char * | get_vol_uuid (const AFPObj *obj, const char *volname) |
| Get a volume's UUID from the config file. | |
| static int | do_check_ea_support (const struct vol *vol) |
| Check if the underlying filesystem supports EAs. | |
| static void | check_ea_support (struct vol *vol) |
| static int | check_vol_acl_support (const struct vol *vol) |
| Check whether a volume supports ACLs. | |
| static char * | volxlate (const AFPObj *obj, char *dest, size_t destlen, const char *src, const struct passwd *pwd, const char *path, const char *volname) |
| Handle variable substitutions. | |
| static int | accessvol (const AFPObj *obj, const char *args, const char *name) |
| check user access list for volume | |
| static int | hostaccessvol (const AFPObj *obj, const char *volname, const char *args) |
| check host access list for volume | |
| static const char * | getoption_str (const dictionary *conf, const char *vol, const char *opt, const char *defsec, const char *defval) |
| Get option string from config, use default value if not set. | |
| static char * | getoption_strdup (const dictionary *conf, const char *vol, const char *opt, const char *defsec, const char *defval) |
| Get option string from config, use default value if not set. | |
| static int | getoption_bool (const dictionary *conf, const char *vol, const char *opt, const char *defsec, int defval) |
| Get boolean option from config, use default value if not set. | |
| static int | getoption_int (const dictionary *conf, const char *vol, const char *opt, const char *defsec, int defval) |
| Get integer option from config, use default value if not set. | |
| static int | vdgoption_bool (const dictionary *conf, const char *vol, const char *opt, const char *defsec, int defval) |
| Get boolean option from volume, default section or global - use default value if not set. | |
| static struct vol * | creatvol (AFPObj *obj, const struct passwd *pwd, const char *section, const char *name, const char *path_in, const char *preset) |
| Create volume struct. | |
| static int | volfile_changed (AFPObj *obj) |
| static int | vol_section (const char *sec) |
| static int | readvolfile (AFPObj *obj, const struct passwd *pwent) |
| Read volumes from iniconfig and add the volumes contained within to the global volume list. | |
| static int | setextmap (char *ext, char *type, char *creator) |
| static int | extmap_cmp (const void *map1, const void *map2) |
| static void | sortextmap (void) |
| static void | free_extmap (void) |
| static int | ext_cmp_key (const void *key, const void *obj) |
| struct extmap * | getextmap (const char *path) |
| struct extmap * | getdefextmap (void) |
| static int | readextmap (const char *file) |
| void | volume_unlink (struct vol *volume) |
| void | volume_free (struct vol *vol) |
| Free all resources allocated in a struct vol in load_volumes(). | |
| int | load_charset (struct vol *vol) |
| int | load_volumes (AFPObj *obj, lv_flags_t flags) |
| Initialize volumes and load ini configfile. | |
| void | unload_volumes (AFPObj *obj) |
| struct vol * | getvolumes (void) |
| struct vol * | getvolbyvid (const uint16_t vid) |
| static char * | getuserbypath (const char *path) |
| get username by path | |
| struct vol * | getvolbypath (AFPObj *obj, const char *path) |
| Search volume by path, creating user home vols as necessary. | |
| struct vol * | getvolbyname (const char *name) |
| int | afp_config_parse (AFPObj *AFPObj, char *processname) |
| void | afp_config_free (AFPObj *obj) |
Variables | |
| static int | have_uservol = 0 |
| static struct vol * | Volumes = NULL |
| static uint16_t | lastvid = 0 |
| static struct extmap * | Extmap = NULL |
| static struct extmap * | Defextmap = NULL |
| static int | Extmap_cnt |
| #define EABUFSZ 4 |
| #define IS_VAR | ( | a, | |
| b ) |
| #define MAXPRESETLEN 100 |
| #define MAXVAL 1024 |
| #define UUID_PRINTABLE_STRING_LENGTH 37 |
| #define VOLPASSLEN 8 |
|
static |
check user access list for volume
This function wants a string consisting of names seperated by comma or space. Names may be quoted within a pair of quotes. Groups are denoted by a leading @ symbol.
Example:
| [in] | obj | AFPObj containing user and group info |
| [in] | args | access list string; NULL allows everybody to have access |
| [in] | name | user name to check |
| void afp_config_free | ( | AFPObj * | obj | ) |
get rid of any allocated afp_option buffers.
| int afp_config_parse | ( | AFPObj * | AFPObj, |
| char * | processname ) |
Initialize an AFPObj and options from ini config file
|
static |
|
static |
Check whether a volume supports ACLs.
| [in] | vol | volume |
|
static |
Create volume struct.
| [in] | obj | handle |
| [in] | pwd | struct passwd of logged in user, may be NULL in master afpd |
| [in] | section | volume name wo variables expanded (exactly as in iniconfig) |
| [in] | name | volume name |
| [in] | path_in | volume path |
| [in] | preset | default preset, may be NULL |
|
static |
Check if the underlying filesystem supports EAs.
If not, switch to ea=ad. As we can't check (requires write access) on ro-volumes, we assume ea=sys.
|
static |
|
static |
|
static |
|
static |
Get a volume's UUID from the config file.
If there is none, it is generated and stored there.
| struct extmap * getdefextmap | ( | void | ) |
| struct extmap * getextmap | ( | const char * | path | ) |
|
static |
Get boolean option from config, use default value if not set.
| [in] | conf | config handle |
| [in] | vol | volume name (must be section name i.e. wo vars expanded) |
| [in] | opt | option |
| [in] | defsec | if "option" is not found in "vol", try to find it in section "defsec" |
| [in] | defval | if neither "vol" nor "defsec" contain "opt" return "defval" |
|
static |
Get integer option from config, use default value if not set.
| [in] | conf | config handle |
| [in] | vol | volume name (must be section name i.e. wo vars expanded) |
| [in] | opt | option |
| [in] | defsec | if "option" is not found in "vol", try to find it in section "defsec" |
| [in] | defval | if neither "vol" nor "defsec" contain "opt" return "defval" |
|
static |
Get option string from config, use default value if not set.
| [in] | conf | config handle |
| [in] | vol | volume name (must be section name i.e. wo vars expanded) |
| [in] | opt | option |
| [in] | defsec | if "option" is not found in "vol", try to find it in section "defsec" |
| [in] | defval | if neither "vol" nor "defsec" contain "opt" return "defval" |
|
static |
Get option string from config, use default value if not set.
Returns a dynamically allocated string which caller must free
| [in] | conf | config handle |
| [in] | vol | volume name (must be section name i.e. wo vars expanded) |
| [in] | opt | option |
| [in] | defsec | if "option" is not found in "vol", try to find it in section "defsec" |
| [in] | defval | if neither "vol" nor "defsec" contain "opt" return "defval" |
|
static |
get username by path
getvolbypath() assumes that the user home directory has the same name as the username. If that is not true, getuserbypath() is called and tries to retrieve the username from the directory owner, checking its validity.
| [in] | path | absolute volume path |
| struct vol * getvolbyname | ( | const char * | name | ) |
Search volume by path, creating user home vols as necessary.
Path may be absolute or relative. Ordinary volume structs are created when the ini config is initially parsed (load_volumes()), but user volumes are as load_volumes() only can create the user volume of the logged in user in an AFP session in afpd, but not when called from e.g. cnid_metad or dbd. Both cnid_metad and dbd thus need a way to lookup and create struct vols for user home by path. This is what this func does as well.
| [in,out] | obj | handle |
| [in] | path | path, may be relative or absolute |
| struct vol * getvolbyvid | ( | const uint16_t | vid | ) |
| struct vol * getvolumes | ( | void | ) |
|
static |
check host access list for volume
This function wants a string consisting of ip addresses or networks in CIDR notation seperated by comma or space.
| [in] | obj | AFPObj containing client info |
| [in] | volname | volume name (not used) |
| [in] | args | access list string; NULL allows all hosts to have access |
| int load_charset | ( | struct vol * | vol | ) |
Load charsets for a volume
| int load_volumes | ( | AFPObj * | obj, |
| lv_flags_t | flags ) |
Initialize volumes and load ini configfile.
| [in] | obj | handle |
| [in] | flags | flags controlling volume load behaviour:
|
|
static |
|
static |
Read volumes from iniconfig and add the volumes contained within to the global volume list.
This gets called from the forked afpd childs. The master now reads this too for Zeroconf announcements.
|
static |
|
static |
| void unload_volumes | ( | AFPObj * | obj | ) |
|
static |
Get boolean option from volume, default section or global - use default value if not set.
Order of precedence: volume -> default section -> global -> default value
"vdg" means volume, default section or global
| [in] | conf | config handle |
| [in] | vol | volume name (must be section name i.e. wo vars expanded) |
| [in] | opt | option |
| [in] | defsec | if "option" is not found in "vol", try to find it in section "defsec" |
| [in] | defval | if neither "vol" nor "defsec" contain "opt" return "defval" |
|
static |
|
static |
| void volume_free | ( | struct vol * | vol | ) |
Free all resources allocated in a struct vol in load_volumes().
Actually opening a volume (afp_openvol()) will allocate additional resources which are freed in closevol()
| void volume_unlink | ( | struct vol * | volume | ) |
Remove a volume from the linked list of volumes
|
static |
Handle variable substitutions.
here's what we understand:
This get's called from readvolfile with
Using this information we can reject xlation of any variable depeninding on a login context which is not given in the afp master, where we must evaluate this whole stuff too for the Zeroconf announcements.
|
static |
|
static |
|
static |
|
static |
whether there's generic user home share in config ("~" or "~/path", but not "~user")
|
static |
|
static |