netatalk  4.5.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
include/atalk/util.h
Go to the documentation of this file.
1
10
11#ifndef _ATALK_UTIL_H
12#define _ATALK_UTIL_H 1
13
14#include <poll.h>
15#include <stdbool.h>
16#include <sys/socket.h>
17#include <sys/stat.h>
18#include <sys/types.h>
19#include <unistd.h>
20
21#include <bstrlib.h>
22
23#include <netatalk/at.h>
24
25#include <atalk/cnid.h>
26#include <atalk/unicode.h>
27
28#ifndef RLIM_MAX
29#ifdef __APPLE__
30#define RLIM_MAX 10240
31#else
32#define RLIM_MAX 65535
33#endif
34#endif
35
36/* exit error codes */
37#define EXITERR_CLNT 1
38#define EXITERR_CONF 2
39#define EXITERR_SYS 3
40#define EXITERR_CLOSED 4
41
43#define AFP_PANIC(why) \
44 do { \
45 netatalk_panic(why); \
46 abort(); \
47 } while(0)
48
49#ifndef NDEBUG
51#define AFP_ASSERT(b) \
52 do { \
53 if (!(b)) { \
54 AFP_PANIC(#b); \
55 } \
56 } while(0)
57#else
58#define AFP_ASSERT(b) do {} while(0)
59#endif /* NDEBUG */
60
61#ifndef MIN
62#define MIN(a, b) ((a) < (b) ? (a) : (b))
63#endif
64
65#ifndef MAX
66#define MAX(a, b) ((a) > (b) ? (a) : (b))
67#endif
68
69#define STRCMP(a,b,c) (strcmp(a,c) b 0)
70#define ZERO_STRUCT(a) memset(&(a), 0, sizeof(a))
71#define ZERO_STRUCTP(a) memset((a), 0, sizeof(a))
72
73#ifdef WORDS_BIGENDIAN
74#define hton64(x) (x)
75#define ntoh64(x) (x)
76#else
77#define hton64(x) ((uint64_t) (htonl(((x) >> 32) & 0xffffffffLL)) | \
78 (uint64_t) ((htonl(x) & 0xffffffffLL) << 32))
79#define ntoh64(x) (hton64(x))
80#endif
81
82#ifndef SAFE_FREE
83#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
84#endif
85
86#ifdef WITH_SENDFILE
87extern ssize_t sys_sendfile(int __out_fd, int __in_fd, off_t *__offset,
88 size_t __count);
89#endif
90
91extern const int _diacasemap[], _dialowermap[];
92
93extern char **getifacelist(void);
94extern void freeifacelist(char **);
95
96#define diatolower(x) _dialowermap[(unsigned char) (x)]
97#define diatoupper(x) _diacasemap[(unsigned char) (x)]
98#ifndef NO_DDP
99extern int atalk_aton(char *, struct at_addr *);
100#endif
101extern void bprint(char *, int);
102extern int strdiacasecmp(const char *, const char *);
103extern int strndiacasecmp(const char *, const char *, size_t);
104extern pid_t server_lock(char * /*program*/, char * /*file*/, int /*debug*/);
105extern int check_lockfile(const char *program, const char *pidfile);
106extern int create_lockfile(const char *program, const char *pidfile);
107extern void fault_setup(void (*fn)(void *));
108extern void netatalk_panic(const char *why);
109#define server_unlock(x) (unlink(x))
110
111#ifndef HAVE_DLFCN_H
112extern void *mod_open(const char *);
113extern void *mod_symbol(void *, const char *);
114extern void mod_close(void *);
115#define mod_error() ""
116#else /* ! HAVE_DLFCN_H */
117#include <dlfcn.h>
118
119#ifndef RTLD_NOW
120#define RTLD_NOW 1
121#endif /* ! RTLD_NOW */
122
123#define mod_open(a) dlopen(a, RTLD_NOW | RTLD_GLOBAL)
124
125#define mod_symbol(a, b) dlsym(a, b)
126#define mod_error() dlerror()
127#define mod_close(a) dlclose(a)
128#endif /* ! HAVE_DLFCN_H */
129
130#ifndef strequal
131#define strequal(a,b) (strcmp((a),(b)) == 0)
132#endif
133
134#define cfrombstr(b) ((char *)((b)->data))
135
137#define BSTRING_STRIP_SLASH(a) \
138 do { \
139 while (bchar((a), blength(a) - 1) == '/') \
140 bdelete((a), blength(a) - 1, 1); \
141 } while (0);
142
143/******************************************************************
144 * locking.c
145 ******************************************************************/
146
147extern int lock_reg(int fd, int cmd, int type, off_t offest, int whence,
148 off_t len);
149#define read_lock(fd, offset, whence, len) \
150 lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))
151#define write_lock(fd, offset, whence, len) \
152 lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))
153#define unlock(fd, offset, whence, len) \
154 lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))
155
156/******************************************************************
157 * socket.c
158 ******************************************************************/
159
160extern int setnonblock(int fd, int cmd);
161extern ssize_t readt(int socket, void *data, const size_t length,
162 int setnonblocking, int timeout);
163extern ssize_t writet(int socket, void *data, const size_t length,
164 int setnonblocking, int timeout);
165extern const char *getip_string(const struct sockaddr *sa);
166extern unsigned int getip_port(const struct sockaddr *sa);
167extern void apply_ip_mask(struct sockaddr *ai, int maskbits);
168extern int compare_ip(const struct sockaddr *sa1, const struct sockaddr *sa2);
169extern int tokenize_ip_port(const char *ipurl, char **address, char **port);
170
171/* Structures and functions dealing with dynamic pollfd arrays */
172
174
178struct asev_data {
180 void *private;
183};
184
188struct asev {
189 struct pollfd *fdset;
190 struct asev_data *data;
191 int max;
192 int used;
193};
194
195extern struct asev *asev_init(int max);
196extern bool asev_add_fd(struct asev *sev, int fd, enum asev_fdtype fdtype,
197 void *private, int protocol);
198extern bool asev_del_fd(struct asev *sev, int fd);
199
200extern int send_fd(int socket, int fd);
201extern int recv_fd(int fd, int nonblocking);
202
203/******************************************************************
204 * unix.c
205 *****************************************************************/
206
207extern const char *getcwdpath(void);
208extern const char *fullpathname(const char *);
209extern char *stripped_slashes_basename(char *p);
210extern void randombytes(void *buf, int n);
211extern int daemonize(void);
212extern int run_cmd(const char *cmd, char **cmd_argv);
213extern char *realpath_safe(const char *path);
214extern const char *basename_safe(const char *path);
215extern char *strtok_quote(char *s, const char *delim);
216extern const char *tmpdir(void);
217extern int safe_atoi(const char *str, const char *param_name,
218 int min_val, int max_val, int default_val);
219
220extern int ochdir(const char *dir, int options);
221extern int ostat(const char *path, struct stat *buf, int options);
222extern int ostatat(int dirfd, const char *path, struct stat *st, int options);
223extern int ochown(const char *path, uid_t owner, gid_t group, int options);
224extern int ochmod(char *path, mode_t mode, const struct stat *st, int options);
225
226/******************************************************************
227 * cnid.c
228 *****************************************************************/
229
230extern bstring rel_path_in_vol(const char *path, const char *volpath);
231extern cnid_t cnid_for_path(struct _cnid_db *cdb, const char *volpath,
232 const char *path, cnid_t *did);
233extern char *uuid_strip_dashes(const char *uuid);
234
235/******************************************************************
236 * gettok.c
237 *****************************************************************/
238
239extern void initline(int, char *);
240extern int parseline(int, char *);
241
242/******************************************************************
243 * pathconv.c
244 *****************************************************************/
245
246extern char *convert_utf8_to_mac(const struct vol *vol, const char *upath);
247
248#endif /* _ATALK_UTIL_H */
uint32_t cnid_t
Definition adouble.h:156
static char buf[MAXPATHLEN+1]
Definition afppasswd.c:113
static struct savedt sa
Definition appl.c:32
uid_t uuid
C implementaion of bstring functions.
struct tagbstring * bstring
Definition bstrlib.h:86
size_t p
Definition dircache.c:256
static char * pidfile
Definition etc/atalkd/main.c:93
#define data
Definition hash.c:38
void freeifacelist(char **)
Definition getiface.c:157
const char * tmpdir(void)
Find a suitable temporary directory for Netatalk.
Definition libatalk/util/unix.c:288
ssize_t readt(int socket, void *data, const size_t length, int setnonblocking, int timeout)
non-blocking drop-in replacement for read with timeout using select
Definition socket.c:88
const char * getip_string(const struct sockaddr *sa)
convert an IPv4 or IPv6 address to a static string using inet_ntop
Definition socket.c:327
const char * getcwdpath(void)
get cwd in static buffer
Definition libatalk/util/unix.c:218
int parseline(int, char *)
Definition gettok.c:32
pid_t server_lock(char *, char *, int)
Definition server_lock.c:33
bstring rel_path_in_vol(const char *path, const char *volpath)
Build path relative to volume root.
Definition util/cnid.c:72
char * stripped_slashes_basename(char *p)
Takes a buffer with a path, strips slashs, returns basename.
Definition libatalk/util/unix.c:270
int ochmod(char *path, mode_t mode, const struct stat *st, int options)
chmod() wrapper for symlink and ACL handling
Definition libatalk/util/unix.c:424
int ochown(const char *path, uid_t owner, gid_t group, int options)
Definition libatalk/util/unix.c:401
int compare_ip(const struct sockaddr *sa1, const struct sockaddr *sa2)
compare IP addresses for equality
Definition socket.c:460
asev_fdtype
Definition include/atalk/util.h:173
@ STATS_FD
Definition include/atalk/util.h:173
@ IPC_FD
Definition include/atalk/util.h:173
@ LISTEN_FD
Definition include/atalk/util.h:173
const int _dialowermap[]
Definition include/atalk/util.h:91
int lock_reg(int fd, int cmd, int type, off_t offest, int whence, off_t len)
lock a file with fctnl
Definition locking.c:86
int safe_atoi(const char *str, const char *param_name, int min_val, int max_val, int default_val)
Safe string to integer conversion with bounds checking.
Definition netatalk_conf.c:890
char * realpath_safe(const char *path)
Definition libatalk/util/unix.c:615
int ochdir(const char *dir, int options)
symlink safe chdir replacement
Definition libatalk/util/unix.c:480
int ostat(const char *path, struct stat *buf, int options)
Definition libatalk/util/unix.c:392
char * uuid_strip_dashes(const char *uuid)
Definition util/cnid.c:218
int tokenize_ip_port(const char *ipurl, char **address, char **port)
Tokenize IP(4/6) addresses with an optional port into address and port.
Definition socket.c:492
const char * fullpathname(const char *)
Request absolute path.
Definition libatalk/util/unix.c:235
int strdiacasecmp(const char *, const char *)
Definition strdicasecmp.c:527
const int _diacasemap[]
Definition strdicasecmp.c:7
bool asev_add_fd(struct asev *sev, int fd, enum asev_fdtype fdtype, void *private, int protocol)
Add a fd to a dynamic pollfd array and associated data array.
Definition socket.c:594
unsigned int getip_port(const struct sockaddr *sa)
return port number from struct sockaddr
Definition socket.c:373
char * strtok_quote(char *s, const char *delim)
extended strtok allows the quoted strings
Definition libatalk/util/unix.c:668
void * mod_symbol(void *, const char *)
struct asev * asev_init(int max)
Definition socket.c:564
char * convert_utf8_to_mac(const struct vol *vol, const char *upath)
Convert a UTF-8 filename to a mangled Mac filename.
Definition pathconv.c:25
ssize_t sys_sendfile(int __out_fd, int __in_fd, off_t *__offset, size_t __count)
Definition ad_sendfile.c:78
int create_lockfile(const char *program, const char *pidfile)
Definition server_lock.c:138
int run_cmd(const char *cmd, char **cmd_argv)
Definition libatalk/util/unix.c:62
void * mod_open(const char *)
void apply_ip_mask(struct sockaddr *ai, int maskbits)
apply netmask to IP (v4 or v6)
Definition socket.c:397
int ostatat(int dirfd, const char *path, struct stat *st, int options)
ostat/fsstatat multiplexer
Definition libatalk/util/unix.c:462
int send_fd(int socket, int fd)
Definition socket.c:746
const char * basename_safe(const char *path)
safe basename() replacement
Definition libatalk/util/unix.c:656
int daemonize(void)
Fork, exit parent, setsid(), chdir("/"), close all fds.
Definition libatalk/util/unix.c:119
void netatalk_panic(const char *why)
Definition fault.c:84
void initline(int, char *)
Definition gettok.c:21
void fault_setup(void(*fn)(void *))
Definition fault.c:155
int check_lockfile(const char *program, const char *pidfile)
Definition server_lock.c:111
void bprint(char *, int)
Definition bprint.c:17
cnid_t cnid_for_path(struct _cnid_db *cdb, const char *volpath, const char *path, cnid_t *did)
Resolves CNID of a given path.
Definition util/cnid.c:171
char ** getifacelist(void)
Get interfaces from the kernel.
Definition getiface.c:136
ssize_t writet(int socket, void *data, const size_t length, int setnonblocking, int timeout)
non-blocking drop-in replacement for read with timeout using select
Definition socket.c:217
void mod_close(void *)
void randombytes(void *buf, int n)
Definition libatalk/util/unix.c:570
int recv_fd(int fd, int nonblocking)
Receive a fd on a suitable socket.
Definition socket.c:682
bool asev_del_fd(struct asev *sev, int fd)
Remove fd from asev.
Definition socket.c:622
int strndiacasecmp(const char *, const char *, size_t)
Definition strdicasecmp.c:540
int atalk_aton(char *, struct at_addr *)
Check whether "cp" is a valid ascii representation of an AppleTalk address and convert to a binary ad...
Definition atalk_addr.c:32
int setnonblock(int fd, int cmd)
set or unset non-blocking IO on a fd
Definition socket.c:53
cnid_t did
Definition nad_cp.c:93
static enum op type
Definition nad_cp.c:96
static unsigned char port
Definition pap.c:504
Definition cnid.h:65
atalk socket event data
Definition include/atalk/util.h:178
int protocol
Definition include/atalk/util.h:182
enum asev_fdtype fdtype
Definition include/atalk/util.h:179
atalk socket event
Definition include/atalk/util.h:188
int max
Definition include/atalk/util.h:191
int used
Definition include/atalk/util.h:192
struct asev_data * data
Definition include/atalk/util.h:190
struct pollfd * fdset
Definition include/atalk/util.h:189
Definition at.h:68
Definition include/atalk/directory.h:56
Definition include/atalk/directory.h:123
Definition include/atalk/volume.h:33