1/*
2 * $Id: unix.h,v 1.23 2010-04-12 14:28:47 franklahm Exp $
3 */
4
5#ifndef AFPD_UNIX_H
6#define AFPD_UNIX_H
7
8#ifdef HAVE_SYS_CDEFS_H
9#include <sys/cdefs.h>
10#endif /* HAVE_SYS_CDEFS_H */
11#include <netatalk/endian.h>
12#include "config.h"
13#include "volume.h"
14
15#if defined( sun ) && !defined( __svr4__ )
16#ifdef i386
17typedef int	mode_t;
18#endif /*i386*/
19#endif /*sun __svr4__*/
20
21#if defined(HAVE_SYS_VFS_H) || defined( sun ) || defined( ibm032 )
22#include <sys/vfs.h>
23#endif /* HAVE_SYS_VFS_H || sun || ibm032 */
24
25#if defined(_IBMR2) || defined(HAVE_STATFS_H)
26#include <sys/statfs.h>
27/* this might not be right. */
28#define f_mntfromname f_fname
29#endif /* _IBMR2 || HAVE_STATFS_H */
30
31#if defined(TRU64)
32#define f_frsize f_fsize
33#else /* TRU64 */
34/* temp fix, was: defined(HAVE_SYS_STATVFS) || defined(__svr4__) */
35#if defined(__svr4__) || (defined(__NetBSD__) && (__NetBSD_Version__ >= 200040000))
36#include <sys/statvfs.h>
37#define statfs statvfs
38#else /* HAVE_SYS_STATVFS || __svr4__ */
39#define	f_frsize f_bsize
40#endif /* USE_STATVFS_H */
41#endif /* TRU64 */
42
43#if defined(__svr4__) || defined(HAVE_SYS_MNTTAB_H)
44#include <sys/mnttab.h>
45#endif /* __svr4__ || HAVE_SYS_MNTTAB_H */
46
47#if defined(__DragonFly__)
48#define dqblk ufs_dqblk
49#endif
50
51#if defined(HAVE_SYS_MOUNT_H) || defined(BSD4_4) || \
52    defined(linux) || defined(ultrix)
53#include <sys/mount.h>
54#endif /* HAVE_SYS_MOUNT_H || BSD4_4 || linux || ultrix */
55
56#if defined(linux) || defined(HAVE_MNTENT_H)
57#include <mntent.h>
58#endif /* linux || HAVE_MNTENT_H */
59
60
61#ifndef NO_QUOTA_SUPPORT
62#if !defined(HAVE_LIBQUOTA)
63
64#if !(defined(__svr4__) || defined(HAVE_DQB_BTIMELIMIT))
65#define dqb_btimelimit  dqb_btime
66#endif /* ! __svr4__ || HAVE_DQB_BTIMELIMIT */
67
68#if defined(linux) || defined(ultrix) || defined(HAVE_QUOTA_H)
69#ifndef NEED_QUOTACTL_WRAPPER
70/*#include <sys/quota.h>*/
71/*long quotactl (int, const char *, unsigned int, caddr_t); */
72/* extern long quotactl (int, const char *, long, caddr_t); */
73
74#else /* ! NEED_QUOTACTL_WRAPPER */
75#include <asm/types.h>
76#include <asm/unistd.h>
77#include <linux/quota.h>
78#endif /* ! NEED_QUOTACTL_WRAPPER */
79#endif /* linux || ultrix || HAVE_QUOTA_H */
80
81#ifdef __svr4__
82#include <sys/fs/ufs_quota.h>
83#endif /* __svr4__ */
84
85#ifdef BSD4_4
86#include <ufs/ufs/quota.h>
87#endif /* BSD4_4 */
88
89#ifdef HAVE_UFS_QUOTA_H
90#include <ufs/quota.h>
91#endif /* HAVE_UFS_QUOTA_H */
92
93#ifdef _IBMR2
94#include <jfs/quota.h>
95#endif /* _IBMR2 */
96
97#include <unistd.h>
98#include <sys/types.h>
99#include <sys/stat.h>
100#include "directory.h"
101
102
103#if defined (linux)
104
105#define MAXQUOTAS 2
106
107/* definitions from sys/quota.h */
108#define USRQUOTA  0             /* element used for user quotas */
109#define GRPQUOTA  1             /* element used for group quotas */
110
111/*
112 * Command definitions for the 'quotactl' system call.
113 * The commands are broken into a main command defined below
114 * and a subcommand that is used to convey the type of
115 * quota that is being manipulated (see above).
116 */
117#define SUBCMDMASK  0x00ff
118#define SUBCMDSHIFT 8
119#define QCMD(cmd, type)  (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
120
121/* declare an internal version of the quota block struct */
122typedef u_int64_t qsize_t;	/* Type in which we store size limitations */
123typedef u_int32_t qid_t;	/* Type in which we store ids in memory */
124
125struct dqblk {
126  qsize_t bsize;
127  qsize_t dqb_ihardlimit;   /* absolute limit on allocated inodes */
128  qsize_t dqb_isoftlimit;   /* preferred inode limit */
129  qsize_t dqb_curinodes;    /* current # allocated inodes */
130  qsize_t dqb_bhardlimit;   /* absolute limit on disk blks alloc */
131  qsize_t dqb_bsoftlimit;   /* preferred limit on disk blks */
132  qsize_t dqb_curblocks;    /* current block count */
133  time_t  dqb_btime;        /* time limit for excessive disk use */
134  time_t  dqb_itime;        /* time limit for excessive inode use */
135};
136
137/* API v1 command definitions */
138#define Q_V1_GETQUOTA  0x0300
139#define Q_V1_SYNC      0x0600
140#define Q_V1_SETQLIM   0x0700
141#define Q_V1_GETSTATS  0x0800
142/* API v2 command definitions */
143#define Q_V2_SYNC      0x0600
144#define Q_V2_SETQLIM   0x0700
145#define Q_V2_GETQUOTA  0x0D00
146#define Q_V2_GETSTATS  0x1100
147/* proc API command definitions */
148#define Q_V3_SYNC      0x800001
149#define Q_V3_GETQUOTA  0x800007
150#define Q_V3_SETQUOTA  0x800008
151
152/* Interface versions */
153#define IFACE_UNSET 0
154#define IFACE_VFSOLD 1
155#define IFACE_VFSV0 2
156#define IFACE_GENERIC 3
157
158#define DEV_QBSIZE 1024
159
160struct dqblk_v3 {
161  u_int64_t dqb_bhardlimit;
162  u_int64_t dqb_bsoftlimit;
163  u_int64_t dqb_curspace;
164  u_int64_t dqb_ihardlimit;
165  u_int64_t dqb_isoftlimit;
166  u_int64_t dqb_curinodes;
167  u_int64_t dqb_btime;
168  u_int64_t dqb_itime;
169  u_int32_t dqb_valid;
170};
171
172struct dqblk_v2 {
173  unsigned int dqb_ihardlimit;
174  unsigned int dqb_isoftlimit;
175  unsigned int dqb_curinodes;
176  unsigned int dqb_bhardlimit;
177  unsigned int dqb_bsoftlimit;
178  qsize_t dqb_curspace;
179  time_t dqb_btime;
180  time_t dqb_itime;
181};
182
183struct dqstats_v2 {
184  u_int32_t lookups;
185  u_int32_t drops;
186  u_int32_t reads;
187  u_int32_t writes;
188  u_int32_t cache_hits;
189  u_int32_t allocated_dquots;
190  u_int32_t free_dquots;
191  u_int32_t syncs;
192  u_int32_t version;
193};
194
195struct dqblk_v1 {
196  u_int32_t dqb_bhardlimit;
197  u_int32_t dqb_bsoftlimit;
198  u_int32_t dqb_curblocks;
199  u_int32_t dqb_ihardlimit;
200  u_int32_t dqb_isoftlimit;
201  u_int32_t dqb_curinodes;
202  time_t dqb_btime;
203  time_t dqb_itime;
204};
205
206extern long quotactl (unsigned int, const char *, int, caddr_t);
207
208
209
210#endif /* linux */
211
212extern int getnfsquota (struct vol *, const int, const u_int32_t,
213                                struct dqblk *);
214
215#endif /* ! HAVE_LIBQUOTA */
216extern int uquota_getvolspace (struct vol *, VolSpace *, VolSpace *,
217                                       const u_int32_t);
218#endif /* NO_QUOTA_SUPPORT */
219
220extern struct afp_options default_options;
221
222extern int gmem            (const gid_t);
223extern int setdeskmode      (const mode_t);
224extern int setdirunixmode   (const struct vol *, const char *, mode_t);
225extern int setdirmode       (const struct vol *, const char *, mode_t);
226extern int setdeskowner     (const uid_t, const gid_t);
227extern int setdirowner      (const struct vol *, const char *, const uid_t, const gid_t);
228extern int setfilunixmode   (const struct vol *, struct path*, const mode_t);
229extern int setfilowner      (const struct vol *, const uid_t, const gid_t, struct path*);
230extern void accessmode      (const struct vol *, char *, struct maccess *, struct dir *, struct stat *);
231
232#ifdef AFS
233    #define accessmode afsmode
234#endif
235
236#endif /* UNIX_H */
237