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