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