2 * $Id: switch.c,v 1.16 2009-02-25 16:14:08 franklahm Exp $
4 * Copyright (c) 1990,1991 Regents of The University of Michigan.
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.
17 * Research Systems Unix Group
18 * The University of Michigan
20 * 535 W. William Street
23 * netatalk@itd.umich.edu
28 #endif /* HAVE_CONFIG_H */
30 #include <stdio.h> /* to pick up NULL */
31 #include <sys/stat.h> /* works around a bug */
32 #include <atalk/logger.h>
34 #include <atalk/afp.h>
35 #include <atalk/uam.h>
39 /* grab the FP functions */
45 #include "directory.h"
49 #ifdef HAVE_NFSv4_ACLS
53 static int afp_null(obj, ibuf, ibuflen, rbuf, rbuflen )
55 char *ibuf, *rbuf _U_;
56 int ibuflen _U_, *rbuflen;
58 LOG(log_info, logtype_afpd, "afp_null handle %d", *ibuf );
60 return( AFPERR_NOOP );
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...
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 */
135 int (**afp_switch)() = preauth_switch;
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,
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, NULL, 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 */
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)())
212 case UAM_AFPSERVER_PREAUTH:
214 *old = preauth_switch[id];
216 preauth_switch[id] = new;
218 case UAM_AFPSERVER_POSTAUTH:
220 *old = postauth_switch[id];
222 postauth_switch[id] = new;
225 LOG(log_debug, logtype_afpd, "uam_afpserver_action: unknown switch %d[%d]",