]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/switch.c
Initial checkin of ACLs patch
[netatalk.git] / etc / afpd / switch.c
1 /*
2  * $Id: switch.c,v 1.15 2009-02-02 11:55:01 franklahm Exp $
3  *
4  * Copyright (c) 1990,1991 Regents of The University of Michigan.
5  * All Rights Reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software and
8  * its documentation for any purpose and without fee is hereby granted,
9  * provided that the above copyright notice appears in all copies and
10  * that both that copyright notice and this permission notice appear
11  * in supporting documentation, and that the name of The University
12  * of Michigan not be used in advertising or publicity pertaining to
13  * distribution of the software without specific, written prior
14  * permission. This software is supplied as is without expressed or
15  * implied warranties of any kind.
16  *
17  *      Research Systems Unix Group
18  *      The University of Michigan
19  *      c/o Mike Clark
20  *      535 W. William Street
21  *      Ann Arbor, Michigan
22  *      +1-313-763-0525
23  *      netatalk@itd.umich.edu
24  */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif /* HAVE_CONFIG_H */
29
30 #include <stdio.h>  /* to pick up NULL */
31 #include <sys/stat.h> /* works around a bug */
32 #include <atalk/logger.h>
33
34 #include <atalk/afp.h>
35 #include <atalk/uam.h>
36
37 #include "globals.h"
38
39 /* grab the FP functions */
40 #include "auth.h" 
41 #include "desktop.h"
42 #include "switch.h"
43 #include "fork.h"
44 #include "file.h"
45 #include "directory.h"
46 #include "filedir.h"
47 #include "status.h"
48 #include "misc.h"
49 #ifdef HAVE_NFSv4_ACLS
50 #include "acls.h"
51 #endif
52
53 static int afp_null(obj, ibuf, ibuflen, rbuf, rbuflen )
54 AFPObj  *obj _U_;
55 char    *ibuf, *rbuf _U_;
56 int     ibuflen _U_, *rbuflen;
57 {
58     LOG(log_info, logtype_afpd, "afp_null handle %d", *ibuf );
59     *rbuflen = 0;
60     return( AFPERR_NOOP );
61 }
62
63 /*
64  * Routines marked "NULL" are not AFP functions.
65  * Routines marked "afp_null" are AFP functions
66  * which are not yet implemented. A fine line...
67  */
68 int     (*preauth_switch[])() = {
69     NULL, NULL, NULL, NULL,
70     NULL, NULL, NULL, NULL,                                     /*   0 -   7 */
71     NULL, NULL, NULL, NULL,
72     NULL, NULL, NULL, NULL,                                     /*   8 -  15 */
73     NULL, NULL, afp_login, afp_logincont,
74     afp_logout, NULL, NULL, NULL,                               /*  16 -  23 */
75     NULL, NULL, NULL, NULL,
76     NULL, NULL, NULL, NULL,                                     /*  24 -  31 */
77     NULL, NULL, NULL, NULL,
78     NULL, NULL, NULL, NULL,                                     /*  32 -  39 */
79     NULL, NULL, NULL, NULL,
80     NULL, NULL, NULL, NULL,                                     /*  40 -  47 */
81     NULL, NULL, NULL, NULL,
82     NULL, NULL, NULL, NULL,                                     /*  48 -  55 */
83     NULL, NULL, NULL, NULL,
84     NULL, NULL, NULL, afp_login_ext,                            /*  56 -  63 */
85     NULL, NULL, NULL, NULL,
86     NULL, NULL, NULL, NULL,                                     /*  64 -  71 */
87     NULL, NULL, NULL, NULL,
88     NULL, NULL, NULL, NULL,                                     /*  72 -  79 */
89     NULL, NULL, NULL, NULL,
90     NULL, NULL, NULL, NULL,                                     /*  80 -  87 */
91     NULL, NULL, NULL, NULL,
92     NULL, NULL, NULL, NULL,                                     /*  88 -  95 */
93     NULL, NULL, NULL, NULL,
94     NULL, NULL, NULL, NULL,                                     /*  96 - 103 */
95     NULL, NULL, NULL, NULL,
96     NULL, NULL, NULL, NULL,                                     /* 104 - 111 */
97     NULL, NULL, NULL, NULL,
98     NULL, NULL, NULL, NULL,                                     /* 112 - 119 */
99     NULL, NULL, NULL, NULL,
100     NULL, NULL, NULL, NULL,                                     /* 120 - 127 */
101     NULL, NULL, NULL, NULL,
102     NULL, NULL, NULL, NULL,                                     /* 128 - 135 */
103     NULL, NULL, NULL, NULL,
104     NULL, NULL, NULL, NULL,                                     /* 136 - 143 */
105     NULL, NULL, NULL, NULL,
106     NULL, NULL, NULL, NULL,                                     /* 144 - 151 */
107     NULL, NULL, NULL, NULL,
108     NULL, NULL, NULL, NULL,                                     /* 152 - 159 */
109     NULL, NULL, NULL, NULL,
110     NULL, NULL, NULL, NULL,                                     /* 160 - 167 */
111     NULL, NULL, NULL, NULL,
112     NULL, NULL, NULL, NULL,                                     /* 168 - 175 */
113     NULL, NULL, NULL, NULL,
114     NULL, NULL, NULL, NULL,                                     /* 176 - 183 */
115     NULL, NULL, NULL, NULL,
116     NULL, NULL, NULL, NULL,                                     /* 184 - 191 */
117     NULL, NULL, NULL, NULL,
118     NULL, NULL, NULL, NULL,                                     /* 192 - 199 */
119     NULL, NULL, NULL, NULL,
120     NULL, NULL, NULL, NULL,                                     /* 200 - 207 */
121     NULL, NULL, NULL, NULL,
122     NULL, NULL, NULL, NULL,                                     /* 208 - 215 */
123     NULL, NULL, NULL, NULL,
124     NULL, NULL, NULL, NULL,                                     /* 216 - 223 */
125     NULL, NULL, NULL, NULL,
126     NULL, NULL, NULL, NULL,                                     /* 224 - 231 */
127     NULL, NULL, NULL, NULL,
128     NULL, NULL, NULL, NULL,                                     /* 232 - 239 */
129     NULL, NULL, NULL, NULL,
130     NULL, NULL, NULL, NULL,                                     /* 240 - 247 */
131     NULL, NULL, NULL, NULL,
132     NULL, NULL, NULL, NULL,                                     /* 248 - 255 */
133 };
134
135 int     (**afp_switch)() = preauth_switch;
136
137 int     (*postauth_switch[])() = {
138     NULL, afp_bytelock, afp_closevol, afp_closedir,
139     afp_closefork, afp_copyfile, afp_createdir, afp_createfile, /*   0 -   7 */
140     afp_delete, afp_enumerate, afp_flush, afp_flushfork,
141     afp_null, afp_null, afp_getforkparams, afp_getsrvrinfo,     /*   8 -  15 */
142     afp_getsrvrparms, afp_getvolparams, afp_login, afp_logincont,
143     afp_logout, afp_mapid, afp_mapname, afp_moveandrename,      /*  16 -  23 */
144     afp_openvol, afp_opendir, afp_openfork, afp_read,
145     afp_rename, afp_setdirparams, afp_setfilparams, afp_setforkparams,
146     /*  24 -  31 */
147     afp_setvolparams, afp_write, afp_getfildirparams, afp_setfildirparams,
148     afp_changepw, afp_getuserinfo, afp_getsrvrmesg, afp_createid, /*  32 -  39 */
149     afp_deleteid, afp_resolveid, afp_exchangefiles, afp_catsearch,
150     afp_null, afp_null, afp_null, afp_null,                     /*  40 -  47 */
151     afp_opendt, afp_closedt, afp_null, afp_geticon,
152     afp_geticoninfo, afp_addappl, afp_rmvappl, afp_getappl,     /*  48 -  55 */
153     afp_addcomment, afp_rmvcomment, afp_getcomment, NULL,
154     NULL, NULL, NULL, NULL,                                     /*  56 -  63 */
155     NULL, NULL, NULL, NULL,
156     NULL, NULL, NULL, NULL,                                     /*  64 -  71 */
157     NULL, NULL, NULL, NULL,
158     NULL, NULL, afp_syncdir, NULL,                              /*  72 -  79 */
159     NULL, NULL, NULL, NULL,
160     NULL, NULL, NULL, NULL,                                     /*  80 -  87 */
161     NULL, NULL, NULL, NULL,
162     NULL, NULL, NULL, NULL,                                     /*  88 -  95 */
163     NULL, NULL, NULL, NULL,
164     afp_getdiracl, afp_setdiracl, afp_afschangepw, NULL,        /*  96 - 103 */
165     NULL, NULL, NULL, NULL,
166     NULL, NULL, NULL, NULL,                                     /* 104 - 111 */
167     NULL, NULL, NULL, NULL,
168     NULL, NULL, NULL, NULL,                                     /* 112 - 119 */
169     NULL, NULL, NULL, NULL,
170     NULL, NULL, NULL, NULL,                                     /* 120 - 127 */
171     NULL, NULL, NULL, NULL,
172     NULL, NULL, NULL, NULL,                                     /* 128 - 135 */
173     NULL, NULL, NULL, NULL,
174     NULL, NULL, NULL, NULL,                                     /* 136 - 143 */
175     NULL, NULL, NULL, NULL,
176     NULL, NULL, NULL, NULL,                                     /* 144 - 151 */
177     NULL, NULL, NULL, NULL,
178     NULL, NULL, NULL, NULL,                                     /* 152 - 159 */
179     NULL, NULL, NULL, NULL,
180     NULL, NULL, NULL, NULL,                                     /* 160 - 167 */
181     NULL, NULL, NULL, NULL,
182     NULL, NULL, NULL, NULL,                                     /* 168 - 175 */
183     NULL, NULL, NULL, NULL,
184     NULL, NULL, NULL, NULL,                                     /* 176 - 183 */
185     NULL, NULL, NULL, NULL,
186     NULL, NULL, NULL, NULL,                                     /* 184 - 191 */
187     afp_addicon, NULL, NULL, NULL,
188     NULL, NULL, NULL, NULL,                                     /* 192 - 199 */
189     NULL, NULL, NULL, NULL,
190     NULL, NULL, NULL, NULL,                                     /* 200 - 207 */
191     NULL, NULL, NULL, NULL,
192     NULL, NULL, NULL, NULL,                                     /* 208 - 215 */
193     NULL, NULL, NULL, NULL,
194     NULL, NULL, NULL, NULL,                                     /* 216 - 223 */
195     NULL, NULL, NULL, NULL,
196     NULL, NULL, NULL, NULL,                                     /* 224 - 231 */
197     NULL, NULL, NULL, NULL,
198     NULL, NULL, NULL, NULL,                                     /* 232 - 239 */
199     NULL, NULL, NULL, NULL,
200     NULL, NULL, NULL, NULL,                                     /* 240 - 247 */
201     NULL, NULL, NULL, NULL,
202     NULL, NULL, NULL, NULL,                                     /* 248 - 255 */
203 };
204
205
206 /* add a new function if it's specified. return the old function in
207  * "old" if there's a pointer there. */
208 int uam_afpserver_action(const int id, const int which,
209                          int (*new)(), int (**old)())
210 {
211     switch (which) {
212     case UAM_AFPSERVER_PREAUTH:
213         if (old)
214             *old = preauth_switch[id];
215         if (new)
216             preauth_switch[id] = new;
217         break;
218     case UAM_AFPSERVER_POSTAUTH:
219         if (old)
220             *old = postauth_switch[id];
221         if (new)
222             postauth_switch[id] = new;
223         break;
224     default:
225         LOG(log_debug, logtype_afpd, "uam_afpserver_action: unknown switch %d[%d]",
226             which, id);
227         return -1;
228     }
229
230     return 0;
231 }