2 * $Id: switch.c,v 1.19 2009-10-15 10:43:13 didg 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(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen)
55 LOG(log_info, logtype_afpd, "afp_null handle %d", *ibuf );
57 return( AFPERR_NOOP );
61 * Routines marked "NULL" are not AFP functions.
62 * Routines marked "afp_null" are AFP functions
63 * which are not yet implemented. A fine line...
65 static AFPCmd preauth_switch[] = {
66 NULL, NULL, NULL, NULL,
67 NULL, NULL, NULL, NULL, /* 0 - 7 */
68 NULL, NULL, NULL, NULL,
69 NULL, NULL, NULL, NULL, /* 8 - 15 */
70 NULL, NULL, afp_login, afp_logincont,
71 afp_logout, NULL, NULL, NULL, /* 16 - 23 */
72 NULL, NULL, NULL, NULL,
73 NULL, NULL, NULL, NULL, /* 24 - 31 */
74 NULL, NULL, NULL, NULL,
75 NULL, NULL, NULL, NULL, /* 32 - 39 */
76 NULL, NULL, NULL, NULL,
77 NULL, NULL, NULL, NULL, /* 40 - 47 */
78 NULL, NULL, NULL, NULL,
79 NULL, NULL, NULL, NULL, /* 48 - 55 */
80 NULL, NULL, NULL, NULL,
81 NULL, NULL, NULL, afp_login_ext, /* 56 - 63 */
82 NULL, NULL, NULL, NULL,
83 NULL, NULL, NULL, NULL, /* 64 - 71 */
84 NULL, NULL, NULL, NULL,
85 NULL, NULL, NULL, NULL, /* 72 - 79 */
86 NULL, NULL, NULL, NULL,
87 NULL, NULL, NULL, NULL, /* 80 - 87 */
88 NULL, NULL, NULL, NULL,
89 NULL, NULL, NULL, NULL, /* 88 - 95 */
90 NULL, NULL, NULL, NULL,
91 NULL, NULL, NULL, NULL, /* 96 - 103 */
92 NULL, NULL, NULL, NULL,
93 NULL, NULL, NULL, NULL, /* 104 - 111 */
94 NULL, NULL, NULL, NULL,
95 NULL, NULL, NULL, NULL, /* 112 - 119 */
96 NULL, NULL, NULL, NULL,
97 NULL, NULL, NULL, NULL, /* 120 - 127 */
98 NULL, NULL, NULL, NULL,
99 NULL, NULL, NULL, NULL, /* 128 - 135 */
100 NULL, NULL, NULL, NULL,
101 NULL, NULL, NULL, NULL, /* 136 - 143 */
102 NULL, NULL, NULL, NULL,
103 NULL, NULL, NULL, NULL, /* 144 - 151 */
104 NULL, NULL, NULL, NULL,
105 NULL, NULL, NULL, NULL, /* 152 - 159 */
106 NULL, NULL, NULL, NULL,
107 NULL, NULL, NULL, NULL, /* 160 - 167 */
108 NULL, NULL, NULL, NULL,
109 NULL, NULL, NULL, NULL, /* 168 - 175 */
110 NULL, NULL, NULL, NULL,
111 NULL, NULL, NULL, NULL, /* 176 - 183 */
112 NULL, NULL, NULL, NULL,
113 NULL, NULL, NULL, NULL, /* 184 - 191 */
114 NULL, NULL, NULL, NULL,
115 NULL, NULL, NULL, NULL, /* 192 - 199 */
116 NULL, NULL, NULL, NULL,
117 NULL, NULL, NULL, NULL, /* 200 - 207 */
118 NULL, NULL, NULL, NULL,
119 NULL, NULL, NULL, NULL, /* 208 - 215 */
120 NULL, NULL, NULL, NULL,
121 NULL, NULL, NULL, NULL, /* 216 - 223 */
122 NULL, NULL, NULL, NULL,
123 NULL, NULL, NULL, NULL, /* 224 - 231 */
124 NULL, NULL, NULL, NULL,
125 NULL, NULL, NULL, NULL, /* 232 - 239 */
126 NULL, NULL, NULL, NULL,
127 NULL, NULL, NULL, NULL, /* 240 - 247 */
128 NULL, NULL, NULL, NULL,
129 NULL, NULL, NULL, NULL, /* 248 - 255 */
132 AFPCmd *afp_switch = preauth_switch;
134 AFPCmd postauth_switch[] = {
135 NULL, afp_bytelock, afp_closevol, afp_closedir,
136 afp_closefork, afp_copyfile, afp_createdir, afp_createfile, /* 0 - 7 */
137 afp_delete, afp_enumerate, afp_flush, afp_flushfork,
138 afp_null, afp_null, afp_getforkparams, afp_getsrvrinfo, /* 8 - 15 */
139 afp_getsrvrparms, afp_getvolparams, afp_login, afp_logincont,
140 afp_logout, afp_mapid, afp_mapname, afp_moveandrename, /* 16 - 23 */
141 afp_openvol, afp_opendir, afp_openfork, afp_read,
142 afp_rename, afp_setdirparams, afp_setfilparams, afp_setforkparams,
144 afp_setvolparams, afp_write, afp_getfildirparams, afp_setfildirparams,
145 afp_changepw, afp_getuserinfo, afp_getsrvrmesg, afp_createid, /* 32 - 39 */
146 afp_deleteid, afp_resolveid, afp_exchangefiles, afp_catsearch,
147 afp_null, afp_null, afp_null, afp_null, /* 40 - 47 */
148 afp_opendt, afp_closedt, afp_null, afp_geticon,
149 afp_geticoninfo, afp_addappl, afp_rmvappl, afp_getappl, /* 48 - 55 */
150 afp_addcomment, afp_rmvcomment, afp_getcomment, NULL,
151 NULL, NULL, NULL, NULL, /* 56 - 63 */
152 NULL, NULL, NULL, NULL,
153 NULL, NULL, NULL, NULL, /* 64 - 71 */
154 NULL, NULL, NULL, NULL,
155 NULL, NULL, afp_syncdir, afp_syncfork, /* 72 - 79 */
156 NULL, NULL, NULL, NULL,
157 NULL, NULL, NULL, NULL, /* 80 - 87 */
158 NULL, NULL, NULL, NULL,
159 NULL, NULL, NULL, NULL, /* 88 - 95 */
160 NULL, NULL, NULL, NULL,
161 afp_getdiracl, afp_setdiracl, afp_afschangepw, NULL, /* 96 - 103 */
162 NULL, NULL, NULL, NULL,
163 NULL, NULL, NULL, NULL, /* 104 - 111 */
164 NULL, NULL, NULL, NULL,
165 NULL, NULL, NULL, NULL, /* 112 - 119 */
166 NULL, NULL, NULL, NULL,
167 NULL, NULL, NULL, NULL, /* 120 - 127 */
168 NULL, NULL, NULL, NULL,
169 NULL, NULL, NULL, NULL, /* 128 - 135 */
170 NULL, NULL, NULL, NULL,
171 NULL, NULL, NULL, NULL, /* 136 - 143 */
172 NULL, NULL, NULL, NULL,
173 NULL, NULL, NULL, NULL, /* 144 - 151 */
174 NULL, NULL, NULL, NULL,
175 NULL, NULL, NULL, NULL, /* 152 - 159 */
176 NULL, NULL, NULL, NULL,
177 NULL, NULL, NULL, NULL, /* 160 - 167 */
178 NULL, NULL, NULL, NULL,
179 NULL, NULL, NULL, NULL, /* 168 - 175 */
180 NULL, NULL, NULL, NULL,
181 NULL, NULL, NULL, NULL, /* 176 - 183 */
182 NULL, NULL, NULL, NULL,
183 NULL, NULL, NULL, NULL, /* 184 - 191 */
184 afp_addicon, NULL, NULL, NULL,
185 NULL, NULL, NULL, NULL, /* 192 - 199 */
186 NULL, NULL, NULL, NULL,
187 NULL, NULL, NULL, NULL, /* 200 - 207 */
188 NULL, NULL, NULL, NULL,
189 NULL, NULL, NULL, NULL, /* 208 - 215 */
190 NULL, NULL, NULL, NULL,
191 NULL, NULL, NULL, NULL, /* 216 - 223 */
192 NULL, NULL, NULL, NULL,
193 NULL, NULL, NULL, NULL, /* 224 - 231 */
194 NULL, NULL, NULL, NULL,
195 NULL, NULL, NULL, NULL, /* 232 - 239 */
196 NULL, NULL, NULL, NULL,
197 NULL, NULL, NULL, NULL, /* 240 - 247 */
198 NULL, NULL, NULL, NULL,
199 NULL, NULL, NULL, NULL, /* 248 - 255 */
203 /* add a new function if it's specified. return the old function in
204 * "old" if there's a pointer there. */
205 int uam_afpserver_action(const int id, const int which,
206 AFPCmd new_table, AFPCmd *old)
209 case UAM_AFPSERVER_PREAUTH:
211 *old = preauth_switch[id];
213 preauth_switch[id] = new_table;
215 case UAM_AFPSERVER_POSTAUTH:
217 *old = postauth_switch[id];
219 postauth_switch[id] = new_table;
222 LOG(log_debug, logtype_afpd, "uam_afpserver_action: unknown switch %d[%d]",