| File: | builds/wireshark/wireshark/epan/dissectors/packet-afp.c |
| Warning: | line 1493, column 3 Value stored to 'offset' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* packet-afp.c |
| 2 | * Routines for afp packet dissection |
| 3 | * Copyright 2002, Didier Gautheron <dgautheron@magic.fr> |
| 4 | * |
| 5 | * Wireshark - Network traffic analyzer |
| 6 | * By Gerald Combs <gerald@wireshark.org> |
| 7 | * Copyright 1998 Gerald Combs |
| 8 | * |
| 9 | * Copied from README.developer |
| 10 | * Copied from packet-dsi.c |
| 11 | * |
| 12 | * SPDX-License-Identifier: GPL-2.0-or-later |
| 13 | */ |
| 14 | |
| 15 | #include "config.h" |
| 16 | |
| 17 | |
| 18 | #include <epan/packet.h> |
| 19 | #include <epan/exceptions.h> |
| 20 | #include <epan/to_str.h> |
| 21 | #include <epan/conversation.h> |
| 22 | #include <epan/prefs.h> |
| 23 | #include <epan/tap.h> |
| 24 | #include <epan/srt_table.h> |
| 25 | #include <epan/expert.h> |
| 26 | #include <wsutil/epochs.h> |
| 27 | |
| 28 | #include "packet-afp.h" |
| 29 | |
| 30 | /* The information in this module (AFP) comes from: |
| 31 | |
| 32 | AFP 2.1 & 2.2 documentation, in PDF form, at |
| 33 | |
| 34 | http://mirror.informatimago.com/next/developer.apple.com/documentation/macos8/pdf/ASAppleTalkFiling2.1_2.2.pdf |
| 35 | |
| 36 | formerly at |
| 37 | |
| 38 | http://developer.apple.com/DOCUMENTATION/macos8/pdf/ASAppleTalkFiling2.1_2.2.pdf |
| 39 | |
| 40 | AFP3.0.pdf from http://www.apple.com (still available?) |
| 41 | |
| 42 | AFP 3.1 programming guide, in PDF form, at |
| 43 | |
| 44 | https://web.archive.org/web/20040721011424/http://developer.apple.com/documentation/Networking/Conceptual/AFP/AFP3_1.pdf |
| 45 | |
| 46 | and, in HTML form, at |
| 47 | |
| 48 | https://web.archive.org/web/20041010010846/http://developer.apple.com/documentation/Networking/Conceptual/AFP/index.html |
| 49 | |
| 50 | AFP 3.2 programming guide, in PDF form, at |
| 51 | |
| 52 | https://web.archive.org/web/20060207231337/http://developer.apple.com/documentation/Networking/Conceptual/AFP/AFP3_1.pdf |
| 53 | |
| 54 | and, in HTML form, at |
| 55 | |
| 56 | https://web.archive.org/web/20080514131536/http://developer.apple.com/documentation/Networking/Conceptual/AFP/Introduction/chapter_1_section_1.html |
| 57 | |
| 58 | AFP 3.x specification, as of 2012, in PDF form, at |
| 59 | https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.363.9481&rep=rep1&type=pdf |
| 60 | |
| 61 | Current AFP 3.x programming guide, in HTML form, at |
| 62 | https://developer.apple.com/library/archive/documentation/Networking/Conceptual/AFP/Introduction/Introduction.html |
| 63 | |
| 64 | The netatalk source code by Wesley Craig & Adrian Sun |
| 65 | http://netatalk.sf.net |
| 66 | |
| 67 | XXX - distinguish between UTF-8 and Mac proprietary encodings for strings? |
| 68 | Does that need a preference in case we didn't see the client and server |
| 69 | negotiate that? |
| 70 | */ |
| 71 | /* Forward declarations */ |
| 72 | void proto_register_afp(void); |
| 73 | void proto_reg_handoff_afp(void); |
| 74 | |
| 75 | /* from netatalk/include/afp.h */ |
| 76 | #define AFPTRANS_NONE0 0 |
| 77 | #define AFPTRANS_DDP(1U << 0) (1U << 0) |
| 78 | #define AFPTRANS_TCP(1U << 1) (1U << 1) |
| 79 | #define AFPTRANS_ALL((1U << 0) | (1U << 1)) (AFPTRANS_DDP(1U << 0) | AFPTRANS_TCP(1U << 1)) |
| 80 | |
| 81 | /* AFP Attention Codes -- 4 bits */ |
| 82 | #define AFPATTN_SHUTDOWN(1U << 15) (1U << 15) /* shutdown/disconnect */ |
| 83 | #define AFPATTN_CRASH(1U << 14) (1U << 14) /* server crashed */ |
| 84 | #define AFPATTN_MESG(1U << 13) (1U << 13) /* server has message */ |
| 85 | #define AFPATTN_NORECONNECT(1U << 12) (1U << 12) /* don't reconnect */ |
| 86 | /* server notification */ |
| 87 | #define AFPATTN_NOTIFY((1U << 13) | (1U << 12)) (AFPATTN_MESG(1U << 13) | AFPATTN_NORECONNECT(1U << 12)) |
| 88 | |
| 89 | /* extended bitmap -- 12 bits. volchanged is only useful w/ a server |
| 90 | * notification, and time is only useful for shutdown. */ |
| 91 | #define AFPATTN_VOLCHANGED(1U << 0) (1U << 0) /* volume has changed */ |
| 92 | #define AFPATTN_TIME(x)((x) & 0xfff) ((x) & 0xfff) /* time in minutes */ |
| 93 | |
| 94 | /* AFP functions */ |
| 95 | #define AFP_BYTELOCK1 1 |
| 96 | #define AFP_CLOSEVOL2 2 |
| 97 | #define AFP_CLOSEDIR3 3 |
| 98 | #define AFP_CLOSEFORK4 4 |
| 99 | #define AFP_COPYFILE5 5 |
| 100 | #define AFP_CREATEDIR6 6 |
| 101 | #define AFP_CREATEFILE7 7 |
| 102 | #define AFP_DELETE8 8 |
| 103 | #define AFP_ENUMERATE9 9 |
| 104 | #define AFP_FLUSH10 10 |
| 105 | #define AFP_FLUSHFORK11 11 |
| 106 | #define AFP_GETFORKPARAM14 14 |
| 107 | #define AFP_GETSRVINFO15 15 |
| 108 | #define AFP_GETSRVPARAM16 16 |
| 109 | #define AFP_GETVOLPARAM17 17 |
| 110 | #define AFP_LOGIN18 18 |
| 111 | #define AFP_LOGINCONT19 19 |
| 112 | #define AFP_LOGOUT20 20 |
| 113 | #define AFP_MAPID21 21 |
| 114 | #define AFP_MAPNAME22 22 |
| 115 | #define AFP_MOVE23 23 |
| 116 | #define AFP_OPENVOL24 24 |
| 117 | #define AFP_OPENDIR25 25 |
| 118 | #define AFP_OPENFORK26 26 |
| 119 | #define AFP_READ27 27 |
| 120 | #define AFP_RENAME28 28 |
| 121 | #define AFP_SETDIRPARAM29 29 |
| 122 | #define AFP_SETFILEPARAM30 30 |
| 123 | #define AFP_SETFORKPARAM31 31 |
| 124 | #define AFP_SETVOLPARAM32 32 |
| 125 | #define AFP_WRITE33 33 |
| 126 | #define AFP_GETFLDRPARAM34 34 |
| 127 | #define AFP_SETFLDRPARAM35 35 |
| 128 | #define AFP_CHANGEPW36 36 |
| 129 | #define AFP_GETUSERINFO37 37 |
| 130 | #define AFP_GETSRVRMSG38 38 |
| 131 | #define AFP_CREATEID39 39 |
| 132 | #define AFP_DELETEID40 40 |
| 133 | #define AFP_RESOLVEID41 41 |
| 134 | #define AFP_EXCHANGEFILE42 42 |
| 135 | #define AFP_CATSEARCH43 43 |
| 136 | #define AFP_OPENDT48 48 |
| 137 | #define AFP_CLOSEDT49 49 |
| 138 | #define AFP_GETICON51 51 |
| 139 | #define AFP_GTICNINFO52 52 |
| 140 | #define AFP_ADDAPPL53 53 |
| 141 | #define AFP_RMVAPPL54 54 |
| 142 | #define AFP_GETAPPL55 55 |
| 143 | #define AFP_ADDCMT56 56 |
| 144 | #define AFP_RMVCMT57 57 |
| 145 | #define AFP_GETCMT58 58 |
| 146 | |
| 147 | #define AFP_ZZZ122 122 |
| 148 | #define AFP_ADDICON192 192 |
| 149 | |
| 150 | /* AFP 3.0 new calls */ |
| 151 | #define AFP_BYTELOCK_EXT59 59 |
| 152 | #define AFP_READ_EXT60 60 |
| 153 | #define AFP_WRITE_EXT61 61 |
| 154 | #define AFP_LOGIN_EXT63 63 |
| 155 | #define AFP_GETSESSTOKEN64 64 |
| 156 | #define AFP_DISCTOLDSESS65 65 |
| 157 | #define AFP_ENUMERATE_EXT66 66 |
| 158 | #define AFP_CATSEARCH_EXT67 67 |
| 159 | |
| 160 | /* AFP 3.1 new calls */ |
| 161 | #define AFP_ENUMERATE_EXT268 68 |
| 162 | |
| 163 | /* AFP 3.2 new calls */ |
| 164 | #define AFP_GETEXTATTR69 69 |
| 165 | #define AFP_SETEXTATTR70 70 |
| 166 | #define AFP_REMOVEATTR71 71 |
| 167 | #define AFP_LISTEXTATTR72 72 |
| 168 | #define AFP_GETACL73 73 |
| 169 | #define AFP_SETACL74 74 |
| 170 | #define AFP_ACCESS75 75 |
| 171 | |
| 172 | /* AFP 3.2 calls added in 10.5 */ |
| 173 | #define AFP_SPOTLIGHTRPC76 76 |
| 174 | #define AFP_SYNCDIR78 78 |
| 175 | #define AFP_SYNCFORK79 79 |
| 176 | |
| 177 | /* FPSpotlightRPC subcommand codes */ |
| 178 | #define SPOTLIGHT_CMD_GET_VOLPATH4 4 |
| 179 | #define SPOTLIGHT_CMD_GET_VOLID2 2 |
| 180 | #define SPOTLIGHT_CMD_GET_THREE3 3 |
| 181 | |
| 182 | /* Spotlight epoch is UNIX epoch minus SPOTLIGHT_TIME_DELTA */ |
| 183 | #define SPOTLIGHT_TIME_DELTA280878921600UL UINT64_C(280878921600)280878921600UL |
| 184 | |
| 185 | /* ----------------------------- */ |
| 186 | static int proto_afp; |
| 187 | static int hf_afp_reserved; |
| 188 | static int hf_afp_unknown; |
| 189 | |
| 190 | static int hf_afp_command; /* CommandCode */ |
| 191 | static int hf_afp_Version; |
| 192 | static int hf_afp_UAM; |
| 193 | static int hf_afp_user; |
| 194 | static int hf_afp_passwd; |
| 195 | static int hf_afp_random; |
| 196 | |
| 197 | static int hf_afp_response_to; |
| 198 | static int hf_afp_time; |
| 199 | static int hf_afp_response_in; |
| 200 | |
| 201 | static int hf_afp_login_flags; |
| 202 | static int hf_afp_pad; |
| 203 | |
| 204 | static int hf_afp_user_type; |
| 205 | static int hf_afp_user_len; |
| 206 | static int hf_afp_user_name; |
| 207 | |
| 208 | static int hf_afp_vol_flag; |
| 209 | static int hf_afp_vol_flag_passwd; |
| 210 | static int hf_afp_vol_flag_has_config; |
| 211 | static int hf_afp_server_time; |
| 212 | |
| 213 | static int hf_afp_vol_bitmap; |
| 214 | static int hf_afp_vol_name_offset; |
| 215 | static int hf_afp_vol_id; |
| 216 | static int hf_afp_vol_attribute; |
| 217 | static int hf_afp_vol_name; |
| 218 | static int hf_afp_vol_signature; |
| 219 | static int hf_afp_vol_creation_date; |
| 220 | static int hf_afp_vol_modification_date; |
| 221 | static int hf_afp_vol_backup_date; |
| 222 | static int hf_afp_vol_bytes_free; |
| 223 | static int hf_afp_vol_bytes_total; |
| 224 | static int hf_afp_vol_ex_bytes_free; |
| 225 | static int hf_afp_vol_ex_bytes_total; |
| 226 | static int hf_afp_vol_block_size; |
| 227 | |
| 228 | /* desktop stuff */ |
| 229 | static int hf_afp_comment; |
| 230 | static int hf_afp_file_creator; |
| 231 | static int hf_afp_file_type; |
| 232 | static int hf_afp_icon_type; |
| 233 | static int hf_afp_icon_length; |
| 234 | static int hf_afp_icon_tag; |
| 235 | static int hf_afp_icon_index; |
| 236 | static int hf_afp_appl_index; |
| 237 | static int hf_afp_appl_tag; |
| 238 | |
| 239 | static int hf_afp_did; |
| 240 | static int hf_afp_file_id; |
| 241 | static int hf_afp_file_DataForkLen; |
| 242 | static int hf_afp_file_RsrcForkLen; |
| 243 | static int hf_afp_file_ExtDataForkLen; |
| 244 | static int hf_afp_file_ExtRsrcForkLen; |
| 245 | |
| 246 | static int hf_afp_dir_bitmap; |
| 247 | static int hf_afp_dir_offspring; |
| 248 | static int hf_afp_dir_OwnerID; |
| 249 | static int hf_afp_dir_GroupID; |
| 250 | |
| 251 | static int hf_afp_req_count; |
| 252 | static int hf_afp_start_index; |
| 253 | static int hf_afp_start_index32; |
| 254 | static int hf_afp_max_reply_size; |
| 255 | static int hf_afp_max_reply_size32; |
| 256 | static int hf_afp_file_flag; |
| 257 | static int hf_afp_create_flag; |
| 258 | static int hf_afp_struct_size; |
| 259 | static int hf_afp_struct_size16; |
| 260 | |
| 261 | static int hf_afp_cat_count; |
| 262 | static int hf_afp_cat_req_matches; |
| 263 | static int hf_afp_cat_position; |
| 264 | |
| 265 | static int hf_afp_creation_date; |
| 266 | static int hf_afp_modification_date; |
| 267 | static int hf_afp_backup_date; |
| 268 | static int hf_afp_finder_info; |
| 269 | static int hf_afp_long_name_offset; |
| 270 | static int hf_afp_prodos_info; |
| 271 | static int hf_afp_prodos_type; |
| 272 | static int hf_afp_prodos_auxtype; |
| 273 | static int hf_afp_short_name_offset; |
| 274 | static int hf_afp_unicode_name_offset; |
| 275 | static int hf_afp_unix_privs_uid; |
| 276 | static int hf_afp_unix_privs_gid; |
| 277 | static int hf_afp_unix_privs_permissions; |
| 278 | static int hf_afp_unix_privs_ua_permissions; |
| 279 | |
| 280 | static int hf_afp_path_type; |
| 281 | static int hf_afp_path_len; |
| 282 | static int hf_afp_path_name; |
| 283 | static int hf_afp_path_unicode_hint; |
| 284 | static int hf_afp_path_unicode_len; |
| 285 | |
| 286 | static int hf_afp_flag; |
| 287 | static int hf_afp_dt_ref; |
| 288 | static int hf_afp_ofork; |
| 289 | static int hf_afp_ofork_len; |
| 290 | static int hf_afp_offset; |
| 291 | static int hf_afp_rw_count; |
| 292 | static int hf_afp_newline_mask; |
| 293 | static int hf_afp_newline_char; |
| 294 | static int hf_afp_last_written; |
| 295 | |
| 296 | static int hf_afp_fork_type; |
| 297 | static int hf_afp_access_mode; |
| 298 | static int hf_afp_access_read; |
| 299 | static int hf_afp_access_write; |
| 300 | static int hf_afp_access_deny_read; |
| 301 | static int hf_afp_access_deny_write; |
| 302 | |
| 303 | static int hf_afp_lock_op; |
| 304 | static int hf_afp_lock_from; |
| 305 | static int hf_afp_lock_offset; |
| 306 | static int hf_afp_lock_len; |
| 307 | static int hf_afp_lock_range_start; |
| 308 | |
| 309 | static int ett_afp; |
| 310 | |
| 311 | static int ett_afp_vol_attribute; |
| 312 | static int ett_afp_enumerate; |
| 313 | static int ett_afp_enumerate_line; |
| 314 | static int ett_afp_access_mode; |
| 315 | |
| 316 | static int ett_afp_vol_bitmap; |
| 317 | static int ett_afp_dir_bitmap; |
| 318 | static int ett_afp_dir_attribute; |
| 319 | static int ett_afp_file_attribute; |
| 320 | static int ett_afp_file_bitmap; |
| 321 | static int ett_afp_unix_privs; |
| 322 | static int ett_afp_path_name; |
| 323 | static int ett_afp_lock_flags; |
| 324 | static int ett_afp_dir_ar; |
| 325 | static int ett_afp_prodos_info; |
| 326 | |
| 327 | static int ett_afp_server_vol; |
| 328 | static int ett_afp_vol_list; |
| 329 | static int ett_afp_vol_flag; |
| 330 | static int ett_afp_cat_search; |
| 331 | static int ett_afp_cat_r_bitmap; |
| 332 | static int ett_afp_cat_spec; |
| 333 | static int ett_afp_vol_did; |
| 334 | |
| 335 | /* AFP 3.0 parameters */ |
| 336 | static int hf_afp_lock_offset64; |
| 337 | static int hf_afp_lock_len64; |
| 338 | static int hf_afp_lock_range_start64; |
| 339 | |
| 340 | static int hf_afp_offset64; |
| 341 | static int hf_afp_rw_count64; |
| 342 | static int hf_afp_reqcount64; |
| 343 | |
| 344 | static int hf_afp_last_written64; |
| 345 | |
| 346 | static int hf_afp_ofork_len64; |
| 347 | static int hf_afp_session_token_type; |
| 348 | static int hf_afp_session_token_len; |
| 349 | static int hf_afp_session_token; |
| 350 | static int hf_afp_session_token_timestamp; |
| 351 | |
| 352 | /* AFP 3.2 */ |
| 353 | |
| 354 | static int hf_afp_extattr_bitmap; |
| 355 | static int hf_afp_extattr_bitmap_NoFollow; |
| 356 | static int hf_afp_extattr_bitmap_Create; |
| 357 | static int hf_afp_extattr_bitmap_Replace; |
| 358 | static int ett_afp_extattr_bitmap; |
| 359 | static int hf_afp_extattr_namelen; |
| 360 | static int hf_afp_extattr_name; |
| 361 | static int hf_afp_extattr_len; |
| 362 | static int hf_afp_extattr_data; |
| 363 | static int hf_afp_extattr_req_count; |
| 364 | static int hf_afp_extattr_start_index; |
| 365 | static int hf_afp_extattr_reply_size; |
| 366 | static int ett_afp_extattr_names; |
| 367 | |
| 368 | static expert_field ei_afp_subquery_count_over_safety_limit; |
| 369 | static expert_field ei_afp_subquery_count_over_query_count; |
| 370 | static expert_field ei_afp_abnormal_num_subqueries; |
| 371 | static expert_field ei_afp_too_many_acl_entries; |
| 372 | static expert_field ei_afp_ip_port_reused; |
| 373 | static expert_field ei_afp_toc_offset; |
| 374 | |
| 375 | |
| 376 | static int afp_tap; |
| 377 | |
| 378 | static dissector_handle_t spotlight_handle; |
| 379 | |
| 380 | static const value_string vol_signature_vals[] = { |
| 381 | {1, "Flat"}, |
| 382 | {2, "Fixed Directory ID"}, |
| 383 | {3, "Variable Directory ID (deprecated)"}, |
| 384 | {0, NULL((void*)0) } |
| 385 | }; |
| 386 | |
| 387 | static const value_string CommandCode_vals[] = { |
| 388 | {AFP_BYTELOCK1, "FPByteRangeLock" }, |
| 389 | {AFP_CLOSEVOL2, "FPCloseVol" }, |
| 390 | {AFP_CLOSEDIR3, "FPCloseDir" }, |
| 391 | {AFP_CLOSEFORK4, "FPCloseFork" }, |
| 392 | {AFP_COPYFILE5, "FPCopyFile" }, |
| 393 | {AFP_CREATEDIR6, "FPCreateDir" }, |
| 394 | {AFP_CREATEFILE7, "FPCreateFile" }, |
| 395 | {AFP_DELETE8, "FPDelete" }, |
| 396 | {AFP_ENUMERATE9, "FPEnumerate" }, |
| 397 | {AFP_FLUSH10, "FPFlush" }, |
| 398 | {AFP_FLUSHFORK11, "FPFlushFork" }, |
| 399 | {AFP_GETFORKPARAM14, "FPGetForkParms" }, |
| 400 | {AFP_GETSRVINFO15, "FPGetSrvrInfo" }, |
| 401 | {AFP_GETSRVPARAM16, "FPGetSrvrParms" }, |
| 402 | {AFP_GETVOLPARAM17, "FPGetVolParms" }, |
| 403 | {AFP_LOGIN18, "FPLogin" }, |
| 404 | {AFP_LOGINCONT19, "FPLoginCont" }, |
| 405 | {AFP_LOGOUT20, "FPLogout" }, |
| 406 | {AFP_MAPID21, "FPMapID" }, |
| 407 | {AFP_MAPNAME22, "FPMapName" }, |
| 408 | {AFP_MOVE23, "FPMoveAndRename" }, |
| 409 | {AFP_OPENVOL24, "FPOpenVol" }, |
| 410 | {AFP_OPENDIR25, "FPOpenDir" }, |
| 411 | {AFP_OPENFORK26, "FPOpenFork" }, |
| 412 | {AFP_READ27, "FPRead" }, |
| 413 | {AFP_RENAME28, "FPRename" }, |
| 414 | {AFP_SETDIRPARAM29, "FPSetDirParms" }, |
| 415 | {AFP_SETFILEPARAM30, "FPSetFileParms" }, |
| 416 | {AFP_SETFORKPARAM31, "FPSetForkParms" }, |
| 417 | {AFP_SETVOLPARAM32, "FPSetVolParms" }, |
| 418 | {AFP_WRITE33, "FPWrite" }, |
| 419 | {AFP_GETFLDRPARAM34, "FPGetFileDirParms" }, |
| 420 | {AFP_SETFLDRPARAM35, "FPSetFileDirParms" }, |
| 421 | {AFP_CHANGEPW36, "FPChangePassword" }, |
| 422 | {AFP_GETUSERINFO37, "FPGetUserInfo" }, |
| 423 | {AFP_GETSRVRMSG38, "FPGetSrvrMsg" }, |
| 424 | {AFP_CREATEID39, "FPCreateID" }, |
| 425 | {AFP_DELETEID40, "FPDeleteID" }, |
| 426 | {AFP_RESOLVEID41, "FPResolveID" }, |
| 427 | {AFP_EXCHANGEFILE42, "FPExchangeFiles" }, |
| 428 | {AFP_CATSEARCH43, "FPCatSearch" }, |
| 429 | {AFP_OPENDT48, "FPOpenDT" }, |
| 430 | {AFP_CLOSEDT49, "FPCloseDT" }, |
| 431 | {AFP_GETICON51, "FPGetIcon" }, |
| 432 | {AFP_GTICNINFO52, "FPGetIconInfo" }, |
| 433 | {AFP_ADDAPPL53, "FPAddAPPL" }, |
| 434 | {AFP_RMVAPPL54, "FPRemoveAPPL" }, |
| 435 | {AFP_GETAPPL55, "FPGetAPPL" }, |
| 436 | {AFP_ADDCMT56, "FPAddComment" }, |
| 437 | {AFP_RMVCMT57, "FPRemoveComment" }, |
| 438 | {AFP_GETCMT58, "FPGetComment" }, |
| 439 | {AFP_BYTELOCK_EXT59, "FPByteRangeLockExt" }, |
| 440 | {AFP_READ_EXT60, "FPReadExt" }, |
| 441 | {AFP_WRITE_EXT61, "FPWriteExt" }, |
| 442 | {AFP_LOGIN_EXT63, "FPLoginExt" }, |
| 443 | {AFP_GETSESSTOKEN64, "FPGetSessionToken" }, |
| 444 | {AFP_DISCTOLDSESS65, "FPDisconnectOldSession" }, |
| 445 | {AFP_ENUMERATE_EXT66, "FPEnumerateExt" }, |
| 446 | {AFP_CATSEARCH_EXT67, "FPCatSearchExt" }, |
| 447 | {AFP_ENUMERATE_EXT268, "FPEnumerateExt2" }, |
| 448 | {AFP_GETEXTATTR69, "FPGetExtAttr" }, |
| 449 | {AFP_SETEXTATTR70, "FPSetExtAttr" }, |
| 450 | {AFP_REMOVEATTR71, "FPRemoveExtAttr" }, |
| 451 | {AFP_LISTEXTATTR72, "FPListExtAttrs" }, |
| 452 | {AFP_GETACL73, "FPGetACL" }, |
| 453 | {AFP_SETACL74, "FPSetACL" }, |
| 454 | {AFP_ACCESS75, "FPAccess" }, |
| 455 | {AFP_SPOTLIGHTRPC76, "FPSpotlightRPC" }, |
| 456 | {AFP_SYNCDIR78, "FPSyncDir" }, |
| 457 | {AFP_SYNCFORK79, "FPSyncFork" }, |
| 458 | {AFP_ZZZ122, "FPZzzzz" }, |
| 459 | {AFP_ADDICON192, "FPAddIcon" }, |
| 460 | {0, NULL((void*)0) } |
| 461 | }; |
| 462 | static value_string_ext CommandCode_vals_ext = VALUE_STRING_EXT_INIT(CommandCode_vals){ _try_val_to_str_ext_init, 0, (sizeof (CommandCode_vals) / sizeof ((CommandCode_vals)[0]))-1, CommandCode_vals, "CommandCode_vals" , ((void*)0) }; |
| 463 | |
| 464 | static const value_string unicode_hint_vals[] = { |
| 465 | { 0, "MacRoman" }, |
| 466 | { 1, "MacJapanese" }, |
| 467 | { 2, "MacChineseTrad" }, |
| 468 | { 3, "MacKorean" }, |
| 469 | { 4, "MacArabic" }, |
| 470 | { 5, "MacHebrew" }, |
| 471 | { 6, "MacGreek" }, |
| 472 | { 7, "MacCyrillic" }, |
| 473 | { 9, "MacDevanagari" }, |
| 474 | { 10, "MacGurmukhi" }, |
| 475 | { 11, "MacGujarati" }, |
| 476 | { 12, "MacOriya" }, |
| 477 | { 13, "MacBengali" }, |
| 478 | { 14, "MacTamil" }, |
| 479 | { 15, "MacTelugu" }, |
| 480 | { 16, "MacKannada" }, |
| 481 | { 17, "MacMalayalam" }, |
| 482 | { 18, "MacSinhalese" }, |
| 483 | { 19, "MacBurmese" }, |
| 484 | { 20, "MacKhmer" }, |
| 485 | { 21, "MacThai" }, |
| 486 | { 22, "MacLaotian" }, |
| 487 | { 23, "MacGeorgian" }, |
| 488 | { 24, "MacArmenian" }, |
| 489 | { 25, "MacChineseSimp" }, |
| 490 | { 26, "MacTibetan" }, |
| 491 | { 27, "MacMongolian" }, |
| 492 | { 28, "MacEthiopic" }, |
| 493 | { 29, "MacCentralEurRoman" }, |
| 494 | { 30, "MacVietnamese" }, |
| 495 | { 31, "MacExtArabic" }, |
| 496 | { 33, "MacSymbol" }, |
| 497 | { 34, "MacDingbats" }, |
| 498 | { 35, "MacTurkish" }, |
| 499 | { 36, "MacCroatian" }, |
| 500 | { 37, "MacIcelandic" }, |
| 501 | { 38, "MacRomanian" }, |
| 502 | { 39, "MacCeltic" }, |
| 503 | { 40, "MacGaelic" }, |
| 504 | { 41, "MacKeyboardGlyphs" }, |
| 505 | { 126, "MacUnicode" }, |
| 506 | { 140, "MacFarsi" }, |
| 507 | { 152, "MacUkrainian" }, |
| 508 | { 236, "MacInuit" }, |
| 509 | { 252, "MacVT100" }, |
| 510 | { 255, "MacHFS" }, |
| 511 | { 256, "UnicodeDefault" }, |
| 512 | /* ?? { 257, "UnicodeV1_1" }, */ |
| 513 | { 257, "ISO10646_1993" }, |
| 514 | { 259, "UnicodeV2_0" }, |
| 515 | /* ?? { 259, "UnicodeV2_1" }, */ |
| 516 | { 260, "UnicodeV3_0" }, |
| 517 | { 513, "ISOLatin1" }, |
| 518 | { 514, "ISOLatin2" }, |
| 519 | { 515, "ISOLatin3" }, |
| 520 | { 516, "ISOLatin4" }, |
| 521 | { 517, "ISOLatinCyrillic" }, |
| 522 | { 518, "ISOLatinArabic" }, |
| 523 | { 519, "ISOLatinGreek" }, |
| 524 | { 520, "ISOLatinHebrew" }, |
| 525 | { 521, "ISOLatin5" }, |
| 526 | { 522, "ISOLatin6" }, |
| 527 | { 525, "ISOLatin7" }, |
| 528 | { 526, "ISOLatin8" }, |
| 529 | { 527, "ISOLatin9" }, |
| 530 | { 1024, "DOSLatinUS" }, |
| 531 | { 1029, "DOSGreek" }, |
| 532 | { 1030, "DOSBalticRim" }, |
| 533 | { 1040, "DOSLatin1" }, |
| 534 | { 1041, "DOSGreek1" }, |
| 535 | { 1042, "DOSLatin2" }, |
| 536 | { 1043, "DOSCyrillic" }, |
| 537 | { 1044, "DOSTurkish" }, |
| 538 | { 1045, "DOSPortuguese" }, |
| 539 | { 1046, "DOSIcelandic" }, |
| 540 | { 1047, "DOSHebrew" }, |
| 541 | { 1048, "DOSCanadianFrench" }, |
| 542 | { 1049, "DOSArabic" }, |
| 543 | { 1050, "DOSNordic" }, |
| 544 | { 1051, "DOSRussian" }, |
| 545 | { 1052, "DOSGreek2" }, |
| 546 | { 1053, "DOSThai" }, |
| 547 | { 1056, "DOSJapanese" }, |
| 548 | { 1057, "DOSChineseSimplif" }, |
| 549 | { 1058, "DOSKorean" }, |
| 550 | { 1059, "DOSChineseTrad" }, |
| 551 | { 1280, "WindowsLatin1" }, |
| 552 | /* { 1280, "WindowsANSI" }, */ |
| 553 | { 1281, "WindowsLatin2" }, |
| 554 | { 1282, "WindowsCyrillic" }, |
| 555 | { 1283, "WindowsGreek" }, |
| 556 | { 1284, "WindowsLatin5" }, |
| 557 | { 1285, "WindowsHebrew" }, |
| 558 | { 1286, "WindowsArabic" }, |
| 559 | { 1287, "WindowsBalticRim" }, |
| 560 | { 1288, "WindowsVietnamese" }, |
| 561 | { 1296, "WindowsKoreanJohab" }, |
| 562 | { 1536, "US_ASCII" }, |
| 563 | { 1568, "JIS_X0201_76" }, |
| 564 | { 1569, "JIS_X0208_83" }, |
| 565 | { 1570, "JIS_X0208_90" }, |
| 566 | { 0, NULL((void*)0) } |
| 567 | }; |
| 568 | static value_string_ext unicode_hint_vals_ext = VALUE_STRING_EXT_INIT(unicode_hint_vals){ _try_val_to_str_ext_init, 0, (sizeof (unicode_hint_vals) / sizeof ((unicode_hint_vals)[0]))-1, unicode_hint_vals, "unicode_hint_vals" , ((void*)0) }; |
| 569 | |
| 570 | /* volume bitmap |
| 571 | from Apple AFP3.0.pdf |
| 572 | Table 1-2 p. 20 |
| 573 | */ |
| 574 | #define kFPVolAttributeBit(1U << 0) (1U << 0) |
| 575 | #define kFPVolSignatureBit(1U << 1) (1U << 1) |
| 576 | #define kFPVolCreateDateBit(1U << 2) (1U << 2) |
| 577 | #define kFPVolModDateBit(1U << 3) (1U << 3) |
| 578 | #define kFPVolBackupDateBit(1U << 4) (1U << 4) |
| 579 | #define kFPVolIDBit(1U << 5) (1U << 5) |
| 580 | #define kFPVolBytesFreeBit(1U << 6) (1U << 6) |
| 581 | #define kFPVolBytesTotalBit(1U << 7) (1U << 7) |
| 582 | #define kFPVolNameBit(1U << 8) (1U << 8) |
| 583 | #define kFPVolExtBytesFreeBit(1U << 9) (1U << 9) |
| 584 | #define kFPVolExtBytesTotalBit(1U << 10) (1U << 10) |
| 585 | #define kFPVolBlockSizeBit(1U << 11) (1U << 11) |
| 586 | |
| 587 | static int hf_afp_vol_bitmap_Attributes; |
| 588 | static int hf_afp_vol_bitmap_Signature; |
| 589 | static int hf_afp_vol_bitmap_CreateDate; |
| 590 | static int hf_afp_vol_bitmap_ModDate; |
| 591 | static int hf_afp_vol_bitmap_BackupDate; |
| 592 | static int hf_afp_vol_bitmap_ID; |
| 593 | static int hf_afp_vol_bitmap_BytesFree; |
| 594 | static int hf_afp_vol_bitmap_BytesTotal; |
| 595 | static int hf_afp_vol_bitmap_Name; |
| 596 | static int hf_afp_vol_bitmap_ExtBytesFree; |
| 597 | static int hf_afp_vol_bitmap_ExtBytesTotal; |
| 598 | static int hf_afp_vol_bitmap_BlockSize; |
| 599 | |
| 600 | static int hf_afp_vol_attribute_ReadOnly; |
| 601 | static int hf_afp_vol_attribute_HasVolumePassword; |
| 602 | static int hf_afp_vol_attribute_SupportsFileIDs; |
| 603 | static int hf_afp_vol_attribute_SupportsCatSearch; |
| 604 | static int hf_afp_vol_attribute_SupportsBlankAccessPrivs; |
| 605 | static int hf_afp_vol_attribute_SupportsUnixPrivs; |
| 606 | static int hf_afp_vol_attribute_SupportsUTF8Names; |
| 607 | static int hf_afp_vol_attribute_NoNetworkUserID; |
| 608 | static int hf_afp_vol_attribute_DefaultPrivsFromParent; |
| 609 | static int hf_afp_vol_attribute_NoExchangeFiles; |
| 610 | static int hf_afp_vol_attribute_SupportsExtAttrs; |
| 611 | static int hf_afp_vol_attribute_SupportsACLs; |
| 612 | static int hf_afp_vol_attribute_CaseSensitive; |
| 613 | static int hf_afp_vol_attribute_SupportsTMLockSteal; |
| 614 | |
| 615 | static int hf_afp_dir_bitmap_Attributes; |
| 616 | static int hf_afp_dir_bitmap_ParentDirID; |
| 617 | static int hf_afp_dir_bitmap_CreateDate; |
| 618 | static int hf_afp_dir_bitmap_ModDate; |
| 619 | static int hf_afp_dir_bitmap_BackupDate; |
| 620 | static int hf_afp_dir_bitmap_FinderInfo; |
| 621 | static int hf_afp_dir_bitmap_LongName; |
| 622 | static int hf_afp_dir_bitmap_ShortName; |
| 623 | static int hf_afp_dir_bitmap_NodeID; |
| 624 | static int hf_afp_dir_bitmap_OffspringCount; |
| 625 | static int hf_afp_dir_bitmap_OwnerID; |
| 626 | static int hf_afp_dir_bitmap_GroupID; |
| 627 | static int hf_afp_dir_bitmap_AccessRights; |
| 628 | static int hf_afp_dir_bitmap_UTF8Name; |
| 629 | static int hf_afp_dir_bitmap_UnixPrivs; |
| 630 | |
| 631 | static int hf_afp_dir_attribute; |
| 632 | static int hf_afp_dir_attribute_Invisible; |
| 633 | static int hf_afp_dir_attribute_IsExpFolder; |
| 634 | static int hf_afp_dir_attribute_System; |
| 635 | static int hf_afp_dir_attribute_Mounted; |
| 636 | static int hf_afp_dir_attribute_InExpFolder; |
| 637 | static int hf_afp_dir_attribute_BackUpNeeded; |
| 638 | static int hf_afp_dir_attribute_RenameInhibit; |
| 639 | static int hf_afp_dir_attribute_DeleteInhibit; |
| 640 | |
| 641 | static int hf_afp_file_bitmap; |
| 642 | static int hf_afp_file_bitmap_Attributes; |
| 643 | static int hf_afp_file_bitmap_ParentDirID; |
| 644 | static int hf_afp_file_bitmap_CreateDate; |
| 645 | static int hf_afp_file_bitmap_ModDate; |
| 646 | static int hf_afp_file_bitmap_BackupDate; |
| 647 | static int hf_afp_file_bitmap_FinderInfo; |
| 648 | static int hf_afp_file_bitmap_LongName; |
| 649 | static int hf_afp_file_bitmap_ShortName; |
| 650 | static int hf_afp_file_bitmap_NodeID; |
| 651 | static int hf_afp_file_bitmap_DataForkLen; |
| 652 | static int hf_afp_file_bitmap_RsrcForkLen; |
| 653 | static int hf_afp_file_bitmap_ExtDataForkLen; |
| 654 | static int hf_afp_file_bitmap_LaunchLimit; |
| 655 | |
| 656 | static int hf_afp_file_bitmap_UTF8Name; |
| 657 | static int hf_afp_file_bitmap_ExtRsrcForkLen; |
| 658 | static int hf_afp_file_bitmap_UnixPrivs; |
| 659 | |
| 660 | static int hf_afp_file_attribute; |
| 661 | static int hf_afp_file_attribute_Invisible; |
| 662 | static int hf_afp_file_attribute_MultiUser; |
| 663 | static int hf_afp_file_attribute_System; |
| 664 | static int hf_afp_file_attribute_DAlreadyOpen; |
| 665 | static int hf_afp_file_attribute_RAlreadyOpen; |
| 666 | static int hf_afp_file_attribute_WriteInhibit; |
| 667 | static int hf_afp_file_attribute_BackUpNeeded; |
| 668 | static int hf_afp_file_attribute_RenameInhibit; |
| 669 | static int hf_afp_file_attribute_DeleteInhibit; |
| 670 | static int hf_afp_file_attribute_CopyProtect; |
| 671 | static int hf_afp_file_attribute_SetClear; |
| 672 | |
| 673 | static int hf_afp_map_name_type; |
| 674 | static int hf_afp_map_name; |
| 675 | static int hf_afp_map_id; |
| 676 | static int hf_afp_map_id_type; |
| 677 | static int hf_afp_map_id_reply_type; |
| 678 | |
| 679 | /* catsearch stuff */ |
| 680 | static int hf_afp_request_bitmap; |
| 681 | static int hf_afp_request_bitmap_Attributes; |
| 682 | static int hf_afp_request_bitmap_ParentDirID; |
| 683 | static int hf_afp_request_bitmap_CreateDate; |
| 684 | static int hf_afp_request_bitmap_ModDate; |
| 685 | static int hf_afp_request_bitmap_BackupDate; |
| 686 | static int hf_afp_request_bitmap_FinderInfo; |
| 687 | static int hf_afp_request_bitmap_LongName; |
| 688 | static int hf_afp_request_bitmap_DataForkLen; |
| 689 | static int hf_afp_request_bitmap_OffspringCount; |
| 690 | static int hf_afp_request_bitmap_RsrcForkLen; |
| 691 | static int hf_afp_request_bitmap_ExtDataForkLen; |
| 692 | static int hf_afp_request_bitmap_UTF8Name; |
| 693 | static int hf_afp_request_bitmap_ExtRsrcForkLen; |
| 694 | static int hf_afp_request_bitmap_PartialNames; |
| 695 | |
| 696 | /* Spotlight stuff */ |
| 697 | static int ett_afp_spotlight_queries; |
| 698 | static int ett_afp_spotlight_query_line; |
| 699 | static int ett_afp_spotlight_query; |
| 700 | static int ett_afp_spotlight_data; |
| 701 | static int ett_afp_spotlight_toc; |
| 702 | |
| 703 | static int hf_afp_spotlight_request_flags; |
| 704 | static int hf_afp_spotlight_request_command; |
| 705 | static int hf_afp_spotlight_request_reserved; |
| 706 | static int hf_afp_spotlight_reply_reserved; |
| 707 | static int hf_afp_spotlight_volpath_server; |
| 708 | static int hf_afp_spotlight_volpath_client; |
| 709 | static int hf_afp_spotlight_returncode; |
| 710 | static int hf_afp_spotlight_volflags; |
| 711 | static int hf_afp_spotlight_reqlen; |
| 712 | static int hf_afp_spotlight_uuid; |
| 713 | static int hf_afp_spotlight_date; |
| 714 | |
| 715 | /* Status stuff from ASP or DSI */ |
| 716 | static int ett_afp_status; |
| 717 | static int ett_afp_uams; |
| 718 | static int ett_afp_vers; |
| 719 | static int ett_afp_server_addr; |
| 720 | static int ett_afp_server_addr_line; |
| 721 | static int ett_afp_directory; |
| 722 | static int ett_afp_utf8_name; |
| 723 | static int ett_afp_status_server_flag; |
| 724 | |
| 725 | static const value_string flag_vals[] = { |
| 726 | {0, "Start" }, |
| 727 | {1, "End" }, |
| 728 | {0, NULL((void*)0) } }; |
| 729 | |
| 730 | static const value_string path_type_vals[] = { |
| 731 | {1, "Short names" }, |
| 732 | {2, "Long names" }, |
| 733 | {3, "Unicode names" }, |
| 734 | {0, NULL((void*)0) } }; |
| 735 | |
| 736 | static const value_string map_name_type_vals[] = { |
| 737 | {1, "Unicode user name to a user ID" }, |
| 738 | {2, "Unicode group name to a group ID" }, |
| 739 | {3, "Macintosh roman user name to a user ID" }, |
| 740 | {4, "Macintosh roman group name to a group ID" }, |
| 741 | {5, "Unicode user name to a user UUID" }, |
| 742 | {6, "Unicode group name to a group UUID" }, |
| 743 | {0, NULL((void*)0) } }; |
| 744 | static value_string_ext map_name_type_vals_ext = VALUE_STRING_EXT_INIT(map_name_type_vals){ _try_val_to_str_ext_init, 0, (sizeof (map_name_type_vals) / sizeof ((map_name_type_vals)[0]))-1, map_name_type_vals, "map_name_type_vals" , ((void*)0) }; |
| 745 | |
| 746 | static const value_string map_id_type_vals[] = { |
| 747 | {1, "User ID to a Macintosh roman user name" }, |
| 748 | {2, "Group ID to a Macintosh roman group name" }, |
| 749 | {3, "User ID to a unicode user name" }, |
| 750 | {4, "Group ID to a unicode group name" }, |
| 751 | {5, "User UUID to a unicode user name" }, |
| 752 | {6, "Group UUID to a unicode group name" }, |
| 753 | {0, NULL((void*)0) } }; |
| 754 | static value_string_ext map_id_type_vals_ext = VALUE_STRING_EXT_INIT(map_id_type_vals){ _try_val_to_str_ext_init, 0, (sizeof (map_id_type_vals) / sizeof ((map_id_type_vals)[0]))-1, map_id_type_vals, "map_id_type_vals" , ((void*)0) }; |
| 755 | |
| 756 | /* map_id subfunctions 5,6: reply type */ |
| 757 | static const value_string map_id_reply_type_vals[] = { |
| 758 | {1, "user name" }, |
| 759 | {2, "group name" }, |
| 760 | {0, NULL((void*)0) } }; |
| 761 | |
| 762 | /* |
| 763 | volume attribute from Apple AFP3.0.pdf |
| 764 | Table 1-3 p. 22 |
| 765 | */ |
| 766 | #define kReadOnly(1U << 0) (1U << 0) |
| 767 | #define kHasVolumePassword(1U << 1) (1U << 1) |
| 768 | #define kSupportsFileIDs(1U << 2) (1U << 2) |
| 769 | #define kSupportsCatSearch(1U << 3) (1U << 3) |
| 770 | #define kSupportsBlankAccessPrivs(1U << 4) (1U << 4) |
| 771 | #define kSupportsUnixPrivs(1U << 5) (1U << 5) |
| 772 | #define kSupportsUTF8Names(1U << 6) (1U << 6) |
| 773 | /* AFP3.1 */ |
| 774 | #define kNoNetworkUserIDs(1U << 7) (1U << 7) |
| 775 | /* AFP3.2 */ |
| 776 | #define kDefaultPrivsFromParent(1U << 8) (1U << 8) |
| 777 | #define kNoExchangeFiles(1U << 9) (1U << 9) |
| 778 | #define kSupportsExtAttrs(1U << 10) (1U << 10) |
| 779 | #define kSupportsACLs(1U << 11) (1U << 11) |
| 780 | /* AFP3.2+ */ |
| 781 | #define kCaseSensitive(1U << 12) (1U << 12) |
| 782 | #define kSupportsTMLockSteal(1U << 13) (1U << 13) |
| 783 | |
| 784 | /* |
| 785 | directory bitmap from Apple AFP3.1.pdf |
| 786 | Table 1-5 pp. 25-26 |
| 787 | */ |
| 788 | #define kFPAttributeBit(1U << 0) (1U << 0) |
| 789 | #define kFPParentDirIDBit(1U << 1) (1U << 1) |
| 790 | #define kFPCreateDateBit(1U << 2) (1U << 2) |
| 791 | #define kFPModDateBit(1U << 3) (1U << 3) |
| 792 | #define kFPBackupDateBit(1U << 4) (1U << 4) |
| 793 | #define kFPFinderInfoBit(1U << 5) (1U << 5) |
| 794 | #define kFPLongNameBit(1U << 6) (1U << 6) |
| 795 | #define kFPShortNameBit(1U << 7) (1U << 7) |
| 796 | #define kFPNodeIDBit(1U << 8) (1U << 8) |
| 797 | #define kFPOffspringCountBit(1U << 9) (1U << 9) |
| 798 | #define kFPOwnerIDBit(1U << 10) (1U << 10) |
| 799 | #define kFPGroupIDBit(1U << 11) (1U << 11) |
| 800 | #define kFPAccessRightsBit(1U << 12) (1U << 12) |
| 801 | #define kFPUTF8NameBit(1U << 13) (1U << 13) |
| 802 | |
| 803 | /* FIXME AFP3.0 bit 14, AFP3.1 bit 15 */ |
| 804 | |
| 805 | #define kFPUnixPrivsBit(1U << 15) (1U << 15) |
| 806 | |
| 807 | /* |
| 808 | directory Access Rights parameter AFP3.1.pdf |
| 809 | table 1-7 p. 28 |
| 810 | */ |
| 811 | |
| 812 | #define AR_O_SEARCH(1U << 0) (1U << 0) /* owner has search access */ |
| 813 | #define AR_O_READ(1U << 1) (1U << 1) /* owner has read access */ |
| 814 | #define AR_O_WRITE(1U << 2) (1U << 2) /* owner has write access */ |
| 815 | |
| 816 | #define AR_G_SEARCH(1U << 8) (1U << 8) /* group has search access */ |
| 817 | #define AR_G_READ(1U << 9) (1U << 9) /* group has read access */ |
| 818 | #define AR_G_WRITE(1U << 10) (1U << 10) /* group has write access */ |
| 819 | |
| 820 | #define AR_E_SEARCH(1U << 16) (1U << 16) /* everyone has search access */ |
| 821 | #define AR_E_READ(1U << 17) (1U << 17) /* everyone has read access */ |
| 822 | #define AR_E_WRITE(1U << 18) (1U << 18) /* everyone has write access */ |
| 823 | |
| 824 | #define AR_U_SEARCH(1U << 24) (1U << 24) /* user has search access */ |
| 825 | #define AR_U_READ(1U << 25) (1U << 25) /* user has read access */ |
| 826 | #define AR_U_WRITE(1U << 26) (1U << 26) /* user has write access */ |
| 827 | |
| 828 | #define AR_BLANK(1U << 28) (1U << 28) /* Blank Access Privileges (use parent dir privileges) */ |
| 829 | #define AR_U_OWN(1U << 31) (1U << 31) /* user is the owner */ |
| 830 | |
| 831 | static int hf_afp_dir_ar; |
| 832 | static int hf_afp_dir_ar_o_search; |
| 833 | static int hf_afp_dir_ar_o_read; |
| 834 | static int hf_afp_dir_ar_o_write; |
| 835 | static int hf_afp_dir_ar_g_search; |
| 836 | static int hf_afp_dir_ar_g_read; |
| 837 | static int hf_afp_dir_ar_g_write; |
| 838 | static int hf_afp_dir_ar_e_search; |
| 839 | static int hf_afp_dir_ar_e_read; |
| 840 | static int hf_afp_dir_ar_e_write; |
| 841 | static int hf_afp_dir_ar_u_search; |
| 842 | static int hf_afp_dir_ar_u_read; |
| 843 | static int hf_afp_dir_ar_u_write; |
| 844 | static int hf_afp_dir_ar_blank; |
| 845 | static int hf_afp_dir_ar_u_own; |
| 846 | |
| 847 | static int hf_afp_user_flag; |
| 848 | static int hf_afp_user_ID; |
| 849 | static int hf_afp_group_ID; |
| 850 | static int hf_afp_UUID; |
| 851 | static int hf_afp_GRPUUID; |
| 852 | static int hf_afp_user_bitmap; |
| 853 | static int hf_afp_user_bitmap_UID; |
| 854 | static int hf_afp_user_bitmap_GID; |
| 855 | static int hf_afp_user_bitmap_UUID; |
| 856 | |
| 857 | static int ett_afp_user_bitmap; |
| 858 | |
| 859 | static const value_string user_flag_vals[] = { |
| 860 | {0, "Use user ID" }, |
| 861 | {1, "Default user" }, |
| 862 | {0, NULL((void*)0) } }; |
| 863 | |
| 864 | static int hf_afp_message; |
| 865 | static int hf_afp_message_type; |
| 866 | static int hf_afp_message_bitmap; |
| 867 | static int hf_afp_message_bitmap_REQ; |
| 868 | static int hf_afp_message_bitmap_UTF; |
| 869 | static int hf_afp_message_len; |
| 870 | |
| 871 | static int ett_afp_message_bitmap; |
| 872 | |
| 873 | static const value_string server_message_type[] = { |
| 874 | {0, "Login message" }, |
| 875 | {1, "Server message" }, |
| 876 | {0, NULL((void*)0) } }; |
| 877 | |
| 878 | /* |
| 879 | file bitmap AFP3.1.pdf |
| 880 | Table 1-8 p. 29 |
| 881 | same as dir |
| 882 | kFPAttributeBit (bit 0) |
| 883 | kFPParentDirIDBit (bit 1) |
| 884 | kFPCreateDateBit (bit 2) |
| 885 | kFPModDateBit (bit 3) |
| 886 | kFPBackupDateBit (bit 4) |
| 887 | kFPFinderInfoBit (bit 5) |
| 888 | kFPLongNameBit (bit 6) |
| 889 | kFPShortNameBit (bit 7) |
| 890 | kFPNodeIDBit (bit 8) |
| 891 | |
| 892 | kFPUTF8NameBit (bit 13) |
| 893 | */ |
| 894 | |
| 895 | #define kFPDataForkLenBit(1U << 9) (1U << 9) |
| 896 | #define kFPRsrcForkLenBit(1U << 10) (1U << 10) |
| 897 | #define kFPExtDataForkLenBit(1U << 11) (1U << 11) |
| 898 | #define kFPLaunchLimitBit(1U << 12) (1U << 12) |
| 899 | |
| 900 | #define kFPExtRsrcForkLenBit(1U << 14) (1U << 14) |
| 901 | |
| 902 | /* |
| 903 | file attribute AFP3.1.pdf |
| 904 | Table 1-9 pp. 29-31 |
| 905 | */ |
| 906 | #define kFPInvisibleBit(1U << 0) (1U << 0) |
| 907 | #define kFPMultiUserBit(1U << 1) (1U << 1) |
| 908 | #define kFPSystemBit(1U << 2) (1U << 2) |
| 909 | #define kFPDAlreadyOpenBit(1U << 3) (1U << 3) |
| 910 | #define kFPRAlreadyOpenBit(1U << 4) (1U << 4) |
| 911 | #define kFPWriteInhibitBit(1U << 5) (1U << 5) |
| 912 | #define kFPBackUpNeededBit(1U << 6) (1U << 6) |
| 913 | #define kFPRenameInhibitBit(1U << 7) (1U << 7) |
| 914 | #define kFPDeleteInhibitBit(1U << 8) (1U << 8) |
| 915 | #define kFPCopyProtectBit(1U << 10) (1U << 10) |
| 916 | #define kFPSetClearBit(1U << 15) (1U << 15) |
| 917 | |
| 918 | /* dir attribute */ |
| 919 | #define kIsExpFolder(1U << 1) (1U << 1) |
| 920 | #define kMounted(1U << 3) (1U << 3) |
| 921 | #define kInExpFolder(1U << 4) (1U << 4) |
| 922 | |
| 923 | /* AFP 3.1 getsession token type */ |
| 924 | #define kLoginWithoutID0 0 |
| 925 | #define kLoginWithID1 1 |
| 926 | #define kReconnWithID2 2 |
| 927 | #define kLoginWithTimeAndID3 3 |
| 928 | #define kReconnWithTimeAndID4 4 |
| 929 | |
| 930 | /* modified AFP 3.1 token type cf. page 327 */ |
| 931 | #define kRecon1Login5 5 |
| 932 | #define kRecon1ReconnectLogin6 6 |
| 933 | #define kRecon1Refresh7 7 |
| 934 | #define kGetKerberosSessionKey8 8 |
| 935 | |
| 936 | static const value_string token_type_vals[] = { |
| 937 | {kLoginWithoutID0, "LoginWithoutID"}, |
| 938 | {kLoginWithID1, "LoginWithID"}, |
| 939 | {kReconnWithID2, "ReconnWithID"}, |
| 940 | {kLoginWithTimeAndID3, "LoginWithTimeAndID"}, |
| 941 | {kReconnWithTimeAndID4, "ReconnWithTimeAndID"}, |
| 942 | {kRecon1Login5, "Recon1Login"}, |
| 943 | {kRecon1ReconnectLogin6, "Recon1ReconnectLogin"}, |
| 944 | {kRecon1Refresh7, "Recon1Refresh"}, |
| 945 | {kGetKerberosSessionKey8, "GetKerberosSessionKey"}, |
| 946 | |
| 947 | {0, NULL((void*)0) } }; |
| 948 | static value_string_ext token_type_vals_ext = VALUE_STRING_EXT_INIT(token_type_vals){ _try_val_to_str_ext_init, 0, (sizeof (token_type_vals) / sizeof ((token_type_vals)[0]))-1, token_type_vals, "token_type_vals" , ((void*)0) }; |
| 949 | |
| 950 | /* AFP 3.2 ACL bitmap */ |
| 951 | #define kFileSec_UUID(1U << 0) (1U << 0) |
| 952 | #define kFileSec_GRPUUID(1U << 1) (1U << 1) |
| 953 | #define kFileSec_ACL(1U << 2) (1U << 2) |
| 954 | #define kFileSec_REMOVEACL(1U << 3) (1U << 3) |
| 955 | #define kFileSec_Inherit(1U << 4) (1U << 4) |
| 956 | |
| 957 | static int hf_afp_acl_list_bitmap; |
| 958 | static int hf_afp_acl_list_bitmap_UUID; |
| 959 | static int hf_afp_acl_list_bitmap_GRPUUID; |
| 960 | static int hf_afp_acl_list_bitmap_ACL; |
| 961 | static int hf_afp_acl_list_bitmap_REMOVEACL; |
| 962 | static int hf_afp_acl_list_bitmap_Inherit; |
| 963 | static int ett_afp_acl_list_bitmap; |
| 964 | |
| 965 | static int hf_afp_access_bitmap; |
| 966 | |
| 967 | static int hf_afp_acl_entrycount; |
| 968 | static int hf_afp_acl_flags; |
| 969 | |
| 970 | static int hf_afp_ace_flags; |
| 971 | |
| 972 | static int ett_afp_ace_flags; |
| 973 | static int hf_afp_ace_flags_allow; |
| 974 | static int hf_afp_ace_flags_deny; |
| 975 | static int hf_afp_ace_flags_inherited; |
| 976 | static int hf_afp_ace_flags_fileinherit; |
| 977 | static int hf_afp_ace_flags_dirinherit; |
| 978 | static int hf_afp_ace_flags_limitinherit; |
| 979 | static int hf_afp_ace_flags_onlyinherit; |
| 980 | |
| 981 | /* AFP 3.2 ACE flags */ |
| 982 | #define ACE_ALLOW(1U << 0) (1U << 0) |
| 983 | #define ACE_DENY(1U << 1) (1U << 1) |
| 984 | #define ACE_INHERITED(1U << 4) (1U << 4) |
| 985 | #define ACE_FILE_INHERIT(1U << 5) (1U << 5) |
| 986 | #define ACE_DIR_INHERIT(1U << 6) (1U << 6) |
| 987 | #define ACE_LIMIT_INHERIT(1U << 7) (1U << 7) |
| 988 | #define ACE_ONLY_INHERIT(1U << 8) (1U << 8) |
| 989 | |
| 990 | static int ett_afp_ace_entries; |
| 991 | static int ett_afp_ace_entry; |
| 992 | |
| 993 | /* AFP 3.2 ACL access right cf page 248*/ |
| 994 | #define KAUTH_VNODE_READ_DATA(1U << 1) (1U << 1) |
| 995 | #define KAUTH_VNODE_LIST_DIRECTORY(1U << 1) KAUTH_VNODE_READ_DATA(1U << 1) |
| 996 | #define KAUTH_VNODE_WRITE_DATA(1U << 2) (1U << 2) |
| 997 | #define KAUTH_VNODE_ADD_FILE(1U << 2) KAUTH_VNODE_WRITE_DATA(1U << 2) |
| 998 | #define KAUTH_VNODE_EXECUTE(1U << 3) (1U << 3) |
| 999 | #define KAUTH_VNODE_SEARCH(1U << 3) KAUTH_VNODE_EXECUTE(1U << 3) |
| 1000 | #define KAUTH_VNODE_DELETE(1U << 4) (1U << 4) |
| 1001 | #define KAUTH_VNODE_APPEND_DATA(1U << 5) (1U << 5) |
| 1002 | #define KAUTH_VNODE_ADD_SUBDIRECTORY(1U << 5) KAUTH_VNODE_APPEND_DATA(1U << 5) |
| 1003 | #define KAUTH_VNODE_DELETE_CHILD(1U << 6) (1U << 6) |
| 1004 | #define KAUTH_VNODE_READ_ATTRIBUTES(1U << 7) (1U << 7) |
| 1005 | #define KAUTH_VNODE_WRITE_ATTRIBUTES(1U << 8) (1U << 8) |
| 1006 | #define KAUTH_VNODE_READ_EXTATTRIBUTES(1U << 9) (1U << 9) |
| 1007 | #define KAUTH_VNODE_WRITE_EXTATTRIBUTES(1U << 10) (1U << 10) |
| 1008 | #define KAUTH_VNODE_READ_SECURITY(1U << 11) (1U << 11) |
| 1009 | #define KAUTH_VNODE_WRITE_SECURITY(1U << 12) (1U << 12) |
| 1010 | #define KAUTH_VNODE_CHANGE_OWNER(1U << 13) (1U << 13) |
| 1011 | #define KAUTH_VNODE_SYNCHRONIZE(1U << 20) (1U << 20) |
| 1012 | #define KAUTH_VNODE_GENERIC_ALL(1U << 21) (1U << 21) |
| 1013 | #define KAUTH_VNODE_GENERIC_EXECUTE(1U << 22) (1U << 22) |
| 1014 | #define KAUTH_VNODE_GENERIC_WRITE(1U << 23) (1U << 23) |
| 1015 | #define KAUTH_VNODE_GENERIC_READ(1U << 24) (1U << 24) |
| 1016 | |
| 1017 | |
| 1018 | static int hf_afp_acl_access_bitmap; |
| 1019 | static int ett_afp_acl_access_bitmap; |
| 1020 | static int hf_afp_acl_access_bitmap_read_data; |
| 1021 | static int hf_afp_acl_access_bitmap_write_data; |
| 1022 | static int hf_afp_acl_access_bitmap_execute; |
| 1023 | static int hf_afp_acl_access_bitmap_delete; |
| 1024 | static int hf_afp_acl_access_bitmap_append_data; |
| 1025 | static int hf_afp_acl_access_bitmap_delete_child; |
| 1026 | static int hf_afp_acl_access_bitmap_read_attrs; |
| 1027 | static int hf_afp_acl_access_bitmap_write_attrs; |
| 1028 | static int hf_afp_acl_access_bitmap_read_extattrs; |
| 1029 | static int hf_afp_acl_access_bitmap_write_extattrs; |
| 1030 | static int hf_afp_acl_access_bitmap_read_security; |
| 1031 | static int hf_afp_acl_access_bitmap_write_security; |
| 1032 | static int hf_afp_acl_access_bitmap_change_owner; |
| 1033 | static int hf_afp_acl_access_bitmap_synchronize; |
| 1034 | static int hf_afp_acl_access_bitmap_generic_all; |
| 1035 | static int hf_afp_acl_access_bitmap_generic_execute; |
| 1036 | static int hf_afp_acl_access_bitmap_generic_write; |
| 1037 | static int hf_afp_acl_access_bitmap_generic_read; |
| 1038 | |
| 1039 | /* Status stuff from ASP or DSI */ |
| 1040 | static int hf_afp_server_name; |
| 1041 | static int hf_afp_utf8_server_name_len; |
| 1042 | static int hf_afp_utf8_server_name; |
| 1043 | static int hf_afp_server_type; |
| 1044 | static int hf_afp_server_vers; |
| 1045 | static int hf_afp_server_uams; |
| 1046 | static int hf_afp_server_icon; |
| 1047 | static int hf_afp_server_directory; |
| 1048 | |
| 1049 | static int hf_afp_server_flag; |
| 1050 | static int hf_afp_server_flag_copyfile; |
| 1051 | static int hf_afp_server_flag_passwd; |
| 1052 | static int hf_afp_server_flag_no_save_passwd; |
| 1053 | static int hf_afp_server_flag_srv_msg; |
| 1054 | static int hf_afp_server_flag_srv_sig; |
| 1055 | static int hf_afp_server_flag_tcpip; |
| 1056 | static int hf_afp_server_flag_notify; |
| 1057 | static int hf_afp_server_flag_reconnect; |
| 1058 | static int hf_afp_server_flag_directory; |
| 1059 | static int hf_afp_server_flag_utf8_name; |
| 1060 | static int hf_afp_server_flag_uuid; |
| 1061 | static int hf_afp_server_flag_ext_sleep; |
| 1062 | static int hf_afp_server_flag_fast_copy; |
| 1063 | static int hf_afp_server_signature; |
| 1064 | |
| 1065 | static int hf_afp_server_addr_len; |
| 1066 | static int hf_afp_server_addr_type; |
| 1067 | static int hf_afp_server_addr_value; |
| 1068 | |
| 1069 | /* Generated from convert_proto_tree_add_text.pl */ |
| 1070 | static int hf_afp_int64; |
| 1071 | static int hf_afp_float; |
| 1072 | static int hf_afp_unknown16; |
| 1073 | static int hf_afp_unknown32; |
| 1074 | static int hf_afp_cnid; |
| 1075 | static int hf_afp_null; |
| 1076 | static int hf_afp_string; |
| 1077 | static int hf_afp_utf_16_string; |
| 1078 | static int hf_afp_bool; |
| 1079 | static int hf_afp_query_type; |
| 1080 | static int hf_afp_toc_offset; |
| 1081 | static int hf_afp_toc_entry; |
| 1082 | static int hf_afp_endianness; |
| 1083 | static int hf_afp_query_len; |
| 1084 | static int hf_afp_num_toc_entries; |
| 1085 | static int hf_afp_machine_offset; |
| 1086 | static int hf_afp_version_offset; |
| 1087 | static int hf_afp_uams_offset; |
| 1088 | static int hf_afp_icon_offset; |
| 1089 | static int hf_afp_signature_offset; |
| 1090 | static int hf_afp_network_address_offset; |
| 1091 | static int hf_afp_directory_services_offset; |
| 1092 | static int hf_afp_utf8_server_name_offset; |
| 1093 | |
| 1094 | static const value_string afp_server_addr_type_vals[] = { |
| 1095 | {1, "IP address" }, |
| 1096 | {2, "IP+port address" }, |
| 1097 | {3, "DDP address" }, |
| 1098 | {4, "DNS name" }, |
| 1099 | {5, "IP+port ssh tunnel" }, |
| 1100 | {6, "IP6 address" }, |
| 1101 | {7, "IP6+port address" }, |
| 1102 | {0, NULL((void*)0) } }; |
| 1103 | static value_string_ext afp_server_addr_type_vals_ext = VALUE_STRING_EXT_INIT(afp_server_addr_type_vals){ _try_val_to_str_ext_init, 0, (sizeof (afp_server_addr_type_vals ) / sizeof ((afp_server_addr_type_vals)[0]))-1, afp_server_addr_type_vals , "afp_server_addr_type_vals", ((void*)0) }; |
| 1104 | |
| 1105 | #define AFP_NUM_PROCEDURES256 256 |
| 1106 | |
| 1107 | static void |
| 1108 | afpstat_init(struct register_srt* srt _U___attribute__((unused)), GArray* srt_array) |
| 1109 | { |
| 1110 | srt_stat_table *afp_srt_table; |
| 1111 | uint32_t i; |
| 1112 | |
| 1113 | afp_srt_table = init_srt_table("AFP Commands", NULL((void*)0), srt_array, AFP_NUM_PROCEDURES256, NULL((void*)0), "afp.command", NULL((void*)0)); |
| 1114 | for (i = 0; i < AFP_NUM_PROCEDURES256; i++) |
| 1115 | { |
| 1116 | char* tmp_str = val_to_str_ext(NULL((void*)0), i, &CommandCode_vals_ext, "Unknown(%u)"); |
| 1117 | init_srt_table_row(afp_srt_table, i, tmp_str); |
| 1118 | wmem_free(NULL((void*)0), tmp_str); |
| 1119 | } |
| 1120 | } |
| 1121 | |
| 1122 | static tap_packet_status |
| 1123 | afpstat_packet(void *pss, packet_info *pinfo, epan_dissect_t *edt _U___attribute__((unused)), const void *prv, tap_flags_t flags _U___attribute__((unused))) |
| 1124 | { |
| 1125 | unsigned i = 0; |
| 1126 | srt_stat_table *afp_srt_table; |
| 1127 | srt_data_t *data = (srt_data_t *)pss; |
| 1128 | const afp_request_val *request_val = (const afp_request_val *)prv; |
| 1129 | |
| 1130 | /* if we haven't seen the request, just ignore it */ |
| 1131 | if (!request_val) { |
| 1132 | return TAP_PACKET_DONT_REDRAW; |
| 1133 | } |
| 1134 | |
| 1135 | afp_srt_table = g_array_index(data->srt_array, srt_stat_table*, i)(((srt_stat_table**) (void *) (data->srt_array)->data) [ (i)]); |
| 1136 | |
| 1137 | add_srt_table_data(afp_srt_table, request_val->command, &request_val->req_time, pinfo); |
| 1138 | |
| 1139 | return TAP_PACKET_REDRAW; |
| 1140 | } |
| 1141 | |
| 1142 | |
| 1143 | |
| 1144 | #define hash_init_count20 20 |
| 1145 | |
| 1146 | /* Forward declarations */ |
| 1147 | |
| 1148 | /* Hash functions */ |
| 1149 | static int afp_equal (const void *v, const void *v2); |
| 1150 | static unsigned afp_hash (const void *v); |
| 1151 | |
| 1152 | typedef struct { |
| 1153 | uint32_t conversation; |
| 1154 | uint16_t tid; |
| 1155 | } afp_request_key; |
| 1156 | |
| 1157 | static wmem_map_t *afp_request_hash; |
| 1158 | |
| 1159 | static unsigned Vol; /* volume */ |
| 1160 | static unsigned Did; /* parent directory ID */ |
| 1161 | |
| 1162 | /* Hash Functions */ |
| 1163 | static int afp_equal (const void *v, const void *v2) |
| 1164 | { |
| 1165 | const afp_request_key *val1 = (const afp_request_key*)v; |
| 1166 | const afp_request_key *val2 = (const afp_request_key*)v2; |
| 1167 | |
| 1168 | if (val1->conversation == val2->conversation && |
| 1169 | val1->tid == val2->tid) { |
| 1170 | return 1; |
| 1171 | } |
| 1172 | return 0; |
| 1173 | } |
| 1174 | |
| 1175 | static unsigned afp_hash (const void *v) |
| 1176 | { |
| 1177 | const afp_request_key *afp_key = (const afp_request_key*)v; |
| 1178 | return afp_key->tid; |
| 1179 | } |
| 1180 | |
| 1181 | /* -------------------------- |
| 1182 | */ |
| 1183 | #define PAD(x){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, x, 0x00000000 ); offset += x; } { proto_tree_add_item(tree, hf_afp_pad, tvb, offset, x, ENC_NA0x00000000); offset += x; } |
| 1184 | |
| 1185 | static uint16_t |
| 1186 | decode_vol_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1187 | { |
| 1188 | uint16_t bitmap; |
| 1189 | static int * const bitmaps[] = { |
| 1190 | &hf_afp_vol_bitmap_Attributes, |
| 1191 | &hf_afp_vol_bitmap_Signature, |
| 1192 | &hf_afp_vol_bitmap_CreateDate, |
| 1193 | &hf_afp_vol_bitmap_ModDate, |
| 1194 | &hf_afp_vol_bitmap_BackupDate, |
| 1195 | &hf_afp_vol_bitmap_ID, |
| 1196 | &hf_afp_vol_bitmap_BytesFree, |
| 1197 | &hf_afp_vol_bitmap_BytesTotal, |
| 1198 | &hf_afp_vol_bitmap_Name, |
| 1199 | &hf_afp_vol_bitmap_ExtBytesFree, |
| 1200 | &hf_afp_vol_bitmap_ExtBytesTotal, |
| 1201 | &hf_afp_vol_bitmap_BlockSize, |
| 1202 | NULL((void*)0) |
| 1203 | }; |
| 1204 | |
| 1205 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_vol_bitmap, |
| 1206 | ett_afp_vol_bitmap, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 1207 | bitmap = tvb_get_ntohs(tvb, offset); |
| 1208 | |
| 1209 | return bitmap; |
| 1210 | } |
| 1211 | |
| 1212 | /* -------------------------- */ |
| 1213 | static uint16_t |
| 1214 | decode_vol_attribute (proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1215 | { |
| 1216 | uint16_t bitmap; |
| 1217 | static int * const bitmaps[] = { |
| 1218 | &hf_afp_vol_attribute_ReadOnly, |
| 1219 | &hf_afp_vol_attribute_HasVolumePassword, |
| 1220 | &hf_afp_vol_attribute_SupportsFileIDs, |
| 1221 | &hf_afp_vol_attribute_SupportsCatSearch, |
| 1222 | &hf_afp_vol_attribute_SupportsBlankAccessPrivs, |
| 1223 | &hf_afp_vol_attribute_SupportsUnixPrivs, |
| 1224 | &hf_afp_vol_attribute_SupportsUTF8Names, |
| 1225 | &hf_afp_vol_attribute_NoNetworkUserID, |
| 1226 | &hf_afp_vol_attribute_DefaultPrivsFromParent, |
| 1227 | &hf_afp_vol_attribute_NoExchangeFiles, |
| 1228 | &hf_afp_vol_attribute_SupportsExtAttrs, |
| 1229 | &hf_afp_vol_attribute_SupportsACLs, |
| 1230 | &hf_afp_vol_attribute_CaseSensitive, |
| 1231 | &hf_afp_vol_attribute_SupportsTMLockSteal, |
| 1232 | NULL((void*)0) |
| 1233 | }; |
| 1234 | |
| 1235 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_vol_attribute, |
| 1236 | ett_afp_vol_attribute, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 1237 | bitmap = tvb_get_ntohs(tvb, offset); |
| 1238 | |
| 1239 | return bitmap; |
| 1240 | } |
| 1241 | |
| 1242 | /* -------------------------- |
| 1243 | cf AFP3.0.pdf page 38 |
| 1244 | date are number of seconds from 12:00am on 01.01.2000 GMT |
| 1245 | backup : 0x8000000 not set |
| 1246 | from netatalk adouble.h |
| 1247 | */ |
| 1248 | #define DATE_NOT_SET0x80000000 0x80000000 |
| 1249 | #define AD_DATE_DELTA((3*365 + 366)*7 + 2*365)*24*3600UL EPOCH_DELTA_2000_01_01_00_00_00_UTC((3*365 + 366)*7 + 2*365)*24*3600UL |
| 1250 | #define AD_DATE_TO_UNIX(x)(x + ((3*365 + 366)*7 + 2*365)*24*3600UL) (x + AD_DATE_DELTA((3*365 + 366)*7 + 2*365)*24*3600UL) |
| 1251 | static void |
| 1252 | print_date(proto_tree *tree,int id, tvbuff_t *tvb, int offset) |
| 1253 | { |
| 1254 | time_t date = tvb_get_ntohl(tvb, offset); |
| 1255 | nstime_t tv; |
| 1256 | |
| 1257 | tv.secs = AD_DATE_TO_UNIX(date)(date + ((3*365 + 366)*7 + 2*365)*24*3600UL); |
| 1258 | tv.nsecs = 0; |
| 1259 | proto_tree_add_time(tree, id, tvb, offset, 4, &tv); |
| 1260 | } |
| 1261 | |
| 1262 | /* -------------------------- */ |
| 1263 | static int |
| 1264 | parse_vol_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset, uint16_t bitmap) |
| 1265 | { |
| 1266 | uint16_t nameoff = 0; |
| 1267 | |
| 1268 | if ((bitmap & kFPVolAttributeBit(1U << 0))) { |
| 1269 | decode_vol_attribute(tree,tvb,offset); |
| 1270 | offset += 2; |
| 1271 | } |
| 1272 | if ((bitmap & kFPVolSignatureBit(1U << 1))) { |
| 1273 | proto_tree_add_item(tree, hf_afp_vol_signature,tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1274 | offset += 2; |
| 1275 | } |
| 1276 | if ((bitmap & kFPVolCreateDateBit(1U << 2))) { |
| 1277 | print_date(tree, hf_afp_vol_creation_date,tvb, offset); |
| 1278 | offset += 4; |
| 1279 | } |
| 1280 | if ((bitmap & kFPVolModDateBit(1U << 3))) { |
| 1281 | print_date(tree, hf_afp_vol_modification_date,tvb, offset); |
| 1282 | offset += 4; |
| 1283 | } |
| 1284 | if ((bitmap & kFPVolBackupDateBit(1U << 4))) { |
| 1285 | print_date(tree, hf_afp_vol_backup_date,tvb, offset); |
| 1286 | offset += 4; |
| 1287 | } |
| 1288 | if ((bitmap & kFPVolIDBit(1U << 5))) { |
| 1289 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1290 | offset += 2; |
| 1291 | } |
| 1292 | if ((bitmap & kFPVolBytesFreeBit(1U << 6))) { |
| 1293 | proto_tree_add_item(tree, hf_afp_vol_bytes_free,tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1294 | offset += 4; |
| 1295 | } |
| 1296 | if ((bitmap & kFPVolBytesTotalBit(1U << 7))) { |
| 1297 | proto_tree_add_item(tree, hf_afp_vol_bytes_total,tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1298 | offset += 4; |
| 1299 | } |
| 1300 | if ((bitmap & kFPVolNameBit(1U << 8))) { |
| 1301 | proto_tree_add_item_ret_uint16(tree, hf_afp_vol_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &nameoff); |
| 1302 | offset += 2; |
| 1303 | } |
| 1304 | if ((bitmap & kFPVolExtBytesFreeBit(1U << 9))) { |
| 1305 | proto_tree_add_item(tree, hf_afp_vol_ex_bytes_free,tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 1306 | offset += 8; |
| 1307 | } |
| 1308 | if ((bitmap & kFPVolExtBytesTotalBit(1U << 10))) { |
| 1309 | proto_tree_add_item(tree, hf_afp_vol_ex_bytes_total,tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 1310 | offset += 8; |
| 1311 | } |
| 1312 | if ((bitmap & kFPVolBlockSizeBit(1U << 11))) { |
| 1313 | proto_tree_add_item(tree, hf_afp_vol_block_size,tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1314 | offset += 4; |
| 1315 | } |
| 1316 | if (nameoff) { |
| 1317 | uint8_t len; |
| 1318 | /* TODO: this doesn't look right! */ |
| 1319 | len = tvb_get_uint8(tvb, offset); |
| 1320 | proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 1321 | offset += len +1; |
| 1322 | |
| 1323 | } |
| 1324 | return offset; |
| 1325 | } |
| 1326 | |
| 1327 | /* -------------------------- */ |
| 1328 | static uint16_t |
| 1329 | decode_file_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1330 | { |
| 1331 | uint16_t bitmap; |
| 1332 | static int * const bitmaps[] = { |
| 1333 | &hf_afp_file_bitmap_Attributes, |
| 1334 | &hf_afp_file_bitmap_ParentDirID, |
| 1335 | &hf_afp_file_bitmap_CreateDate, |
| 1336 | &hf_afp_file_bitmap_ModDate, |
| 1337 | &hf_afp_file_bitmap_BackupDate, |
| 1338 | &hf_afp_file_bitmap_FinderInfo, |
| 1339 | &hf_afp_file_bitmap_LongName, |
| 1340 | &hf_afp_file_bitmap_ShortName, |
| 1341 | &hf_afp_file_bitmap_NodeID, |
| 1342 | &hf_afp_file_bitmap_DataForkLen, |
| 1343 | &hf_afp_file_bitmap_RsrcForkLen, |
| 1344 | &hf_afp_file_bitmap_ExtDataForkLen, |
| 1345 | &hf_afp_file_bitmap_LaunchLimit, |
| 1346 | &hf_afp_file_bitmap_UTF8Name, |
| 1347 | &hf_afp_file_bitmap_ExtRsrcForkLen, |
| 1348 | &hf_afp_file_bitmap_UnixPrivs, |
| 1349 | NULL((void*)0) |
| 1350 | }; |
| 1351 | |
| 1352 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_file_bitmap, |
| 1353 | ett_afp_file_bitmap, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 1354 | bitmap = tvb_get_ntohs(tvb, offset); |
| 1355 | |
| 1356 | return bitmap; |
| 1357 | } |
| 1358 | |
| 1359 | /* -------------------------- */ |
| 1360 | static uint16_t |
| 1361 | decode_file_attribute(proto_tree *tree, tvbuff_t *tvb, int offset, int shared) |
| 1362 | { |
| 1363 | uint16_t attribute; |
| 1364 | static int * const not_shared_attr[] = { |
| 1365 | &hf_afp_file_attribute_Invisible, |
| 1366 | &hf_afp_file_attribute_MultiUser, |
| 1367 | &hf_afp_file_attribute_System, |
| 1368 | &hf_afp_file_attribute_DAlreadyOpen, |
| 1369 | &hf_afp_file_attribute_RAlreadyOpen, |
| 1370 | /* writeinhibit is file only but Macs are setting it with FPSetFileDirParms too */ |
| 1371 | &hf_afp_file_attribute_WriteInhibit, |
| 1372 | &hf_afp_file_attribute_BackUpNeeded, |
| 1373 | &hf_afp_file_attribute_RenameInhibit, |
| 1374 | &hf_afp_file_attribute_DeleteInhibit, |
| 1375 | &hf_afp_file_attribute_CopyProtect, |
| 1376 | &hf_afp_file_attribute_SetClear, |
| 1377 | NULL((void*)0) |
| 1378 | }; |
| 1379 | |
| 1380 | static int * const shared_attr[] = { |
| 1381 | &hf_afp_file_attribute_Invisible, |
| 1382 | &hf_afp_file_attribute_System, |
| 1383 | &hf_afp_file_attribute_WriteInhibit, |
| 1384 | &hf_afp_file_attribute_BackUpNeeded, |
| 1385 | &hf_afp_file_attribute_RenameInhibit, |
| 1386 | &hf_afp_file_attribute_DeleteInhibit, |
| 1387 | &hf_afp_file_attribute_SetClear, |
| 1388 | NULL((void*)0) |
| 1389 | }; |
| 1390 | |
| 1391 | if (!shared) |
| 1392 | { |
| 1393 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_file_attribute, |
| 1394 | ett_afp_file_attribute, not_shared_attr, ENC_BIG_ENDIAN0x00000000); |
| 1395 | } |
| 1396 | else |
| 1397 | { |
| 1398 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_file_attribute, |
| 1399 | ett_afp_file_attribute, shared_attr, ENC_BIG_ENDIAN0x00000000); |
| 1400 | } |
| 1401 | |
| 1402 | attribute = tvb_get_ntohs(tvb, offset); |
| 1403 | return attribute; |
| 1404 | } |
| 1405 | |
| 1406 | static void |
| 1407 | decode_access_rights (proto_tree *tree, tvbuff_t *tvb, int hf, int offset) |
| 1408 | { |
| 1409 | static int * const rights[] = { |
| 1410 | &hf_afp_dir_ar_o_search, |
| 1411 | &hf_afp_dir_ar_o_read, |
| 1412 | &hf_afp_dir_ar_o_write, |
| 1413 | &hf_afp_dir_ar_g_search, |
| 1414 | &hf_afp_dir_ar_g_read, |
| 1415 | &hf_afp_dir_ar_g_write, |
| 1416 | &hf_afp_dir_ar_e_search, |
| 1417 | &hf_afp_dir_ar_e_read, |
| 1418 | &hf_afp_dir_ar_e_write, |
| 1419 | &hf_afp_dir_ar_u_search, |
| 1420 | &hf_afp_dir_ar_u_read, |
| 1421 | &hf_afp_dir_ar_u_write, |
| 1422 | &hf_afp_dir_ar_blank, |
| 1423 | &hf_afp_dir_ar_u_own, |
| 1424 | NULL((void*)0) |
| 1425 | }; |
| 1426 | |
| 1427 | proto_tree_add_bitmask(tree, tvb, offset, hf, |
| 1428 | ett_afp_dir_ar, rights, ENC_BIG_ENDIAN0x00000000); |
| 1429 | } |
| 1430 | |
| 1431 | static void |
| 1432 | decode_unix_privs (proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1433 | { |
| 1434 | proto_tree *sub_tree; |
| 1435 | |
| 1436 | if (tree) { |
| 1437 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, 16, ett_afp_unix_privs, NULL((void*)0), |
| 1438 | "UNIX privileges"); |
| 1439 | |
| 1440 | proto_tree_add_item(sub_tree, hf_afp_unix_privs_uid, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1441 | proto_tree_add_item(sub_tree, hf_afp_unix_privs_gid, tvb, offset+4, 4, ENC_BIG_ENDIAN0x00000000); |
| 1442 | proto_tree_add_item(sub_tree, hf_afp_unix_privs_permissions, tvb, offset+8, 4, ENC_BIG_ENDIAN0x00000000); |
| 1443 | decode_access_rights(sub_tree, tvb, hf_afp_unix_privs_ua_permissions, offset+12); |
| 1444 | } |
| 1445 | } |
| 1446 | |
| 1447 | /* -------------------------- */ |
| 1448 | static int |
| 1449 | parse_long_filename(proto_tree *tree, tvbuff_t *tvb, int offset, int org_offset) |
| 1450 | { |
| 1451 | uint16_t lnameoff; |
| 1452 | int tp_ofs = 0; |
| 1453 | uint8_t len; |
| 1454 | |
| 1455 | lnameoff = tvb_get_ntohs(tvb, offset); |
| 1456 | proto_tree_add_item(tree, hf_afp_long_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1457 | if (lnameoff) { |
| 1458 | tp_ofs = lnameoff +org_offset; |
| 1459 | proto_tree_add_item_ret_uint8(tree, hf_afp_path_len, tvb, tp_ofs, 1, ENC_BIG_ENDIAN0x00000000, &len); |
| 1460 | tp_ofs++; |
| 1461 | proto_tree_add_item(tree, hf_afp_path_name, tvb, tp_ofs, len, ENC_UTF_80x00000002); |
| 1462 | tp_ofs += len; |
| 1463 | } |
| 1464 | return tp_ofs; |
| 1465 | } |
| 1466 | |
| 1467 | /* -------------------------- */ |
| 1468 | static int |
| 1469 | parse_UTF8_filename(proto_tree *tree, tvbuff_t *tvb, int offset, int org_offset) |
| 1470 | { |
| 1471 | uint16_t unameoff; |
| 1472 | int tp_ofs = 0; |
| 1473 | uint16_t len; |
| 1474 | |
| 1475 | unameoff = tvb_get_ntohs(tvb, offset); |
| 1476 | /* Check for and process the AFP 2.x ProDOS info block if found. |
| 1477 | * We detect this by looking for a value of 0 or any value greater |
| 1478 | * than 255, which is an implausible offset for a UTF-8 filename. |
| 1479 | */ |
| 1480 | if (unameoff == 0 || unameoff > 255) { |
| 1481 | proto_item *ti, *hidden_item; |
| 1482 | ti = proto_tree_add_item(tree, hf_afp_prodos_info, tvb, offset, 6, ENC_NA0x00000000); |
| 1483 | proto_tree* sub_tree = NULL((void*)0); |
| 1484 | sub_tree = proto_item_add_subtree(ti, ett_afp_prodos_info); |
| 1485 | proto_tree_add_item(sub_tree, hf_afp_prodos_type, tvb, offset, 1, ENC_NA0x00000000); |
| 1486 | offset += 1; |
| 1487 | hidden_item = proto_tree_add_item(sub_tree, hf_afp_pad, tvb, offset, 1, ENC_NA0x00000000); |
| 1488 | offset += 1; |
| 1489 | proto_item_set_hidden(hidden_item); /* hide one byte pad */ |
| 1490 | proto_tree_add_item(sub_tree, hf_afp_prodos_auxtype, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000); |
| 1491 | offset += 2; |
| 1492 | hidden_item = proto_tree_add_item(sub_tree, hf_afp_pad, tvb, offset, 2, ENC_NA0x00000000); |
| 1493 | offset += 2; |
Value stored to 'offset' is never read | |
| 1494 | proto_item_set_hidden(hidden_item); /* hide two byte pad */ |
| 1495 | return tp_ofs; |
| 1496 | } |
| 1497 | /* Otherwise, it is an AFP 3.x UTF-8 name offset. */ |
| 1498 | proto_tree_add_item(tree, hf_afp_unicode_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1499 | offset += 2; |
| 1500 | if (unameoff) { |
| 1501 | /* FIXME AFP3.x reuses PDINFO bit for UTF8. |
| 1502 | * In enumerate_ext it's pad with 4 bytes, PDINFO was 6 bytes, |
| 1503 | * but not in catsearch_ext. |
| 1504 | * Last but not least there's a bug in OSX catsearch_ext for spec2 |
| 1505 | * offset is off by 2 bytes. |
| 1506 | */ |
| 1507 | |
| 1508 | tp_ofs = unameoff +org_offset; |
| 1509 | if (tp_ofs > offset) { |
| 1510 | PAD(4){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 4, 0x00000000 ); offset += 4; }; |
| 1511 | } |
| 1512 | else if (tp_ofs < offset) { |
| 1513 | tp_ofs = offset; |
| 1514 | } |
| 1515 | proto_tree_add_item( tree, hf_afp_path_unicode_hint, tvb, tp_ofs, 4, ENC_BIG_ENDIAN0x00000000); |
| 1516 | tp_ofs += 4; |
| 1517 | |
| 1518 | len = tvb_get_ntohs(tvb, tp_ofs); |
| 1519 | proto_tree_add_item( tree, hf_afp_path_unicode_len, tvb, tp_ofs, 2, ENC_BIG_ENDIAN0x00000000); |
| 1520 | tp_ofs += 2; |
| 1521 | |
| 1522 | proto_tree_add_item(tree, hf_afp_path_name, tvb, tp_ofs, len, ENC_UTF_80x00000002); |
| 1523 | tp_ofs += len; |
| 1524 | } |
| 1525 | return tp_ofs; |
| 1526 | } |
| 1527 | |
| 1528 | /* -------------------------- */ |
| 1529 | static int |
| 1530 | parse_file_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset, uint16_t bitmap, int shared) |
| 1531 | { |
| 1532 | /* uint16_t snameoff = 0; */ |
| 1533 | int max_offset = 0; |
| 1534 | |
| 1535 | int org_offset = offset; |
| 1536 | |
| 1537 | if ((bitmap & kFPAttributeBit(1U << 0))) { |
| 1538 | decode_file_attribute(tree, tvb, offset, shared); |
| 1539 | offset += 2; |
| 1540 | } |
| 1541 | if ((bitmap & kFPParentDirIDBit(1U << 1))) { |
| 1542 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1543 | offset += 4; |
| 1544 | } |
| 1545 | if ((bitmap & kFPCreateDateBit(1U << 2))) { |
| 1546 | print_date(tree, hf_afp_creation_date,tvb, offset); |
| 1547 | offset += 4; |
| 1548 | } |
| 1549 | if ((bitmap & kFPModDateBit(1U << 3))) { |
| 1550 | print_date(tree, hf_afp_modification_date,tvb, offset); |
| 1551 | offset += 4; |
| 1552 | } |
| 1553 | if ((bitmap & kFPBackupDateBit(1U << 4))) { |
| 1554 | print_date(tree, hf_afp_backup_date,tvb, offset); |
| 1555 | offset += 4; |
| 1556 | } |
| 1557 | if ((bitmap & kFPFinderInfoBit(1U << 5))) { |
| 1558 | proto_tree_add_item(tree, hf_afp_finder_info,tvb, offset, 32, ENC_NA0x00000000); |
| 1559 | offset += 32; |
| 1560 | } |
| 1561 | if ((bitmap & kFPLongNameBit(1U << 6))) { |
| 1562 | int tp_ofs; |
| 1563 | |
| 1564 | tp_ofs = parse_long_filename(tree, tvb, offset, org_offset); |
| 1565 | max_offset = (tp_ofs >max_offset)?tp_ofs:max_offset; |
| 1566 | |
| 1567 | offset += 2; |
| 1568 | |
| 1569 | } |
| 1570 | if ((bitmap & kFPShortNameBit(1U << 7))) { |
| 1571 | /* snameoff = tvb_get_ntohs(tvb, offset); */ |
| 1572 | proto_tree_add_item(tree, hf_afp_short_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1573 | offset += 2; |
| 1574 | } |
| 1575 | if ((bitmap & kFPNodeIDBit(1U << 8))) { |
| 1576 | proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1577 | offset += 4; |
| 1578 | } |
| 1579 | |
| 1580 | if ((bitmap & kFPDataForkLenBit(1U << 9))) { |
| 1581 | proto_tree_add_item(tree, hf_afp_file_DataForkLen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1582 | offset += 4; |
| 1583 | } |
| 1584 | |
| 1585 | if ((bitmap & kFPRsrcForkLenBit(1U << 10))) { |
| 1586 | proto_tree_add_item(tree, hf_afp_file_RsrcForkLen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1587 | offset += 4; |
| 1588 | } |
| 1589 | |
| 1590 | if ((bitmap & kFPExtDataForkLenBit(1U << 11))) { |
| 1591 | proto_tree_add_item(tree, hf_afp_file_ExtDataForkLen, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 1592 | offset += 8; |
| 1593 | } |
| 1594 | |
| 1595 | if ((bitmap & kFPLaunchLimitBit(1U << 12))) { |
| 1596 | offset += 2; /* ? */ |
| 1597 | } |
| 1598 | |
| 1599 | if ((bitmap & kFPUTF8NameBit(1U << 13))) { |
| 1600 | int tp_ofs; |
| 1601 | |
| 1602 | tp_ofs = parse_UTF8_filename(tree, tvb, offset, org_offset); |
| 1603 | max_offset = (tp_ofs >max_offset)?tp_ofs:max_offset; |
| 1604 | offset += 6; |
| 1605 | } |
| 1606 | |
| 1607 | if ((bitmap & kFPExtRsrcForkLenBit(1U << 14))) { |
| 1608 | proto_tree_add_item(tree, hf_afp_file_ExtRsrcForkLen, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 1609 | offset += 8; |
| 1610 | } |
| 1611 | |
| 1612 | if ((bitmap & kFPUnixPrivsBit(1U << 15))) { |
| 1613 | /* |
| 1614 | * XXX - the AFP 3.0 spec says this is "Four bytes", but |
| 1615 | * also says the privileges are "stored in an FPUnixPrivs |
| 1616 | * structure", which is 16 bytes long. |
| 1617 | * |
| 1618 | * We assume, for now, that the latter is true. |
| 1619 | */ |
| 1620 | decode_unix_privs(tree, tvb, offset); |
| 1621 | offset += 16; |
| 1622 | } |
| 1623 | |
| 1624 | return (max_offset)?max_offset:offset; |
| 1625 | } |
| 1626 | |
| 1627 | /* -------------------------- */ |
| 1628 | static uint16_t |
| 1629 | decode_dir_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1630 | { |
| 1631 | uint16_t bitmap; |
| 1632 | static int * const bitmaps[] = { |
| 1633 | &hf_afp_dir_bitmap_Attributes, |
| 1634 | &hf_afp_dir_bitmap_ParentDirID, |
| 1635 | &hf_afp_dir_bitmap_CreateDate, |
| 1636 | &hf_afp_dir_bitmap_ModDate, |
| 1637 | &hf_afp_dir_bitmap_BackupDate, |
| 1638 | &hf_afp_dir_bitmap_FinderInfo, |
| 1639 | &hf_afp_dir_bitmap_LongName, |
| 1640 | &hf_afp_dir_bitmap_ShortName, |
| 1641 | &hf_afp_dir_bitmap_NodeID, |
| 1642 | &hf_afp_dir_bitmap_OffspringCount, |
| 1643 | &hf_afp_dir_bitmap_OwnerID, |
| 1644 | &hf_afp_dir_bitmap_GroupID, |
| 1645 | &hf_afp_dir_bitmap_AccessRights, |
| 1646 | &hf_afp_dir_bitmap_UTF8Name, |
| 1647 | &hf_afp_dir_bitmap_UnixPrivs, |
| 1648 | NULL((void*)0) |
| 1649 | }; |
| 1650 | |
| 1651 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_dir_bitmap, |
| 1652 | ett_afp_dir_bitmap, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 1653 | bitmap = tvb_get_ntohs(tvb, offset); |
| 1654 | |
| 1655 | return bitmap; |
| 1656 | } |
| 1657 | |
| 1658 | /* -------------------------- */ |
| 1659 | static uint16_t |
| 1660 | decode_dir_attribute(proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1661 | { |
| 1662 | uint16_t attribute; |
| 1663 | static int * const attributes[] = { |
| 1664 | &hf_afp_dir_attribute_Invisible, |
| 1665 | &hf_afp_dir_attribute_IsExpFolder, |
| 1666 | &hf_afp_dir_attribute_System, |
| 1667 | &hf_afp_dir_attribute_Mounted, |
| 1668 | &hf_afp_dir_attribute_InExpFolder, |
| 1669 | &hf_afp_dir_attribute_BackUpNeeded, |
| 1670 | &hf_afp_dir_attribute_RenameInhibit, |
| 1671 | &hf_afp_dir_attribute_DeleteInhibit, |
| 1672 | NULL((void*)0) |
| 1673 | }; |
| 1674 | |
| 1675 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_dir_attribute, |
| 1676 | ett_afp_dir_attribute, attributes, ENC_BIG_ENDIAN0x00000000); |
| 1677 | attribute = tvb_get_ntohs(tvb, offset); |
| 1678 | |
| 1679 | return attribute; |
| 1680 | } |
| 1681 | |
| 1682 | /* -------------------------- */ |
| 1683 | static int |
| 1684 | parse_dir_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset, uint16_t bitmap) |
| 1685 | { |
| 1686 | /* uint16_t snameoff = 0; */ |
| 1687 | int max_offset = 0; |
| 1688 | |
| 1689 | int org_offset = offset; |
| 1690 | |
| 1691 | if ((bitmap & kFPAttributeBit(1U << 0))) { |
| 1692 | decode_dir_attribute(tree, tvb, offset); |
| 1693 | offset += 2; |
| 1694 | } |
| 1695 | if ((bitmap & kFPParentDirIDBit(1U << 1))) { |
| 1696 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1697 | offset += 4; |
| 1698 | } |
| 1699 | if ((bitmap & kFPCreateDateBit(1U << 2))) { |
| 1700 | print_date(tree, hf_afp_creation_date,tvb, offset); |
| 1701 | offset += 4; |
| 1702 | } |
| 1703 | if ((bitmap & kFPModDateBit(1U << 3))) { |
| 1704 | print_date(tree, hf_afp_modification_date,tvb, offset); |
| 1705 | offset += 4; |
| 1706 | } |
| 1707 | if ((bitmap & kFPBackupDateBit(1U << 4))) { |
| 1708 | print_date(tree, hf_afp_backup_date,tvb, offset); |
| 1709 | offset += 4; |
| 1710 | } |
| 1711 | if ((bitmap & kFPFinderInfoBit(1U << 5))) { |
| 1712 | proto_tree_add_item(tree, hf_afp_finder_info,tvb, offset, 32, ENC_NA0x00000000); |
| 1713 | offset += 32; |
| 1714 | } |
| 1715 | if ((bitmap & kFPLongNameBit(1U << 6))) { |
| 1716 | int tp_ofs; |
| 1717 | |
| 1718 | tp_ofs = parse_long_filename(tree, tvb, offset, org_offset); |
| 1719 | max_offset = (tp_ofs >max_offset)?tp_ofs:max_offset; |
| 1720 | |
| 1721 | offset += 2; |
| 1722 | } |
| 1723 | if ((bitmap & kFPShortNameBit(1U << 7))) { |
| 1724 | /* snameoff = tvb_get_ntohs(tvb, offset); */ |
| 1725 | proto_tree_add_item(tree, hf_afp_short_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1726 | offset += 2; |
| 1727 | } |
| 1728 | if ((bitmap & kFPNodeIDBit(1U << 8))) { |
| 1729 | proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1730 | offset += 4; |
| 1731 | } |
| 1732 | if ((bitmap & kFPOffspringCountBit(1U << 9))) { |
| 1733 | proto_tree_add_item(tree, hf_afp_dir_offspring, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1734 | offset += 2; /* error in AFP3.0.pdf */ |
| 1735 | } |
| 1736 | if ((bitmap & kFPOwnerIDBit(1U << 10))) { |
| 1737 | proto_tree_add_item(tree, hf_afp_dir_OwnerID, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1738 | offset += 4; |
| 1739 | } |
| 1740 | if ((bitmap & kFPGroupIDBit(1U << 11))) { |
| 1741 | proto_tree_add_item(tree, hf_afp_dir_GroupID, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1742 | offset += 4; |
| 1743 | } |
| 1744 | if ((bitmap & kFPAccessRightsBit(1U << 12))) { |
| 1745 | decode_access_rights(tree, tvb, hf_afp_dir_ar, offset); |
| 1746 | offset += 4; |
| 1747 | } |
| 1748 | if ((bitmap & kFPUTF8NameBit(1U << 13))) { |
| 1749 | int tp_ofs; |
| 1750 | |
| 1751 | tp_ofs = parse_UTF8_filename(tree, tvb, offset, org_offset); |
| 1752 | max_offset = (tp_ofs >max_offset)?tp_ofs:max_offset; |
| 1753 | offset += 6; |
| 1754 | } |
| 1755 | if ((bitmap & kFPUnixPrivsBit(1U << 15))) { |
| 1756 | /* |
| 1757 | * XXX - the AFP 3.0 spec says this is "Four bytes", but |
| 1758 | * also says the privileges are "stored in an FPUnixPrivs |
| 1759 | * structure", which is 16 bytes long. |
| 1760 | * |
| 1761 | * We assume, for now, that the latter is true. |
| 1762 | */ |
| 1763 | decode_unix_privs(tree, tvb, offset); |
| 1764 | offset += 16; |
| 1765 | } |
| 1766 | return (max_offset)?max_offset:offset; |
| 1767 | } |
| 1768 | |
| 1769 | /* -------------------------- */ |
| 1770 | static uint8_t * |
| 1771 | name_in_bitmap(wmem_allocator_t *scope, tvbuff_t *tvb, int offset, uint16_t bitmap, int isdir) |
| 1772 | { |
| 1773 | uint8_t *name; |
| 1774 | int org_offset = offset; |
| 1775 | uint16_t nameoff; |
| 1776 | uint8_t len; |
| 1777 | uint16_t len16; |
| 1778 | int tp_ofs; |
| 1779 | |
| 1780 | if ((bitmap & kFPAttributeBit(1U << 0))) /* 0 */ |
| 1781 | offset += 2; |
| 1782 | if ((bitmap & kFPParentDirIDBit(1U << 1))) /* 1 */ |
| 1783 | offset += 4; |
| 1784 | if ((bitmap & kFPCreateDateBit(1U << 2))) /* 2 */ |
| 1785 | offset += 4; |
| 1786 | if ((bitmap & kFPModDateBit(1U << 3))) /* 3 */ |
| 1787 | offset += 4; |
| 1788 | if ((bitmap & kFPBackupDateBit(1U << 4))) /* 4 */ |
| 1789 | offset += 4; |
| 1790 | if ((bitmap & kFPFinderInfoBit(1U << 5))) /* 5 */ |
| 1791 | offset += 32; |
| 1792 | |
| 1793 | if ((bitmap & kFPLongNameBit(1U << 6))) { /* 6 */ |
| 1794 | nameoff = tvb_get_ntohs(tvb, offset); |
| 1795 | if (nameoff) { |
| 1796 | tp_ofs = nameoff +org_offset; |
| 1797 | len = tvb_get_uint8(tvb, tp_ofs); |
| 1798 | tp_ofs++; |
| 1799 | /* XXX - code page,, e.g. Mac{Roman,Japanese,etc.} */ |
| 1800 | name = tvb_get_string_enc(scope, tvb, tp_ofs, len, ENC_ASCII0x00000000|ENC_NA0x00000000); |
| 1801 | return name; |
| 1802 | } |
| 1803 | offset += 2; |
| 1804 | } |
| 1805 | |
| 1806 | if ((bitmap & kFPShortNameBit(1U << 7))) /* 7 */ |
| 1807 | offset += 2; |
| 1808 | if ((bitmap & kFPNodeIDBit(1U << 8))) /* 8 */ |
| 1809 | offset += 4; |
| 1810 | |
| 1811 | if (isdir) { |
| 1812 | if ((bitmap & kFPOffspringCountBit(1U << 9))) /* 9 */ |
| 1813 | offset += 2; |
| 1814 | if ((bitmap & kFPOwnerIDBit(1U << 10))) /* 10*/ |
| 1815 | offset += 4; |
| 1816 | if ((bitmap & kFPGroupIDBit(1U << 11))) /* 11*/ |
| 1817 | offset += 4; |
| 1818 | if ((bitmap & kFPAccessRightsBit(1U << 12))) /* 12*/ |
| 1819 | offset += 4; |
| 1820 | } |
| 1821 | else { |
| 1822 | if ((bitmap & kFPDataForkLenBit(1U << 9))) /* 9 */ |
| 1823 | offset += 4; |
| 1824 | if ((bitmap & kFPRsrcForkLenBit(1U << 10))) /* 10*/ |
| 1825 | offset += 4; |
| 1826 | if ((bitmap & kFPExtDataForkLenBit(1U << 11))) /* 11*/ |
| 1827 | offset += 8; |
| 1828 | if ((bitmap & kFPLaunchLimitBit(1U << 12))) /* 12*/ |
| 1829 | offset += 2; /* FIXME ? */ |
| 1830 | } |
| 1831 | |
| 1832 | if ((bitmap & kFPUTF8NameBit(1U << 13))) { /* 13 */ |
| 1833 | nameoff = tvb_get_ntohs(tvb, offset); |
| 1834 | if (nameoff) { |
| 1835 | tp_ofs = nameoff +org_offset +4; |
| 1836 | len16 = tvb_get_ntohs(tvb, tp_ofs); |
| 1837 | tp_ofs += 2; |
| 1838 | name = tvb_get_string_enc(scope, tvb, tp_ofs, len16, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 1839 | return name; |
| 1840 | } |
| 1841 | } |
| 1842 | return NULL((void*)0); |
| 1843 | } |
| 1844 | |
| 1845 | /* -------------------------- */ |
| 1846 | static uint8_t * |
| 1847 | name_in_dbitmap(wmem_allocator_t *scope, tvbuff_t *tvb, int offset, uint16_t bitmap) |
| 1848 | { |
| 1849 | uint8_t *name; |
| 1850 | |
| 1851 | name = name_in_bitmap(scope, tvb, offset, bitmap, 1); |
| 1852 | if (name != NULL((void*)0)) |
| 1853 | return name; |
| 1854 | /* |
| 1855 | check UTF8 name |
| 1856 | */ |
| 1857 | |
| 1858 | return name; |
| 1859 | } |
| 1860 | |
| 1861 | /* -------------------------- */ |
| 1862 | static uint8_t * |
| 1863 | name_in_fbitmap(wmem_allocator_t *scope, tvbuff_t *tvb, int offset, uint16_t bitmap) |
| 1864 | { |
| 1865 | uint8_t *name; |
| 1866 | |
| 1867 | name = name_in_bitmap(scope, tvb, offset, bitmap, 0); |
| 1868 | if (name != NULL((void*)0)) |
| 1869 | return name; |
| 1870 | /* |
| 1871 | check UTF8 name |
| 1872 | */ |
| 1873 | |
| 1874 | return name; |
| 1875 | } |
| 1876 | |
| 1877 | /* -------------------------- */ |
| 1878 | static int |
| 1879 | decode_vol(proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1880 | { |
| 1881 | Vol = tvb_get_ntohs(tvb, offset); |
| 1882 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1883 | return offset + 2; |
| 1884 | } |
| 1885 | |
| 1886 | /* -------------------------- */ |
| 1887 | static int |
| 1888 | decode_vol_did(proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1889 | { |
| 1890 | Vol = tvb_get_ntohs(tvb, offset); |
| 1891 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1892 | offset += 2; |
| 1893 | |
| 1894 | Did = tvb_get_ntohl(tvb, offset); |
| 1895 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1896 | offset += 4; |
| 1897 | return offset; |
| 1898 | } |
| 1899 | |
| 1900 | /* -------------------------- */ |
| 1901 | static int |
| 1902 | decode_vol_did_file_dir_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset) |
| 1903 | { |
| 1904 | offset = decode_vol_did(tree, tvb, offset); |
| 1905 | |
| 1906 | decode_file_bitmap(tree, tvb, offset); |
| 1907 | offset += 2; |
| 1908 | |
| 1909 | decode_dir_bitmap(tree, tvb, offset); |
| 1910 | offset += 2; |
| 1911 | |
| 1912 | return offset; |
| 1913 | } |
| 1914 | |
| 1915 | /* ------------------------ */ |
| 1916 | static const char * |
| 1917 | get_name(wmem_allocator_t *scope, tvbuff_t *tvb, int offset, int type) |
| 1918 | { |
| 1919 | int len; |
| 1920 | const char *string; |
| 1921 | |
| 1922 | switch (type) { |
| 1923 | case 1: |
| 1924 | case 2: |
| 1925 | len = tvb_get_uint8(tvb, offset); |
| 1926 | offset++; |
| 1927 | string = tvb_format_text(scope, tvb,offset, len); |
| 1928 | break; |
| 1929 | case 3: |
| 1930 | len = tvb_get_ntohs(tvb, offset +4); |
| 1931 | offset += 6; |
| 1932 | string = tvb_format_text(scope, tvb,offset, len); |
| 1933 | break; |
| 1934 | default: |
| 1935 | string = "Unknown type"; |
| 1936 | break; |
| 1937 | } |
| 1938 | return string; |
| 1939 | } |
| 1940 | /* -------------------------- */ |
| 1941 | static int |
| 1942 | decode_name_label (proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, int offset, const char *label, bool_Bool add_info) |
| 1943 | { |
| 1944 | int len; |
| 1945 | int header; |
| 1946 | const char *name; |
| 1947 | uint8_t type; |
| 1948 | proto_tree *sub_tree = NULL((void*)0); |
| 1949 | |
| 1950 | type = tvb_get_uint8(tvb, offset); |
| 1951 | if (type == 3) { |
| 1952 | header = 7; |
| 1953 | len = tvb_get_ntohs(tvb, offset +5); |
| 1954 | } |
| 1955 | else { |
| 1956 | header = 2; |
| 1957 | len = tvb_get_uint8(tvb, offset +1); |
| 1958 | } |
| 1959 | name = get_name(pinfo->pool, tvb, offset +1, type); |
| 1960 | |
| 1961 | if (add_info) { |
| 1962 | col_append_fstr(pinfo->cinfo, COL_INFO, ": Vol=%u Did=%u", Vol, Did); |
| 1963 | if (len) { |
| 1964 | col_append_fstr(pinfo->cinfo, COL_INFO, " Name=%s", name); |
| 1965 | } |
| 1966 | } |
| 1967 | |
| 1968 | if (tree) { |
| 1969 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, len +header, |
| 1970 | ett_afp_path_name, NULL((void*)0), label, name); |
| 1971 | |
| 1972 | proto_tree_add_item( sub_tree, hf_afp_path_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 1973 | offset++; |
| 1974 | if (type == 3) { |
| 1975 | proto_tree_add_item( sub_tree, hf_afp_path_unicode_hint, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 1976 | offset += 4; |
| 1977 | proto_tree_add_item( sub_tree, hf_afp_path_unicode_len, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 1978 | offset += 2; |
| 1979 | } |
| 1980 | else { |
| 1981 | proto_tree_add_item( sub_tree, hf_afp_path_len, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 1982 | offset++; |
| 1983 | } |
| 1984 | |
| 1985 | proto_tree_add_string(sub_tree, hf_afp_path_name, tvb, offset, len,name); |
| 1986 | } |
| 1987 | else |
| 1988 | offset += header; |
| 1989 | |
| 1990 | return offset +len; |
| 1991 | } |
| 1992 | |
| 1993 | /* -------------------------- */ |
| 1994 | static int |
| 1995 | decode_name (proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, int offset) |
| 1996 | { |
| 1997 | return decode_name_label(tree, pinfo, tvb, offset, "Path: %s", true1); |
| 1998 | } |
| 1999 | |
| 2000 | /* -------------------------- */ |
| 2001 | static void |
| 2002 | add_info_fork(tvbuff_t *tvb, packet_info *pinfo, int offset) |
| 2003 | { |
| 2004 | uint16_t ofork; |
| 2005 | |
| 2006 | ofork = tvb_get_ntohs(tvb, offset); |
| 2007 | if (ofork) { |
| 2008 | col_append_fstr(pinfo->cinfo, COL_INFO, ": Fork=%u", ofork); |
| 2009 | } |
| 2010 | } |
| 2011 | |
| 2012 | /* -------------------------- */ |
| 2013 | static void |
| 2014 | add_info_vol(tvbuff_t *tvb, packet_info *pinfo, int offset) |
| 2015 | { |
| 2016 | uint16_t vol; |
| 2017 | |
| 2018 | vol = tvb_get_ntohs(tvb, offset); |
| 2019 | col_append_fstr(pinfo->cinfo, COL_INFO, ": Vol=%u", vol); |
| 2020 | } |
| 2021 | |
| 2022 | /* ************************** */ |
| 2023 | static int |
| 2024 | dissect_query_afp_open_vol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2025 | { |
| 2026 | int len; |
| 2027 | const char *rep; |
| 2028 | |
| 2029 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2030 | |
| 2031 | decode_vol_bitmap(tree, tvb, offset); |
| 2032 | offset += 2; |
| 2033 | |
| 2034 | len = tvb_get_uint8(tvb, offset); |
| 2035 | |
| 2036 | rep = get_name(pinfo->pool, tvb, offset, 2); |
| 2037 | col_append_fstr(pinfo->cinfo, COL_INFO, ": %s", rep); |
| 2038 | |
| 2039 | if (!tree) |
| 2040 | return offset; |
| 2041 | |
| 2042 | proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 2043 | offset += len +1; |
| 2044 | |
| 2045 | len = tvb_reported_length_remaining(tvb,offset); |
| 2046 | if (len >= 8) { |
| 2047 | /* optional password */ |
| 2048 | proto_tree_add_item(tree, hf_afp_passwd, tvb, offset, 8, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 2049 | offset += 8; |
| 2050 | } |
| 2051 | return offset; |
| 2052 | } |
| 2053 | |
| 2054 | /* -------------------------- */ |
| 2055 | static int |
| 2056 | dissect_reply_afp_open_vol(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2057 | { |
| 2058 | uint16_t bitmap; |
| 2059 | |
| 2060 | if (!tree) |
| 2061 | return offset; |
| 2062 | bitmap = decode_vol_bitmap(tree, tvb, offset); |
| 2063 | offset += 2; |
| 2064 | offset = parse_vol_bitmap(tree, tvb, offset, bitmap); |
| 2065 | |
| 2066 | return offset; |
| 2067 | } |
| 2068 | |
| 2069 | /* ************************** */ |
| 2070 | static int |
| 2071 | dissect_reply_afp_get_server_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2072 | { |
| 2073 | uint8_t num; |
| 2074 | uint8_t len; |
| 2075 | uint8_t i; |
| 2076 | proto_tree *sub_tree; |
| 2077 | proto_item *item; |
| 2078 | |
| 2079 | static int * const flags[] = { |
| 2080 | &hf_afp_vol_flag_passwd, |
| 2081 | &hf_afp_vol_flag_has_config, |
| 2082 | NULL((void*)0) |
| 2083 | }; |
| 2084 | |
| 2085 | if (!tree) |
| 2086 | return offset; |
| 2087 | |
| 2088 | print_date(tree, hf_afp_server_time,tvb, offset); |
| 2089 | offset += 4; |
| 2090 | |
| 2091 | num = tvb_get_uint8(tvb, offset); |
| 2092 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, |
| 2093 | ett_afp_server_vol, NULL((void*)0), "Volumes : %d", num); |
| 2094 | offset++; |
| 2095 | |
| 2096 | for (i = 0; i < num; i++) { |
| 2097 | const char *rep; |
| 2098 | |
| 2099 | tree = proto_tree_add_subtree(sub_tree, tvb, offset, -1, |
| 2100 | ett_afp_vol_list, NULL((void*)0), "Volume"); |
| 2101 | |
| 2102 | item = proto_tree_add_bitmask(tree, tvb, offset, hf_afp_vol_flag, |
| 2103 | ett_afp_vol_flag, flags, ENC_BIG_ENDIAN0x00000000); |
| 2104 | offset++; |
| 2105 | |
| 2106 | len = tvb_get_uint8(tvb, offset) +1; |
| 2107 | rep = get_name(pinfo->pool, tvb, offset, 2); |
| 2108 | proto_item_set_text(item, "%s", rep); |
| 2109 | proto_item_set_len(item, len +1); |
| 2110 | |
| 2111 | proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 2112 | |
| 2113 | offset += len; |
| 2114 | } |
| 2115 | return offset; |
| 2116 | } |
| 2117 | |
| 2118 | /* ************************** |
| 2119 | next calls use the same format : |
| 2120 | 1 pad byte |
| 2121 | volume id |
| 2122 | AFP_FLUSH |
| 2123 | AFP_CLOSEVOL |
| 2124 | AFP_OPENDT |
| 2125 | */ |
| 2126 | static int |
| 2127 | dissect_query_afp_with_vol_id(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2128 | { |
| 2129 | |
| 2130 | if (!tree) |
| 2131 | return offset; |
| 2132 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2133 | |
| 2134 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2135 | offset += 2; |
| 2136 | return offset; |
| 2137 | } |
| 2138 | |
| 2139 | /* ************************** */ |
| 2140 | static int |
| 2141 | dissect_query_afp_open_fork(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2142 | { |
| 2143 | static int * const access[] = { |
| 2144 | &hf_afp_access_read, |
| 2145 | &hf_afp_access_write, |
| 2146 | &hf_afp_access_deny_read, |
| 2147 | &hf_afp_access_deny_write, |
| 2148 | NULL((void*)0) |
| 2149 | }; |
| 2150 | |
| 2151 | proto_tree_add_item(tree, hf_afp_fork_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2152 | offset++; |
| 2153 | |
| 2154 | offset = decode_vol_did(tree, tvb, offset); |
| 2155 | |
| 2156 | decode_file_bitmap(tree, tvb, offset); |
| 2157 | offset += 2; |
| 2158 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_access_mode, |
| 2159 | ett_afp_access_mode, access, ENC_BIG_ENDIAN0x00000000); |
| 2160 | offset += 2; |
| 2161 | |
| 2162 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2163 | |
| 2164 | return offset; |
| 2165 | } |
| 2166 | |
| 2167 | /* -------------------------- */ |
| 2168 | static int |
| 2169 | dissect_reply_afp_open_fork(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2170 | { |
| 2171 | uint16_t f_bitmap; |
| 2172 | |
| 2173 | f_bitmap = decode_file_bitmap(tree, tvb, offset); |
| 2174 | offset += 2; |
| 2175 | |
| 2176 | add_info_fork(tvb, pinfo, offset); |
| 2177 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2178 | offset += 2; |
| 2179 | |
| 2180 | offset = parse_file_bitmap(tree, tvb, offset, f_bitmap,0); |
| 2181 | |
| 2182 | return offset; |
| 2183 | } |
| 2184 | |
| 2185 | /* ************************** */ |
| 2186 | static int |
| 2187 | dissect_query_afp_enumerate_ext2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2188 | { |
| 2189 | |
| 2190 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2191 | offset = decode_vol_did_file_dir_bitmap(tree, tvb, offset); |
| 2192 | |
| 2193 | proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2194 | offset += 2; |
| 2195 | |
| 2196 | proto_tree_add_item(tree, hf_afp_start_index32, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2197 | offset += 4; |
| 2198 | |
| 2199 | proto_tree_add_item(tree, hf_afp_max_reply_size32, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2200 | offset += 4; |
| 2201 | |
| 2202 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2203 | |
| 2204 | return offset; |
| 2205 | } |
| 2206 | |
| 2207 | /* ************************** */ |
| 2208 | static int |
| 2209 | dissect_query_afp_enumerate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2210 | { |
| 2211 | |
| 2212 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2213 | offset = decode_vol_did_file_dir_bitmap(tree, tvb, offset); |
| 2214 | |
| 2215 | proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2216 | offset += 2; |
| 2217 | |
| 2218 | proto_tree_add_item(tree, hf_afp_start_index, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2219 | offset += 2; |
| 2220 | |
| 2221 | proto_tree_add_item(tree, hf_afp_max_reply_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2222 | offset += 2; |
| 2223 | |
| 2224 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2225 | |
| 2226 | return offset; |
| 2227 | } |
| 2228 | |
| 2229 | /* -------------------------- */ |
| 2230 | static int |
| 2231 | loop_record(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int offset, |
| 2232 | int count, uint16_t d_bitmap, uint16_t f_bitmap, int add, int ext) |
| 2233 | { |
| 2234 | proto_tree *tree = NULL((void*)0); |
| 2235 | uint8_t *name; |
| 2236 | uint8_t flags; |
| 2237 | unsigned size; |
| 2238 | int org; |
| 2239 | int i; |
| 2240 | int decal; |
| 2241 | |
| 2242 | for (i = 0; i < count; i++) { |
| 2243 | org = offset; |
| 2244 | if (ext) { |
| 2245 | size = tvb_get_ntohs(tvb, offset) +add *2; |
| 2246 | decal = 2; |
| 2247 | } |
| 2248 | else { |
| 2249 | size = tvb_get_uint8(tvb, offset) +add; |
| 2250 | decal = 1; |
| 2251 | } |
| 2252 | if (!size) |
| 2253 | return offset; /* packet is malformed */ |
| 2254 | flags = tvb_get_uint8(tvb, offset +decal); |
| 2255 | |
| 2256 | decal += (ext)?2:1; |
| 2257 | |
| 2258 | if (ptree) { |
| 2259 | if (flags) { |
| 2260 | name = name_in_dbitmap(pinfo->pool, tvb, offset +decal, d_bitmap); |
| 2261 | } |
| 2262 | else { |
| 2263 | name = name_in_fbitmap(pinfo->pool, tvb, offset +decal, f_bitmap); |
| 2264 | } |
| 2265 | if (name) { |
| 2266 | tree = proto_tree_add_subtree(ptree, tvb, offset, size, |
| 2267 | ett_afp_enumerate_line, NULL((void*)0), (const char*)name); |
| 2268 | } |
| 2269 | else { |
| 2270 | tree = proto_tree_add_subtree_format(ptree, tvb, offset, size, |
| 2271 | ett_afp_enumerate_line, NULL((void*)0), "line %d", i+1); |
| 2272 | } |
| 2273 | } |
| 2274 | if (ext) { |
| 2275 | proto_tree_add_item(tree, hf_afp_struct_size16, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2276 | offset += 2; |
| 2277 | } |
| 2278 | else { |
| 2279 | proto_tree_add_item(tree, hf_afp_struct_size, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2280 | offset++; |
| 2281 | } |
| 2282 | |
| 2283 | proto_tree_add_item(tree, hf_afp_file_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2284 | offset++; |
| 2285 | if (ext) { |
| 2286 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2287 | } |
| 2288 | if (flags) { |
| 2289 | offset = parse_dir_bitmap(tree, tvb, offset, d_bitmap); |
| 2290 | } |
| 2291 | else { |
| 2292 | offset = parse_file_bitmap(tree, tvb, offset, f_bitmap,0); |
| 2293 | } |
| 2294 | if ((offset & 1)) |
| 2295 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2296 | offset = org +size; /* play safe */ |
| 2297 | } |
| 2298 | return offset; |
| 2299 | } |
| 2300 | /* ------------------------- */ |
| 2301 | static int |
| 2302 | reply_enumerate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int ext) |
| 2303 | { |
| 2304 | proto_tree *sub_tree = NULL((void*)0); |
| 2305 | proto_item *item; |
| 2306 | int count; |
| 2307 | uint16_t f_bitmap; |
| 2308 | uint16_t d_bitmap; |
| 2309 | |
| 2310 | f_bitmap = decode_file_bitmap(tree, tvb, offset); |
| 2311 | offset += 2; |
| 2312 | |
| 2313 | d_bitmap = decode_dir_bitmap(tree, tvb, offset); |
| 2314 | offset += 2; |
| 2315 | |
| 2316 | count = tvb_get_ntohs(tvb, offset); |
| 2317 | if (tree) { |
| 2318 | item = proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2319 | sub_tree = proto_item_add_subtree(item, ett_afp_enumerate); |
| 2320 | } |
| 2321 | offset += 2; |
| 2322 | |
| 2323 | return loop_record(tvb, pinfo, sub_tree, offset, count, d_bitmap, f_bitmap,0, ext); |
| 2324 | } |
| 2325 | |
| 2326 | /* ------------------------- */ |
| 2327 | static int |
| 2328 | dissect_reply_afp_enumerate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2329 | { |
| 2330 | return reply_enumerate(tvb, pinfo, tree, offset, 0); |
| 2331 | } |
| 2332 | |
| 2333 | /* **************************/ |
| 2334 | static int |
| 2335 | dissect_reply_afp_enumerate_ext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2336 | { |
| 2337 | return reply_enumerate(tvb, pinfo, tree, offset, 1); |
| 2338 | } |
| 2339 | |
| 2340 | /* **************************/ |
| 2341 | static int |
| 2342 | catsearch_spec(tvbuff_t *tvb, proto_tree *ptree, int offset, int ext, uint32_t r_bitmap, const char *label) |
| 2343 | { |
| 2344 | proto_tree *tree; |
| 2345 | uint16_t size; |
| 2346 | int org; |
| 2347 | |
| 2348 | org = offset; |
| 2349 | |
| 2350 | if (ext) { |
| 2351 | size = tvb_get_ntohs(tvb, offset) +2; |
| 2352 | } |
| 2353 | else { |
| 2354 | size = tvb_get_uint8(tvb, offset) +2; |
| 2355 | } |
| 2356 | |
| 2357 | tree = proto_tree_add_subtree(ptree, tvb, offset, size, ett_afp_cat_spec, NULL((void*)0), label); |
| 2358 | |
| 2359 | if (ext) { |
| 2360 | proto_tree_add_item(tree, hf_afp_struct_size16, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2361 | offset += 2; |
| 2362 | } |
| 2363 | else { |
| 2364 | proto_tree_add_item(tree, hf_afp_struct_size, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2365 | offset++; |
| 2366 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2367 | } |
| 2368 | |
| 2369 | /* AFP 3.1 spec pdf: The low-order word of ReqBitmap is equivalent to the |
| 2370 | File and Directory bitmaps used by the FPGetFileDirParms command. */ |
| 2371 | parse_file_bitmap(tree, tvb, offset, (uint16_t) r_bitmap,0); |
| 2372 | offset = org +size; |
| 2373 | |
| 2374 | return offset; |
| 2375 | } |
| 2376 | |
| 2377 | /* ------------------------- */ |
| 2378 | static int |
| 2379 | query_catsearch(tvbuff_t *tvb, proto_tree *ptree, int offset, int ext) |
| 2380 | { |
| 2381 | proto_tree *tree = NULL((void*)0), *sub_tree; |
| 2382 | proto_item *item; |
| 2383 | uint16_t f_bitmap; |
| 2384 | uint16_t d_bitmap; |
| 2385 | uint32_t r_bitmap; |
| 2386 | |
| 2387 | if (!ptree) |
| 2388 | return offset; |
| 2389 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2390 | |
| 2391 | proto_tree_add_item(ptree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2392 | offset += 2; |
| 2393 | |
| 2394 | proto_tree_add_item(ptree, hf_afp_cat_req_matches, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2395 | offset += 4; |
| 2396 | |
| 2397 | proto_tree_add_item(ptree, hf_afp_reserved, tvb, offset, 4, ENC_NA0x00000000); |
| 2398 | offset += 4; |
| 2399 | |
| 2400 | proto_tree_add_item(ptree, hf_afp_cat_position, tvb, offset, 16, ENC_NA0x00000000); |
| 2401 | offset += 16; |
| 2402 | |
| 2403 | f_bitmap = decode_file_bitmap(ptree, tvb, offset); |
| 2404 | offset += 2; |
| 2405 | |
| 2406 | d_bitmap = decode_dir_bitmap(ptree, tvb, offset); |
| 2407 | offset += 2; |
| 2408 | |
| 2409 | r_bitmap = tvb_get_ntohl(tvb, offset); |
| 2410 | /* Already checked this above: if (ptree) */ { |
| 2411 | item = proto_tree_add_item(ptree, hf_afp_request_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2412 | sub_tree = proto_item_add_subtree(item, ett_afp_cat_r_bitmap); |
| 2413 | |
| 2414 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_Attributes , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2415 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ParentDirID, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2416 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_CreateDate , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2417 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ModDate , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2418 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_BackupDate , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2419 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_FinderInfo , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2420 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_LongName , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2421 | |
| 2422 | if (d_bitmap == 0) { |
| 2423 | /* Only for file-only searches */ |
| 2424 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_DataForkLen , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2425 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_RsrcForkLen , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2426 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ExtDataForkLen , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2427 | } |
| 2428 | if (f_bitmap == 0) { |
| 2429 | /* Only for directory-only searches */ |
| 2430 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_OffspringCount , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2431 | } |
| 2432 | |
| 2433 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_UTF8Name , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2434 | |
| 2435 | if (d_bitmap == 0) { |
| 2436 | /* Only for file-only searches */ |
| 2437 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ExtRsrcForkLen , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2438 | } |
| 2439 | proto_tree_add_item(sub_tree, hf_afp_request_bitmap_PartialNames , tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2440 | } |
| 2441 | offset += 4; |
| 2442 | |
| 2443 | /* spec 1 */ |
| 2444 | offset = catsearch_spec(tvb, ptree, offset, ext, r_bitmap, "Spec 1"); |
| 2445 | |
| 2446 | /* spec 2 */ |
| 2447 | offset = catsearch_spec(tvb, ptree, offset, ext, r_bitmap, "Spec 2"); |
| 2448 | |
| 2449 | return offset; |
| 2450 | } |
| 2451 | |
| 2452 | /* ------------------------- */ |
| 2453 | static int |
| 2454 | dissect_query_afp_cat_search(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *ptree, int offset) |
| 2455 | { |
| 2456 | return query_catsearch(tvb, ptree, offset, 0); |
| 2457 | |
| 2458 | } |
| 2459 | /* **************************/ |
| 2460 | static int |
| 2461 | dissect_query_afp_cat_search_ext(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *ptree, int offset) |
| 2462 | { |
| 2463 | return query_catsearch(tvb, ptree, offset, 1); |
| 2464 | |
| 2465 | } |
| 2466 | |
| 2467 | /* **************************/ |
| 2468 | static int |
| 2469 | reply_catsearch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int ext) |
| 2470 | { |
| 2471 | proto_tree *sub_tree = NULL((void*)0); |
| 2472 | proto_item *item; |
| 2473 | uint16_t f_bitmap; |
| 2474 | uint16_t d_bitmap; |
| 2475 | int count; |
| 2476 | |
| 2477 | proto_tree_add_item(tree, hf_afp_cat_position, tvb, offset, 16, ENC_NA0x00000000); |
| 2478 | offset += 16; |
| 2479 | |
| 2480 | f_bitmap = decode_file_bitmap(tree, tvb, offset); |
| 2481 | offset += 2; |
| 2482 | |
| 2483 | d_bitmap = decode_dir_bitmap(tree, tvb, offset); |
| 2484 | offset += 2; |
| 2485 | |
| 2486 | count = tvb_get_ntohl(tvb, offset); |
| 2487 | if (tree) { |
| 2488 | item = proto_tree_add_item(tree, hf_afp_cat_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2489 | sub_tree = proto_item_add_subtree(item, ett_afp_cat_search); |
| 2490 | } |
| 2491 | offset += 4; |
| 2492 | |
| 2493 | return loop_record(tvb, pinfo, sub_tree, offset, count, d_bitmap, f_bitmap, 2, ext); |
| 2494 | } |
| 2495 | |
| 2496 | /* -------------------------- */ |
| 2497 | static int |
| 2498 | dissect_reply_afp_cat_search(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2499 | { |
| 2500 | return reply_catsearch(tvb, pinfo, tree, offset, 0); |
| 2501 | } |
| 2502 | |
| 2503 | /* **************************/ |
| 2504 | static int |
| 2505 | dissect_reply_afp_cat_search_ext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2506 | { |
| 2507 | return reply_catsearch(tvb, pinfo, tree, offset, 1); |
| 2508 | } |
| 2509 | |
| 2510 | /* **************************/ |
| 2511 | static int |
| 2512 | dissect_query_afp_get_vol_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2513 | { |
| 2514 | |
| 2515 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; } |
| 2516 | add_info_vol(tvb, pinfo, offset); |
| 2517 | |
| 2518 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2519 | offset += 2; |
| 2520 | |
| 2521 | decode_vol_bitmap(tree, tvb, offset); |
| 2522 | offset += 2; |
| 2523 | |
| 2524 | return offset; |
| 2525 | } |
| 2526 | |
| 2527 | /* ------------------------ */ |
| 2528 | static int |
| 2529 | dissect_reply_afp_get_vol_param(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2530 | { |
| 2531 | uint16_t bitmap; |
| 2532 | |
| 2533 | bitmap = decode_vol_bitmap(tree, tvb, offset); |
| 2534 | offset += 2; |
| 2535 | |
| 2536 | offset = parse_vol_bitmap(tree, tvb, offset, bitmap); |
| 2537 | |
| 2538 | return offset; |
| 2539 | } |
| 2540 | |
| 2541 | /* **************************/ |
| 2542 | static int |
| 2543 | dissect_query_afp_set_vol_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2544 | { |
| 2545 | uint16_t bitmap; |
| 2546 | |
| 2547 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; } |
| 2548 | |
| 2549 | add_info_vol(tvb, pinfo, offset); |
| 2550 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2551 | offset += 2; |
| 2552 | |
| 2553 | bitmap = decode_vol_bitmap(tree, tvb, offset); |
| 2554 | offset += 2; |
| 2555 | |
| 2556 | offset = parse_vol_bitmap(tree, tvb, offset, bitmap); |
| 2557 | |
| 2558 | return offset; |
| 2559 | } |
| 2560 | |
| 2561 | /* ***************************/ |
| 2562 | static int |
| 2563 | decode_uam_parameters(const char *uam, int len_uam, tvbuff_t *tvb, proto_tree *tree, int offset) |
| 2564 | { |
| 2565 | int len; |
| 2566 | |
| 2567 | if (!g_ascii_strncasecmp(uam, "Cleartxt passwrd", len_uam)) { |
| 2568 | if ((offset & 1)) |
| 2569 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2570 | |
| 2571 | len = 8; /* tvb_strsize(tvb, offset);*/ |
| 2572 | proto_tree_add_item(tree, hf_afp_passwd, tvb, offset, len, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 2573 | offset += len; |
| 2574 | } |
| 2575 | else if (!g_ascii_strncasecmp(uam, "DHCAST128", len_uam)) { |
| 2576 | if ((offset & 1)) |
| 2577 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2578 | |
| 2579 | len = 16; |
| 2580 | proto_tree_add_item(tree, hf_afp_random, tvb, offset, len, ENC_NA0x00000000); |
| 2581 | offset += len; |
| 2582 | } |
| 2583 | else if (!g_ascii_strncasecmp(uam, "2-Way Randnum exchange", len_uam)) { |
| 2584 | /* nothing */ |
| 2585 | return offset; |
| 2586 | } |
| 2587 | return offset; |
| 2588 | } |
| 2589 | |
| 2590 | /* ---------------- */ |
| 2591 | static int |
| 2592 | dissect_query_afp_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2593 | { |
| 2594 | int len; |
| 2595 | int len_uam; |
| 2596 | const char *uam; |
| 2597 | |
| 2598 | len = tvb_get_uint8(tvb, offset); |
| 2599 | proto_tree_add_item(tree, hf_afp_Version, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 2600 | offset += len +1; |
| 2601 | len_uam = tvb_get_uint8(tvb, offset); |
| 2602 | uam = (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset +1, len_uam, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 2603 | proto_tree_add_item(tree, hf_afp_UAM, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 2604 | offset += len_uam +1; |
| 2605 | |
| 2606 | if (!g_ascii_strncasecmp(uam, "No User Authent", len_uam)) { |
| 2607 | return offset; |
| 2608 | } |
| 2609 | |
| 2610 | len = tvb_get_uint8(tvb, offset); |
| 2611 | proto_tree_add_item(tree, hf_afp_user, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 2612 | offset += len +1; |
| 2613 | |
| 2614 | return decode_uam_parameters(uam, len_uam, tvb, tree, offset); |
| 2615 | } |
| 2616 | |
| 2617 | /* ***************************/ |
| 2618 | static int |
| 2619 | dissect_query_afp_login_ext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2620 | { |
| 2621 | uint16_t len; |
| 2622 | int len_uam; |
| 2623 | const char *uam; |
| 2624 | uint8_t path_type; |
| 2625 | |
| 2626 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2627 | proto_tree_add_item(tree, hf_afp_login_flags, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2628 | offset += 2; |
| 2629 | |
| 2630 | len = tvb_get_uint8(tvb, offset); |
| 2631 | proto_tree_add_item(tree, hf_afp_Version, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 2632 | offset += len +1; |
| 2633 | |
| 2634 | len_uam = tvb_get_uint8(tvb, offset); |
| 2635 | uam = (const char*)tvb_get_string_enc(pinfo->pool, tvb, offset +1, len_uam, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 2636 | proto_tree_add_item(tree, hf_afp_UAM, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 2637 | offset += len_uam +1; |
| 2638 | |
| 2639 | proto_tree_add_item(tree, hf_afp_user_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2640 | offset++; |
| 2641 | /* only type 3 */ |
| 2642 | proto_tree_add_item_ret_uint16(tree, hf_afp_user_len, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &len); |
| 2643 | offset += 2; |
| 2644 | proto_tree_add_item(tree, hf_afp_user_name, tvb, offset, len, ENC_UTF_80x00000002); |
| 2645 | offset += len; |
| 2646 | |
| 2647 | /* directory service */ |
| 2648 | proto_tree_add_item_ret_uint8(tree, hf_afp_path_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &path_type); |
| 2649 | offset++; |
| 2650 | /* FIXME use 16 bit len + unicode from smb dissector */ |
| 2651 | switch (path_type) { |
| 2652 | case 1: |
| 2653 | case 2: |
| 2654 | proto_tree_add_item_ret_uint16(tree, hf_afp_path_len, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &len); |
| 2655 | offset++; |
| 2656 | proto_tree_add_item(tree, hf_afp_path_name, tvb, offset, len, ENC_UTF_80x00000002); |
| 2657 | offset += len; |
| 2658 | break; |
| 2659 | case 3: |
| 2660 | proto_tree_add_item_ret_uint16( tree, hf_afp_path_unicode_len, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &len); |
| 2661 | offset += 2; |
| 2662 | proto_tree_add_item(tree, hf_afp_path_name, tvb, offset, len, ENC_UTF_80x00000002); |
| 2663 | offset += len; |
| 2664 | break; |
| 2665 | default: |
| 2666 | break; |
| 2667 | } |
| 2668 | |
| 2669 | return decode_uam_parameters(uam, len_uam, tvb, tree, offset); |
| 2670 | } |
| 2671 | |
| 2672 | /* ************************** */ |
| 2673 | static int |
| 2674 | dissect_query_afp_write(tvbuff_t *tvb, packet_info *pinfo , proto_tree *tree, int offset) |
| 2675 | { |
| 2676 | int param; |
| 2677 | |
| 2678 | |
| 2679 | proto_tree_add_item(tree, hf_afp_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2680 | offset += 1; |
| 2681 | |
| 2682 | add_info_fork(tvb, pinfo, offset); |
| 2683 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2684 | offset += 2; |
| 2685 | |
| 2686 | proto_tree_add_item(tree, hf_afp_offset, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2687 | param = tvb_get_ntohl(tvb, offset); |
| 2688 | col_append_fstr(pinfo->cinfo, COL_INFO, " Offset=%d", param); |
| 2689 | offset += 4; |
| 2690 | |
| 2691 | proto_tree_add_item(tree, hf_afp_rw_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2692 | param = tvb_get_ntohl(tvb, offset); |
| 2693 | col_append_fstr(pinfo->cinfo, COL_INFO, " Size=%d", param); |
| 2694 | offset += 4; |
| 2695 | |
| 2696 | return offset; |
| 2697 | } |
| 2698 | |
| 2699 | static int |
| 2700 | dissect_reply_afp_write(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2701 | { |
| 2702 | proto_tree_add_item(tree, hf_afp_last_written, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2703 | offset += 4; |
| 2704 | |
| 2705 | return offset; |
| 2706 | } |
| 2707 | |
| 2708 | /* ************************** */ |
| 2709 | static int |
| 2710 | dissect_query_afp_write_ext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2711 | { |
| 2712 | proto_tree_add_item(tree, hf_afp_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2713 | offset += 1; |
| 2714 | |
| 2715 | add_info_fork(tvb, pinfo, offset); |
| 2716 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2717 | offset += 2; |
| 2718 | |
| 2719 | proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 2720 | offset += 8; |
| 2721 | |
| 2722 | proto_tree_add_item(tree, hf_afp_rw_count64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 2723 | offset += 8; |
| 2724 | |
| 2725 | return offset; |
| 2726 | } |
| 2727 | |
| 2728 | static int |
| 2729 | dissect_reply_afp_write_ext(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2730 | { |
| 2731 | proto_tree_add_item(tree, hf_afp_last_written64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 2732 | offset += 8; |
| 2733 | |
| 2734 | return offset; |
| 2735 | } |
| 2736 | |
| 2737 | /* ************************** */ |
| 2738 | static int |
| 2739 | dissect_query_afp_read(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2740 | { |
| 2741 | int param; |
| 2742 | |
| 2743 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2744 | |
| 2745 | add_info_fork(tvb, pinfo, offset); |
| 2746 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2747 | offset += 2; |
| 2748 | |
| 2749 | proto_tree_add_item(tree, hf_afp_offset, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2750 | param = tvb_get_ntohl(tvb, offset); |
| 2751 | col_append_fstr(pinfo->cinfo, COL_INFO, " Offset=%d", param); |
| 2752 | offset += 4; |
| 2753 | |
| 2754 | proto_tree_add_item(tree, hf_afp_rw_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2755 | param = tvb_get_ntohl(tvb, offset); |
| 2756 | col_append_fstr(pinfo->cinfo, COL_INFO, " Size=%d", param); |
| 2757 | offset += 4; |
| 2758 | |
| 2759 | proto_tree_add_item(tree, hf_afp_newline_mask, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2760 | offset++; |
| 2761 | |
| 2762 | proto_tree_add_item(tree, hf_afp_newline_char, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2763 | offset++; |
| 2764 | |
| 2765 | return offset; |
| 2766 | } |
| 2767 | |
| 2768 | /* ************************** */ |
| 2769 | static int |
| 2770 | dissect_query_afp_read_ext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2771 | { |
| 2772 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2773 | |
| 2774 | add_info_fork(tvb, pinfo, offset); |
| 2775 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2776 | offset += 2; |
| 2777 | |
| 2778 | proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 2779 | offset += 8; |
| 2780 | |
| 2781 | proto_tree_add_item(tree, hf_afp_rw_count64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 2782 | offset += 8; |
| 2783 | |
| 2784 | return offset; |
| 2785 | } |
| 2786 | |
| 2787 | /* ************************** |
| 2788 | Open desktop call |
| 2789 | query is the same than AFP_FLUSH, AFP_CLOSEVOL |
| 2790 | |
| 2791 | */ |
| 2792 | static int |
| 2793 | dissect_reply_afp_open_dt(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2794 | { |
| 2795 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2796 | offset += 2; |
| 2797 | |
| 2798 | return offset; |
| 2799 | } |
| 2800 | |
| 2801 | /* ************************** |
| 2802 | no reply |
| 2803 | */ |
| 2804 | static int |
| 2805 | dissect_query_afp_close_dt(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2806 | { |
| 2807 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2808 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2809 | offset += 2; |
| 2810 | |
| 2811 | return offset; |
| 2812 | } |
| 2813 | |
| 2814 | /* ************************** |
| 2815 | calls using the same format : |
| 2816 | 1 pad byte |
| 2817 | fork number |
| 2818 | AFP_FLUSHFORK |
| 2819 | AFP_CLOSEFORK |
| 2820 | AFP_SYNCFORK |
| 2821 | */ |
| 2822 | static int |
| 2823 | dissect_query_afp_with_fork(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2824 | { |
| 2825 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2826 | add_info_fork(tvb, pinfo, offset); |
| 2827 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2828 | offset += 2; |
| 2829 | |
| 2830 | return offset; |
| 2831 | } |
| 2832 | |
| 2833 | /* ************************** */ |
| 2834 | static int |
| 2835 | dissect_query_afp_get_fldr_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2836 | { |
| 2837 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2838 | offset = decode_vol_did_file_dir_bitmap(tree, tvb, offset); |
| 2839 | |
| 2840 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2841 | |
| 2842 | return offset; |
| 2843 | } |
| 2844 | |
| 2845 | /* -------------------------- */ |
| 2846 | static int |
| 2847 | dissect_reply_afp_get_fldr_param(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2848 | { |
| 2849 | uint8_t flags; |
| 2850 | uint16_t f_bitmap, d_bitmap; |
| 2851 | |
| 2852 | f_bitmap = decode_file_bitmap(tree, tvb, offset); |
| 2853 | offset += 2; |
| 2854 | |
| 2855 | d_bitmap = decode_dir_bitmap(tree, tvb, offset); |
| 2856 | offset += 2; |
| 2857 | |
| 2858 | flags = tvb_get_uint8(tvb, offset); |
| 2859 | proto_tree_add_item(tree, hf_afp_file_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 2860 | offset++; |
| 2861 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2862 | if (flags) { |
| 2863 | offset = parse_dir_bitmap(tree, tvb, offset, d_bitmap); |
| 2864 | } |
| 2865 | else { |
| 2866 | offset = parse_file_bitmap(tree, tvb, offset, f_bitmap,0); |
| 2867 | } |
| 2868 | return offset; |
| 2869 | } |
| 2870 | |
| 2871 | /* ************************** |
| 2872 | no reply |
| 2873 | */ |
| 2874 | static int |
| 2875 | dissect_query_afp_set_fldr_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2876 | { |
| 2877 | uint16_t f_bitmap; |
| 2878 | |
| 2879 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2880 | offset = decode_vol_did(tree, tvb, offset); |
| 2881 | |
| 2882 | f_bitmap = decode_file_bitmap(tree, tvb, offset); |
| 2883 | offset += 2; |
| 2884 | |
| 2885 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2886 | |
| 2887 | if ((offset & 1)) |
| 2888 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2889 | /* did:name can be a file or a folder but only the intersection between |
| 2890 | * file bitmap and dir bitmap can be set. |
| 2891 | * Well it's in afp spec, but clients (Mac) are setting 'file only' bits with this call |
| 2892 | * (WriteInhibit for example). |
| 2893 | */ |
| 2894 | offset = parse_file_bitmap(tree, tvb, offset, f_bitmap, 1); |
| 2895 | |
| 2896 | return offset; |
| 2897 | } |
| 2898 | |
| 2899 | /* ************************** |
| 2900 | no reply |
| 2901 | */ |
| 2902 | static int |
| 2903 | dissect_query_afp_set_file_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2904 | { |
| 2905 | uint16_t f_bitmap; |
| 2906 | |
| 2907 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2908 | offset = decode_vol_did(tree, tvb, offset); |
| 2909 | |
| 2910 | f_bitmap = decode_file_bitmap(tree, tvb, offset); |
| 2911 | offset += 2; |
| 2912 | |
| 2913 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2914 | |
| 2915 | if ((offset & 1)) |
| 2916 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2917 | offset = parse_file_bitmap(tree, tvb, offset, f_bitmap, 0); |
| 2918 | |
| 2919 | return offset; |
| 2920 | } |
| 2921 | |
| 2922 | /* ************************** |
| 2923 | no reply |
| 2924 | */ |
| 2925 | static int |
| 2926 | dissect_query_afp_set_dir_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2927 | { |
| 2928 | uint16_t d_bitmap; |
| 2929 | |
| 2930 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2931 | offset = decode_vol_did(tree, tvb, offset); |
| 2932 | |
| 2933 | d_bitmap = decode_dir_bitmap(tree, tvb, offset); |
| 2934 | offset += 2; |
| 2935 | |
| 2936 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2937 | |
| 2938 | if ((offset & 1)) |
| 2939 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2940 | offset = parse_dir_bitmap(tree, tvb, offset, d_bitmap); |
| 2941 | |
| 2942 | offset += 4; |
| 2943 | return offset; |
| 2944 | } |
| 2945 | |
| 2946 | /* ************************** |
| 2947 | AFP_DELETE |
| 2948 | AFP_CREATE_DIR |
| 2949 | */ |
| 2950 | static int |
| 2951 | dissect_query_afp_create_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 2952 | { |
| 2953 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2954 | offset = decode_vol_did(tree, tvb, offset); |
| 2955 | |
| 2956 | offset = decode_name(tree, pinfo, tvb, offset); |
| 2957 | return offset; |
| 2958 | } |
| 2959 | |
| 2960 | /* -------------------------- |
| 2961 | AFP_MOVE |
| 2962 | */ |
| 2963 | static int |
| 2964 | dissect_reply_afp_create_id(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2965 | { |
| 2966 | proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2967 | offset += 4; |
| 2968 | |
| 2969 | return offset; |
| 2970 | } |
| 2971 | |
| 2972 | /* -------------------------- */ |
| 2973 | static int |
| 2974 | dissect_reply_afp_create_dir(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2975 | { |
| 2976 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2977 | offset += 4; |
| 2978 | |
| 2979 | return offset; |
| 2980 | } |
| 2981 | |
| 2982 | /* ************************** |
| 2983 | no reply |
| 2984 | */ |
| 2985 | static int |
| 2986 | dissect_query_afp_delete_id(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 2987 | { |
| 2988 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 2989 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 2990 | offset += 2; |
| 2991 | proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 2992 | offset += 4; |
| 2993 | |
| 2994 | return offset; |
| 2995 | } |
| 2996 | |
| 2997 | /* ************************** |
| 2998 | same reply as get_fork_param |
| 2999 | */ |
| 3000 | static int |
| 3001 | dissect_query_afp_resolve_id(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3002 | { |
| 3003 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3004 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3005 | offset += 2; |
| 3006 | proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3007 | offset += 4; |
| 3008 | |
| 3009 | decode_file_bitmap(tree, tvb, offset); |
| 3010 | offset += 2; |
| 3011 | |
| 3012 | return offset; |
| 3013 | } |
| 3014 | |
| 3015 | /* ************************** */ |
| 3016 | static int |
| 3017 | dissect_query_afp_get_fork_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3018 | { |
| 3019 | |
| 3020 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3021 | add_info_fork(tvb, pinfo, offset); |
| 3022 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3023 | offset += 2; |
| 3024 | |
| 3025 | decode_file_bitmap(tree, tvb, offset); |
| 3026 | offset += 2; |
| 3027 | return offset; |
| 3028 | } |
| 3029 | |
| 3030 | /* -------------------------- */ |
| 3031 | static int |
| 3032 | dissect_reply_afp_get_fork_param(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3033 | { |
| 3034 | uint16_t f_bitmap; |
| 3035 | |
| 3036 | f_bitmap = decode_file_bitmap(tree, tvb, offset); |
| 3037 | offset += 2; |
| 3038 | |
| 3039 | offset = parse_file_bitmap(tree, tvb, offset, f_bitmap,0); |
| 3040 | |
| 3041 | return offset; |
| 3042 | } |
| 3043 | |
| 3044 | /* ************************** */ |
| 3045 | static int |
| 3046 | dissect_query_afp_set_fork_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3047 | { |
| 3048 | uint16_t bitmap; |
| 3049 | int param; |
| 3050 | |
| 3051 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3052 | add_info_fork(tvb, pinfo, offset); |
| 3053 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3054 | offset += 2; |
| 3055 | |
| 3056 | bitmap = decode_file_bitmap(tree, tvb, offset); |
| 3057 | offset += 2; |
| 3058 | |
| 3059 | if ((bitmap & kFPExtDataForkLenBit(1U << 11)) || (bitmap & kFPExtRsrcForkLenBit(1U << 14))) { |
| 3060 | proto_tree_add_item(tree, hf_afp_ofork_len64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 3061 | offset += 8; |
| 3062 | } |
| 3063 | else { |
| 3064 | proto_tree_add_item(tree, hf_afp_ofork_len, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3065 | param = tvb_get_ntohl(tvb, offset); |
| 3066 | col_append_fstr(pinfo->cinfo, COL_INFO, " Size=%d", param); |
| 3067 | offset += 4; |
| 3068 | } |
| 3069 | return offset; |
| 3070 | } |
| 3071 | |
| 3072 | /* ************************** */ |
| 3073 | static int |
| 3074 | dissect_query_afp_move(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3075 | { |
| 3076 | |
| 3077 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3078 | offset = decode_vol_did(tree, tvb, offset); |
| 3079 | |
| 3080 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3081 | offset += 4; |
| 3082 | |
| 3083 | offset = decode_name_label(tree, pinfo, tvb, offset, "Source path: %s", true1); |
| 3084 | offset = decode_name_label(tree, pinfo, tvb, offset, "Dest dir: %s", false0); |
| 3085 | offset = decode_name_label(tree, pinfo, tvb, offset, "New name: %s", false0); |
| 3086 | |
| 3087 | return offset; |
| 3088 | } |
| 3089 | |
| 3090 | /* ************************** */ |
| 3091 | static int |
| 3092 | dissect_query_afp_exchange_file(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3093 | { |
| 3094 | |
| 3095 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3096 | offset = decode_vol_did(tree, tvb, offset); |
| 3097 | |
| 3098 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3099 | offset += 4; |
| 3100 | |
| 3101 | offset = decode_name_label(tree, pinfo, tvb, offset, "Source path: %s", true1); |
| 3102 | offset = decode_name_label(tree, pinfo, tvb, offset, "Dest path: %s", false0); |
| 3103 | |
| 3104 | return offset; |
| 3105 | } |
| 3106 | /* ************************** */ |
| 3107 | static int |
| 3108 | dissect_query_afp_copy_file(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3109 | { |
| 3110 | proto_tree *sub_tree; |
| 3111 | |
| 3112 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3113 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, 6, ett_afp_vol_did, NULL((void*)0), "Source volume"); |
| 3114 | |
| 3115 | offset = decode_vol_did(sub_tree, tvb, offset); |
| 3116 | |
| 3117 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, 6, ett_afp_vol_did, NULL((void*)0), "Dest volume"); |
| 3118 | |
| 3119 | offset = decode_vol_did(sub_tree, tvb, offset); |
| 3120 | |
| 3121 | offset = decode_name_label(tree, pinfo, tvb, offset, "Source path: %s", true1); |
| 3122 | offset = decode_name_label(tree, pinfo, tvb, offset, "Dest dir: %s", false0); |
| 3123 | offset = decode_name_label(tree, pinfo, tvb, offset, "New name: %s", false0); |
| 3124 | |
| 3125 | return offset; |
| 3126 | } |
| 3127 | |
| 3128 | /* ************************** */ |
| 3129 | static int |
| 3130 | dissect_query_afp_rename(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3131 | { |
| 3132 | |
| 3133 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3134 | offset = decode_vol_did(tree, tvb, offset); |
| 3135 | |
| 3136 | offset = decode_name_label(tree, pinfo, tvb, offset, "Old name: %s", true1); |
| 3137 | offset = decode_name_label(tree, pinfo, tvb, offset, "New name: %s", false0); |
| 3138 | |
| 3139 | return offset; |
| 3140 | } |
| 3141 | |
| 3142 | /* ************************** */ |
| 3143 | static int |
| 3144 | dissect_query_afp_byte_lock(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3145 | { |
| 3146 | proto_tree *sub_tree; |
| 3147 | uint8_t flag; |
| 3148 | |
| 3149 | flag = tvb_get_uint8(tvb, offset); |
| 3150 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, |
| 3151 | ett_afp_lock_flags, NULL((void*)0), "Flags: 0x%02x", flag); |
| 3152 | |
| 3153 | proto_tree_add_item(sub_tree, hf_afp_lock_op, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3154 | proto_tree_add_item(sub_tree, hf_afp_lock_from, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3155 | offset += 1; |
| 3156 | |
| 3157 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3158 | offset += 2; |
| 3159 | |
| 3160 | proto_tree_add_item(tree, hf_afp_lock_offset, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3161 | offset += 4; |
| 3162 | |
| 3163 | proto_tree_add_item(tree, hf_afp_lock_len, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3164 | offset += 4; |
| 3165 | return offset; |
| 3166 | } |
| 3167 | |
| 3168 | /* -------------------------- */ |
| 3169 | static int |
| 3170 | dissect_reply_afp_byte_lock(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3171 | { |
| 3172 | proto_tree_add_item(tree, hf_afp_lock_range_start, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3173 | offset += 4; |
| 3174 | |
| 3175 | return offset; |
| 3176 | } |
| 3177 | |
| 3178 | /* ************************** */ |
| 3179 | static int |
| 3180 | dissect_query_afp_byte_lock_ext(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3181 | { |
| 3182 | proto_tree *sub_tree; |
| 3183 | uint8_t flag; |
| 3184 | |
| 3185 | flag = tvb_get_uint8(tvb, offset); |
| 3186 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, |
| 3187 | ett_afp_lock_flags, NULL((void*)0), "Flags: 0x%02x", flag); |
| 3188 | |
| 3189 | proto_tree_add_item(sub_tree, hf_afp_lock_op, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3190 | proto_tree_add_item(sub_tree, hf_afp_lock_from, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3191 | offset += 1; |
| 3192 | |
| 3193 | proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3194 | offset += 2; |
| 3195 | |
| 3196 | proto_tree_add_item(tree, hf_afp_lock_offset64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 3197 | offset += 8; |
| 3198 | |
| 3199 | proto_tree_add_item(tree, hf_afp_lock_len64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 3200 | offset += 8; |
| 3201 | return offset; |
| 3202 | } |
| 3203 | |
| 3204 | /* -------------------------- */ |
| 3205 | static int |
| 3206 | dissect_reply_afp_byte_lock_ext(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3207 | { |
| 3208 | proto_tree_add_item(tree, hf_afp_lock_range_start64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 3209 | offset += 8; |
| 3210 | |
| 3211 | return offset; |
| 3212 | } |
| 3213 | |
| 3214 | /* ************************** */ |
| 3215 | static int |
| 3216 | dissect_query_afp_add_cmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3217 | { |
| 3218 | uint8_t len; |
| 3219 | |
| 3220 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3221 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3222 | offset += 2; |
| 3223 | |
| 3224 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3225 | offset += 4; |
| 3226 | |
| 3227 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3228 | |
| 3229 | if ((offset & 1)) |
| 3230 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3231 | |
| 3232 | len = tvb_get_uint8(tvb, offset); |
| 3233 | proto_tree_add_item(tree, hf_afp_comment, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 3234 | offset += len +1; |
| 3235 | |
| 3236 | return offset; |
| 3237 | } |
| 3238 | |
| 3239 | |
| 3240 | /* ************************** */ |
| 3241 | static int |
| 3242 | dissect_query_afp_get_cmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3243 | { |
| 3244 | |
| 3245 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3246 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3247 | offset += 2; |
| 3248 | |
| 3249 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3250 | offset += 4; |
| 3251 | |
| 3252 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3253 | return offset; |
| 3254 | } |
| 3255 | |
| 3256 | /* -------------------------- */ |
| 3257 | static int |
| 3258 | dissect_reply_afp_get_cmt(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3259 | { |
| 3260 | uint8_t len; |
| 3261 | |
| 3262 | len = tvb_get_uint8(tvb, offset); |
| 3263 | proto_tree_add_item(tree, hf_afp_comment, tvb, offset, 1, ENC_UTF_80x00000002|ENC_BIG_ENDIAN0x00000000); |
| 3264 | offset += len +1; |
| 3265 | |
| 3266 | return offset; |
| 3267 | } |
| 3268 | |
| 3269 | /* ************************** */ |
| 3270 | static int |
| 3271 | dissect_query_afp_get_icon(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3272 | { |
| 3273 | |
| 3274 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3275 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3276 | offset += 2; |
| 3277 | proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_UTF_80x00000002); |
| 3278 | offset += 4; |
| 3279 | |
| 3280 | proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3281 | offset += 4; |
| 3282 | |
| 3283 | proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3284 | offset += 1; |
| 3285 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3286 | |
| 3287 | proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3288 | offset += 2; |
| 3289 | |
| 3290 | return offset; |
| 3291 | } |
| 3292 | |
| 3293 | /* ************************** */ |
| 3294 | static int |
| 3295 | dissect_query_afp_get_icon_info(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3296 | { |
| 3297 | |
| 3298 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3299 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3300 | offset += 2; |
| 3301 | proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3302 | offset += 4; |
| 3303 | |
| 3304 | proto_tree_add_item(tree, hf_afp_icon_index, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3305 | offset += 2; |
| 3306 | |
| 3307 | return offset; |
| 3308 | } |
| 3309 | |
| 3310 | /* -------------------------- */ |
| 3311 | static int |
| 3312 | dissect_reply_afp_get_icon_info(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3313 | { |
| 3314 | |
| 3315 | proto_tree_add_item(tree, hf_afp_icon_tag, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3316 | offset += 4; |
| 3317 | |
| 3318 | proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3319 | offset += 4; |
| 3320 | |
| 3321 | proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3322 | offset += 1; |
| 3323 | |
| 3324 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3325 | proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3326 | offset += 2; |
| 3327 | |
| 3328 | return offset; |
| 3329 | } |
| 3330 | |
| 3331 | /* ************************** */ |
| 3332 | static int |
| 3333 | dissect_query_afp_add_icon(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3334 | { |
| 3335 | |
| 3336 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3337 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3338 | offset += 2; |
| 3339 | proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3340 | offset += 4; |
| 3341 | |
| 3342 | proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3343 | offset += 4; |
| 3344 | |
| 3345 | proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3346 | offset += 1; |
| 3347 | |
| 3348 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3349 | proto_tree_add_item(tree, hf_afp_icon_tag, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3350 | offset += 4; |
| 3351 | |
| 3352 | proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3353 | offset += 2; |
| 3354 | |
| 3355 | return offset; |
| 3356 | } |
| 3357 | |
| 3358 | /* ************************** |
| 3359 | no reply |
| 3360 | */ |
| 3361 | static int |
| 3362 | decode_dt_did(proto_tree *tree, tvbuff_t *tvb, int offset) |
| 3363 | { |
| 3364 | /* FIXME it's not volume but dt cf decode_name*/ |
| 3365 | Vol = tvb_get_ntohs(tvb, offset); |
| 3366 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3367 | offset += 2; |
| 3368 | |
| 3369 | Did = tvb_get_ntohl(tvb, offset); |
| 3370 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3371 | offset += 4; |
| 3372 | return offset; |
| 3373 | } |
| 3374 | |
| 3375 | /* -------------------------- */ |
| 3376 | static int |
| 3377 | dissect_query_afp_add_appl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3378 | { |
| 3379 | |
| 3380 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3381 | offset = decode_dt_did(tree, tvb, offset); |
| 3382 | |
| 3383 | proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3384 | offset += 4; |
| 3385 | |
| 3386 | proto_tree_add_item(tree, hf_afp_appl_tag, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3387 | offset += 4; |
| 3388 | |
| 3389 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3390 | |
| 3391 | return offset; |
| 3392 | } |
| 3393 | |
| 3394 | /* ************************** |
| 3395 | no reply |
| 3396 | */ |
| 3397 | static int |
| 3398 | dissect_query_afp_rmv_appl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3399 | { |
| 3400 | |
| 3401 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3402 | offset = decode_dt_did(tree, tvb, offset); |
| 3403 | |
| 3404 | proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3405 | offset += 4; |
| 3406 | |
| 3407 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3408 | |
| 3409 | return offset; |
| 3410 | } |
| 3411 | |
| 3412 | /* ************************** */ |
| 3413 | static int |
| 3414 | dissect_query_afp_get_appl(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3415 | { |
| 3416 | |
| 3417 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3418 | proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3419 | offset += 2; |
| 3420 | |
| 3421 | proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII0x00000000); |
| 3422 | offset += 4; |
| 3423 | |
| 3424 | proto_tree_add_item(tree, hf_afp_appl_index, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3425 | offset += 2; |
| 3426 | |
| 3427 | decode_file_bitmap(tree, tvb, offset); |
| 3428 | offset += 2; |
| 3429 | |
| 3430 | return offset; |
| 3431 | } |
| 3432 | |
| 3433 | /* -------------------------- */ |
| 3434 | static int |
| 3435 | dissect_reply_afp_get_appl(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3436 | { |
| 3437 | proto_tree_add_item(tree, hf_afp_appl_tag, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3438 | offset += 4; |
| 3439 | |
| 3440 | return offset; |
| 3441 | } |
| 3442 | |
| 3443 | /* ************************** */ |
| 3444 | static int |
| 3445 | dissect_query_afp_create_file(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3446 | { |
| 3447 | proto_tree_add_item(tree, hf_afp_create_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3448 | offset++; |
| 3449 | |
| 3450 | offset = decode_vol_did(tree, tvb, offset); |
| 3451 | |
| 3452 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3453 | |
| 3454 | return offset; |
| 3455 | } |
| 3456 | |
| 3457 | /* ************************** */ |
| 3458 | static int |
| 3459 | dissect_query_afp_map_id(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3460 | { |
| 3461 | uint8_t type; |
| 3462 | |
| 3463 | proto_tree_add_item_ret_uint8(tree, hf_afp_map_id_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &type); |
| 3464 | offset++; |
| 3465 | |
| 3466 | if ( type < 5) { |
| 3467 | proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3468 | offset += 4; |
| 3469 | } |
| 3470 | else { |
| 3471 | proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3472 | offset += 16; |
| 3473 | } |
| 3474 | |
| 3475 | return offset; |
| 3476 | } |
| 3477 | |
| 3478 | /* -------------------------- */ |
| 3479 | static int |
| 3480 | dissect_reply_afp_map_id(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3481 | { |
| 3482 | int len; |
| 3483 | int size = 1; |
| 3484 | |
| 3485 | len = tvb_get_uint8(tvb, offset); |
| 3486 | /* for type 3 and 4 len is 16 bits but we don't keep the type from the request |
| 3487 | * XXX assume name < 256, ie the first byte is zero. |
| 3488 | */ |
| 3489 | if (!len) { |
| 3490 | len = tvb_get_uint8(tvb, offset +1); |
| 3491 | if (!len) { |
| 3492 | /* |
| 3493 | * Assume it's kUserUUIDToUTF8Name or |
| 3494 | * kGroupUUIDToUTF8Name. |
| 3495 | */ |
| 3496 | proto_tree_add_item(tree, hf_afp_map_id_reply_type, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3497 | offset += 4; |
| 3498 | |
| 3499 | proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3500 | offset += 4; |
| 3501 | |
| 3502 | size = 2; |
| 3503 | len = tvb_get_uint8(tvb, offset +1); |
| 3504 | |
| 3505 | } |
| 3506 | else { |
| 3507 | int remain = tvb_reported_length_remaining(tvb,offset); |
| 3508 | if (remain == len +2) { |
| 3509 | size = 2; |
| 3510 | } |
| 3511 | else { |
| 3512 | /* give up */ |
| 3513 | len = remain; |
| 3514 | size = 0; |
| 3515 | } |
| 3516 | } |
| 3517 | } |
| 3518 | if (size) { |
| 3519 | proto_tree_add_item(tree, hf_afp_map_name, tvb, offset, size, ENC_ASCII0x00000000|ENC_BIG_ENDIAN0x00000000); |
| 3520 | } |
| 3521 | else { |
| 3522 | proto_tree_add_item(tree, hf_afp_unknown, tvb, offset, len, ENC_NA0x00000000); |
| 3523 | } |
| 3524 | offset += len +size; |
| 3525 | return offset; |
| 3526 | } |
| 3527 | |
| 3528 | /* ************************** */ |
| 3529 | static int |
| 3530 | dissect_query_afp_map_name(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3531 | { |
| 3532 | int len; |
| 3533 | uint8_t type; |
| 3534 | int size; |
| 3535 | |
| 3536 | proto_tree_add_item_ret_uint8(tree, hf_afp_map_name_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &type); |
| 3537 | offset++; |
| 3538 | switch (type) { |
| 3539 | case 5: |
| 3540 | case 6: |
| 3541 | /* |
| 3542 | * Maps to UUID, UTF-8 string |
| 3543 | * |
| 3544 | * XXX - the spec doesn't say the string length is 2 bytes |
| 3545 | * for this case. |
| 3546 | */ |
| 3547 | size = 2; |
| 3548 | len = tvb_get_ntohs(tvb, offset); |
| 3549 | break; |
| 3550 | default: |
| 3551 | /* Maps to UID/GID */ |
| 3552 | size = 1; |
| 3553 | len = tvb_get_uint8(tvb, offset); |
| 3554 | break; |
| 3555 | } |
| 3556 | proto_tree_add_item(tree, hf_afp_map_name, tvb, offset, size, ENC_ASCII0x00000000|ENC_BIG_ENDIAN0x00000000); |
| 3557 | offset += (len+size); |
| 3558 | |
| 3559 | return offset; |
| 3560 | } |
| 3561 | |
| 3562 | /* -------------------------- */ |
| 3563 | static int |
| 3564 | dissect_reply_afp_map_name(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3565 | { |
| 3566 | int remain; |
| 3567 | |
| 3568 | /* We don't keep the type from the request */ |
| 3569 | /* If remain == 16, assume UUID */ |
| 3570 | remain = tvb_reported_length(tvb); |
| 3571 | if (remain == 16) { |
| 3572 | proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3573 | offset += 16; |
| 3574 | } |
| 3575 | else { |
| 3576 | proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3577 | offset += 4; |
| 3578 | } |
| 3579 | |
| 3580 | return offset; |
| 3581 | } |
| 3582 | |
| 3583 | /* ************************** */ |
| 3584 | static int |
| 3585 | dissect_query_afp_disconnect_old_session(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3586 | { |
| 3587 | uint32_t token_len; |
| 3588 | |
| 3589 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3590 | |
| 3591 | proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3592 | offset += 2; |
| 3593 | |
| 3594 | proto_tree_add_item_ret_uint(tree, hf_afp_session_token_len, |
| 3595 | tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &token_len); |
| 3596 | offset += 4; |
| 3597 | |
| 3598 | if ((uint32_t)offset + token_len > INT_MAX2147483647) |
| 3599 | return offset; |
| 3600 | |
| 3601 | proto_tree_add_item(tree, hf_afp_session_token, |
| 3602 | tvb, offset, (int)token_len, ENC_NA0x00000000); |
| 3603 | offset += (int)token_len; |
| 3604 | |
| 3605 | return offset; |
| 3606 | } |
| 3607 | |
| 3608 | /* ************************** */ |
| 3609 | static int |
| 3610 | dissect_query_afp_get_session_token(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3611 | { |
| 3612 | uint16_t token; |
| 3613 | uint32_t token_len; |
| 3614 | |
| 3615 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3616 | |
| 3617 | token = tvb_get_ntohs(tvb, offset); |
| 3618 | proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3619 | offset += 2; |
| 3620 | if (token == kLoginWithoutID0 || token == kGetKerberosSessionKey8) /* 0 || 8 */ |
| 3621 | return offset; |
| 3622 | |
| 3623 | proto_tree_add_item_ret_uint(tree, hf_afp_session_token_len, |
| 3624 | tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &token_len); |
| 3625 | offset += 4; |
| 3626 | |
| 3627 | if (token==kLoginWithTimeAndID3 || token==kReconnWithTimeAndID4) { |
| 3628 | proto_tree_add_item(tree, hf_afp_session_token_timestamp, |
| 3629 | tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3630 | offset += 4; |
| 3631 | } |
| 3632 | |
| 3633 | if ((uint32_t)offset + token_len > INT_MAX2147483647) |
| 3634 | return offset; |
| 3635 | |
| 3636 | proto_tree_add_item(tree, hf_afp_session_token, |
| 3637 | tvb, offset, (int)token_len, ENC_NA0x00000000); |
| 3638 | offset += (int)token_len; |
| 3639 | |
| 3640 | return offset; |
| 3641 | } |
| 3642 | |
| 3643 | /* -------------------------- */ |
| 3644 | static int |
| 3645 | dissect_reply_afp_get_session_token(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3646 | { |
| 3647 | int size; |
| 3648 | uint32_t token_len; |
| 3649 | |
| 3650 | /* FIXME spec and capture disagree : or it's 4 bytes with no token type, or it's 2 bytes */ |
| 3651 | size = 4; |
| 3652 | /* [cm]: FIXME continued: Since size is set to 4, this test is never true. |
| 3653 | if (size == 2) { |
| 3654 | proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2, ENC_BIG_ENDIAN); |
| 3655 | offset += 2; |
| 3656 | } |
| 3657 | */ |
| 3658 | proto_tree_add_item_ret_uint(tree, hf_afp_session_token_len, |
| 3659 | tvb, offset, size, ENC_BIG_ENDIAN0x00000000, &token_len); |
| 3660 | offset += size; |
| 3661 | |
| 3662 | if ((uint32_t)offset + token_len > INT_MAX2147483647) |
| 3663 | return offset; |
| 3664 | |
| 3665 | proto_tree_add_item(tree, hf_afp_session_token, |
| 3666 | tvb, offset, (int)token_len, ENC_NA0x00000000); |
| 3667 | offset += (int)token_len; |
| 3668 | |
| 3669 | return offset; |
| 3670 | } |
| 3671 | |
| 3672 | /* ************************** */ |
| 3673 | static int * const afp_message_bitmaps[] = { |
| 3674 | &hf_afp_message_bitmap_REQ, |
| 3675 | &hf_afp_message_bitmap_UTF, |
| 3676 | NULL((void*)0) |
| 3677 | }; |
| 3678 | |
| 3679 | static int |
| 3680 | dissect_query_afp_get_server_message(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3681 | { |
| 3682 | |
| 3683 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3684 | proto_tree_add_item(tree, hf_afp_message_type, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3685 | offset += 2; |
| 3686 | |
| 3687 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_message_bitmap, |
| 3688 | ett_afp_message_bitmap, afp_message_bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 3689 | offset += 2; |
| 3690 | |
| 3691 | return offset; |
| 3692 | } |
| 3693 | |
| 3694 | /* ************************** */ |
| 3695 | static int |
| 3696 | dissect_reply_afp_get_server_message(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3697 | { |
| 3698 | uint16_t bitmap; |
| 3699 | uint16_t len = 0; |
| 3700 | |
| 3701 | /* FIXME: APF 3.1 specs also specify a long reply format, yet unused */ |
| 3702 | |
| 3703 | proto_tree_add_item(tree, hf_afp_message_type, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3704 | offset += 2; |
| 3705 | |
| 3706 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_message_bitmap, |
| 3707 | ett_afp_message_bitmap, afp_message_bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 3708 | bitmap = tvb_get_ntohs(tvb, offset); |
| 3709 | offset += 2; |
| 3710 | |
| 3711 | /* |
| 3712 | * XXX - the spec says that the 0x01 bit indicates whether |
| 3713 | * the ServerMessage field contains a server message or a login |
| 3714 | * message. |
| 3715 | */ |
| 3716 | if (bitmap & 0x02) { |
| 3717 | /* Message is UTF-8, and message length is 2 bytes */ |
| 3718 | proto_tree_add_item_ret_uint16(tree, hf_afp_message_len, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &len); |
| 3719 | offset += 2; |
| 3720 | if (len) { |
| 3721 | proto_tree_add_item(tree, hf_afp_message, tvb, offset, len , ENC_UTF_80x00000002); |
| 3722 | offset += len; |
| 3723 | } |
| 3724 | } else { |
| 3725 | /* |
| 3726 | * Message is not UTF-8, and message length is 1 byte. |
| 3727 | * |
| 3728 | * Is the message in some Mac encoding? Always Mac Roman, |
| 3729 | * or possibly some other encoding for other locales? |
| 3730 | */ |
| 3731 | proto_tree_add_item_ret_uint16(tree, hf_afp_message_len, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &len); |
| 3732 | offset += 1; |
| 3733 | if (len) { |
| 3734 | proto_tree_add_item(tree, hf_afp_message, tvb, offset, len , ENC_ASCII0x00000000); |
| 3735 | offset += len; |
| 3736 | } |
| 3737 | } |
| 3738 | |
| 3739 | return offset; |
| 3740 | } |
| 3741 | |
| 3742 | /* ************************** */ |
| 3743 | static int * const afp_user_bitmaps[] = { |
| 3744 | &hf_afp_user_bitmap_UID, |
| 3745 | &hf_afp_user_bitmap_GID, |
| 3746 | &hf_afp_user_bitmap_UUID, |
| 3747 | NULL((void*)0) |
| 3748 | }; |
| 3749 | |
| 3750 | static int |
| 3751 | dissect_query_afp_get_user_info(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3752 | { |
| 3753 | |
| 3754 | proto_tree_add_item(tree, hf_afp_user_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3755 | offset++; |
| 3756 | |
| 3757 | proto_tree_add_item(tree, hf_afp_user_ID, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3758 | offset += 4; |
| 3759 | |
| 3760 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_user_bitmap, |
| 3761 | ett_afp_user_bitmap, afp_user_bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 3762 | offset += 2; |
| 3763 | |
| 3764 | return offset; |
| 3765 | } |
| 3766 | |
| 3767 | /* -------------------------- */ |
| 3768 | static int |
| 3769 | dissect_reply_afp_get_user_info(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3770 | { |
| 3771 | uint16_t bitmap; |
| 3772 | |
| 3773 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_user_bitmap, |
| 3774 | ett_afp_user_bitmap, afp_user_bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 3775 | bitmap = tvb_get_ntohs(tvb, offset); |
| 3776 | |
| 3777 | offset += 2; |
| 3778 | if ((bitmap & 1)) { |
| 3779 | proto_tree_add_item(tree, hf_afp_user_ID, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3780 | offset += 4; |
| 3781 | } |
| 3782 | |
| 3783 | if ((bitmap & 2)) { |
| 3784 | proto_tree_add_item(tree, hf_afp_group_ID, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3785 | offset += 4; |
| 3786 | } |
| 3787 | |
| 3788 | if ((bitmap & 4)) { |
| 3789 | proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3790 | offset += 16; |
| 3791 | } |
| 3792 | return offset; |
| 3793 | } |
| 3794 | |
| 3795 | |
| 3796 | /* ************************** */ |
| 3797 | static int |
| 3798 | decode_attr_name (proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), tvbuff_t *tvb, int offset, const char *label) |
| 3799 | { |
| 3800 | int len; |
| 3801 | |
| 3802 | if ((offset & 1)) |
| 3803 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3804 | |
| 3805 | len = tvb_get_ntohs(tvb, offset); |
| 3806 | |
| 3807 | if (tree) { |
| 3808 | char *name; |
| 3809 | proto_tree *sub_tree; |
| 3810 | |
| 3811 | name = tvb_format_text(pinfo->pool, tvb,offset+2, len); |
| 3812 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, len + 2, |
| 3813 | ett_afp_extattr_names, NULL((void*)0), label, name); |
| 3814 | |
| 3815 | proto_tree_add_item(sub_tree, hf_afp_extattr_namelen, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3816 | proto_tree_add_item(sub_tree, hf_afp_extattr_name, tvb, offset +2, len, ENC_UTF_80x00000002); |
| 3817 | } |
| 3818 | offset += 2 +len; |
| 3819 | |
| 3820 | return offset; |
| 3821 | } |
| 3822 | |
| 3823 | /* ************************** */ |
| 3824 | static int |
| 3825 | decode_attr_bitmap (proto_tree *tree, tvbuff_t *tvb, int offset) |
| 3826 | { |
| 3827 | static int * const bitmaps[] = { |
| 3828 | &hf_afp_extattr_bitmap_NoFollow, |
| 3829 | &hf_afp_extattr_bitmap_Create, |
| 3830 | &hf_afp_extattr_bitmap_Replace, |
| 3831 | NULL((void*)0) |
| 3832 | }; |
| 3833 | |
| 3834 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_extattr_bitmap, |
| 3835 | ett_afp_extattr_bitmap, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 3836 | offset += 2; |
| 3837 | return offset; |
| 3838 | } |
| 3839 | |
| 3840 | /* ************************** */ |
| 3841 | static int |
| 3842 | dissect_query_afp_get_ext_attr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3843 | { |
| 3844 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3845 | offset = decode_vol_did(tree, tvb, offset); |
| 3846 | |
| 3847 | offset = decode_attr_bitmap(tree, tvb, offset); |
| 3848 | |
| 3849 | /* 8byte offset */ |
| 3850 | proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 3851 | offset += 8; |
| 3852 | /* 8byte reqcount */ |
| 3853 | proto_tree_add_item(tree, hf_afp_reqcount64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 3854 | offset += 8; |
| 3855 | |
| 3856 | /* maxreply */ |
| 3857 | proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3858 | offset += 4; |
| 3859 | |
| 3860 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3861 | |
| 3862 | offset = decode_attr_name(tree, pinfo, tvb, offset, "Attribute: %s"); |
| 3863 | |
| 3864 | return offset; |
| 3865 | } |
| 3866 | |
| 3867 | /* -------------------------- */ |
| 3868 | static int |
| 3869 | dissect_reply_afp_get_ext_attr(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3870 | { |
| 3871 | uint32_t extattr_len; |
| 3872 | |
| 3873 | offset = decode_attr_bitmap(tree, tvb, offset); |
| 3874 | |
| 3875 | proto_tree_add_item_ret_uint(tree, hf_afp_extattr_len, |
| 3876 | tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &extattr_len); |
| 3877 | offset += 4; |
| 3878 | |
| 3879 | if ((uint32_t)offset + extattr_len > INT_MAX2147483647) |
| 3880 | return offset; |
| 3881 | |
| 3882 | proto_tree_add_item(tree, hf_afp_extattr_data, |
| 3883 | tvb, offset, (int)extattr_len, ENC_NA0x00000000); |
| 3884 | offset += (int)extattr_len; |
| 3885 | |
| 3886 | return offset; |
| 3887 | } |
| 3888 | |
| 3889 | /* ************************** */ |
| 3890 | static int |
| 3891 | dissect_query_afp_set_ext_attr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3892 | { |
| 3893 | uint32_t len; |
| 3894 | |
| 3895 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3896 | offset = decode_vol_did(tree, tvb, offset); |
| 3897 | |
| 3898 | offset = decode_attr_bitmap(tree, tvb, offset); |
| 3899 | |
| 3900 | /* 8byte offset */ |
| 3901 | proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 3902 | offset += 8; |
| 3903 | |
| 3904 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3905 | |
| 3906 | offset = decode_attr_name(tree, pinfo, tvb, offset, "Attribute: %s"); |
| 3907 | |
| 3908 | proto_tree_add_item_ret_uint(tree, hf_afp_extattr_len, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &len); |
| 3909 | offset += 4; |
| 3910 | |
| 3911 | proto_tree_add_item(tree, hf_afp_extattr_data, tvb, offset, len, ENC_NA0x00000000); |
| 3912 | offset += len; |
| 3913 | |
| 3914 | return offset; |
| 3915 | } |
| 3916 | |
| 3917 | /* ************************** */ |
| 3918 | static int |
| 3919 | dissect_query_afp_list_ext_attrs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3920 | { |
| 3921 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3922 | offset = decode_vol_did(tree, tvb, offset); |
| 3923 | |
| 3924 | /* for this command only kXAttrNoFollow is valid */ |
| 3925 | offset = decode_attr_bitmap(tree, tvb, offset); |
| 3926 | |
| 3927 | proto_tree_add_item(tree, hf_afp_extattr_req_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3928 | offset += 2; |
| 3929 | |
| 3930 | proto_tree_add_item(tree, hf_afp_extattr_start_index, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3931 | offset += 4; |
| 3932 | |
| 3933 | proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3934 | offset += 4; |
| 3935 | |
| 3936 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3937 | |
| 3938 | return offset; |
| 3939 | } |
| 3940 | |
| 3941 | /* -------------------------- */ |
| 3942 | static int |
| 3943 | dissect_reply_afp_list_ext_attrs(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3944 | { |
| 3945 | proto_tree *sub_tree; |
| 3946 | unsigned len_field = 0; |
| 3947 | int length; |
| 3948 | int remain; |
| 3949 | |
| 3950 | offset = decode_attr_bitmap(tree, tvb, offset); |
| 3951 | |
| 3952 | proto_tree_add_item_ret_uint(tree, hf_afp_extattr_reply_size, |
| 3953 | tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &len_field); |
| 3954 | offset += 4; |
| 3955 | if (len_field > INT_MAX2147483647) { |
| 3956 | /* XXX - add expert info */ |
| 3957 | return offset; |
| 3958 | } |
| 3959 | |
| 3960 | /* If reply_size was 0 on request, server only reports the size of |
| 3961 | the entries without actually adding any entries */ |
| 3962 | remain = tvb_reported_length_remaining(tvb, offset); |
| 3963 | if (remain < (int)len_field) |
| 3964 | return offset; |
| 3965 | |
| 3966 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, remain, |
| 3967 | ett_afp_extattr_names, NULL((void*)0), "Attributes"); |
| 3968 | while (remain > 0) { |
| 3969 | length = (int)tvb_strsize(tvb, offset); |
| 3970 | |
| 3971 | proto_tree_add_item(sub_tree, hf_afp_extattr_name, tvb, offset, length, ENC_UTF_80x00000002); |
| 3972 | offset += length; |
| 3973 | remain -= length; |
| 3974 | } |
| 3975 | |
| 3976 | return offset; |
| 3977 | } |
| 3978 | |
| 3979 | /* ************************** */ |
| 3980 | static int |
| 3981 | dissect_query_afp_remove_ext_attr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3982 | { |
| 3983 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 3984 | offset = decode_vol_did(tree, tvb, offset); |
| 3985 | |
| 3986 | offset = decode_attr_bitmap(tree, tvb, offset); |
| 3987 | |
| 3988 | offset = decode_name(tree, pinfo, tvb, offset); |
| 3989 | |
| 3990 | offset = decode_attr_name(tree, pinfo, tvb, offset, "Attribute: %s"); |
| 3991 | |
| 3992 | return offset; |
| 3993 | } |
| 3994 | |
| 3995 | /* ************************** */ |
| 3996 | static int |
| 3997 | decode_acl_access_bitmap(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 3998 | { |
| 3999 | uint32_t bitmap; |
| 4000 | static int * const bitmaps[] = { |
| 4001 | &hf_afp_acl_access_bitmap_read_data, |
| 4002 | &hf_afp_acl_access_bitmap_write_data, |
| 4003 | &hf_afp_acl_access_bitmap_execute, |
| 4004 | &hf_afp_acl_access_bitmap_delete, |
| 4005 | &hf_afp_acl_access_bitmap_append_data, |
| 4006 | &hf_afp_acl_access_bitmap_delete_child, |
| 4007 | &hf_afp_acl_access_bitmap_read_attrs, |
| 4008 | &hf_afp_acl_access_bitmap_write_attrs, |
| 4009 | &hf_afp_acl_access_bitmap_read_extattrs, |
| 4010 | &hf_afp_acl_access_bitmap_write_extattrs, |
| 4011 | &hf_afp_acl_access_bitmap_read_security, |
| 4012 | &hf_afp_acl_access_bitmap_write_security, |
| 4013 | &hf_afp_acl_access_bitmap_change_owner, |
| 4014 | &hf_afp_acl_access_bitmap_synchronize, |
| 4015 | &hf_afp_acl_access_bitmap_generic_all, |
| 4016 | &hf_afp_acl_access_bitmap_generic_execute, |
| 4017 | &hf_afp_acl_access_bitmap_generic_write, |
| 4018 | &hf_afp_acl_access_bitmap_generic_read, |
| 4019 | NULL((void*)0) |
| 4020 | }; |
| 4021 | |
| 4022 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_acl_access_bitmap, |
| 4023 | ett_afp_acl_access_bitmap, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 4024 | bitmap = tvb_get_ntohl(tvb, offset); |
| 4025 | |
| 4026 | return bitmap; |
| 4027 | } |
| 4028 | |
| 4029 | /* ************************** */ |
| 4030 | static int |
| 4031 | dissect_query_afp_access(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 4032 | { |
| 4033 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 4034 | offset = decode_vol_did(tree, tvb, offset); |
| 4035 | |
| 4036 | proto_tree_add_item(tree, hf_afp_access_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 4037 | offset += 2; |
| 4038 | |
| 4039 | proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 4040 | offset += 16; |
| 4041 | |
| 4042 | decode_acl_access_bitmap(tvb, tree, offset); |
| 4043 | offset += 4; |
| 4044 | |
| 4045 | offset = decode_name(tree, pinfo, tvb, offset); |
| 4046 | |
| 4047 | return offset; |
| 4048 | } |
| 4049 | |
| 4050 | /* ************************** */ |
| 4051 | static int |
| 4052 | dissect_query_afp_with_did(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 4053 | { |
| 4054 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 4055 | offset = decode_vol_did(tree, tvb, offset); |
| 4056 | |
| 4057 | proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4058 | offset += 4; |
| 4059 | |
| 4060 | return offset; |
| 4061 | } |
| 4062 | |
| 4063 | /* ************************** */ |
| 4064 | |
| 4065 | #define SQ_TYPE_NULL0x0000 0x0000 |
| 4066 | #define SQ_TYPE_COMPLEX0x0200 0x0200 |
| 4067 | #define SQ_TYPE_INT640x8400 0x8400 |
| 4068 | #define SQ_TYPE_BOOL0x0100 0x0100 |
| 4069 | #define SQ_TYPE_FLOAT0x8500 0x8500 |
| 4070 | #define SQ_TYPE_DATA0x0700 0x0700 |
| 4071 | #define SQ_TYPE_CNIDS0x8700 0x8700 |
| 4072 | #define SQ_TYPE_UUID0x0e00 0x0e00 |
| 4073 | #define SQ_TYPE_DATE0x8600 0x8600 |
| 4074 | |
| 4075 | #define SQ_CPX_TYPE_ARRAY0x0a00 0x0a00 |
| 4076 | #define SQ_CPX_TYPE_STRING0x0c00 0x0c00 |
| 4077 | #define SQ_CPX_TYPE_UTF16_STRING0x1c00 0x1c00 |
| 4078 | #define SQ_CPX_TYPE_DICT0x0d00 0x0d00 |
| 4079 | #define SQ_CPX_TYPE_CNIDS0x1a00 0x1a00 |
| 4080 | #define SQ_CPX_TYPE_FILEMETA0x1b00 0x1b00 |
| 4081 | |
| 4082 | #define SUBQ_SAFETY_LIM20 20 |
| 4083 | |
| 4084 | static int |
| 4085 | spotlight_int64(tvbuff_t *tvb, proto_tree *tree, int offset, unsigned encoding) |
| 4086 | { |
| 4087 | unsigned count, i; |
| 4088 | uint64_t query_data64; |
| 4089 | |
| 4090 | query_data64 = tvb_get_uint64(tvb, offset, encoding); |
| 4091 | count = (unsigned)(query_data64 >> 32); |
| 4092 | offset += 8; |
| 4093 | |
| 4094 | for (i = 0; i < count; i++) { |
| 4095 | proto_tree_add_item(tree, hf_afp_int64, tvb, offset, 8, encoding); |
| 4096 | offset += 8; |
| 4097 | } |
| 4098 | |
| 4099 | return count; |
| 4100 | } |
| 4101 | |
| 4102 | static int |
| 4103 | spotlight_date(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, unsigned encoding) |
| 4104 | { |
| 4105 | unsigned count, i; |
| 4106 | uint64_t query_data64; |
| 4107 | nstime_t t; |
| 4108 | |
| 4109 | query_data64 = tvb_get_uint64(tvb, offset, encoding); |
| 4110 | count = (unsigned)(query_data64 >> 32); |
| 4111 | offset += 8; |
| 4112 | |
| 4113 | if (count > SUBQ_SAFETY_LIM20) { |
| 4114 | expert_add_info_format(pinfo, tree, &ei_afp_subquery_count_over_safety_limit, |
| 4115 | "Subquery count (%d) > safety limit (%d)", count, SUBQ_SAFETY_LIM20); |
| 4116 | return -1; |
| 4117 | } |
| 4118 | |
| 4119 | for (i = 0; i < count; i++) { |
| 4120 | query_data64 = tvb_get_uint64(tvb, offset, encoding) >> 24; |
| 4121 | t.secs = (time_t)(query_data64 - SPOTLIGHT_TIME_DELTA280878921600UL); |
| 4122 | t.nsecs = 0; |
| 4123 | proto_tree_add_time(tree, hf_afp_spotlight_date, tvb, offset, 8, &t); |
| 4124 | offset += 8; |
| 4125 | } |
| 4126 | |
| 4127 | return count; |
| 4128 | } |
| 4129 | |
| 4130 | static int |
| 4131 | spotlight_uuid(tvbuff_t *tvb, proto_tree *tree, int offset, unsigned encoding) |
| 4132 | { |
| 4133 | unsigned count, i; |
| 4134 | uint64_t query_data64; |
| 4135 | |
| 4136 | query_data64 = tvb_get_uint64(tvb, offset, encoding); |
| 4137 | count = (unsigned)(query_data64 >> 32); |
| 4138 | offset += 8; |
| 4139 | |
| 4140 | for (i = 0; i < count; i++) { |
| 4141 | proto_tree_add_item(tree, hf_afp_spotlight_uuid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 4142 | offset += 16; |
| 4143 | } |
| 4144 | |
| 4145 | return count; |
| 4146 | } |
| 4147 | |
| 4148 | static int |
| 4149 | spotlight_float(tvbuff_t *tvb, proto_tree *tree, int offset, unsigned encoding) |
| 4150 | { |
| 4151 | unsigned count, i; |
| 4152 | uint64_t query_data64; |
| 4153 | |
| 4154 | query_data64 = tvb_get_uint64(tvb, offset, encoding); |
| 4155 | count = (unsigned)(query_data64 >> 32); |
| 4156 | offset += 8; |
| 4157 | |
| 4158 | for (i = 0; i < count; i++) { |
| 4159 | proto_tree_add_item(tree, hf_afp_float, tvb, offset, 8, encoding); |
| 4160 | offset += 8; |
| 4161 | } |
| 4162 | |
| 4163 | return count; |
| 4164 | } |
| 4165 | |
| 4166 | static int |
| 4167 | spotlight_CNID_array(tvbuff_t *tvb, proto_tree *tree, int offset, unsigned encoding) |
| 4168 | { |
| 4169 | unsigned count; |
| 4170 | uint64_t query_data64; |
| 4171 | uint16_t unknown1; |
| 4172 | uint32_t unknown2; |
| 4173 | |
| 4174 | query_data64 = tvb_get_uint64(tvb, offset, encoding); |
| 4175 | count = (unsigned)(query_data64 & 0xffff); |
| 4176 | unknown1 = (query_data64 & 0xffff0000) >> 16; |
| 4177 | unknown2 = (uint32_t)(query_data64 >> 32); |
| 4178 | |
| 4179 | proto_tree_add_uint(tree, hf_afp_unknown16, tvb, offset + 2, 2, unknown1); |
| 4180 | proto_tree_add_uint(tree, hf_afp_unknown32, tvb, offset + 4, 4, unknown2); |
| 4181 | offset += 8; |
| 4182 | |
| 4183 | |
| 4184 | while (count --) { |
| 4185 | proto_tree_add_item(tree, hf_afp_cnid, tvb, offset, 8, encoding); |
| 4186 | offset += 8; |
| 4187 | } |
| 4188 | |
| 4189 | return 0; |
| 4190 | } |
| 4191 | |
| 4192 | static const val64_string qtype_string_values[] = { |
| 4193 | {SQ_TYPE_NULL0x0000, "null" }, |
| 4194 | {SQ_TYPE_COMPLEX0x0200, "complex"}, |
| 4195 | {SQ_TYPE_INT640x8400, "int64" }, |
| 4196 | {SQ_TYPE_BOOL0x0100, "bool"}, |
| 4197 | {SQ_TYPE_FLOAT0x8500, "float" }, |
| 4198 | {SQ_TYPE_DATA0x0700, "data"}, |
| 4199 | {SQ_TYPE_CNIDS0x8700, "CNIDs" }, |
| 4200 | {0, NULL((void*)0)} |
| 4201 | }; |
| 4202 | |
| 4203 | static const val64_string cpx_qtype_string_values[] = { |
| 4204 | {SQ_CPX_TYPE_ARRAY0x0a00, "array" }, |
| 4205 | {SQ_CPX_TYPE_STRING0x0c00, "string"}, |
| 4206 | {SQ_CPX_TYPE_UTF16_STRING0x1c00, "utf-16 string" }, |
| 4207 | {SQ_CPX_TYPE_DICT0x0d00, "dictionary"}, |
| 4208 | {SQ_CPX_TYPE_CNIDS0x1a00, "CNIDs" }, |
| 4209 | {SQ_CPX_TYPE_FILEMETA0x1b00, "FileMeta"}, |
| 4210 | {0, NULL((void*)0)} |
| 4211 | }; |
| 4212 | |
| 4213 | static int |
| 4214 | // NOLINTNEXTLINE(misc-no-recursion) |
| 4215 | spotlight_dissect_query_loop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, |
| 4216 | uint64_t cpx_query_type, int count, int toc_offset, unsigned encoding) |
| 4217 | { |
| 4218 | int i, j; |
| 4219 | int subquery_count; |
| 4220 | int toc_index; |
| 4221 | uint64_t query_data64; |
| 4222 | int query_length; |
| 4223 | uint64_t query_type; |
| 4224 | uint64_t complex_query_type; |
| 4225 | tvbuff_t *spotlight_tvb; |
| 4226 | char *str_tmp; |
| 4227 | |
| 4228 | proto_item *item_query; |
| 4229 | proto_tree *sub_tree; |
| 4230 | |
| 4231 | /* |
| 4232 | * This loops through a possibly nested query data structure. |
| 4233 | * The outermost one is always without count and called from |
| 4234 | * dissect_spotlight() with count = prefs.gui_max_tree_depth |
| 4235 | * thus the while (...) loop terminates if (offset >= toc_offset). |
| 4236 | * If nested structures are found, these will have an encoded element |
| 4237 | * count which is used in a recursive call to |
| 4238 | * spotlight_dissect_query_loop as count parameter, thus in this case |
| 4239 | * the while (...) loop will terminate when count reaches 0. |
| 4240 | */ |
| 4241 | while ((offset < (toc_offset - 8)) && (count > 0)) { |
| 4242 | query_data64 = tvb_get_uint64(tvb, offset, encoding); |
| 4243 | query_length = ((int)query_data64 & 0xffff) * 8; |
| 4244 | if (query_length == 0) { |
| 4245 | /* XXX - report this as an error */ |
| 4246 | break; |
| 4247 | } |
| 4248 | query_type = (query_data64 & 0xffff0000) >> 16; |
| 4249 | |
| 4250 | switch (query_type) { |
| 4251 | case SQ_TYPE_COMPLEX0x0200: |
| 4252 | toc_index = (int)((query_data64 >> 32) - 1); |
| 4253 | query_data64 = tvb_get_uint64(tvb, toc_offset + toc_index * 8, encoding); |
| 4254 | complex_query_type = (query_data64 & 0xffff0000) >> 16; |
| 4255 | |
| 4256 | switch (complex_query_type) { |
| 4257 | case SQ_CPX_TYPE_ARRAY0x0a00: |
| 4258 | case SQ_CPX_TYPE_DICT0x0d00: |
| 4259 | subquery_count = (int)(query_data64 >> 32); |
| 4260 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, query_length, |
| 4261 | ett_afp_spotlight_query_line, NULL((void*)0), |
| 4262 | "%s, toc index: %u, children: %u", |
| 4263 | val64_to_str_const(complex_query_type, cpx_qtype_string_values, "Unknown"), |
| 4264 | toc_index + 1, |
| 4265 | subquery_count); |
| 4266 | break; |
| 4267 | case SQ_CPX_TYPE_STRING0x0c00: |
| 4268 | subquery_count = 1; |
| 4269 | query_data64 = tvb_get_uint64(tvb, offset + 8, encoding); |
| 4270 | query_length = ((int)query_data64 & 0xffff) * 8; |
| 4271 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, query_length + 8, |
| 4272 | ett_afp_spotlight_query_line, NULL((void*)0), |
| 4273 | "%s, toc index: %u, string: '%s'", |
| 4274 | val64_to_str_const(complex_query_type, cpx_qtype_string_values, "Unknown"), |
| 4275 | toc_index + 1, |
| 4276 | tvb_get_string_enc(pinfo->pool, tvb, offset + 16, query_length - 8, ENC_UTF_80x00000002|ENC_NA0x00000000)); |
| 4277 | break; |
| 4278 | case SQ_CPX_TYPE_UTF16_STRING0x1c00: |
| 4279 | /* |
| 4280 | * This is an UTF-16 string. |
| 4281 | * Dissections show the typical byte order mark 0xFFFE or 0xFEFF, respectively. |
| 4282 | * However the existence of such a mark can not be assumed. |
| 4283 | * If the mark is missing, big endian encoding is assumed. |
| 4284 | * XXX - assume the encoding given by "encoding"? |
| 4285 | */ |
| 4286 | |
| 4287 | subquery_count = 1; |
| 4288 | query_data64 = tvb_get_uint64(tvb, offset + 8, encoding); |
| 4289 | query_length = ((int)query_data64 & 0xffff) * 8; |
| 4290 | |
| 4291 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, query_length + 8, |
| 4292 | ett_afp_spotlight_query_line, NULL((void*)0), |
| 4293 | "%s, toc index: %u, utf-16 string: '%s'", |
| 4294 | val64_to_str_const(complex_query_type, cpx_qtype_string_values, "Unknown"), |
| 4295 | toc_index + 1, |
| 4296 | tvb_get_string_enc(pinfo->pool, tvb, offset + 16, |
| 4297 | query_length - 8, ENC_UTF_160x00000004|ENC_BIG_ENDIAN0x00000000|ENC_BOM0x20000000)); |
| 4298 | break; |
| 4299 | default: |
| 4300 | subquery_count = 1; |
| 4301 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, query_length, |
| 4302 | ett_afp_spotlight_query_line, NULL((void*)0), |
| 4303 | "type: %s (%s), toc index: %u, children: %u", |
| 4304 | val64_to_str_const(query_type, qtype_string_values, "Unknown"), |
| 4305 | val64_to_str_const(complex_query_type, cpx_qtype_string_values, "Unknown"), |
| 4306 | toc_index + 1, |
| 4307 | subquery_count); |
| 4308 | break; |
| 4309 | } |
| 4310 | |
| 4311 | offset += 8; |
| 4312 | increment_dissection_depth(pinfo); |
| 4313 | offset = spotlight_dissect_query_loop(tvb, pinfo, sub_tree, offset, complex_query_type, subquery_count, toc_offset, encoding); |
| 4314 | decrement_dissection_depth(pinfo); |
| 4315 | count--; |
| 4316 | break; |
| 4317 | case SQ_TYPE_NULL0x0000: |
| 4318 | subquery_count = (int)(query_data64 >> 32); |
| 4319 | if (subquery_count > count) { |
| 4320 | item_query = proto_tree_add_item(tree, hf_afp_null, tvb, offset, query_length, ENC_NA0x00000000); |
| 4321 | expert_add_info_format(pinfo, item_query, &ei_afp_subquery_count_over_query_count, |
| 4322 | "Subquery count (%d) > query count (%d)", subquery_count, count); |
| 4323 | count = 0; |
| 4324 | } else if (subquery_count > 20) { |
| 4325 | item_query = proto_tree_add_item(tree, hf_afp_null, tvb, offset, query_length, ENC_NA0x00000000); |
| 4326 | expert_add_info_format(pinfo, item_query, &ei_afp_abnormal_num_subqueries, |
| 4327 | "Abnormal number of subqueries (%d)", subquery_count); |
| 4328 | count -= subquery_count; |
| 4329 | } else { |
| 4330 | for (i = 0; i < subquery_count; i++, count--) |
| 4331 | proto_tree_add_item(tree, hf_afp_null, tvb, offset, query_length, encoding); |
| 4332 | } |
| 4333 | offset += query_length; |
| 4334 | break; |
| 4335 | case SQ_TYPE_BOOL0x0100: |
| 4336 | proto_tree_add_uint64_format_value(tree, hf_afp_bool, tvb, offset, query_length, (query_data64 >> 32), "%s", (query_data64 >> 32) ? "true" : "false"); |
| 4337 | count--; |
| 4338 | offset += query_length; |
| 4339 | break; |
| 4340 | case SQ_TYPE_INT640x8400: |
| 4341 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_afp_spotlight_query_line, NULL((void*)0), "int64"); |
| 4342 | j = spotlight_int64(tvb, sub_tree, offset, encoding); |
| 4343 | count -= j; |
| 4344 | offset += query_length; |
| 4345 | break; |
| 4346 | case SQ_TYPE_UUID0x0e00: |
| 4347 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_afp_spotlight_query_line, NULL((void*)0), "UUID"); |
| 4348 | j = spotlight_uuid(tvb, sub_tree, offset, encoding); |
| 4349 | count -= j; |
| 4350 | offset += query_length; |
| 4351 | break; |
| 4352 | case SQ_TYPE_FLOAT0x8500: |
| 4353 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_afp_spotlight_query_line, NULL((void*)0), "float"); |
| 4354 | j = spotlight_float(tvb, sub_tree, offset, encoding); |
| 4355 | count -= j; |
| 4356 | offset += query_length; |
| 4357 | break; |
| 4358 | case SQ_TYPE_DATA0x0700: |
| 4359 | switch (cpx_query_type) { |
| 4360 | case SQ_CPX_TYPE_STRING0x0c00: |
| 4361 | str_tmp = (char*)tvb_get_string_enc(pinfo->pool, tvb, offset + 8, query_length - 8, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 4362 | proto_tree_add_string(tree, hf_afp_string, tvb, offset, query_length, str_tmp); |
| 4363 | break; |
| 4364 | case SQ_CPX_TYPE_UTF16_STRING0x1c00: { |
| 4365 | /* description see above */ |
| 4366 | str_tmp = (char*)tvb_get_string_enc(pinfo->pool, tvb, offset + 8, query_length - 8, ENC_UTF_160x00000004|ENC_BIG_ENDIAN0x00000000|ENC_BOM0x20000000); |
| 4367 | proto_tree_add_string(tree, hf_afp_utf_16_string, tvb, offset, query_length, str_tmp); |
| 4368 | break; |
| 4369 | } |
| 4370 | case SQ_CPX_TYPE_FILEMETA0x1b00: |
| 4371 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, query_length, |
| 4372 | ett_afp_spotlight_query_line, &item_query, "filemeta"); |
| 4373 | if (query_length <= 8) { |
| 4374 | proto_item_append_text(item_query, " (empty)"); |
| 4375 | } else { |
| 4376 | spotlight_tvb = tvb_new_subset_length(tvb, offset+8, query_length); |
| 4377 | call_dissector(spotlight_handle, spotlight_tvb, pinfo, sub_tree); |
| 4378 | } |
| 4379 | break; |
| 4380 | } |
| 4381 | count--; |
| 4382 | offset += query_length; |
| 4383 | break; |
| 4384 | case SQ_TYPE_CNIDS0x8700: |
| 4385 | sub_tree = proto_tree_add_subtree(tree, tvb, offset, query_length, |
| 4386 | ett_afp_spotlight_query_line, &item_query, "CNID Array"); |
| 4387 | if (query_length <= 8) { |
| 4388 | proto_item_append_text(item_query, " (empty)"); |
| 4389 | } else { |
| 4390 | spotlight_CNID_array(tvb, sub_tree, offset + 8, encoding); |
| 4391 | } |
| 4392 | count--; |
| 4393 | offset += query_length; |
| 4394 | break; |
| 4395 | case SQ_TYPE_DATE0x8600: |
| 4396 | if ((j = spotlight_date(tvb, pinfo, tree, offset, encoding)) == -1) |
| 4397 | return offset; |
| 4398 | count -= j; |
| 4399 | offset += query_length; |
| 4400 | break; |
| 4401 | default: |
| 4402 | proto_tree_add_string(tree, hf_afp_query_type, tvb, offset, query_length, val64_to_str_const(query_type, qtype_string_values, "Unknown")); |
| 4403 | count--; |
| 4404 | offset += query_length; |
| 4405 | break; |
| 4406 | } |
| 4407 | } |
| 4408 | |
| 4409 | return offset; |
| 4410 | } |
| 4411 | |
| 4412 | static const val64_string endian_vals[] = { |
| 4413 | {0, "Little Endian" }, |
| 4414 | {1, "Big Endian" }, |
| 4415 | {0, NULL((void*)0) } }; |
| 4416 | |
| 4417 | static int |
| 4418 | dissect_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U___attribute__((unused))) |
| 4419 | { |
| 4420 | unsigned encoding; |
| 4421 | int i; |
| 4422 | unsigned offset = 0; |
| 4423 | uint64_t toc_offset; |
| 4424 | uint64_t querylen; |
| 4425 | int toc_entries; |
| 4426 | uint64_t toc_entry; |
| 4427 | |
| 4428 | proto_tree *sub_tree_queries; |
| 4429 | proto_tree *sub_tree_toc; |
| 4430 | proto_item *ti; |
| 4431 | |
| 4432 | if (strncmp((char*)tvb_get_string_enc(pinfo->pool, tvb, offset, 8, ENC_UTF_80x00000002|ENC_NA0x00000000), "md031234", 8) == 0) |
| 4433 | encoding = ENC_BIG_ENDIAN0x00000000; |
| 4434 | else |
| 4435 | encoding = ENC_LITTLE_ENDIAN0x80000000; |
| 4436 | proto_tree_add_uint64(tree, hf_afp_endianness, tvb, offset, 8, (encoding == ENC_BIG_ENDIAN0x00000000)); |
| 4437 | offset += 8; |
| 4438 | |
| 4439 | toc_offset = (tvb_get_uint64(tvb, offset, encoding) >> 32) * 8; |
| 4440 | if (toc_offset < 8) { |
| 4441 | ti = proto_tree_add_uint64(tree, hf_afp_toc_offset, tvb, offset, 8, toc_offset); |
| 4442 | expert_add_info_format(pinfo, ti, &ei_afp_toc_offset, "%" PRIu64"l" "u" " < 8 (bogus)", toc_offset); |
| 4443 | return tvb_captured_length(tvb); |
| 4444 | } |
| 4445 | toc_offset -= 8; |
| 4446 | if (offset + toc_offset + 8 > INT_MAX2147483647) { |
| 4447 | ti = proto_tree_add_uint64(tree, hf_afp_toc_offset, tvb, offset, 8, toc_offset); |
| 4448 | expert_add_info_format(pinfo, ti, &ei_afp_toc_offset, "%" PRIu64"l" "u" " > %u (bogus)", toc_offset, INT_MAX2147483647 - 8 - offset); |
| 4449 | return tvb_captured_length(tvb); |
| 4450 | } |
| 4451 | querylen = (tvb_get_uint64(tvb, offset, encoding) & 0xffffffff) * 8; |
| 4452 | if (querylen < 8) { |
| 4453 | ti = proto_tree_add_uint64(tree, hf_afp_toc_offset, tvb, offset, 8, toc_offset); |
| 4454 | expert_add_info_format(pinfo, ti, &ei_afp_toc_offset, "%" PRIu64"l" "u" " Bytes, Query length: %" PRIu64"l" "u" " < 8 (bogus)", |
| 4455 | toc_offset, querylen); |
| 4456 | return tvb_captured_length(tvb); |
| 4457 | } |
| 4458 | querylen -= 8; |
| 4459 | if (querylen > INT_MAX2147483647) { |
| 4460 | ti = proto_tree_add_uint64(tree, hf_afp_toc_offset, tvb, offset, 8, toc_offset); |
| 4461 | expert_add_info_format(pinfo, ti, &ei_afp_toc_offset, "%" PRIu64"l" "u" " Bytes, Query length: %" PRIu64"l" "u" " > %u (bogus)", |
| 4462 | toc_offset, querylen, INT_MAX2147483647); |
| 4463 | return tvb_captured_length(tvb); |
| 4464 | } |
| 4465 | proto_tree_add_uint64(tree, hf_afp_toc_offset, tvb, offset, 8, toc_offset); |
| 4466 | proto_tree_add_uint64(tree, hf_afp_query_len, tvb, offset, 8, querylen); |
| 4467 | offset += 8; |
| 4468 | |
| 4469 | toc_entries = (int)(tvb_get_uint64(tvb, offset + (int)toc_offset, encoding) & 0xffff); |
| 4470 | |
| 4471 | sub_tree_queries = proto_tree_add_subtree(tree, tvb, offset, (int)toc_offset, |
| 4472 | ett_afp_spotlight_queries, NULL((void*)0), |
| 4473 | "Spotlight RPC data"); |
| 4474 | |
| 4475 | /* Queries */ |
| 4476 | offset = spotlight_dissect_query_loop(tvb, pinfo, sub_tree_queries, offset, SQ_CPX_TYPE_ARRAY0x0a00, prefs.gui_max_tree_depth, offset + (int)toc_offset + 8, encoding); |
| 4477 | |
| 4478 | /* ToC */ |
| 4479 | sub_tree_toc = proto_tree_add_subtree_format(tree, tvb, offset, |
| 4480 | (int)querylen - (int)toc_offset, |
| 4481 | ett_afp_spotlight_toc, &ti, |
| 4482 | "Complex types ToC (%u entries)", |
| 4483 | toc_entries); |
| 4484 | if (toc_entries < 1) { |
| 4485 | proto_item_append_text(ti, " (%u < 1 - bogus)", toc_entries); |
| 4486 | return tvb_captured_length(tvb); |
| 4487 | } |
| 4488 | proto_item_append_text(ti, " (%u entries)", toc_entries); |
| 4489 | |
| 4490 | toc_entries -= 1; |
| 4491 | proto_tree_add_uint(sub_tree_toc, hf_afp_num_toc_entries, tvb, offset, 2, toc_entries); |
| 4492 | proto_tree_add_item(sub_tree_toc, hf_afp_unknown16, tvb, offset + 2, 2, ENC_BIG_ENDIAN0x00000000); |
| 4493 | proto_tree_add_item(sub_tree_toc, hf_afp_unknown32, tvb, offset + 4, 4, ENC_BIG_ENDIAN0x00000000); |
| 4494 | |
| 4495 | offset += 8; |
| 4496 | for (i = 0; i < toc_entries; i++, offset += 8) { |
| 4497 | toc_entry = tvb_get_uint64(tvb, offset, encoding); |
| 4498 | switch((toc_entry & 0xffff0000) >> 16) |
| 4499 | { |
| 4500 | case SQ_CPX_TYPE_ARRAY0x0a00: |
| 4501 | case SQ_CPX_TYPE_DICT0x0d00: |
| 4502 | proto_tree_add_uint64_format(sub_tree_toc, hf_afp_toc_entry, tvb, offset, 8, toc_entry, |
| 4503 | "%u: count: %" PRIu64"l" "u" ", type: %s, offset: %" PRIu64"l" "u", |
| 4504 | i+1, toc_entry >> 32, val64_to_str_const((toc_entry & 0xffff0000) >> 16, cpx_qtype_string_values, "Unknown"), |
| 4505 | (toc_entry & 0xffff) * 8); |
| 4506 | break; |
| 4507 | case SQ_CPX_TYPE_STRING0x0c00: |
| 4508 | case SQ_CPX_TYPE_UTF16_STRING0x1c00: |
| 4509 | proto_tree_add_uint64_format(sub_tree_toc, hf_afp_toc_entry, tvb, offset, 8, toc_entry, |
| 4510 | "%u: pad byte count: %" PRIx64"l" "x" ", type: %s, offset: %" PRIu64"l" "u", |
| 4511 | i+1, 8 - (toc_entry >> 32), val64_to_str_const((toc_entry & 0xffff0000) >> 16, cpx_qtype_string_values, "Unknown"), |
| 4512 | (toc_entry & 0xffff) * 8); |
| 4513 | break; |
| 4514 | default: |
| 4515 | proto_tree_add_uint64_format(sub_tree_toc, hf_afp_toc_entry, tvb, offset, 8, toc_entry, |
| 4516 | "%u: unknown: 0x%08" PRIx64"l" "x" ", type: %s, offset: %" PRIu64"l" "u", |
| 4517 | i+1, toc_entry >> 32, val64_to_str_const((toc_entry & 0xffff0000) >> 16, cpx_qtype_string_values, "Unknown"), |
| 4518 | (toc_entry & 0xffff) * 8); |
| 4519 | } |
| 4520 | } |
| 4521 | |
| 4522 | return offset; |
| 4523 | } |
| 4524 | |
| 4525 | static int |
| 4526 | dissect_query_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, afp_request_val *request_val) |
| 4527 | { |
| 4528 | unsigned len; |
| 4529 | tvbuff_t *spotlight_tvb; |
| 4530 | |
| 4531 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 4532 | offset = decode_vol(tree, tvb, offset); |
| 4533 | |
| 4534 | proto_tree_add_item(tree, hf_afp_spotlight_request_flags, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4535 | offset += 4; |
| 4536 | |
| 4537 | proto_tree_add_item(tree, hf_afp_spotlight_request_command, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4538 | offset += 4; |
| 4539 | |
| 4540 | proto_tree_add_item(tree, hf_afp_spotlight_request_reserved, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4541 | offset += 4; |
| 4542 | |
| 4543 | switch (request_val->spotlight_req_command) { |
| 4544 | |
| 4545 | case SPOTLIGHT_CMD_GET_VOLPATH4: |
| 4546 | tvb_get_stringz_enc(pinfo->pool, tvb, offset, &len, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 4547 | proto_tree_add_item(tree, hf_afp_spotlight_volpath_client, tvb, offset, len, ENC_UTF_80x00000002); |
| 4548 | offset += len; |
| 4549 | break; |
| 4550 | |
| 4551 | case SPOTLIGHT_CMD_GET_VOLID2: |
| 4552 | /* empty */ |
| 4553 | break; |
| 4554 | |
| 4555 | case SPOTLIGHT_CMD_GET_THREE3: |
| 4556 | proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4557 | offset += 4; |
| 4558 | |
| 4559 | proto_tree_add_item(tree, hf_afp_spotlight_reqlen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4560 | offset += 4; |
| 4561 | |
| 4562 | spotlight_tvb = tvb_new_subset_remaining(tvb, offset); |
| 4563 | offset += call_dissector(spotlight_handle, spotlight_tvb, pinfo, tree); |
| 4564 | break; |
| 4565 | } |
| 4566 | return offset; |
| 4567 | } |
| 4568 | |
| 4569 | /* ************************** */ |
| 4570 | static uint16_t |
| 4571 | decode_acl_list_bitmap(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 4572 | { |
| 4573 | uint16_t bitmap; |
| 4574 | static int * const bitmaps[] = { |
| 4575 | &hf_afp_acl_list_bitmap_UUID, |
| 4576 | &hf_afp_acl_list_bitmap_GRPUUID, |
| 4577 | &hf_afp_acl_list_bitmap_ACL, |
| 4578 | &hf_afp_acl_list_bitmap_REMOVEACL, |
| 4579 | &hf_afp_acl_list_bitmap_Inherit, |
| 4580 | NULL((void*)0) |
| 4581 | }; |
| 4582 | |
| 4583 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_acl_list_bitmap, |
| 4584 | ett_afp_acl_list_bitmap, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 4585 | bitmap = tvb_get_ntohs(tvb, offset); |
| 4586 | return bitmap; |
| 4587 | } |
| 4588 | |
| 4589 | |
| 4590 | /* ************************** */ |
| 4591 | static uint32_t |
| 4592 | decode_ace_flags_bitmap(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 4593 | { |
| 4594 | uint32_t bitmap; |
| 4595 | |
| 4596 | static int * const bitmaps[] = { |
| 4597 | &hf_afp_ace_flags_allow, |
| 4598 | &hf_afp_ace_flags_deny, |
| 4599 | &hf_afp_ace_flags_inherited, |
| 4600 | &hf_afp_ace_flags_fileinherit, |
| 4601 | &hf_afp_ace_flags_dirinherit, |
| 4602 | &hf_afp_ace_flags_limitinherit, |
| 4603 | &hf_afp_ace_flags_onlyinherit, |
| 4604 | NULL((void*)0) |
| 4605 | }; |
| 4606 | |
| 4607 | proto_tree_add_bitmask(tree, tvb, offset, hf_afp_ace_flags, |
| 4608 | ett_afp_ace_flags, bitmaps, ENC_BIG_ENDIAN0x00000000); |
| 4609 | bitmap = tvb_get_ntohl(tvb, offset); |
| 4610 | |
| 4611 | return bitmap; |
| 4612 | } |
| 4613 | |
| 4614 | static int |
| 4615 | decode_kauth_ace(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 4616 | { |
| 4617 | /* FIXME: preliminary decoding... */ |
| 4618 | if (tree) { |
| 4619 | proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 4620 | offset += 16; |
| 4621 | |
| 4622 | decode_ace_flags_bitmap(tvb, tree, offset); |
| 4623 | offset += 4; |
| 4624 | |
| 4625 | decode_acl_access_bitmap(tvb, tree, offset); |
| 4626 | offset += 4; |
| 4627 | } |
| 4628 | else { |
| 4629 | offset += 24; |
| 4630 | } |
| 4631 | return offset; |
| 4632 | } |
| 4633 | |
| 4634 | #define AFP_MAX_ACL_ENTRIES500 500 /* Arbitrary. */ |
| 4635 | static int |
| 4636 | decode_kauth_acl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 4637 | { |
| 4638 | uint32_t num_entries, i; |
| 4639 | proto_tree *sub_tree, *ace_tree; |
| 4640 | proto_item *item; |
| 4641 | |
| 4642 | item = proto_tree_add_item_ret_uint(tree, hf_afp_acl_entrycount, |
| 4643 | tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &num_entries); |
| 4644 | sub_tree = proto_item_add_subtree(item, ett_afp_ace_entries); |
| 4645 | offset += 4; |
| 4646 | |
| 4647 | proto_tree_add_item(tree, hf_afp_acl_flags, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4648 | offset += 4; |
| 4649 | |
| 4650 | if (num_entries > AFP_MAX_ACL_ENTRIES500) { |
| 4651 | expert_add_info_format(pinfo, item, &ei_afp_too_many_acl_entries, |
| 4652 | "Too many ACL entries (%u). Stopping dissection.", |
| 4653 | num_entries); |
| 4654 | return offset; |
| 4655 | } |
| 4656 | |
| 4657 | for (i = 0; i < num_entries; i++) { |
| 4658 | ace_tree = proto_tree_add_subtree_format(sub_tree, tvb, offset, 24, ett_afp_ace_entry, NULL((void*)0), "ACE: %u", i); |
| 4659 | offset = decode_kauth_ace(tvb, ace_tree, offset); |
| 4660 | } |
| 4661 | |
| 4662 | return offset; |
| 4663 | } |
| 4664 | |
| 4665 | static int |
| 4666 | decode_uuid_acl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t bitmap) |
| 4667 | { |
| 4668 | if ((offset & 1)) |
| 4669 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 4670 | |
| 4671 | if ((bitmap & kFileSec_UUID(1U << 0))) { |
| 4672 | proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 4673 | offset += 16; |
| 4674 | } |
| 4675 | |
| 4676 | if ((bitmap & kFileSec_GRPUUID(1U << 1))) { |
| 4677 | proto_tree_add_item(tree, hf_afp_GRPUUID, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 4678 | offset += 16; |
| 4679 | } |
| 4680 | |
| 4681 | if ((bitmap & kFileSec_ACL(1U << 2))) { |
| 4682 | offset = decode_kauth_acl(tvb, pinfo, tree, offset); |
| 4683 | } |
| 4684 | |
| 4685 | return offset; |
| 4686 | } |
| 4687 | |
| 4688 | /* ************************** */ |
| 4689 | static int |
| 4690 | dissect_query_afp_set_acl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 4691 | { |
| 4692 | uint16_t bitmap; |
| 4693 | |
| 4694 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 4695 | offset = decode_vol_did(tree, tvb, offset); |
| 4696 | |
| 4697 | bitmap = decode_acl_list_bitmap(tvb, tree, offset); |
| 4698 | offset += 2; |
| 4699 | |
| 4700 | offset = decode_name(tree, pinfo, tvb, offset); |
| 4701 | |
| 4702 | offset = decode_uuid_acl(tvb, pinfo, tree, offset, bitmap); |
| 4703 | |
| 4704 | return offset; |
| 4705 | } |
| 4706 | |
| 4707 | /* ************************** */ |
| 4708 | static int |
| 4709 | dissect_query_afp_get_acl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 4710 | { |
| 4711 | PAD(1){ proto_tree_add_item(tree, hf_afp_pad, tvb, offset, 1, 0x00000000 ); offset += 1; }; |
| 4712 | offset = decode_vol_did(tree, tvb, offset); |
| 4713 | |
| 4714 | decode_acl_list_bitmap(tvb, tree, offset); |
| 4715 | offset += 2; |
| 4716 | |
| 4717 | proto_tree_add_item(tree, hf_afp_max_reply_size32, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4718 | offset += 4; |
| 4719 | |
| 4720 | offset = decode_name(tree, pinfo, tvb, offset); |
| 4721 | |
| 4722 | return offset; |
| 4723 | } |
| 4724 | |
| 4725 | /* -------------------------- */ |
| 4726 | static int |
| 4727 | dissect_reply_afp_get_acl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 4728 | { |
| 4729 | uint16_t bitmap; |
| 4730 | |
| 4731 | bitmap = decode_acl_list_bitmap(tvb, tree, offset); |
| 4732 | offset += 2; |
| 4733 | |
| 4734 | offset = decode_uuid_acl(tvb, pinfo, tree, offset, bitmap); |
| 4735 | |
| 4736 | return offset; |
| 4737 | } |
| 4738 | |
| 4739 | /* ************************** */ |
| 4740 | static int |
| 4741 | dissect_reply_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, afp_request_val *request_val) |
| 4742 | { |
| 4743 | unsigned len; |
| 4744 | tvbuff_t *spotlight_tvb; |
| 4745 | |
| 4746 | switch (request_val->spotlight_req_command) { |
| 4747 | |
| 4748 | case SPOTLIGHT_CMD_GET_VOLPATH4: |
| 4749 | proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4750 | offset += 4; |
| 4751 | |
| 4752 | proto_tree_add_item(tree, hf_afp_spotlight_reply_reserved, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4753 | offset += 4; |
| 4754 | |
| 4755 | tvb_get_stringz_enc(pinfo->pool, tvb, offset, &len, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 4756 | proto_tree_add_item(tree, hf_afp_spotlight_volpath_server, tvb, offset, len, ENC_UTF_80x00000002); |
| 4757 | offset += len; |
| 4758 | break; |
| 4759 | |
| 4760 | case SPOTLIGHT_CMD_GET_VOLID2: |
| 4761 | proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4762 | offset += 4; |
| 4763 | break; |
| 4764 | |
| 4765 | case SPOTLIGHT_CMD_GET_THREE3: |
| 4766 | proto_tree_add_item(tree, hf_afp_spotlight_returncode, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4767 | offset += 4; |
| 4768 | |
| 4769 | spotlight_tvb = tvb_new_subset_remaining(tvb, offset); |
| 4770 | offset += call_dissector(spotlight_handle, spotlight_tvb, pinfo, tree); |
| 4771 | break; |
| 4772 | } |
| 4773 | return offset; |
| 4774 | } |
| 4775 | |
| 4776 | /* ----------------------------- |
| 4777 | from netatalk/etc/afpd/status.c |
| 4778 | */ |
| 4779 | |
| 4780 | /* server flags */ |
| 4781 | #define AFPSRVRINFO_COPY(1<<0) (1<<0) /* supports copyfile */ |
| 4782 | #define AFPSRVRINFO_PASSWD(1<<1) (1<<1) /* supports change password */ |
| 4783 | #define AFPSRVRINFO_NOSAVEPASSWD(1<<2) (1<<2) /* don't allow save password */ |
| 4784 | #define AFPSRVRINFO_SRVMSGS(1<<3) (1<<3) /* supports server messages */ |
| 4785 | #define AFPSRVRINFO_SRVSIGNATURE(1<<4) (1<<4) /* supports server signature */ |
| 4786 | #define AFPSRVRINFO_TCPIP(1<<5) (1<<5) /* supports tcpip */ |
| 4787 | #define AFPSRVRINFO_SRVNOTIFY(1<<6) (1<<6) /* supports server notifications */ |
| 4788 | #define AFPSRVRINFO_SRVRECONNECT(1<<7) (1<<7) /* supports reconnect */ |
| 4789 | #define AFPSRVRINFO_SRVDIRECTORY(1<<8) (1<<8) /* supports directory services */ |
| 4790 | #define AFPSRVRINFO_SRVUTF8(1<<9) (1<<9) /* supports UTF8 names AFP 3.1 */ |
| 4791 | #define AFPSRVRINFO_UUID(1<<10) (1<<10) /* supports UUIDs AFP 3.2 */ |
| 4792 | #define AFPSRVRINFO_EXT_SLEEP(1<<11) (1<<11) /* supports extended sleep, AFP 3.3 */ |
| 4793 | #define AFPSRVRINFO_FASTBOZO(1<<15) (1<<15) /* fast copying */ |
| 4794 | |
| 4795 | #define AFPSTATUS_MACHOFF0 0 |
| 4796 | #define AFPSTATUS_VERSOFF2 2 |
| 4797 | #define AFPSTATUS_UAMSOFF4 4 |
| 4798 | #define AFPSTATUS_ICONOFF6 6 |
| 4799 | #define AFPSTATUS_FLAGOFF8 8 |
| 4800 | #define AFPSTATUS_PRELEN10 10 |
| 4801 | #define AFPSTATUS_POSTLEN4 4 |
| 4802 | #define AFPSTATUS_LEN(10 + 4) (AFPSTATUS_PRELEN10 + AFPSTATUS_POSTLEN4) |
| 4803 | |
| 4804 | #define INET6_ADDRLEN16 16 |
| 4805 | |
| 4806 | static int |
| 4807 | dissect_afp_server_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U___attribute__((unused))) |
| 4808 | { |
| 4809 | int offset = 0; |
| 4810 | proto_tree *sub_tree; |
| 4811 | |
| 4812 | uint16_t flag; |
| 4813 | uint8_t server_name_len; |
| 4814 | uint16_t sign_ofs = 0; |
| 4815 | uint16_t adr_ofs = 0; |
| 4816 | uint16_t dir_ofs = 0; |
| 4817 | uint16_t utf_ofs = 0; |
| 4818 | int variable_data_offset; |
| 4819 | uint8_t nbe; |
| 4820 | unsigned len; |
| 4821 | unsigned i; |
| 4822 | |
| 4823 | static int * const flags[] = { |
| 4824 | &hf_afp_server_flag_copyfile, |
| 4825 | &hf_afp_server_flag_passwd, |
| 4826 | &hf_afp_server_flag_no_save_passwd, |
| 4827 | &hf_afp_server_flag_srv_msg, |
| 4828 | &hf_afp_server_flag_srv_sig, |
| 4829 | &hf_afp_server_flag_tcpip, |
| 4830 | &hf_afp_server_flag_notify, |
| 4831 | &hf_afp_server_flag_reconnect, |
| 4832 | &hf_afp_server_flag_directory, |
| 4833 | &hf_afp_server_flag_utf8_name, |
| 4834 | &hf_afp_server_flag_uuid, |
| 4835 | &hf_afp_server_flag_ext_sleep, |
| 4836 | &hf_afp_server_flag_fast_copy, |
| 4837 | NULL((void*)0) |
| 4838 | }; |
| 4839 | |
| 4840 | tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_afp_status, NULL((void*)0), "Get Status"); |
| 4841 | |
| 4842 | proto_tree_add_item(tree, hf_afp_machine_offset, tvb, AFPSTATUS_MACHOFF0, 2, ENC_BIG_ENDIAN0x00000000); |
| 4843 | |
| 4844 | proto_tree_add_item(tree, hf_afp_version_offset, tvb, AFPSTATUS_VERSOFF2, 2, ENC_BIG_ENDIAN0x00000000); |
| 4845 | |
| 4846 | proto_tree_add_item(tree, hf_afp_uams_offset, tvb, AFPSTATUS_UAMSOFF4, 2, ENC_BIG_ENDIAN0x00000000); |
| 4847 | |
| 4848 | proto_tree_add_item(tree, hf_afp_icon_offset, tvb, AFPSTATUS_ICONOFF6, 2, ENC_BIG_ENDIAN0x00000000); |
| 4849 | |
| 4850 | flag = tvb_get_ntohs(tvb, AFPSTATUS_FLAGOFF8); |
| 4851 | |
| 4852 | proto_tree_add_bitmask(tree, tvb, AFPSTATUS_FLAGOFF8, hf_afp_server_flag, |
| 4853 | ett_afp_status_server_flag, flags, ENC_BIG_ENDIAN0x00000000); |
| 4854 | |
| 4855 | offset = AFPSTATUS_PRELEN10; |
| 4856 | server_name_len = tvb_get_uint8(tvb, offset); |
| 4857 | proto_tree_add_item(tree, hf_afp_server_name, tvb, offset, 1, ENC_ASCII0x00000000|ENC_BIG_ENDIAN0x00000000); |
| 4858 | offset += 1 + server_name_len; /* 1 for the length byte */ |
| 4859 | |
| 4860 | if ((flag & AFPSRVRINFO_SRVSIGNATURE(1<<4))) { |
| 4861 | if ((offset & 1)) |
| 4862 | offset++; |
| 4863 | sign_ofs = tvb_get_ntohs(tvb, offset); |
| 4864 | proto_tree_add_item(tree, hf_afp_signature_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 4865 | offset += 2; |
| 4866 | } |
| 4867 | |
| 4868 | if ((flag & AFPSRVRINFO_TCPIP(1<<5))) { |
| 4869 | if ((offset & 1)) |
| 4870 | offset++; |
| 4871 | adr_ofs = tvb_get_ntohs(tvb, offset); |
| 4872 | proto_tree_add_item(tree, hf_afp_network_address_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 4873 | offset += 2; |
| 4874 | } |
| 4875 | |
| 4876 | if ((flag & AFPSRVRINFO_SRVDIRECTORY(1<<8))) { |
| 4877 | if ((offset & 1)) |
| 4878 | offset++; |
| 4879 | dir_ofs = tvb_get_ntohs(tvb, offset); |
| 4880 | proto_tree_add_item(tree, hf_afp_directory_services_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 4881 | offset += 2; |
| 4882 | } |
| 4883 | |
| 4884 | if ((flag & AFPSRVRINFO_SRVUTF8(1<<9))) { |
| 4885 | if ((offset & 1)) |
| 4886 | offset++; |
| 4887 | utf_ofs = tvb_get_ntohs(tvb, offset); |
| 4888 | proto_tree_add_item(tree, hf_afp_utf8_server_name_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 4889 | offset += 2; |
| 4890 | } |
| 4891 | |
| 4892 | /* |
| 4893 | * XXX - should also check for overlap between "variable data" fields; |
| 4894 | * that requires keeping all the offsets and lengths and checking |
| 4895 | * against all the ones we've dissected so far. |
| 4896 | * |
| 4897 | * XXX - should report an error if there's overlap, rather than |
| 4898 | * just ignoring the field. |
| 4899 | */ |
| 4900 | variable_data_offset = offset; |
| 4901 | offset = tvb_get_ntohs(tvb, AFPSTATUS_MACHOFF0); |
| 4902 | if (offset) { |
| 4903 | if (offset >= variable_data_offset) { |
| 4904 | proto_tree_add_item(tree, hf_afp_server_type, tvb, offset, 1, ENC_ASCII0x00000000|ENC_BIG_ENDIAN0x00000000); |
| 4905 | } |
| 4906 | } |
| 4907 | |
| 4908 | offset = tvb_get_ntohs(tvb, AFPSTATUS_VERSOFF2); |
| 4909 | if (offset) { |
| 4910 | if (offset >= variable_data_offset) { |
| 4911 | nbe = tvb_get_uint8(tvb, offset); |
| 4912 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, |
| 4913 | ett_afp_vers, NULL((void*)0), "Version list: %u", nbe); |
| 4914 | offset++; |
| 4915 | for (i = 0; i < nbe; i++) { |
| 4916 | len = tvb_get_uint8(tvb, offset); |
| 4917 | proto_tree_add_item(sub_tree, hf_afp_server_vers, tvb, offset, 1, ENC_ASCII0x00000000|ENC_BIG_ENDIAN0x00000000); |
| 4918 | offset += len + 1; |
| 4919 | } |
| 4920 | } |
| 4921 | } |
| 4922 | |
| 4923 | offset = tvb_get_ntohs(tvb, AFPSTATUS_UAMSOFF4); |
| 4924 | if (offset) { |
| 4925 | if (offset >= variable_data_offset) { |
| 4926 | nbe = tvb_get_uint8(tvb, offset); |
| 4927 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, |
| 4928 | ett_afp_uams, NULL((void*)0), "UAMS list: %u", nbe); |
| 4929 | offset++; |
| 4930 | for (i = 0; i < nbe; i++) { |
| 4931 | len = tvb_get_uint8(tvb, offset); |
| 4932 | proto_tree_add_item(sub_tree, hf_afp_server_uams, tvb, offset, 1, ENC_ASCII0x00000000|ENC_BIG_ENDIAN0x00000000); |
| 4933 | offset += len + 1; |
| 4934 | } |
| 4935 | } |
| 4936 | } |
| 4937 | |
| 4938 | offset = tvb_get_ntohs(tvb, AFPSTATUS_ICONOFF6); |
| 4939 | if (offset) { |
| 4940 | if (offset >= variable_data_offset) |
| 4941 | proto_tree_add_item(tree, hf_afp_server_icon, tvb, offset, 256, ENC_NA0x00000000); |
| 4942 | } |
| 4943 | |
| 4944 | if ((flag & AFPSRVRINFO_SRVSIGNATURE(1<<4))) { |
| 4945 | if (sign_ofs >= variable_data_offset) |
| 4946 | proto_tree_add_item(tree, hf_afp_server_signature, tvb, sign_ofs, 16, ENC_NA0x00000000); |
| 4947 | } |
| 4948 | |
| 4949 | if ((flag & AFPSRVRINFO_TCPIP(1<<5))) { |
| 4950 | if (adr_ofs >= variable_data_offset) { |
| 4951 | proto_tree *adr_tree; |
| 4952 | unsigned char *tmp; |
| 4953 | uint16_t net; |
| 4954 | uint8_t node; |
| 4955 | uint16_t port; |
| 4956 | |
| 4957 | offset = adr_ofs; |
| 4958 | nbe = tvb_get_uint8(tvb, offset); |
| 4959 | adr_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, |
| 4960 | ett_afp_server_addr, NULL((void*)0), "Address list: %d", nbe); |
| 4961 | offset++; |
| 4962 | for (i = 0; i < nbe; i++) { |
| 4963 | uint8_t type; |
| 4964 | |
| 4965 | len = tvb_get_uint8(tvb, offset); |
| 4966 | type = tvb_get_uint8(tvb, offset +1); |
| 4967 | switch (type) { |
| 4968 | case 1: /* IP */ |
| 4969 | sub_tree = proto_tree_add_subtree_format(adr_tree, tvb, offset, len, ett_afp_server_addr_line, NULL((void*)0), "IP: %s", tvb_ip_to_str(pinfo->pool, tvb, offset+2)tvb_address_to_str(pinfo->pool, tvb, AT_IPv4, offset+2)); |
| 4970 | break; |
| 4971 | case 2: /* IP + port */ |
| 4972 | port = tvb_get_ntohs(tvb, offset+6); |
| 4973 | sub_tree = proto_tree_add_subtree_format(adr_tree, tvb, offset, len, |
| 4974 | ett_afp_server_addr_line, NULL((void*)0), |
| 4975 | "IP: %s:%d", tvb_ip_to_str(pinfo->pool, tvb, offset+2)tvb_address_to_str(pinfo->pool, tvb, AT_IPv4, offset+2), port); |
| 4976 | break; |
| 4977 | case 3: /* DDP, atalk_addr_to_str want host order not network */ |
| 4978 | net = tvb_get_ntohs(tvb, offset+2); |
| 4979 | node = tvb_get_uint8(tvb, offset +4); |
| 4980 | port = tvb_get_uint8(tvb, offset +5); |
| 4981 | sub_tree = proto_tree_add_subtree_format(adr_tree, tvb, offset, len, |
| 4982 | ett_afp_server_addr_line, NULL((void*)0), |
| 4983 | "DDP: %u.%u:%u", net, node, port); |
| 4984 | break; |
| 4985 | case 4: /* DNS */ |
| 4986 | case 5: /* SSH tunnel */ |
| 4987 | /* |
| 4988 | * The AFP specification says of |
| 4989 | * the SSH tunnel type: |
| 4990 | * |
| 4991 | * IP address (four bytes) with port |
| 4992 | * number (2 bytes). If this tag is |
| 4993 | * present and the client is so |
| 4994 | * configured, the client attempts |
| 4995 | * to build a Secure Shell (SSH) |
| 4996 | * tunnel between itself and the |
| 4997 | * server and tries to connect |
| 4998 | * through it. This functionality |
| 4999 | * is deprecated. |
| 5000 | * |
| 5001 | * and, in the only place I've seen |
| 5002 | * it, it was like DNS. |
| 5003 | * |
| 5004 | * So we treat it as DNS. |
| 5005 | * |
| 5006 | * XXX - should we treat it as |
| 5007 | * IP+port if this is transported |
| 5008 | * over ASP rather DSI? The old |
| 5009 | * ASP code to dissect this |
| 5010 | * dissected it as IP+port. |
| 5011 | */ |
| 5012 | if (len > 2) { |
| 5013 | /* XXX - internationalized DNS? */ |
| 5014 | tmp = tvb_get_string_enc(pinfo->pool, tvb, offset +2, len -2, ENC_ASCII0x00000000|ENC_NA0x00000000); |
| 5015 | sub_tree = proto_tree_add_subtree_format(adr_tree, tvb, offset, len, ett_afp_server_addr_line, NULL((void*)0), "%s: %s", (type==4)?"DNS":"IP (SSH tunnel)", tmp); |
| 5016 | break; |
| 5017 | } |
| 5018 | else { |
| 5019 | sub_tree = proto_tree_add_subtree(adr_tree, tvb, offset, len, |
| 5020 | ett_afp_server_addr_line, NULL((void*)0), "Malformed DNS address"); |
| 5021 | } |
| 5022 | break; |
| 5023 | case 6: /* IP6 */ |
| 5024 | sub_tree = proto_tree_add_subtree_format(adr_tree, tvb, offset, len, ett_afp_server_addr_line, NULL((void*)0), "IPv6: %s", tvb_ip6_to_str(pinfo->pool, tvb, offset+2)tvb_address_to_str(pinfo->pool, tvb, AT_IPv6, offset+2)); |
| 5025 | break; |
| 5026 | case 7: /* IP6 + 2bytes port */ |
| 5027 | port = tvb_get_ntohs(tvb, offset+ 2+INET6_ADDRLEN16); |
| 5028 | sub_tree = proto_tree_add_subtree_format(adr_tree, tvb, offset, len, |
| 5029 | ett_afp_server_addr_line, NULL((void*)0), |
| 5030 | "IPv6: %s:%d", tvb_ip6_to_str(pinfo->pool, tvb, offset+2)tvb_address_to_str(pinfo->pool, tvb, AT_IPv6, offset+2), port); |
| 5031 | break; |
| 5032 | default: |
| 5033 | sub_tree = proto_tree_add_subtree_format(adr_tree, tvb, offset, len, ett_afp_server_addr_line, NULL((void*)0), "Unknown type: %u", type); |
| 5034 | break; |
| 5035 | } |
| 5036 | len -= 2; |
| 5037 | proto_tree_add_item(sub_tree, hf_afp_server_addr_len, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5038 | offset++; |
| 5039 | proto_tree_add_item(sub_tree, hf_afp_server_addr_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5040 | offset++; |
| 5041 | proto_tree_add_item(sub_tree, hf_afp_server_addr_value,tvb, offset, len, ENC_NA0x00000000); |
| 5042 | offset += len; |
| 5043 | } |
| 5044 | } |
| 5045 | } |
| 5046 | |
| 5047 | if ((flag & AFPSRVRINFO_SRVDIRECTORY(1<<8))) { |
| 5048 | if (dir_ofs >= variable_data_offset) { |
| 5049 | offset = dir_ofs; |
| 5050 | nbe = tvb_get_uint8(tvb, offset); |
| 5051 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, |
| 5052 | ett_afp_directory, NULL((void*)0), "Directory services list: %d", nbe); |
| 5053 | offset++; |
| 5054 | for (i = 0; i < nbe; i++) { |
| 5055 | len = tvb_get_uint8(tvb, offset); |
| 5056 | proto_tree_add_item(sub_tree, hf_afp_server_directory, tvb, offset, 1, ENC_ASCII0x00000000|ENC_BIG_ENDIAN0x00000000); |
| 5057 | offset += len + 1; |
| 5058 | } |
| 5059 | } |
| 5060 | } |
| 5061 | |
| 5062 | if ((flag & AFPSRVRINFO_SRVUTF8(1<<9))) { |
| 5063 | if (utf_ofs >= variable_data_offset) { |
| 5064 | uint16_t ulen; |
| 5065 | char *tmp; |
| 5066 | |
| 5067 | offset = utf_ofs; |
| 5068 | ulen = tvb_get_ntohs(tvb, offset); |
| 5069 | tmp = (char*)tvb_get_string_enc(pinfo->pool, tvb, offset + 2, ulen, ENC_UTF_80x00000002|ENC_NA0x00000000); |
| 5070 | sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, ulen + 2, |
| 5071 | ett_afp_utf8_name, NULL((void*)0), "UTF-8 server name: %s", tmp); |
| 5072 | proto_tree_add_uint(sub_tree, hf_afp_utf8_server_name_len, tvb, offset, 2, ulen); |
| 5073 | offset += 2; |
| 5074 | proto_tree_add_string(sub_tree, hf_afp_utf8_server_name, tvb, offset, ulen, tmp); |
| 5075 | offset += ulen; |
| 5076 | } |
| 5077 | } |
| 5078 | |
| 5079 | return offset; |
| 5080 | } |
| 5081 | |
| 5082 | /* ************************** */ |
| 5083 | static int |
| 5084 | dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) |
| 5085 | { |
| 5086 | struct atp_asp_dsi_info *atp_asp_dsi_info = (struct atp_asp_dsi_info*)data; |
| 5087 | proto_tree *afp_tree = NULL((void*)0); |
| 5088 | proto_item *ti; |
| 5089 | conversation_t *conversation; |
| 5090 | int offset = 0; |
| 5091 | afp_request_key request_key, *new_request_key; |
| 5092 | afp_request_val *request_val; |
| 5093 | uint8_t afp_command; |
| 5094 | nstime_t delta_ts; |
| 5095 | int len; |
| 5096 | |
| 5097 | /* Reject the packet if data is NULL */ |
| 5098 | if (data == NULL((void*)0)) |
| 5099 | return 0; |
| 5100 | |
| 5101 | len = tvb_reported_length(tvb); |
| 5102 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "AFP"); |
| 5103 | col_clear(pinfo->cinfo, COL_INFO); |
| 5104 | |
| 5105 | conversation = find_or_create_conversation(pinfo); |
| 5106 | |
| 5107 | request_key.conversation = conversation->conv_index; |
| 5108 | request_key.tid = atp_asp_dsi_info->tid; |
| 5109 | |
| 5110 | request_val = (afp_request_val *) wmem_map_lookup( |
| 5111 | afp_request_hash, &request_key); |
| 5112 | |
| 5113 | if (!request_val && !atp_asp_dsi_info->reply) { |
| 5114 | afp_command = tvb_get_uint8(tvb, offset); |
| 5115 | new_request_key = wmem_new(wmem_file_scope(), afp_request_key)((afp_request_key*)wmem_alloc((wmem_file_scope()), sizeof(afp_request_key ))); |
| 5116 | *new_request_key = request_key; |
| 5117 | |
| 5118 | request_val = wmem_new(wmem_file_scope(), afp_request_val)((afp_request_val*)wmem_alloc((wmem_file_scope()), sizeof(afp_request_val ))); |
| 5119 | request_val->command = afp_command; |
| 5120 | |
| 5121 | if (afp_command == AFP_SPOTLIGHTRPC76) |
| 5122 | request_val->spotlight_req_command = tvb_get_ntohl(tvb, offset + 2 + 2 + 4); |
| 5123 | else |
| 5124 | request_val->spotlight_req_command = -1; |
| 5125 | |
| 5126 | request_val->frame_req = pinfo->num; |
| 5127 | request_val->frame_res = 0; |
| 5128 | request_val->req_time=pinfo->abs_ts; |
| 5129 | |
| 5130 | wmem_map_insert(afp_request_hash, new_request_key, |
| 5131 | request_val); |
| 5132 | } |
| 5133 | |
| 5134 | if (!request_val) { /* missing request */ |
| 5135 | col_set_str(pinfo->cinfo, COL_INFO, "[Reply without query?]"); |
| 5136 | return tvb_captured_length(tvb); |
| 5137 | } |
| 5138 | |
| 5139 | afp_command = request_val->command; |
| 5140 | col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s", |
| 5141 | val_to_str_ext(pinfo->pool, afp_command, &CommandCode_vals_ext, |
| 5142 | "Unknown command (%u)"), |
| 5143 | atp_asp_dsi_info->reply ? "reply" : "request"); |
| 5144 | if (atp_asp_dsi_info->reply && atp_asp_dsi_info->code != 0) { |
| 5145 | col_append_fstr(pinfo->cinfo, COL_INFO, ": %s (%d)", |
| 5146 | val_to_str_ext(pinfo->pool, atp_asp_dsi_info->code, &asp_error_vals_ext, |
| 5147 | "Unknown error (%u)"), atp_asp_dsi_info->code); |
| 5148 | } |
| 5149 | |
| 5150 | ti = proto_tree_add_item(tree, proto_afp, tvb, offset, -1, ENC_NA0x00000000); |
| 5151 | afp_tree = proto_item_add_subtree(ti, ett_afp); |
| 5152 | |
| 5153 | if (!atp_asp_dsi_info->reply) { |
| 5154 | |
| 5155 | ti = proto_tree_add_uint(afp_tree, hf_afp_command, tvb,offset, 1, afp_command); |
| 5156 | if (afp_command != tvb_get_uint8(tvb, offset)) { |
| 5157 | /* we have the same conversation for different connections eg: |
| 5158 | * ip1:2048 --> ip2:548 |
| 5159 | * ip1:2048 --> ip2:548 <RST> |
| 5160 | * .... |
| 5161 | * ip1:2048 --> ip2:548 <SYN> use the same port but it's a new session! |
| 5162 | */ |
| 5163 | col_set_str(pinfo->cinfo, COL_INFO, |
| 5164 | "[Error!IP port reused, you need to split the capture file]"); |
| 5165 | expert_add_info(pinfo, ti, &ei_afp_ip_port_reused); |
| 5166 | return tvb_captured_length(tvb); |
| 5167 | } |
| 5168 | |
| 5169 | /* |
| 5170 | * Put in a field for the frame number of the frame to which |
| 5171 | * this is a response if we know that frame number (i.e., |
| 5172 | * it's not 0). |
| 5173 | */ |
| 5174 | if (request_val->frame_res != 0) { |
| 5175 | ti = proto_tree_add_uint(afp_tree, hf_afp_response_in, |
| 5176 | tvb, 0, 0, request_val->frame_res); |
| 5177 | proto_item_set_generated(ti); |
| 5178 | } |
| 5179 | |
| 5180 | offset++; |
| 5181 | switch (afp_command) { |
| 5182 | case AFP_BYTELOCK1: |
| 5183 | offset = dissect_query_afp_byte_lock(tvb, pinfo, afp_tree, offset); |
| 5184 | break; |
| 5185 | case AFP_BYTELOCK_EXT59: |
| 5186 | offset = dissect_query_afp_byte_lock_ext(tvb, pinfo, afp_tree, offset); |
| 5187 | break; |
| 5188 | case AFP_OPENDT48: /* same as close vol */ |
| 5189 | case AFP_FLUSH10: |
| 5190 | case AFP_CLOSEVOL2: |
| 5191 | offset = dissect_query_afp_with_vol_id(tvb, pinfo, afp_tree, offset); |
| 5192 | break; |
| 5193 | case AFP_CLOSEDIR3: |
| 5194 | /* offset = dissect_query_afp_close_dir(tvb, pinfo, afp_tree, offset); */ |
| 5195 | break; |
| 5196 | case AFP_CLOSEDT49: |
| 5197 | offset = dissect_query_afp_close_dt(tvb, pinfo, afp_tree, offset); |
| 5198 | break; |
| 5199 | case AFP_FLUSHFORK11: /* same packet as closefork */ |
| 5200 | case AFP_SYNCFORK79: |
| 5201 | case AFP_CLOSEFORK4: |
| 5202 | offset = dissect_query_afp_with_fork(tvb, pinfo, afp_tree, offset); |
| 5203 | break; |
| 5204 | case AFP_COPYFILE5: |
| 5205 | offset = dissect_query_afp_copy_file(tvb, pinfo, afp_tree, offset); |
| 5206 | break; |
| 5207 | case AFP_CREATEFILE7: |
| 5208 | offset = dissect_query_afp_create_file(tvb, pinfo, afp_tree, offset); |
| 5209 | break; |
| 5210 | case AFP_DISCTOLDSESS65: |
| 5211 | offset = dissect_query_afp_disconnect_old_session(tvb, pinfo, afp_tree, offset); |
| 5212 | break; |
| 5213 | case AFP_ENUMERATE_EXT268: |
| 5214 | offset = dissect_query_afp_enumerate_ext2(tvb, pinfo, afp_tree, offset); |
| 5215 | break; |
| 5216 | case AFP_ENUMERATE_EXT66: |
| 5217 | case AFP_ENUMERATE9: |
| 5218 | offset = dissect_query_afp_enumerate(tvb, pinfo, afp_tree, offset); |
| 5219 | break; |
| 5220 | case AFP_GETFORKPARAM14: |
| 5221 | offset = dissect_query_afp_get_fork_param(tvb, pinfo, afp_tree, offset); |
| 5222 | break; |
| 5223 | case AFP_GETSESSTOKEN64: |
| 5224 | offset = dissect_query_afp_get_session_token(tvb, pinfo, afp_tree, offset); |
| 5225 | break; |
| 5226 | case AFP_GETUSERINFO37: |
| 5227 | offset = dissect_query_afp_get_user_info(tvb, pinfo, afp_tree, offset); |
| 5228 | break; |
| 5229 | case AFP_GETSRVINFO15: |
| 5230 | /* offset = dissect_query_afp_get_server_info(tvb, pinfo, afp_tree, offset); */ |
| 5231 | break; |
| 5232 | case AFP_GETSRVPARAM16: |
| 5233 | break; /* no parameters */ |
| 5234 | case AFP_GETVOLPARAM17: |
| 5235 | offset = dissect_query_afp_get_vol_param(tvb, pinfo, afp_tree, offset); |
| 5236 | break; |
| 5237 | case AFP_LOGIN_EXT63: |
| 5238 | offset = dissect_query_afp_login_ext(tvb, pinfo, afp_tree, offset); |
| 5239 | break; |
| 5240 | case AFP_LOGIN18: |
| 5241 | offset = dissect_query_afp_login(tvb, pinfo, afp_tree, offset); |
| 5242 | break; |
| 5243 | case AFP_LOGINCONT19: |
| 5244 | case AFP_LOGOUT20: |
| 5245 | break; |
| 5246 | case AFP_MAPID21: |
| 5247 | offset = dissect_query_afp_map_id(tvb, pinfo, afp_tree, offset); |
| 5248 | break; |
| 5249 | case AFP_MAPNAME22: |
| 5250 | offset = dissect_query_afp_map_name(tvb, pinfo, afp_tree, offset); |
| 5251 | break; |
| 5252 | case AFP_MOVE23: |
| 5253 | offset = dissect_query_afp_move(tvb, pinfo, afp_tree, offset); |
| 5254 | break; |
| 5255 | case AFP_OPENVOL24: |
| 5256 | offset = dissect_query_afp_open_vol(tvb, pinfo, afp_tree, offset); |
| 5257 | break; |
| 5258 | case AFP_OPENDIR25: |
| 5259 | break; |
| 5260 | case AFP_OPENFORK26: |
| 5261 | offset = dissect_query_afp_open_fork(tvb, pinfo, afp_tree, offset); |
| 5262 | break; |
| 5263 | case AFP_READ27: |
| 5264 | offset = dissect_query_afp_read(tvb, pinfo, afp_tree, offset); |
| 5265 | break; |
| 5266 | case AFP_READ_EXT60: |
| 5267 | offset = dissect_query_afp_read_ext(tvb, pinfo, afp_tree, offset); |
| 5268 | break; |
| 5269 | case AFP_RENAME28: |
| 5270 | offset = dissect_query_afp_rename(tvb, pinfo, afp_tree, offset); |
| 5271 | break; |
| 5272 | case AFP_SETDIRPARAM29: |
| 5273 | offset = dissect_query_afp_set_dir_param(tvb, pinfo, afp_tree, offset); |
| 5274 | break; |
| 5275 | case AFP_SETFILEPARAM30: |
| 5276 | offset = dissect_query_afp_set_file_param(tvb, pinfo, afp_tree, offset); |
| 5277 | break; |
| 5278 | case AFP_SETFORKPARAM31: |
| 5279 | offset = dissect_query_afp_set_fork_param(tvb, pinfo, afp_tree, offset); |
| 5280 | break; |
| 5281 | case AFP_SETVOLPARAM32: |
| 5282 | offset = dissect_query_afp_set_vol_param(tvb, pinfo, afp_tree, offset); |
| 5283 | break; |
| 5284 | case AFP_WRITE33: |
| 5285 | offset = dissect_query_afp_write(tvb, pinfo, afp_tree, offset); |
| 5286 | break; |
| 5287 | case AFP_WRITE_EXT61: |
| 5288 | offset = dissect_query_afp_write_ext(tvb, pinfo, afp_tree, offset); |
| 5289 | break; |
| 5290 | case AFP_GETFLDRPARAM34: |
| 5291 | offset = dissect_query_afp_get_fldr_param(tvb, pinfo, afp_tree, offset); |
| 5292 | break; |
| 5293 | case AFP_SETFLDRPARAM35: |
| 5294 | offset = dissect_query_afp_set_fldr_param(tvb, pinfo, afp_tree, offset); |
| 5295 | break; |
| 5296 | case AFP_CHANGEPW36: |
| 5297 | break; |
| 5298 | case AFP_GETSRVRMSG38: |
| 5299 | offset = dissect_query_afp_get_server_message(tvb, pinfo, afp_tree, offset); |
| 5300 | break; |
| 5301 | case AFP_DELETE8: /* same as create_id */ |
| 5302 | case AFP_CREATEDIR6: |
| 5303 | case AFP_CREATEID39: |
| 5304 | offset = dissect_query_afp_create_id(tvb, pinfo, afp_tree, offset); |
| 5305 | break; |
| 5306 | case AFP_DELETEID40: |
| 5307 | offset = dissect_query_afp_delete_id(tvb, pinfo, afp_tree, offset); |
| 5308 | break; |
| 5309 | case AFP_RESOLVEID41: |
| 5310 | offset = dissect_query_afp_resolve_id(tvb, pinfo, afp_tree, offset); |
| 5311 | break; |
| 5312 | case AFP_EXCHANGEFILE42: |
| 5313 | offset = dissect_query_afp_exchange_file(tvb, pinfo, afp_tree, offset); |
| 5314 | break; |
| 5315 | case AFP_CATSEARCH_EXT67: |
| 5316 | offset = dissect_query_afp_cat_search_ext(tvb, pinfo, afp_tree, offset); |
| 5317 | break; |
| 5318 | case AFP_CATSEARCH43: |
| 5319 | offset = dissect_query_afp_cat_search(tvb, pinfo, afp_tree, offset); |
| 5320 | break; |
| 5321 | case AFP_GETICON51: |
| 5322 | offset = dissect_query_afp_get_icon(tvb, pinfo, afp_tree, offset); |
| 5323 | break; |
| 5324 | case AFP_GTICNINFO52: |
| 5325 | offset = dissect_query_afp_get_icon_info(tvb, pinfo, afp_tree, offset); |
| 5326 | break; |
| 5327 | case AFP_ADDAPPL53: |
| 5328 | offset = dissect_query_afp_add_appl(tvb, pinfo, afp_tree, offset); |
| 5329 | break; |
| 5330 | case AFP_RMVAPPL54: |
| 5331 | offset = dissect_query_afp_rmv_appl(tvb, pinfo, afp_tree, offset); |
| 5332 | break; |
| 5333 | case AFP_GETAPPL55: |
| 5334 | offset = dissect_query_afp_get_appl(tvb, pinfo, afp_tree, offset); |
| 5335 | break; |
| 5336 | case AFP_ADDCMT56: |
| 5337 | offset = dissect_query_afp_add_cmt(tvb, pinfo, afp_tree, offset); |
| 5338 | break; |
| 5339 | case AFP_RMVCMT57: /* same as get_cmt */ |
| 5340 | case AFP_GETCMT58: |
| 5341 | offset = dissect_query_afp_get_cmt(tvb, pinfo, afp_tree, offset); |
| 5342 | break; |
| 5343 | case AFP_ADDICON192: |
| 5344 | offset = dissect_query_afp_add_icon(tvb, pinfo, afp_tree, offset); |
| 5345 | break; |
| 5346 | case AFP_GETEXTATTR69: |
| 5347 | offset = dissect_query_afp_get_ext_attr(tvb, pinfo, afp_tree, offset); |
| 5348 | break; |
| 5349 | case AFP_SETEXTATTR70: |
| 5350 | offset = dissect_query_afp_set_ext_attr(tvb, pinfo, afp_tree, offset); |
| 5351 | break; |
| 5352 | case AFP_LISTEXTATTR72: |
| 5353 | offset = dissect_query_afp_list_ext_attrs(tvb, pinfo, afp_tree, offset); |
| 5354 | break; |
| 5355 | case AFP_REMOVEATTR71: |
| 5356 | offset = dissect_query_afp_remove_ext_attr(tvb, pinfo, afp_tree, offset); |
| 5357 | break; |
| 5358 | case AFP_GETACL73: |
| 5359 | offset = dissect_query_afp_get_acl(tvb, pinfo, afp_tree, offset); |
| 5360 | break; |
| 5361 | case AFP_SETACL74: |
| 5362 | offset = dissect_query_afp_set_acl(tvb, pinfo, afp_tree, offset); |
| 5363 | break; |
| 5364 | case AFP_ACCESS75: |
| 5365 | offset = dissect_query_afp_access(tvb, pinfo, afp_tree, offset); |
| 5366 | break; |
| 5367 | case AFP_SYNCDIR78: |
| 5368 | offset = dissect_query_afp_with_did(tvb, pinfo, afp_tree, offset); |
| 5369 | break; |
| 5370 | case AFP_SPOTLIGHTRPC76: |
| 5371 | offset = dissect_query_afp_spotlight(tvb, pinfo, afp_tree, offset, request_val); |
| 5372 | break; |
| 5373 | } |
| 5374 | } |
| 5375 | else { |
| 5376 | proto_tree_add_uint(afp_tree, hf_afp_command, tvb, 0, 0, afp_command); |
| 5377 | |
| 5378 | /* |
| 5379 | * Put in fields for the frame with the response to this |
| 5380 | * frame - if we know the frame number (i.e., it's not 0). |
| 5381 | */ |
| 5382 | if (request_val->frame_req != 0) { |
| 5383 | ti = proto_tree_add_uint(afp_tree, hf_afp_response_to, |
| 5384 | tvb, 0, 0, request_val->frame_req); |
| 5385 | proto_item_set_generated(ti); |
| 5386 | nstime_delta(&delta_ts, &pinfo->abs_ts, &request_val->req_time); |
| 5387 | ti = proto_tree_add_time(afp_tree, hf_afp_time, tvb, |
| 5388 | 0, 0, &delta_ts); |
| 5389 | proto_item_set_generated(ti); |
| 5390 | } |
| 5391 | |
| 5392 | /* |
| 5393 | * Set "frame_res" if it's not already known. |
| 5394 | */ |
| 5395 | if (request_val->frame_res == 0) |
| 5396 | request_val->frame_res = pinfo->num; |
| 5397 | |
| 5398 | /* |
| 5399 | * Tap the packet before the dissectors are called so we |
| 5400 | * still get the tap listener called even if there is an |
| 5401 | * exception. |
| 5402 | */ |
| 5403 | tap_queue_packet(afp_tap, pinfo, request_val); |
| 5404 | |
| 5405 | if (!len) { |
| 5406 | /* for some calls if the reply is an error there's no data |
| 5407 | */ |
| 5408 | return tvb_captured_length(tvb); |
| 5409 | } |
| 5410 | |
| 5411 | switch (afp_command) { |
| 5412 | case AFP_BYTELOCK1: |
| 5413 | offset = dissect_reply_afp_byte_lock(tvb, pinfo, afp_tree, offset); |
| 5414 | break; |
| 5415 | case AFP_BYTELOCK_EXT59: |
| 5416 | offset = dissect_reply_afp_byte_lock_ext(tvb, pinfo, afp_tree, offset); |
| 5417 | break; |
| 5418 | case AFP_ENUMERATE_EXT268: |
| 5419 | case AFP_ENUMERATE_EXT66: |
| 5420 | offset = dissect_reply_afp_enumerate_ext(tvb, pinfo, afp_tree, offset); |
| 5421 | break; |
| 5422 | case AFP_ENUMERATE9: |
| 5423 | offset = dissect_reply_afp_enumerate(tvb, pinfo, afp_tree, offset); |
| 5424 | break; |
| 5425 | case AFP_OPENVOL24: |
| 5426 | offset = dissect_reply_afp_open_vol(tvb, pinfo, afp_tree, offset); |
| 5427 | break; |
| 5428 | case AFP_OPENFORK26: |
| 5429 | offset = dissect_reply_afp_open_fork(tvb, pinfo, afp_tree, offset); |
| 5430 | break; |
| 5431 | case AFP_RESOLVEID41: |
| 5432 | case AFP_GETFORKPARAM14: |
| 5433 | offset = dissect_reply_afp_get_fork_param(tvb, pinfo, afp_tree, offset); |
| 5434 | break; |
| 5435 | case AFP_GETUSERINFO37: |
| 5436 | offset = dissect_reply_afp_get_user_info(tvb, pinfo, afp_tree, offset); |
| 5437 | break; |
| 5438 | case AFP_GETSRVPARAM16: |
| 5439 | offset = dissect_reply_afp_get_server_param(tvb, pinfo, afp_tree, offset); |
| 5440 | break; |
| 5441 | case AFP_GETSRVRMSG38: |
| 5442 | offset = dissect_reply_afp_get_server_message(tvb, pinfo, afp_tree, offset); |
| 5443 | break; |
| 5444 | case AFP_CREATEDIR6: |
| 5445 | offset = dissect_reply_afp_create_dir(tvb, pinfo, afp_tree, offset); |
| 5446 | break; |
| 5447 | case AFP_MAPID21: |
| 5448 | offset = dissect_reply_afp_map_id(tvb, pinfo, afp_tree, offset); |
| 5449 | break; |
| 5450 | case AFP_MAPNAME22: |
| 5451 | offset = dissect_reply_afp_map_name(tvb, pinfo, afp_tree, offset); |
| 5452 | break; |
| 5453 | case AFP_MOVE23: /* same as create_id */ |
| 5454 | case AFP_CREATEID39: |
| 5455 | offset = dissect_reply_afp_create_id(tvb, pinfo, afp_tree, offset); |
| 5456 | break; |
| 5457 | case AFP_GETSESSTOKEN64: |
| 5458 | offset = dissect_reply_afp_get_session_token(tvb, pinfo, afp_tree, offset); |
| 5459 | break; |
| 5460 | case AFP_GETVOLPARAM17: |
| 5461 | offset = dissect_reply_afp_get_vol_param(tvb, pinfo, afp_tree, offset); |
| 5462 | break; |
| 5463 | case AFP_GETFLDRPARAM34: |
| 5464 | offset = dissect_reply_afp_get_fldr_param(tvb, pinfo, afp_tree, offset); |
| 5465 | break; |
| 5466 | case AFP_OPENDT48: |
| 5467 | offset = dissect_reply_afp_open_dt(tvb, pinfo, afp_tree, offset); |
| 5468 | break; |
| 5469 | case AFP_CATSEARCH_EXT67: |
| 5470 | offset = dissect_reply_afp_cat_search_ext(tvb, pinfo, afp_tree, offset); |
| 5471 | break; |
| 5472 | case AFP_CATSEARCH43: |
| 5473 | offset = dissect_reply_afp_cat_search(tvb, pinfo, afp_tree, offset); |
| 5474 | break; |
| 5475 | case AFP_GTICNINFO52: |
| 5476 | offset = dissect_reply_afp_get_icon_info(tvb, pinfo, afp_tree, offset); |
| 5477 | break; |
| 5478 | case AFP_GETAPPL55: |
| 5479 | offset = dissect_reply_afp_get_appl(tvb, pinfo, afp_tree, offset); |
| 5480 | break; |
| 5481 | case AFP_GETCMT58: |
| 5482 | offset = dissect_reply_afp_get_cmt(tvb, pinfo, afp_tree, offset); |
| 5483 | break; |
| 5484 | case AFP_WRITE33: |
| 5485 | offset = dissect_reply_afp_write(tvb, pinfo, afp_tree, offset); |
| 5486 | break; |
| 5487 | case AFP_WRITE_EXT61: |
| 5488 | offset = dissect_reply_afp_write_ext(tvb, pinfo, afp_tree, offset); |
| 5489 | break; |
| 5490 | case AFP_GETEXTATTR69: |
| 5491 | offset = dissect_reply_afp_get_ext_attr(tvb, pinfo, afp_tree, offset); |
| 5492 | break; |
| 5493 | case AFP_LISTEXTATTR72: |
| 5494 | offset = dissect_reply_afp_list_ext_attrs(tvb, pinfo, afp_tree, offset); |
| 5495 | break; |
| 5496 | case AFP_GETACL73: |
| 5497 | offset = dissect_reply_afp_get_acl(tvb, pinfo, afp_tree, offset); |
| 5498 | break; |
| 5499 | case AFP_SPOTLIGHTRPC76: |
| 5500 | offset = dissect_reply_afp_spotlight(tvb, pinfo, afp_tree, offset, request_val); |
| 5501 | break; |
| 5502 | } |
| 5503 | } |
| 5504 | if (offset < len) { |
| 5505 | call_data_dissector(tvb_new_subset_remaining(tvb, offset), |
| 5506 | pinfo, afp_tree); |
| 5507 | } |
| 5508 | |
| 5509 | return tvb_captured_length(tvb); |
| 5510 | } |
| 5511 | |
| 5512 | void |
| 5513 | proto_register_afp(void) |
| 5514 | { |
| 5515 | |
| 5516 | static hf_register_info hf[] = { |
| 5517 | { &hf_afp_command, |
| 5518 | { "Command", "afp.command", |
| 5519 | FT_UINT8, BASE_DEC|BASE_EXT_STRING0x00000200, &CommandCode_vals_ext, 0x0, |
| 5520 | "AFP function", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5521 | |
| 5522 | { &hf_afp_pad, |
| 5523 | { "Pad", "afp.pad", |
| 5524 | FT_NONE, BASE_NONE, NULL((void*)0), 0, |
| 5525 | "Pad Byte", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5526 | |
| 5527 | { &hf_afp_Version, |
| 5528 | { "AFP Version", "afp.Version", |
| 5529 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 5530 | "Client AFP version", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5531 | |
| 5532 | { &hf_afp_UAM, |
| 5533 | { "UAM", "afp.UAM", |
| 5534 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 5535 | "User Authentication Method", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5536 | |
| 5537 | { &hf_afp_user, |
| 5538 | { "User", "afp.user", |
| 5539 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 5540 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5541 | |
| 5542 | { &hf_afp_user_type, |
| 5543 | { "Type", "afp.user_type", |
| 5544 | FT_UINT8, BASE_HEX, VALS(path_type_vals)((0 ? (const struct _value_string*)0 : ((path_type_vals)))), 0, |
| 5545 | "Type of user name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5546 | { &hf_afp_user_len, |
| 5547 | { "Len", "afp.user_len", |
| 5548 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 5549 | "User name length (unicode)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5550 | { &hf_afp_user_name, |
| 5551 | { "User", "afp.user_name", |
| 5552 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 5553 | "User name (unicode)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5554 | |
| 5555 | { &hf_afp_passwd, |
| 5556 | { "Password", "afp.passwd", |
| 5557 | FT_STRINGZPAD, BASE_NONE, NULL((void*)0), 0x0, |
| 5558 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5559 | |
| 5560 | { &hf_afp_random, |
| 5561 | { "Random number", "afp.random", |
| 5562 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 5563 | "UAM random number", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5564 | |
| 5565 | { &hf_afp_response_to, |
| 5566 | { "Response to", "afp.response_to", |
| 5567 | FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_REQUEST)((gpointer) (glong) (FT_FRAMENUM_REQUEST)), 0x0, |
| 5568 | "This packet is a response to the packet in this frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5569 | |
| 5570 | { &hf_afp_time, |
| 5571 | { "Time from request", "afp.time", |
| 5572 | FT_RELATIVE_TIME, BASE_NONE, NULL((void*)0), 0x0, |
| 5573 | "Time between Request and Response for AFP cmds", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5574 | |
| 5575 | { &hf_afp_response_in, |
| 5576 | { "Response in", "afp.response_in", |
| 5577 | FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE)((gpointer) (glong) (FT_FRAMENUM_RESPONSE)), 0x0, |
| 5578 | "The response to this packet is in this packet", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5579 | |
| 5580 | { &hf_afp_login_flags, |
| 5581 | { "Flags", "afp.login_flags", |
| 5582 | FT_UINT16, BASE_HEX, NULL((void*)0), 0 /* 0x0FFF*/, |
| 5583 | "Login flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5584 | |
| 5585 | { &hf_afp_vol_bitmap, |
| 5586 | { "Bitmap", "afp.vol_bitmap", |
| 5587 | FT_UINT16, BASE_HEX, NULL((void*)0), 0 /* 0x0FFF*/, |
| 5588 | "Volume bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5589 | |
| 5590 | { &hf_afp_vol_bitmap_Attributes, |
| 5591 | { "Attributes", "afp.vol_bitmap.attributes", |
| 5592 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolAttributeBit(1U << 0), |
| 5593 | "Volume attributes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5594 | |
| 5595 | { &hf_afp_vol_attribute, |
| 5596 | { "Attributes", "afp.vol_attributes", |
| 5597 | FT_UINT16, BASE_HEX, NULL((void*)0), 0, |
| 5598 | "Volume attributes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5599 | |
| 5600 | { &hf_afp_vol_attribute_ReadOnly, |
| 5601 | { "Read only", "afp.vol_attribute.read_only", |
| 5602 | FT_BOOLEAN, 16, NULL((void*)0), kReadOnly(1U << 0), |
| 5603 | "Read only volume", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5604 | |
| 5605 | { &hf_afp_vol_attribute_HasVolumePassword, |
| 5606 | { "Volume password", "afp.vol_attribute.passwd", |
| 5607 | FT_BOOLEAN, 16, NULL((void*)0), kHasVolumePassword(1U << 1), |
| 5608 | "Has a volume password", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5609 | |
| 5610 | { &hf_afp_vol_attribute_SupportsFileIDs, |
| 5611 | { "File IDs", "afp.vol_attribute.fileIDs", |
| 5612 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsFileIDs(1U << 2), |
| 5613 | "Supports file IDs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5614 | |
| 5615 | { &hf_afp_vol_attribute_SupportsCatSearch, |
| 5616 | { "Catalog search", "afp.vol_attribute.cat_search", |
| 5617 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsCatSearch(1U << 3), |
| 5618 | "Supports catalog search operations", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5619 | |
| 5620 | { &hf_afp_vol_attribute_SupportsBlankAccessPrivs, |
| 5621 | { "Blank access privileges", "afp.vol_attribute.blank_access_privs", |
| 5622 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsBlankAccessPrivs(1U << 4), |
| 5623 | "Supports blank access privileges", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5624 | |
| 5625 | { &hf_afp_vol_attribute_SupportsUnixPrivs, |
| 5626 | { "UNIX access privileges", "afp.vol_attribute.unix_privs", |
| 5627 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsUnixPrivs(1U << 5), |
| 5628 | "Supports UNIX access privileges", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5629 | |
| 5630 | { &hf_afp_vol_attribute_SupportsUTF8Names, |
| 5631 | { "UTF-8 names", "afp.vol_attribute.utf8_names", |
| 5632 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsUTF8Names(1U << 6), |
| 5633 | "Supports UTF-8 names", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5634 | |
| 5635 | { &hf_afp_vol_attribute_NoNetworkUserID, |
| 5636 | { "No Network User ID", "afp.vol_attribute.network_user_id", |
| 5637 | FT_BOOLEAN, 16, NULL((void*)0), kNoNetworkUserIDs(1U << 7), |
| 5638 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5639 | |
| 5640 | { &hf_afp_vol_attribute_DefaultPrivsFromParent, |
| 5641 | { "Inherit parent privileges", "afp.vol_attribute.inherit_parent_privs", |
| 5642 | FT_BOOLEAN, 16, NULL((void*)0), kDefaultPrivsFromParent(1U << 8), |
| 5643 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5644 | |
| 5645 | { &hf_afp_vol_attribute_NoExchangeFiles, |
| 5646 | { "No exchange files", "afp.vol_attribute.no_exchange_files", |
| 5647 | FT_BOOLEAN, 16, NULL((void*)0), kNoExchangeFiles(1U << 9), |
| 5648 | "Exchange files not supported", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5649 | |
| 5650 | { &hf_afp_vol_attribute_SupportsExtAttrs, |
| 5651 | { "Extended Attributes", "afp.vol_attribute.extended_attributes", |
| 5652 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsExtAttrs(1U << 10), |
| 5653 | "Supports Extended Attributes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5654 | |
| 5655 | { &hf_afp_vol_attribute_SupportsACLs, |
| 5656 | { "ACLs", "afp.vol_attribute.acls", |
| 5657 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsACLs(1U << 11), |
| 5658 | "Supports access control lists", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5659 | |
| 5660 | { &hf_afp_vol_attribute_CaseSensitive, |
| 5661 | { "Case sensitive", "afp.vol_attribute.case_sensitive", |
| 5662 | FT_BOOLEAN, 16, NULL((void*)0), kCaseSensitive(1U << 12), |
| 5663 | "Supports case-sensitive filenames", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5664 | |
| 5665 | { &hf_afp_vol_attribute_SupportsTMLockSteal, |
| 5666 | { "TM lock steal", "afp.vol_attribute.TM_lock_steal", |
| 5667 | FT_BOOLEAN, 16, NULL((void*)0), kSupportsTMLockSteal(1U << 13), |
| 5668 | "Supports Time Machine lock stealing", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5669 | |
| 5670 | { &hf_afp_vol_bitmap_Signature, |
| 5671 | { "Signature", "afp.vol_bitmap.signature", |
| 5672 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolSignatureBit(1U << 1), |
| 5673 | "Volume signature", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5674 | |
| 5675 | { &hf_afp_vol_bitmap_CreateDate, |
| 5676 | { "Creation date", "afp.vol_bitmap.create_date", |
| 5677 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolCreateDateBit(1U << 2), |
| 5678 | "Volume creation date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5679 | |
| 5680 | { &hf_afp_vol_bitmap_ModDate, |
| 5681 | { "Modification date", "afp.vol_bitmap.mod_date", |
| 5682 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolModDateBit(1U << 3), |
| 5683 | "Volume modification date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5684 | |
| 5685 | { &hf_afp_vol_bitmap_BackupDate, |
| 5686 | { "Backup date", "afp.vol_bitmap.backup_date", |
| 5687 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolBackupDateBit(1U << 4), |
| 5688 | "Volume backup date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5689 | |
| 5690 | { &hf_afp_vol_bitmap_ID, |
| 5691 | { "ID", "afp.vol_bitmap.id", |
| 5692 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolIDBit(1U << 5), |
| 5693 | "Volume ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5694 | |
| 5695 | { &hf_afp_vol_bitmap_BytesFree, |
| 5696 | { "Bytes free", "afp.vol_bitmap.bytes_free", |
| 5697 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolBytesFreeBit(1U << 6), |
| 5698 | "Volume free bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5699 | |
| 5700 | { &hf_afp_vol_bitmap_BytesTotal, |
| 5701 | { "Bytes total", "afp.vol_bitmap.bytes_total", |
| 5702 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolBytesTotalBit(1U << 7), |
| 5703 | "Volume total bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5704 | |
| 5705 | { &hf_afp_vol_bitmap_Name, |
| 5706 | { "Name", "afp.vol_bitmap.name", |
| 5707 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolNameBit(1U << 8), |
| 5708 | "Volume name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5709 | |
| 5710 | { &hf_afp_vol_bitmap_ExtBytesFree, |
| 5711 | { "Extended bytes free", "afp.vol_bitmap.ex_bytes_free", |
| 5712 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolExtBytesFreeBit(1U << 9), |
| 5713 | "Volume extended (>2GB) free bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5714 | |
| 5715 | { &hf_afp_vol_bitmap_ExtBytesTotal, |
| 5716 | { "Extended bytes total", "afp.vol_bitmap.ex_bytes_total", |
| 5717 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolExtBytesTotalBit(1U << 10), |
| 5718 | "Volume extended (>2GB) total bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5719 | |
| 5720 | { &hf_afp_vol_bitmap_BlockSize, |
| 5721 | { "Block size", "afp.vol_bitmap.block_size", |
| 5722 | FT_BOOLEAN, 16, NULL((void*)0), kFPVolBlockSizeBit(1U << 11), |
| 5723 | "Volume block size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5724 | |
| 5725 | { &hf_afp_dir_bitmap_Attributes, |
| 5726 | { "Attributes", "afp.dir_bitmap.attributes", |
| 5727 | FT_BOOLEAN, 16, NULL((void*)0), kFPAttributeBit(1U << 0), |
| 5728 | "Return attributes if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5729 | |
| 5730 | { &hf_afp_dir_bitmap_ParentDirID, |
| 5731 | { "DID", "afp.dir_bitmap.did", |
| 5732 | FT_BOOLEAN, 16, NULL((void*)0), kFPParentDirIDBit(1U << 1), |
| 5733 | "Return parent directory ID if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5734 | |
| 5735 | { &hf_afp_dir_bitmap_CreateDate, |
| 5736 | { "Creation date", "afp.dir_bitmap.create_date", |
| 5737 | FT_BOOLEAN, 16, NULL((void*)0), kFPCreateDateBit(1U << 2), |
| 5738 | "Return creation date if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5739 | |
| 5740 | { &hf_afp_dir_bitmap_ModDate, |
| 5741 | { "Modification date", "afp.dir_bitmap.mod_date", |
| 5742 | FT_BOOLEAN, 16, NULL((void*)0), kFPModDateBit(1U << 3), |
| 5743 | "Return modification date if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5744 | |
| 5745 | { &hf_afp_dir_bitmap_BackupDate, |
| 5746 | { "Backup date", "afp.dir_bitmap.backup_date", |
| 5747 | FT_BOOLEAN, 16, NULL((void*)0), kFPBackupDateBit(1U << 4), |
| 5748 | "Return backup date if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5749 | |
| 5750 | { &hf_afp_dir_bitmap_FinderInfo, |
| 5751 | { "Finder info", "afp.dir_bitmap.finder_info", |
| 5752 | FT_BOOLEAN, 16, NULL((void*)0), kFPFinderInfoBit(1U << 5), |
| 5753 | "Return finder info if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5754 | |
| 5755 | { &hf_afp_dir_bitmap_LongName, |
| 5756 | { "Long name", "afp.dir_bitmap.long_name", |
| 5757 | FT_BOOLEAN, 16, NULL((void*)0), kFPLongNameBit(1U << 6), |
| 5758 | "Return long name if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5759 | |
| 5760 | { &hf_afp_dir_bitmap_ShortName, |
| 5761 | { "Short name", "afp.dir_bitmap.short_name", |
| 5762 | FT_BOOLEAN, 16, NULL((void*)0), kFPShortNameBit(1U << 7), |
| 5763 | "Return short name if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5764 | |
| 5765 | { &hf_afp_dir_bitmap_NodeID, |
| 5766 | { "File ID", "afp.dir_bitmap.fid", |
| 5767 | FT_BOOLEAN, 16, NULL((void*)0), kFPNodeIDBit(1U << 8), |
| 5768 | "Return file ID if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5769 | |
| 5770 | { &hf_afp_dir_bitmap_OffspringCount, |
| 5771 | { "Offspring count", "afp.dir_bitmap.offspring_count", |
| 5772 | FT_BOOLEAN, 16, NULL((void*)0), kFPOffspringCountBit(1U << 9), |
| 5773 | "Return offspring count if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5774 | |
| 5775 | { &hf_afp_dir_bitmap_OwnerID, |
| 5776 | { "Owner id", "afp.dir_bitmap.owner_id", |
| 5777 | FT_BOOLEAN, 16, NULL((void*)0), kFPOwnerIDBit(1U << 10), |
| 5778 | "Return owner id if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5779 | |
| 5780 | { &hf_afp_dir_bitmap_GroupID, |
| 5781 | { "Group id", "afp.dir_bitmap.group_id", |
| 5782 | FT_BOOLEAN, 16, NULL((void*)0), kFPGroupIDBit(1U << 11), |
| 5783 | "Return group id if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5784 | |
| 5785 | { &hf_afp_dir_bitmap_AccessRights, |
| 5786 | { "Access rights", "afp.dir_bitmap.access_rights", |
| 5787 | FT_BOOLEAN, 16, NULL((void*)0), kFPAccessRightsBit(1U << 12), |
| 5788 | "Return access rights if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5789 | |
| 5790 | { &hf_afp_dir_bitmap_UTF8Name, |
| 5791 | { "UTF-8 name or ProDOS info", "afp.dir_bitmap.UTF8_name", |
| 5792 | FT_BOOLEAN, 16, NULL((void*)0), kFPUTF8NameBit(1U << 13), |
| 5793 | "Return UTF-8 name or ProDOS info if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5794 | |
| 5795 | { &hf_afp_dir_bitmap_UnixPrivs, |
| 5796 | { "UNIX privileges", "afp.dir_bitmap.unix_privs", |
| 5797 | FT_BOOLEAN, 16, NULL((void*)0), kFPUnixPrivsBit(1U << 15), |
| 5798 | "Return UNIX privileges if directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5799 | |
| 5800 | { &hf_afp_dir_attribute, |
| 5801 | { "Directory Attributes", "afp.dir_attribute", |
| 5802 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 5803 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5804 | |
| 5805 | { &hf_afp_dir_attribute_Invisible, |
| 5806 | { "Invisible", "afp.dir_attribute.invisible", |
| 5807 | FT_BOOLEAN, 16, NULL((void*)0), kFPInvisibleBit(1U << 0), |
| 5808 | "Directory is not visible", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5809 | |
| 5810 | { &hf_afp_dir_attribute_IsExpFolder, |
| 5811 | { "Share point", "afp.dir_attribute.share", |
| 5812 | FT_BOOLEAN, 16, NULL((void*)0), kFPMultiUserBit(1U << 1), |
| 5813 | "Directory is a share point", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5814 | |
| 5815 | { &hf_afp_dir_attribute_System, |
| 5816 | { "System", "afp.dir_attribute.system", |
| 5817 | FT_BOOLEAN, 16, NULL((void*)0), kFPSystemBit(1U << 2), |
| 5818 | "Directory is a system directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5819 | |
| 5820 | { &hf_afp_dir_attribute_Mounted, |
| 5821 | { "Mounted", "afp.dir_attribute.mounted", |
| 5822 | FT_BOOLEAN, 16, NULL((void*)0), kFPDAlreadyOpenBit(1U << 3), |
| 5823 | "Directory is mounted", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5824 | |
| 5825 | { &hf_afp_dir_attribute_InExpFolder, |
| 5826 | { "Shared area", "afp.dir_attribute.in_exported_folder", |
| 5827 | FT_BOOLEAN, 16, NULL((void*)0), kFPRAlreadyOpenBit(1U << 4), |
| 5828 | "Directory is in a shared area", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5829 | |
| 5830 | { &hf_afp_dir_attribute_BackUpNeeded, |
| 5831 | { "Backup needed", "afp.dir_attribute.backup_needed", |
| 5832 | FT_BOOLEAN, 16, NULL((void*)0), kFPBackUpNeededBit(1U << 6), |
| 5833 | "Directory needs to be backed up", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5834 | |
| 5835 | { &hf_afp_dir_attribute_RenameInhibit, |
| 5836 | { "Rename inhibit", "afp.dir_attribute.rename_inhibit", |
| 5837 | FT_BOOLEAN, 16, NULL((void*)0), kFPRenameInhibitBit(1U << 7), |
| 5838 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5839 | |
| 5840 | { &hf_afp_dir_attribute_DeleteInhibit, |
| 5841 | { "Delete inhibit", "afp.dir_attribute.delete_inhibit", |
| 5842 | FT_BOOLEAN, 16, NULL((void*)0), kFPDeleteInhibitBit(1U << 8), |
| 5843 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5844 | |
| 5845 | { &hf_afp_file_bitmap, |
| 5846 | { "File bitmap", "afp.file_bitmap", |
| 5847 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 5848 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5849 | |
| 5850 | { &hf_afp_file_bitmap_Attributes, |
| 5851 | { "Attributes", "afp.file_bitmap.attributes", |
| 5852 | FT_BOOLEAN, 16, NULL((void*)0), kFPAttributeBit(1U << 0), |
| 5853 | "Return attributes if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5854 | |
| 5855 | { &hf_afp_file_bitmap_ParentDirID, |
| 5856 | { "DID", "afp.file_bitmap.did", |
| 5857 | FT_BOOLEAN, 16, NULL((void*)0), kFPParentDirIDBit(1U << 1), |
| 5858 | "Return parent directory ID if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5859 | |
| 5860 | { &hf_afp_file_bitmap_CreateDate, |
| 5861 | { "Creation date", "afp.file_bitmap.create_date", |
| 5862 | FT_BOOLEAN, 16, NULL((void*)0), kFPCreateDateBit(1U << 2), |
| 5863 | "Return creation date if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5864 | |
| 5865 | { &hf_afp_file_bitmap_ModDate, |
| 5866 | { "Modification date", "afp.file_bitmap.mod_date", |
| 5867 | FT_BOOLEAN, 16, NULL((void*)0), kFPModDateBit(1U << 3), |
| 5868 | "Return modification date if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5869 | |
| 5870 | { &hf_afp_file_bitmap_BackupDate, |
| 5871 | { "Backup date", "afp.file_bitmap.backup_date", |
| 5872 | FT_BOOLEAN, 16, NULL((void*)0), kFPBackupDateBit(1U << 4), |
| 5873 | "Return backup date if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5874 | |
| 5875 | { &hf_afp_file_bitmap_FinderInfo, |
| 5876 | { "Finder info", "afp.file_bitmap.finder_info", |
| 5877 | FT_BOOLEAN, 16, NULL((void*)0), kFPFinderInfoBit(1U << 5), |
| 5878 | "Return finder info if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5879 | |
| 5880 | { &hf_afp_file_bitmap_LongName, |
| 5881 | { "Long name", "afp.file_bitmap.long_name", |
| 5882 | FT_BOOLEAN, 16, NULL((void*)0), kFPLongNameBit(1U << 6), |
| 5883 | "Return long name if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5884 | |
| 5885 | { &hf_afp_file_bitmap_ShortName, |
| 5886 | { "Short name", "afp.file_bitmap.short_name", |
| 5887 | FT_BOOLEAN, 16, NULL((void*)0), kFPShortNameBit(1U << 7), |
| 5888 | "Return short name if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5889 | |
| 5890 | { &hf_afp_file_bitmap_NodeID, |
| 5891 | { "File ID", "afp.file_bitmap.fid", |
| 5892 | FT_BOOLEAN, 16, NULL((void*)0), kFPNodeIDBit(1U << 8), |
| 5893 | "Return file ID if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5894 | |
| 5895 | { &hf_afp_file_bitmap_DataForkLen, |
| 5896 | { "Data fork size", "afp.file_bitmap.data_fork_len", |
| 5897 | FT_BOOLEAN, 16, NULL((void*)0), kFPDataForkLenBit(1U << 9), |
| 5898 | "Return data fork size if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5899 | |
| 5900 | { &hf_afp_file_bitmap_RsrcForkLen, |
| 5901 | { "Resource fork size", "afp.file_bitmap.resource_fork_len", |
| 5902 | FT_BOOLEAN, 16, NULL((void*)0), kFPRsrcForkLenBit(1U << 10), |
| 5903 | "Return resource fork size if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5904 | |
| 5905 | { &hf_afp_file_bitmap_ExtDataForkLen, |
| 5906 | { "Extended data fork size", "afp.file_bitmap.ex_data_fork_len", |
| 5907 | FT_BOOLEAN, 16, NULL((void*)0), kFPExtDataForkLenBit(1U << 11), |
| 5908 | "Return extended (>2GB) data fork size if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5909 | |
| 5910 | { &hf_afp_file_bitmap_LaunchLimit, |
| 5911 | { "Launch limit", "afp.file_bitmap.launch_limit", |
| 5912 | FT_BOOLEAN, 16, NULL((void*)0), kFPLaunchLimitBit(1U << 12), |
| 5913 | "Return launch limit if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5914 | |
| 5915 | { &hf_afp_file_bitmap_UTF8Name, |
| 5916 | { "UTF-8 name or ProDOS info", "afp.file_bitmap.UTF8_name", |
| 5917 | FT_BOOLEAN, 16, NULL((void*)0), kFPUTF8NameBit(1U << 13), |
| 5918 | "Return UTF-8 name or ProDOS info if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5919 | |
| 5920 | { &hf_afp_file_bitmap_ExtRsrcForkLen, |
| 5921 | { "Extended resource fork size", "afp.file_bitmap.ex_resource_fork_len", |
| 5922 | FT_BOOLEAN, 16, NULL((void*)0), kFPExtRsrcForkLenBit(1U << 14), |
| 5923 | "Return extended (>2GB) resource fork size if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5924 | |
| 5925 | { &hf_afp_file_bitmap_UnixPrivs, |
| 5926 | { "UNIX privileges", "afp.file_bitmap.unix_privs", |
| 5927 | FT_BOOLEAN, 16, NULL((void*)0), kFPUnixPrivsBit(1U << 15), |
| 5928 | "Return UNIX privileges if file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5929 | |
| 5930 | /* ---------- */ |
| 5931 | { &hf_afp_file_attribute, |
| 5932 | { "File Attributes", "afp.file_attribute", |
| 5933 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 5934 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5935 | |
| 5936 | { &hf_afp_file_attribute_Invisible, |
| 5937 | { "Invisible", "afp.file_attribute.invisible", |
| 5938 | FT_BOOLEAN, 16, NULL((void*)0), kFPInvisibleBit(1U << 0), |
| 5939 | "File is not visible", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5940 | |
| 5941 | { &hf_afp_file_attribute_MultiUser, |
| 5942 | { "Multi user", "afp.file_attribute.multi_user", |
| 5943 | FT_BOOLEAN, 16, NULL((void*)0), kFPMultiUserBit(1U << 1), |
| 5944 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5945 | |
| 5946 | { &hf_afp_file_attribute_System, |
| 5947 | { "System", "afp.file_attribute.system", |
| 5948 | FT_BOOLEAN, 16, NULL((void*)0), kFPSystemBit(1U << 2), |
| 5949 | "File is a system file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5950 | |
| 5951 | { &hf_afp_file_attribute_DAlreadyOpen, |
| 5952 | { "Data fork open", "afp.file_attribute.df_open", |
| 5953 | FT_BOOLEAN, 16, NULL((void*)0), kFPDAlreadyOpenBit(1U << 3), |
| 5954 | "Data fork already open", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5955 | |
| 5956 | { &hf_afp_file_attribute_RAlreadyOpen, |
| 5957 | { "Resource fork open", "afp.file_attribute.rf_open", |
| 5958 | FT_BOOLEAN, 16, NULL((void*)0), kFPRAlreadyOpenBit(1U << 4), |
| 5959 | "Resource fork already open", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5960 | |
| 5961 | { &hf_afp_file_attribute_WriteInhibit, |
| 5962 | { "Write inhibit", "afp.file_attribute.write_inhibit", |
| 5963 | FT_BOOLEAN, 16, NULL((void*)0), kFPWriteInhibitBit(1U << 5), |
| 5964 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5965 | |
| 5966 | { &hf_afp_file_attribute_BackUpNeeded, |
| 5967 | { "Backup needed", "afp.file_attribute.backup_needed", |
| 5968 | FT_BOOLEAN, 16, NULL((void*)0), kFPBackUpNeededBit(1U << 6), |
| 5969 | "File needs to be backed up", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5970 | |
| 5971 | { &hf_afp_file_attribute_RenameInhibit, |
| 5972 | { "Rename inhibit", "afp.file_attribute.rename_inhibit", |
| 5973 | FT_BOOLEAN, 16, NULL((void*)0), kFPRenameInhibitBit(1U << 7), |
| 5974 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5975 | |
| 5976 | { &hf_afp_file_attribute_DeleteInhibit, |
| 5977 | { "Delete inhibit", "afp.file_attribute.delete_inhibit", |
| 5978 | FT_BOOLEAN, 16, NULL((void*)0), kFPDeleteInhibitBit(1U << 8), |
| 5979 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5980 | |
| 5981 | { &hf_afp_file_attribute_CopyProtect, |
| 5982 | { "Copy protect", "afp.file_attribute.copy_protect", |
| 5983 | FT_BOOLEAN, 16, NULL((void*)0), kFPCopyProtectBit(1U << 10), |
| 5984 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5985 | |
| 5986 | { &hf_afp_file_attribute_SetClear, |
| 5987 | { "Set", "afp.file_attribute.set_clear", |
| 5988 | FT_BOOLEAN, 16, NULL((void*)0), kFPSetClearBit(1U << 15), |
| 5989 | "Clear/set attribute", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5990 | /* ---------- */ |
| 5991 | |
| 5992 | { &hf_afp_vol_name, |
| 5993 | { "Volume", "afp.vol_name", |
| 5994 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 5995 | "Volume name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 5996 | |
| 5997 | { &hf_afp_vol_flag, |
| 5998 | { "Flags", "afp.vol_flag", |
| 5999 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 6000 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6001 | |
| 6002 | { &hf_afp_vol_flag_passwd, |
| 6003 | { "Password", "afp.vol_flag_passwd", |
| 6004 | FT_BOOLEAN, 8, NULL((void*)0), 128, |
| 6005 | "Volume is password-protected", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6006 | |
| 6007 | { &hf_afp_vol_flag_has_config, |
| 6008 | { "Has config", "afp.vol_flag_has_config", |
| 6009 | FT_BOOLEAN, 8, NULL((void*)0), 1, |
| 6010 | "Volume has Apple II config info", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6011 | |
| 6012 | { &hf_afp_vol_id, |
| 6013 | { "Volume id", "afp.vol_id", |
| 6014 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6015 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6016 | |
| 6017 | { &hf_afp_vol_signature, |
| 6018 | { "Signature", "afp.vol_signature", |
| 6019 | FT_UINT16, BASE_DEC, VALS(vol_signature_vals)((0 ? (const struct _value_string*)0 : ((vol_signature_vals)) )), 0x0, |
| 6020 | "Volume signature", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6021 | |
| 6022 | { &hf_afp_vol_name_offset, |
| 6023 | { "Volume name offset","afp.vol_name_offset", |
| 6024 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6025 | "Volume name offset in packet", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6026 | |
| 6027 | { &hf_afp_vol_creation_date, |
| 6028 | { "Creation date", "afp.vol_creation_date", |
| 6029 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 6030 | "Volume creation date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6031 | |
| 6032 | { &hf_afp_vol_modification_date, |
| 6033 | { "Modification date", "afp.vol_modification_date", |
| 6034 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 6035 | "Volume modification date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6036 | |
| 6037 | { &hf_afp_vol_backup_date, |
| 6038 | { "Backup date", "afp.vol_backup_date", |
| 6039 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 6040 | "Volume backup date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6041 | |
| 6042 | { &hf_afp_vol_bytes_free, |
| 6043 | { "Bytes free", "afp.vol_bytes_free", |
| 6044 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6045 | "Free space", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6046 | |
| 6047 | { &hf_afp_vol_bytes_total, |
| 6048 | { "Bytes total", "afp.vol_bytes_total", |
| 6049 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6050 | "Volume size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6051 | |
| 6052 | { &hf_afp_vol_ex_bytes_free, |
| 6053 | { "Extended bytes free", "afp.vol_ex_bytes_free", |
| 6054 | FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6055 | "Extended (>2GB) free space", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6056 | |
| 6057 | { &hf_afp_vol_ex_bytes_total, |
| 6058 | { "Extended bytes total", "afp.vol_ex_bytes_total", |
| 6059 | FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6060 | "Extended (>2GB) volume size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6061 | |
| 6062 | { &hf_afp_vol_block_size, |
| 6063 | { "Block size", "afp.vol_block_size", |
| 6064 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6065 | "Volume block size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6066 | |
| 6067 | { &hf_afp_did, |
| 6068 | { "DID", "afp.did", |
| 6069 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6070 | "Parent directory ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6071 | |
| 6072 | { &hf_afp_dir_bitmap, |
| 6073 | { "Directory bitmap", "afp.dir_bitmap", |
| 6074 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 6075 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6076 | |
| 6077 | { &hf_afp_dir_offspring, |
| 6078 | { "Offspring", "afp.dir_offspring", |
| 6079 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6080 | "Directory offspring", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6081 | |
| 6082 | { &hf_afp_dir_OwnerID, |
| 6083 | { "Owner ID", "afp.dir_owner_id", |
| 6084 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6085 | "Directory owner ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6086 | |
| 6087 | { &hf_afp_dir_GroupID, |
| 6088 | { "Group ID", "afp.dir_group_id", |
| 6089 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6090 | "Directory group ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6091 | |
| 6092 | { &hf_afp_creation_date, |
| 6093 | { "Creation date", "afp.creation_date", |
| 6094 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 6095 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6096 | |
| 6097 | { &hf_afp_modification_date, |
| 6098 | { "Modification date", "afp.modification_date", |
| 6099 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 6100 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6101 | |
| 6102 | { &hf_afp_backup_date, |
| 6103 | { "Backup date", "afp.backup_date", |
| 6104 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 6105 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6106 | |
| 6107 | { &hf_afp_finder_info, |
| 6108 | { "Finder info", "afp.finder_info", |
| 6109 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 6110 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6111 | |
| 6112 | { &hf_afp_long_name_offset, |
| 6113 | { "Long name offset", "afp.long_name_offset", |
| 6114 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6115 | "Long name offset in packet", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6116 | |
| 6117 | { &hf_afp_prodos_info, |
| 6118 | { "ProDOS info", "afp.prodos_info", |
| 6119 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 6120 | "ProDOS file information", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } }, |
| 6121 | |
| 6122 | { &hf_afp_prodos_type, |
| 6123 | { "ProDOS type", "afp.prodos_type", |
| 6124 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 6125 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } }, |
| 6126 | |
| 6127 | { &hf_afp_prodos_auxtype, |
| 6128 | { "ProDOS aux. type", "afp.prodos_auxtype", |
| 6129 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 6130 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } }, |
| 6131 | |
| 6132 | { &hf_afp_short_name_offset, |
| 6133 | { "Short name offset", "afp.short_name_offset", |
| 6134 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6135 | "Short name offset in packet", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6136 | |
| 6137 | { &hf_afp_unicode_name_offset, |
| 6138 | { "Unicode name offset", "afp.unicode_name_offset", |
| 6139 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6140 | "Unicode name offset in packet", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6141 | |
| 6142 | { &hf_afp_unix_privs_uid, |
| 6143 | { "UID", "afp.unix_privs.uid", |
| 6144 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6145 | "User ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6146 | |
| 6147 | { &hf_afp_unix_privs_gid, |
| 6148 | { "GID", "afp.unix_privs.gid", |
| 6149 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6150 | "Group ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6151 | |
| 6152 | { &hf_afp_unix_privs_permissions, |
| 6153 | { "Permissions", "afp.unix_privs.permissions", |
| 6154 | FT_UINT32, BASE_OCT, NULL((void*)0), 0x0, |
| 6155 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6156 | |
| 6157 | { &hf_afp_unix_privs_ua_permissions, |
| 6158 | { "User's access rights", "afp.unix_privs.ua_permissions", |
| 6159 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6160 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6161 | |
| 6162 | { &hf_afp_file_id, |
| 6163 | { "File ID", "afp.file_id", |
| 6164 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6165 | "File/directory ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6166 | |
| 6167 | { &hf_afp_file_DataForkLen, |
| 6168 | { "Data fork size", "afp.data_fork_len", |
| 6169 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6170 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6171 | |
| 6172 | { &hf_afp_file_RsrcForkLen, |
| 6173 | { "Resource fork size", "afp.resource_fork_len", |
| 6174 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6175 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6176 | |
| 6177 | { &hf_afp_file_ExtDataForkLen, |
| 6178 | { "Extended data fork size", "afp.ext_data_fork_len", |
| 6179 | FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6180 | "Extended (>2GB) data fork length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6181 | |
| 6182 | { &hf_afp_file_ExtRsrcForkLen, |
| 6183 | { "Extended resource fork size", "afp.ext_resource_fork_len", |
| 6184 | FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6185 | "Extended (>2GB) resource fork length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6186 | |
| 6187 | { &hf_afp_req_count, |
| 6188 | { "Req count", "afp.req_count", |
| 6189 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6190 | "Maximum number of structures returned", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6191 | |
| 6192 | { &hf_afp_start_index, |
| 6193 | { "Start index", "afp.start_index", |
| 6194 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6195 | "First structure returned", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6196 | |
| 6197 | { &hf_afp_max_reply_size, |
| 6198 | { "Reply size", "afp.reply_size", |
| 6199 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6200 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6201 | |
| 6202 | { &hf_afp_start_index32, |
| 6203 | { "Start index", "afp.start_index32", |
| 6204 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6205 | "First structure returned", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6206 | |
| 6207 | { &hf_afp_max_reply_size32, |
| 6208 | { "Reply size", "afp.reply_size32", |
| 6209 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6210 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6211 | |
| 6212 | { &hf_afp_file_flag, |
| 6213 | { "Dir", "afp.file_flag", |
| 6214 | FT_BOOLEAN, 8, NULL((void*)0), 0x80, |
| 6215 | "Is a dir", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6216 | |
| 6217 | { &hf_afp_create_flag, |
| 6218 | { "Hard create", "afp.create_flag", |
| 6219 | FT_BOOLEAN, 8, NULL((void*)0), 0x80, |
| 6220 | "Soft/hard create file", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6221 | |
| 6222 | { &hf_afp_request_bitmap, |
| 6223 | { "Request Bitmap", "afp.request_bitmap", |
| 6224 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6225 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6226 | |
| 6227 | { &hf_afp_request_bitmap_Attributes, |
| 6228 | { "Attributes", "afp.request_bitmap.attributes", |
| 6229 | FT_BOOLEAN, 32, NULL((void*)0), kFPAttributeBit(1U << 0), |
| 6230 | "Search attributes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6231 | |
| 6232 | { &hf_afp_request_bitmap_ParentDirID, |
| 6233 | { "DID", "afp.request_bitmap.did", |
| 6234 | FT_BOOLEAN, 32, NULL((void*)0), kFPParentDirIDBit(1U << 1), |
| 6235 | "Search parent directory ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6236 | |
| 6237 | { &hf_afp_request_bitmap_CreateDate, |
| 6238 | { "Creation date", "afp.request_bitmap.create_date", |
| 6239 | FT_BOOLEAN, 32, NULL((void*)0), kFPCreateDateBit(1U << 2), |
| 6240 | "Search creation date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6241 | |
| 6242 | { &hf_afp_request_bitmap_ModDate, |
| 6243 | { "Modification date", "afp.request_bitmap.mod_date", |
| 6244 | FT_BOOLEAN, 32, NULL((void*)0), kFPModDateBit(1U << 3), |
| 6245 | "Search modification date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6246 | |
| 6247 | { &hf_afp_request_bitmap_BackupDate, |
| 6248 | { "Backup date", "afp.request_bitmap.backup_date", |
| 6249 | FT_BOOLEAN, 32, NULL((void*)0), kFPBackupDateBit(1U << 4), |
| 6250 | "Search backup date", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6251 | |
| 6252 | { &hf_afp_request_bitmap_FinderInfo, |
| 6253 | { "Finder info", "afp.request_bitmap.finder_info", |
| 6254 | FT_BOOLEAN, 32, NULL((void*)0), kFPFinderInfoBit(1U << 5), |
| 6255 | "Search finder info", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6256 | |
| 6257 | { &hf_afp_request_bitmap_LongName, |
| 6258 | { "Long name", "afp.request_bitmap.long_name", |
| 6259 | FT_BOOLEAN, 32, NULL((void*)0), kFPLongNameBit(1U << 6), |
| 6260 | "Search long name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6261 | |
| 6262 | { &hf_afp_request_bitmap_DataForkLen, |
| 6263 | { "Data fork size", "afp.request_bitmap.data_fork_len", |
| 6264 | FT_BOOLEAN, 32, NULL((void*)0), kFPDataForkLenBit(1U << 9), |
| 6265 | "Search data fork size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6266 | |
| 6267 | { &hf_afp_request_bitmap_OffspringCount, |
| 6268 | { "Offspring count", "afp.request_bitmap.offspring_count", |
| 6269 | FT_BOOLEAN, 32, NULL((void*)0), kFPOffspringCountBit(1U << 9), |
| 6270 | "Search offspring count", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6271 | |
| 6272 | { &hf_afp_request_bitmap_RsrcForkLen, |
| 6273 | { "Resource fork size", "afp.request_bitmap.resource_fork_len", |
| 6274 | FT_BOOLEAN, 32, NULL((void*)0), kFPRsrcForkLenBit(1U << 10), |
| 6275 | "Search resource fork size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6276 | |
| 6277 | { &hf_afp_request_bitmap_ExtDataForkLen, |
| 6278 | { "Extended data fork size", "afp.request_bitmap.ex_data_fork_len", |
| 6279 | FT_BOOLEAN, 32, NULL((void*)0), kFPExtDataForkLenBit(1U << 11), |
| 6280 | "Search extended (>2GB) data fork size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6281 | |
| 6282 | { &hf_afp_request_bitmap_UTF8Name, |
| 6283 | { "UTF-8 name", "afp.request_bitmap.UTF8_name", |
| 6284 | FT_BOOLEAN, 32, NULL((void*)0), kFPUTF8NameBit(1U << 13), |
| 6285 | "Search UTF-8 name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6286 | |
| 6287 | { &hf_afp_request_bitmap_ExtRsrcForkLen, |
| 6288 | { "Extended resource fork size", "afp.request_bitmap.ex_resource_fork_len", |
| 6289 | FT_BOOLEAN, 32, NULL((void*)0), kFPExtRsrcForkLenBit(1U << 14), |
| 6290 | "Search extended (>2GB) resource fork size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6291 | |
| 6292 | { &hf_afp_request_bitmap_PartialNames, |
| 6293 | { "Match on partial names", "afp.request_bitmap.partial_names", |
| 6294 | FT_BOOLEAN, 32, NULL((void*)0), 0x80000000, |
| 6295 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6296 | |
| 6297 | { &hf_afp_struct_size, |
| 6298 | { "Struct size", "afp.struct_size", |
| 6299 | FT_UINT8, BASE_DEC, NULL((void*)0),0, |
| 6300 | "Sizeof of struct", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6301 | |
| 6302 | { &hf_afp_struct_size16, |
| 6303 | { "Struct size", "afp.struct_size16", |
| 6304 | FT_UINT16, BASE_DEC, NULL((void*)0),0, |
| 6305 | "Sizeof of struct", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6306 | |
| 6307 | { &hf_afp_flag, |
| 6308 | { "From", "afp.flag", |
| 6309 | FT_UINT8, BASE_HEX, VALS(flag_vals)((0 ? (const struct _value_string*)0 : ((flag_vals)))), 0x80, |
| 6310 | "Offset is relative to start/end of the fork", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6311 | |
| 6312 | { &hf_afp_dt_ref, |
| 6313 | { "DT ref", "afp.dt_ref", |
| 6314 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6315 | "Desktop database reference num", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6316 | |
| 6317 | { &hf_afp_ofork, |
| 6318 | { "Fork", "afp.ofork", |
| 6319 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6320 | "Open fork reference number", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6321 | |
| 6322 | { &hf_afp_offset, |
| 6323 | { "Offset", "afp.offset", |
| 6324 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6325 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6326 | |
| 6327 | { &hf_afp_rw_count, |
| 6328 | { "Count", "afp.rw_count", |
| 6329 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6330 | "Number of bytes to be read/written", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6331 | |
| 6332 | { &hf_afp_newline_mask, |
| 6333 | { "Newline mask", "afp.newline_mask", |
| 6334 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 6335 | "Value to AND bytes with when looking for newline", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6336 | |
| 6337 | { &hf_afp_newline_char, |
| 6338 | { "Newline char", "afp.newline_char", |
| 6339 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 6340 | "Value to compare ANDed bytes with when looking for newline", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6341 | |
| 6342 | { &hf_afp_last_written, |
| 6343 | { "Last written", "afp.last_written", |
| 6344 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6345 | "Offset of the last byte written", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6346 | |
| 6347 | { &hf_afp_ofork_len, |
| 6348 | { "New length", "afp.ofork_len", |
| 6349 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6350 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6351 | |
| 6352 | { &hf_afp_path_type, |
| 6353 | { "Type", "afp.path_type", |
| 6354 | FT_UINT8, BASE_HEX, VALS(path_type_vals)((0 ? (const struct _value_string*)0 : ((path_type_vals)))), 0, |
| 6355 | "Type of names", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6356 | |
| 6357 | { &hf_afp_path_len, |
| 6358 | { "Len", "afp.path_len", |
| 6359 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 6360 | "Path length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6361 | |
| 6362 | { &hf_afp_path_unicode_len, |
| 6363 | { "Len", "afp.path_unicode_len", |
| 6364 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6365 | "Path length (unicode)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6366 | |
| 6367 | { &hf_afp_path_unicode_hint, |
| 6368 | { "Unicode hint", "afp.path_unicode_hint", |
| 6369 | FT_UINT32, BASE_HEX|BASE_EXT_STRING0x00000200, &unicode_hint_vals_ext, 0x0, |
| 6370 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6371 | |
| 6372 | { &hf_afp_path_name, |
| 6373 | { "Name", "afp.path_name", |
| 6374 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 6375 | "Path name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6376 | |
| 6377 | { &hf_afp_fork_type, |
| 6378 | { "Resource fork", "afp.fork_type", |
| 6379 | FT_BOOLEAN, 8, NULL((void*)0), 0x80, |
| 6380 | "Data/resource fork", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6381 | |
| 6382 | { &hf_afp_access_mode, |
| 6383 | { "Access mode", "afp.access", |
| 6384 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 6385 | "Fork access mode", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6386 | |
| 6387 | { &hf_afp_access_read, |
| 6388 | { "Read", "afp.access.read", |
| 6389 | FT_BOOLEAN, 16, NULL((void*)0), 0x0001, |
| 6390 | "Open for reading", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6391 | |
| 6392 | { &hf_afp_access_write, |
| 6393 | { "Write", "afp.access.write", |
| 6394 | FT_BOOLEAN, 16, NULL((void*)0), 0x0002, |
| 6395 | "Open for writing", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6396 | |
| 6397 | { &hf_afp_access_deny_read, |
| 6398 | { "Deny read", "afp.access.deny_read", |
| 6399 | FT_BOOLEAN, 16, NULL((void*)0), 0x0010, |
| 6400 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6401 | |
| 6402 | { &hf_afp_access_deny_write, |
| 6403 | { "Deny write", "afp.access.deny_write", |
| 6404 | FT_BOOLEAN, 16, NULL((void*)0), 0x0020, |
| 6405 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6406 | |
| 6407 | { &hf_afp_comment, |
| 6408 | { "Comment", "afp.comment", |
| 6409 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 6410 | "File/folder comment", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6411 | |
| 6412 | /* |
| 6413 | * XXX - should this be a type that's displayed as |
| 6414 | * text if it's all printable ASCII and hex otherwise, |
| 6415 | * or something such as that? |
| 6416 | */ |
| 6417 | { &hf_afp_file_creator, |
| 6418 | { "File creator", "afp.file_creator", |
| 6419 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 6420 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6421 | |
| 6422 | /* |
| 6423 | * XXX - should this be a type that's displayed as |
| 6424 | * text if it's all printable ASCII and hex otherwise, |
| 6425 | * or something such as that? |
| 6426 | */ |
| 6427 | { &hf_afp_file_type, |
| 6428 | { "File type", "afp.file_type", |
| 6429 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 6430 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6431 | |
| 6432 | { &hf_afp_icon_type, |
| 6433 | { "Icon type", "afp.icon_type", |
| 6434 | FT_UINT8, BASE_HEX, NULL((void*)0) , 0, |
| 6435 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6436 | |
| 6437 | { &hf_afp_icon_length, |
| 6438 | { "Size", "afp.icon_length", |
| 6439 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6440 | "Size for icon bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6441 | |
| 6442 | { &hf_afp_icon_index, |
| 6443 | { "Index", "afp.icon_index", |
| 6444 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6445 | "Icon index in desktop database", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6446 | |
| 6447 | { &hf_afp_icon_tag, |
| 6448 | { "Tag", "afp.icon_tag", |
| 6449 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6450 | "Icon tag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6451 | |
| 6452 | { &hf_afp_appl_index, |
| 6453 | { "Index", "afp.appl_index", |
| 6454 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6455 | "Application index", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6456 | |
| 6457 | { &hf_afp_appl_tag, |
| 6458 | { "Tag", "afp.appl_tag", |
| 6459 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6460 | "Application tag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6461 | |
| 6462 | { &hf_afp_lock_op, |
| 6463 | { "unlock", "afp.lock_op", |
| 6464 | FT_BOOLEAN, 8, NULL((void*)0), 0x1, |
| 6465 | "Lock/unlock op", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6466 | |
| 6467 | { &hf_afp_lock_from, |
| 6468 | { "End", "afp.lock_from", |
| 6469 | FT_BOOLEAN, 8, NULL((void*)0), 0x80, |
| 6470 | "Offset is relative to the end of the fork", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6471 | |
| 6472 | { &hf_afp_lock_offset, |
| 6473 | { "Offset", "afp.lock_offset", |
| 6474 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6475 | "First byte to be locked", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6476 | |
| 6477 | { &hf_afp_lock_len, |
| 6478 | { "Length", "afp.lock_len", |
| 6479 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6480 | "Number of bytes to be locked/unlocked", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6481 | |
| 6482 | { &hf_afp_lock_range_start, |
| 6483 | { "Start", "afp.lock_range_start", |
| 6484 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6485 | "First byte locked/unlocked", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6486 | |
| 6487 | { &hf_afp_dir_ar, |
| 6488 | { "Access rights", "afp.dir_ar", |
| 6489 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6490 | "Directory access rights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6491 | |
| 6492 | { &hf_afp_dir_ar_o_search, |
| 6493 | { "Owner has search access", "afp.dir_ar.o_search", |
| 6494 | FT_BOOLEAN, 32, NULL((void*)0), AR_O_SEARCH(1U << 0), |
| 6495 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6496 | |
| 6497 | { &hf_afp_dir_ar_o_read, |
| 6498 | { "Owner has read access", "afp.dir_ar.o_read", |
| 6499 | FT_BOOLEAN, 32, NULL((void*)0), AR_O_READ(1U << 1), |
| 6500 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6501 | |
| 6502 | { &hf_afp_dir_ar_o_write, |
| 6503 | { "Owner has write access", "afp.dir_ar.o_write", |
| 6504 | FT_BOOLEAN, 32, NULL((void*)0), AR_O_WRITE(1U << 2), |
| 6505 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6506 | |
| 6507 | { &hf_afp_dir_ar_g_search, |
| 6508 | { "Group has search access", "afp.dir_ar.g_search", |
| 6509 | FT_BOOLEAN, 32, NULL((void*)0), AR_G_SEARCH(1U << 8), |
| 6510 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6511 | |
| 6512 | { &hf_afp_dir_ar_g_read, |
| 6513 | { "Group has read access", "afp.dir_ar.g_read", |
| 6514 | FT_BOOLEAN, 32, NULL((void*)0), AR_G_READ(1U << 9), |
| 6515 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6516 | |
| 6517 | { &hf_afp_dir_ar_g_write, |
| 6518 | { "Group has write access", "afp.dir_ar.g_write", |
| 6519 | FT_BOOLEAN, 32, NULL((void*)0), AR_G_WRITE(1U << 10), |
| 6520 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6521 | |
| 6522 | { &hf_afp_dir_ar_e_search, |
| 6523 | { "Everyone has search access", "afp.dir_ar.e_search", |
| 6524 | FT_BOOLEAN, 32, NULL((void*)0), AR_E_SEARCH(1U << 16), |
| 6525 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6526 | |
| 6527 | { &hf_afp_dir_ar_e_read, |
| 6528 | { "Everyone has read access", "afp.dir_ar.e_read", |
| 6529 | FT_BOOLEAN, 32, NULL((void*)0), AR_E_READ(1U << 17), |
| 6530 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6531 | |
| 6532 | { &hf_afp_dir_ar_e_write, |
| 6533 | { "Everyone has write access", "afp.dir_ar.e_write", |
| 6534 | FT_BOOLEAN, 32, NULL((void*)0), AR_E_WRITE(1U << 18), |
| 6535 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6536 | |
| 6537 | { &hf_afp_dir_ar_u_search, |
| 6538 | { "User has search access", "afp.dir_ar.u_search", |
| 6539 | FT_BOOLEAN, 32, NULL((void*)0), AR_U_SEARCH(1U << 24), |
| 6540 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6541 | |
| 6542 | { &hf_afp_dir_ar_u_read, |
| 6543 | { "User has read access", "afp.dir_ar.u_read", |
| 6544 | FT_BOOLEAN, 32, NULL((void*)0), AR_U_READ(1U << 25), |
| 6545 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6546 | |
| 6547 | { &hf_afp_dir_ar_u_write, |
| 6548 | { "User has write access", "afp.dir_ar.u_write", |
| 6549 | FT_BOOLEAN, 32, NULL((void*)0), AR_U_WRITE(1U << 26), |
| 6550 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6551 | |
| 6552 | { &hf_afp_dir_ar_blank, |
| 6553 | { "Blank access right", "afp.dir_ar.blank", |
| 6554 | FT_BOOLEAN, 32, NULL((void*)0), AR_BLANK(1U << 28), |
| 6555 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6556 | |
| 6557 | { &hf_afp_dir_ar_u_own, |
| 6558 | { "User is the owner", "afp.dir_ar.u_owner", |
| 6559 | FT_BOOLEAN, 32, NULL((void*)0), AR_U_OWN(1U << 31), |
| 6560 | "Current user is the directory owner", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6561 | |
| 6562 | { &hf_afp_server_time, |
| 6563 | { "Server time", "afp.server_time", |
| 6564 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 6565 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6566 | |
| 6567 | { &hf_afp_cat_req_matches, |
| 6568 | { "Max answers", "afp.cat_req_matches", |
| 6569 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6570 | "Maximum number of matches to return.", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6571 | |
| 6572 | { &hf_afp_reserved, |
| 6573 | { "Reserved", "afp.reserved", |
| 6574 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 6575 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6576 | |
| 6577 | { &hf_afp_cat_count, |
| 6578 | { "Cat count", "afp.cat_count", |
| 6579 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6580 | "Number of structures returned", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6581 | |
| 6582 | { &hf_afp_cat_position, |
| 6583 | { "Position", "afp.cat_position", |
| 6584 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 6585 | "Catalog position", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6586 | |
| 6587 | { &hf_afp_map_name_type, |
| 6588 | { "Type", "afp.map_name_type", |
| 6589 | FT_UINT8, BASE_DEC|BASE_EXT_STRING0x00000200, &map_name_type_vals_ext, 0x0, |
| 6590 | "Map name type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6591 | |
| 6592 | { &hf_afp_map_id_type, |
| 6593 | { "Type", "afp.map_id_type", |
| 6594 | FT_UINT8, BASE_DEC|BASE_EXT_STRING0x00000200, &map_id_type_vals_ext, 0x0, |
| 6595 | "Map ID type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6596 | |
| 6597 | { &hf_afp_map_id, |
| 6598 | { "ID", "afp.map_id", |
| 6599 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6600 | "User/Group ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6601 | |
| 6602 | { &hf_afp_map_id_reply_type, |
| 6603 | { "Reply type", "afp.map_id_reply_type", |
| 6604 | FT_UINT32, BASE_DEC, VALS(map_id_reply_type_vals)((0 ? (const struct _value_string*)0 : ((map_id_reply_type_vals )))), 0x0, |
| 6605 | "Map ID reply type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6606 | |
| 6607 | { &hf_afp_map_name, |
| 6608 | { "Name", "afp.map_name", |
| 6609 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 6610 | "User/Group name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6611 | |
| 6612 | /* AFP 3.0 */ |
| 6613 | { &hf_afp_lock_offset64, |
| 6614 | { "Offset", "afp.lock_offset64", |
| 6615 | FT_INT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6616 | "First byte to be locked (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6617 | |
| 6618 | { &hf_afp_lock_len64, |
| 6619 | { "Length", "afp.lock_len64", |
| 6620 | FT_INT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6621 | "Number of bytes to be locked/unlocked (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6622 | |
| 6623 | { &hf_afp_lock_range_start64, |
| 6624 | { "Start", "afp.lock_range_start64", |
| 6625 | FT_INT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6626 | "First byte locked/unlocked (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6627 | |
| 6628 | { &hf_afp_offset64, |
| 6629 | { "Offset", "afp.offset64", |
| 6630 | FT_INT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6631 | "Offset (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6632 | |
| 6633 | { &hf_afp_rw_count64, |
| 6634 | { "Count", "afp.rw_count64", |
| 6635 | FT_INT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6636 | "Number of bytes to be read/written (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6637 | |
| 6638 | { &hf_afp_last_written64, |
| 6639 | { "Last written", "afp.last_written64", |
| 6640 | FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6641 | "Offset of the last byte written (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6642 | |
| 6643 | { &hf_afp_ofork_len64, |
| 6644 | { "New length", "afp.ofork_len64", |
| 6645 | FT_INT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6646 | "New length (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6647 | |
| 6648 | { &hf_afp_session_token_type, |
| 6649 | { "Type", "afp.session_token_type", |
| 6650 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &token_type_vals_ext, 0x0, |
| 6651 | "Session token type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6652 | |
| 6653 | /* FIXME FT_UINT32 in specs */ |
| 6654 | { &hf_afp_session_token_len, |
| 6655 | { "Len", "afp.session_token_len", |
| 6656 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6657 | "Session token length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6658 | |
| 6659 | { &hf_afp_session_token_timestamp, |
| 6660 | { "Time stamp", "afp.session_token_timestamp", |
| 6661 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6662 | "Session time stamp", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6663 | |
| 6664 | { &hf_afp_session_token, |
| 6665 | { "Token", "afp.session_token", |
| 6666 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 6667 | "Session token", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6668 | |
| 6669 | { &hf_afp_user_flag, |
| 6670 | { "Flag", "afp.user_flag", |
| 6671 | FT_UINT8, BASE_HEX, VALS(user_flag_vals)((0 ? (const struct _value_string*)0 : ((user_flag_vals)))), 0x01, |
| 6672 | "User Info flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6673 | |
| 6674 | { &hf_afp_user_ID, |
| 6675 | { "User ID", "afp.user_ID", |
| 6676 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6677 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6678 | |
| 6679 | { &hf_afp_group_ID, |
| 6680 | { "Group ID", "afp.group_ID", |
| 6681 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6682 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6683 | |
| 6684 | { &hf_afp_UUID, |
| 6685 | { "UUID", "afp.uuid", |
| 6686 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 6687 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6688 | |
| 6689 | { &hf_afp_GRPUUID, |
| 6690 | { "GRPUUID", "afp.grpuuid", |
| 6691 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 6692 | "Group UUID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6693 | |
| 6694 | { &hf_afp_user_bitmap, |
| 6695 | { "Bitmap", "afp.user_bitmap", |
| 6696 | FT_UINT16, BASE_HEX, NULL((void*)0), 0, |
| 6697 | "User Info bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6698 | |
| 6699 | { &hf_afp_user_bitmap_UID, |
| 6700 | { "User ID", "afp.user_bitmap.UID", |
| 6701 | FT_BOOLEAN, 16, NULL((void*)0), 0x0001, |
| 6702 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6703 | |
| 6704 | { &hf_afp_user_bitmap_GID, |
| 6705 | { "Primary group ID", "afp.user_bitmap.GID", |
| 6706 | FT_BOOLEAN, 16, NULL((void*)0), 0x0002, |
| 6707 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6708 | |
| 6709 | { &hf_afp_user_bitmap_UUID, |
| 6710 | { "UUID", "afp.user_bitmap.UUID", |
| 6711 | FT_BOOLEAN, 16, NULL((void*)0), 0x0004, |
| 6712 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6713 | |
| 6714 | { &hf_afp_message_type, |
| 6715 | { "Type", "afp.message_type", |
| 6716 | FT_UINT16, BASE_HEX, VALS(server_message_type)((0 ? (const struct _value_string*)0 : ((server_message_type) ))), 0, |
| 6717 | "Type of server message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6718 | |
| 6719 | { &hf_afp_message_bitmap, |
| 6720 | { "Bitmap", "afp.message_bitmap", |
| 6721 | FT_UINT16, BASE_HEX, NULL((void*)0), 0, |
| 6722 | "Message bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6723 | |
| 6724 | /* |
| 6725 | * XXX - in the reply, this indicates whether the message |
| 6726 | * is a server message or a login message. |
| 6727 | */ |
| 6728 | { &hf_afp_message_bitmap_REQ, |
| 6729 | { "Request message", "afp.message_bitmap.requested", |
| 6730 | FT_BOOLEAN, 16, NULL((void*)0), 0x0001, |
| 6731 | "Message Requested", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6732 | |
| 6733 | { &hf_afp_message_bitmap_UTF, |
| 6734 | { "Message is UTF-8", "afp.message_bitmap.utf8", |
| 6735 | FT_BOOLEAN, 16, NULL((void*)0), 0x0002, |
| 6736 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6737 | |
| 6738 | { &hf_afp_message_len, |
| 6739 | { "Len", "afp.message_length", |
| 6740 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6741 | "Message length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6742 | |
| 6743 | { &hf_afp_message, |
| 6744 | { "Message", "afp.message", |
| 6745 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 6746 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6747 | |
| 6748 | { &hf_afp_reqcount64, |
| 6749 | { "Count", "afp.reqcount64", |
| 6750 | FT_INT64, BASE_DEC, NULL((void*)0), 0x0, |
| 6751 | "Request Count (64 bits)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6752 | |
| 6753 | { &hf_afp_extattr_bitmap, |
| 6754 | { "Bitmap", "afp.extattr_bitmap", |
| 6755 | FT_UINT16, BASE_HEX, NULL((void*)0), 0, |
| 6756 | "Extended attributes bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6757 | |
| 6758 | { &hf_afp_extattr_bitmap_NoFollow, |
| 6759 | { "No follow symlinks", "afp.extattr_bitmap.nofollow", |
| 6760 | FT_BOOLEAN, 16, NULL((void*)0), 0x0001, |
| 6761 | "Do not follow symlink", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6762 | |
| 6763 | { &hf_afp_extattr_bitmap_Create, |
| 6764 | { "Create", "afp.extattr_bitmap.create", |
| 6765 | FT_BOOLEAN, 16, NULL((void*)0), 0x0002, |
| 6766 | "Create extended attribute", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6767 | |
| 6768 | { &hf_afp_extattr_bitmap_Replace, |
| 6769 | { "Replace", "afp.extattr_bitmap.replace", |
| 6770 | FT_BOOLEAN, 16, NULL((void*)0), 0x0004, |
| 6771 | "Replace extended attribute", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6772 | |
| 6773 | { &hf_afp_extattr_namelen, |
| 6774 | { "Length", "afp.extattr.namelen", |
| 6775 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6776 | "Extended attribute name length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6777 | |
| 6778 | { &hf_afp_extattr_name, |
| 6779 | { "Name", "afp.extattr.name", |
| 6780 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 6781 | "Extended attribute name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6782 | |
| 6783 | { &hf_afp_extattr_len, |
| 6784 | { "Length", "afp.extattr.len", |
| 6785 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6786 | "Extended attribute length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6787 | |
| 6788 | { &hf_afp_extattr_data, |
| 6789 | { "Data", "afp.extattr.data", |
| 6790 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 6791 | "Extended attribute data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6792 | |
| 6793 | { &hf_afp_extattr_req_count, |
| 6794 | { "Request Count", "afp.extattr.req_count", |
| 6795 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 6796 | "Request Count.", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6797 | |
| 6798 | { &hf_afp_extattr_start_index, |
| 6799 | { "Index", "afp.extattr.start_index", |
| 6800 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6801 | "Start index", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6802 | |
| 6803 | { &hf_afp_extattr_reply_size, |
| 6804 | { "Reply size", "afp.extattr.reply_size", |
| 6805 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 6806 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6807 | |
| 6808 | /* ACL control list bitmap */ |
| 6809 | { &hf_afp_access_bitmap, |
| 6810 | { "Bitmap", "afp.access_bitmap", |
| 6811 | FT_UINT16, BASE_HEX, NULL((void*)0), 0, |
| 6812 | "Bitmap (reserved)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6813 | |
| 6814 | { &hf_afp_acl_list_bitmap, |
| 6815 | { "ACL bitmap", "afp.acl_list_bitmap", |
| 6816 | FT_UINT16, BASE_HEX, NULL((void*)0), 0, |
| 6817 | "ACL control list bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6818 | |
| 6819 | { &hf_afp_acl_list_bitmap_UUID, |
| 6820 | { "UUID", "afp.acl_list_bitmap.UUID", |
| 6821 | FT_BOOLEAN, 16, NULL((void*)0), kFileSec_UUID(1U << 0), |
| 6822 | "User UUID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6823 | |
| 6824 | { &hf_afp_acl_list_bitmap_GRPUUID, |
| 6825 | { "GRPUUID", "afp.acl_list_bitmap.GRPUUID", |
| 6826 | FT_BOOLEAN, 16, NULL((void*)0), kFileSec_GRPUUID(1U << 1), |
| 6827 | "Group UUID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6828 | |
| 6829 | { &hf_afp_acl_list_bitmap_ACL, |
| 6830 | { "ACL", "afp.acl_list_bitmap.ACL", |
| 6831 | FT_BOOLEAN, 16, NULL((void*)0), kFileSec_ACL(1U << 2), |
| 6832 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6833 | |
| 6834 | { &hf_afp_acl_list_bitmap_REMOVEACL, |
| 6835 | { "Remove ACL", "afp.acl_list_bitmap.REMOVEACL", |
| 6836 | FT_BOOLEAN, 16, NULL((void*)0), kFileSec_REMOVEACL(1U << 3), |
| 6837 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6838 | |
| 6839 | { &hf_afp_acl_list_bitmap_Inherit, |
| 6840 | { "Inherit", "afp.acl_list_bitmap.Inherit", |
| 6841 | FT_BOOLEAN, 16, NULL((void*)0), kFileSec_Inherit(1U << 4), |
| 6842 | "Inherit ACL", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6843 | |
| 6844 | { &hf_afp_acl_entrycount, |
| 6845 | { "ACEs count", "afp.acl_entrycount", |
| 6846 | FT_UINT32, BASE_HEX, NULL((void*)0), 0, |
| 6847 | "Number of ACL entries", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6848 | |
| 6849 | { &hf_afp_acl_flags, |
| 6850 | { "ACL flags", "afp.acl_flags", |
| 6851 | FT_UINT32, BASE_HEX, NULL((void*)0), 0, |
| 6852 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6853 | |
| 6854 | { &hf_afp_acl_access_bitmap, |
| 6855 | { "Bitmap", "afp.acl_access_bitmap", |
| 6856 | FT_UINT32, BASE_HEX, NULL((void*)0), 0, |
| 6857 | "ACL access bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6858 | |
| 6859 | { &hf_afp_acl_access_bitmap_read_data, |
| 6860 | { "Read/List", "afp.acl_access_bitmap.read_data", |
| 6861 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_READ_DATA(1U << 1), |
| 6862 | "Read data / list directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6863 | |
| 6864 | { &hf_afp_acl_access_bitmap_write_data, |
| 6865 | { "Write/Add file", "afp.acl_access_bitmap.write_data", |
| 6866 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_WRITE_DATA(1U << 2), |
| 6867 | "Write data to a file / add a file to a directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6868 | |
| 6869 | { &hf_afp_acl_access_bitmap_execute, |
| 6870 | { "Execute/Search", "afp.acl_access_bitmap.execute", |
| 6871 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_EXECUTE(1U << 3), |
| 6872 | "Execute a program", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6873 | |
| 6874 | { &hf_afp_acl_access_bitmap_delete, |
| 6875 | { "Delete", "afp.acl_access_bitmap.delete", |
| 6876 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_DELETE(1U << 4), |
| 6877 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6878 | |
| 6879 | { &hf_afp_acl_access_bitmap_append_data, |
| 6880 | { "Append data/create subdir", "afp.acl_access_bitmap.append_data", |
| 6881 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_APPEND_DATA(1U << 5), |
| 6882 | "Append data to a file / create a subdirectory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6883 | |
| 6884 | { &hf_afp_acl_access_bitmap_delete_child, |
| 6885 | { "Delete dir", "afp.acl_access_bitmap.delete_child", |
| 6886 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_DELETE_CHILD(1U << 6), |
| 6887 | "Delete directory", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6888 | |
| 6889 | { &hf_afp_acl_access_bitmap_read_attrs, |
| 6890 | { "Read attributes", "afp.acl_access_bitmap.read_attrs", |
| 6891 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_READ_ATTRIBUTES(1U << 7), |
| 6892 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6893 | |
| 6894 | { &hf_afp_acl_access_bitmap_write_attrs, |
| 6895 | { "Write attributes", "afp.acl_access_bitmap.write_attrs", |
| 6896 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_WRITE_ATTRIBUTES(1U << 8), |
| 6897 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6898 | |
| 6899 | { &hf_afp_acl_access_bitmap_read_extattrs, |
| 6900 | { "Read extended attributes", "afp.acl_access_bitmap.read_extattrs", |
| 6901 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_READ_EXTATTRIBUTES(1U << 9), |
| 6902 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6903 | |
| 6904 | { &hf_afp_acl_access_bitmap_write_extattrs, |
| 6905 | { "Write extended attributes", "afp.acl_access_bitmap.write_extattrs", |
| 6906 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_WRITE_EXTATTRIBUTES(1U << 10), |
| 6907 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6908 | |
| 6909 | { &hf_afp_acl_access_bitmap_read_security, |
| 6910 | { "Read security", "afp.acl_access_bitmap.read_security", |
| 6911 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_READ_SECURITY(1U << 11), |
| 6912 | "Read access rights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6913 | |
| 6914 | { &hf_afp_acl_access_bitmap_write_security, |
| 6915 | { "Write security", "afp.acl_access_bitmap.write_security", |
| 6916 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_WRITE_SECURITY(1U << 12), |
| 6917 | "Write access rights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6918 | |
| 6919 | { &hf_afp_acl_access_bitmap_change_owner, |
| 6920 | { "Change owner", "afp.acl_access_bitmap.change_owner", |
| 6921 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_CHANGE_OWNER(1U << 13), |
| 6922 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6923 | |
| 6924 | { &hf_afp_acl_access_bitmap_synchronize, |
| 6925 | { "Synchronize", "afp.acl_access_bitmap.synchronize", |
| 6926 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_SYNCHRONIZE(1U << 20), |
| 6927 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6928 | |
| 6929 | { &hf_afp_acl_access_bitmap_generic_all, |
| 6930 | { "Generic all", "afp.acl_access_bitmap.generic_all", |
| 6931 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_GENERIC_ALL(1U << 21), |
| 6932 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6933 | |
| 6934 | { &hf_afp_acl_access_bitmap_generic_execute, |
| 6935 | { "Generic execute", "afp.acl_access_bitmap.generic_execute", |
| 6936 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_GENERIC_EXECUTE(1U << 22), |
| 6937 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6938 | |
| 6939 | { &hf_afp_acl_access_bitmap_generic_write, |
| 6940 | { "Generic write", "afp.acl_access_bitmap.generic_write", |
| 6941 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_GENERIC_WRITE(1U << 23), |
| 6942 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6943 | |
| 6944 | { &hf_afp_acl_access_bitmap_generic_read, |
| 6945 | { "Generic read", "afp.acl_access_bitmap.generic_read", |
| 6946 | FT_BOOLEAN, 32, NULL((void*)0), KAUTH_VNODE_GENERIC_READ(1U << 24), |
| 6947 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6948 | |
| 6949 | { &hf_afp_ace_flags, |
| 6950 | { "Flags", "afp.ace_flags", |
| 6951 | FT_UINT32, BASE_HEX, NULL((void*)0), 0, |
| 6952 | "ACE flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6953 | |
| 6954 | { &hf_afp_ace_flags_allow, |
| 6955 | { "Allow", "afp.ace_flags.allow", |
| 6956 | FT_BOOLEAN, 32, NULL((void*)0), ACE_ALLOW(1U << 0), |
| 6957 | "Allow rule", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6958 | |
| 6959 | { &hf_afp_ace_flags_deny, |
| 6960 | { "Deny", "afp.ace_flags.deny", |
| 6961 | FT_BOOLEAN, 32, NULL((void*)0), ACE_DENY(1U << 1), |
| 6962 | "Deny rule", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6963 | |
| 6964 | { &hf_afp_ace_flags_inherited, |
| 6965 | { "Inherited", "afp.ace_flags.inherited", |
| 6966 | FT_BOOLEAN, 32, NULL((void*)0), ACE_INHERITED(1U << 4), |
| 6967 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6968 | |
| 6969 | { &hf_afp_ace_flags_fileinherit, |
| 6970 | { "File inherit", "afp.ace_flags.file_inherit", |
| 6971 | FT_BOOLEAN, 32, NULL((void*)0), ACE_FILE_INHERIT(1U << 5), |
| 6972 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6973 | |
| 6974 | { &hf_afp_ace_flags_dirinherit, |
| 6975 | { "Dir inherit", "afp.ace_flags.directory_inherit", |
| 6976 | FT_BOOLEAN, 32, NULL((void*)0), ACE_DIR_INHERIT(1U << 6), |
| 6977 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6978 | |
| 6979 | { &hf_afp_ace_flags_limitinherit, |
| 6980 | { "Limit inherit", "afp.ace_flags.limit_inherit", |
| 6981 | FT_BOOLEAN, 32, NULL((void*)0), ACE_LIMIT_INHERIT(1U << 7), |
| 6982 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6983 | |
| 6984 | { &hf_afp_ace_flags_onlyinherit, |
| 6985 | { "Only inherit", "afp.ace_flags.only_inherit", |
| 6986 | FT_BOOLEAN, 32, NULL((void*)0), ACE_ONLY_INHERIT(1U << 8), |
| 6987 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6988 | |
| 6989 | { &hf_afp_spotlight_request_flags, |
| 6990 | { "Flags", "afp.spotlight.flags", |
| 6991 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6992 | "Spotlight RPC Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6993 | |
| 6994 | { &hf_afp_spotlight_request_command, |
| 6995 | { "Command", "afp.spotlight.command", |
| 6996 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 6997 | "Spotlight RPC Command", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 6998 | |
| 6999 | { &hf_afp_spotlight_request_reserved, |
| 7000 | { "Reserved", "afp.spotlight.reserved", |
| 7001 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 7002 | "Spotlight RPC Padding", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7003 | |
| 7004 | { &hf_afp_spotlight_reply_reserved, |
| 7005 | { "Reserved", "afp.spotlight.reserved", |
| 7006 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 7007 | "Spotlight RPC Padding", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7008 | |
| 7009 | { &hf_afp_spotlight_volpath_client, |
| 7010 | { "Client's volume path", "afp.spotlight.volpath_client", |
| 7011 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7012 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7013 | |
| 7014 | { &hf_afp_spotlight_volpath_server, |
| 7015 | { "Server's volume path", "afp.spotlight.volpath_server", |
| 7016 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7017 | "Servers's volume path", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7018 | |
| 7019 | { &hf_afp_spotlight_returncode, |
| 7020 | { "Return code", "afp.spotlight.return", |
| 7021 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 7022 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7023 | |
| 7024 | { &hf_afp_spotlight_volflags, |
| 7025 | { "Volume flags", "afp.spotlight.volflags", |
| 7026 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 7027 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7028 | |
| 7029 | { &hf_afp_spotlight_reqlen, |
| 7030 | { "Length", "afp.spotlight.reqlen", |
| 7031 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 7032 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7033 | |
| 7034 | { &hf_afp_spotlight_uuid, |
| 7035 | { "UUID", "afp.spotlight.uuid", |
| 7036 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 7037 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7038 | |
| 7039 | { &hf_afp_spotlight_date, |
| 7040 | { "Date", "afp.spotlight.date", |
| 7041 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL((void*)0), 0x0, |
| 7042 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7043 | |
| 7044 | { &hf_afp_unknown, |
| 7045 | { "Unknown parameter", "afp.unknown_bytes", |
| 7046 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 7047 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7048 | |
| 7049 | /* Status stuff from ASP or DSI */ |
| 7050 | { &hf_afp_utf8_server_name_len, |
| 7051 | { "UTF-8 server name length", "afp.utf8_server_name_len", |
| 7052 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 7053 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7054 | |
| 7055 | { &hf_afp_utf8_server_name, |
| 7056 | { "UTF-8 server name", "afp.utf8_server_name", |
| 7057 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7058 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7059 | |
| 7060 | { &hf_afp_server_name, |
| 7061 | { "Server name", "afp.server_name", |
| 7062 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7063 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7064 | |
| 7065 | { &hf_afp_server_type, |
| 7066 | { "Server type", "afp.server_type", |
| 7067 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7068 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7069 | |
| 7070 | { &hf_afp_server_vers, |
| 7071 | { "AFP version", "afp.server_vers", |
| 7072 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7073 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7074 | |
| 7075 | { &hf_afp_server_uams, |
| 7076 | { "UAM", "afp.server_uams", |
| 7077 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7078 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7079 | |
| 7080 | { &hf_afp_server_icon, |
| 7081 | { "Icon bitmap", "afp.server_icon", |
| 7082 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 7083 | "Server icon bitmap", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7084 | |
| 7085 | { &hf_afp_server_directory, |
| 7086 | { "Directory service", "afp.server_directory", |
| 7087 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7088 | "Server directory service", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7089 | |
| 7090 | { &hf_afp_server_signature, |
| 7091 | { "Server signature", "afp.server_signature", |
| 7092 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 7093 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7094 | |
| 7095 | { &hf_afp_server_flag, |
| 7096 | { "Flag", "afp.server_flag", |
| 7097 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 7098 | "Server capabilities flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7099 | { &hf_afp_server_flag_copyfile, |
| 7100 | { "Support copyfile", "afp.server_flag.copyfile", |
| 7101 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_COPY(1<<0), |
| 7102 | "Server support copyfile", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7103 | { &hf_afp_server_flag_passwd, |
| 7104 | { "Support change password", "afp.server_flag.passwd", |
| 7105 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_PASSWD(1<<1), |
| 7106 | "Server support change password", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7107 | { &hf_afp_server_flag_no_save_passwd, |
| 7108 | { "Don't allow save password", "afp.server_flag.no_save_passwd", |
| 7109 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_NOSAVEPASSWD(1<<2), |
| 7110 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7111 | { &hf_afp_server_flag_srv_msg, |
| 7112 | { "Support server message", "afp.server_flag.srv_msg", |
| 7113 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_SRVMSGS(1<<3), |
| 7114 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7115 | { &hf_afp_server_flag_srv_sig, |
| 7116 | { "Support server signature", "afp.server_flag.srv_sig", |
| 7117 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_SRVSIGNATURE(1<<4), |
| 7118 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7119 | { &hf_afp_server_flag_tcpip, |
| 7120 | { "Support TCP/IP", "afp.server_flag.tcpip", |
| 7121 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_TCPIP(1<<5), |
| 7122 | "Server support TCP/IP", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7123 | { &hf_afp_server_flag_notify, |
| 7124 | { "Support server notifications", "afp.server_flag.notify", |
| 7125 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_SRVNOTIFY(1<<6), |
| 7126 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7127 | { &hf_afp_server_flag_reconnect, |
| 7128 | { "Support server reconnect", "afp.server_flag.reconnect", |
| 7129 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_SRVRECONNECT(1<<7), |
| 7130 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7131 | { &hf_afp_server_flag_directory, |
| 7132 | { "Support directory services", "afp.server_flag.directory", |
| 7133 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_SRVDIRECTORY(1<<8), |
| 7134 | "Server support directory services", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7135 | { &hf_afp_server_flag_utf8_name, |
| 7136 | { "Support UTF-8 server name", "afp.server_flag.utf8_name", |
| 7137 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_SRVUTF8(1<<9), |
| 7138 | "Server support UTF-8 server name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7139 | { &hf_afp_server_flag_uuid, |
| 7140 | { "Support UUIDs", "afp.server_flag.uuids", |
| 7141 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_UUID(1<<10), |
| 7142 | "Server supports UUIDs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7143 | { &hf_afp_server_flag_ext_sleep, |
| 7144 | { "Support extended sleep", "afp.server_flag.ext_sleep", |
| 7145 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_EXT_SLEEP(1<<11), |
| 7146 | "Server supports extended sleep", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7147 | { &hf_afp_server_flag_fast_copy, |
| 7148 | { "Support fast copy", "afp.server_flag.fast_copy", |
| 7149 | FT_BOOLEAN, 16, NULL((void*)0), AFPSRVRINFO_FASTBOZO(1<<15), |
| 7150 | "Server support fast copy", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7151 | |
| 7152 | |
| 7153 | { &hf_afp_server_addr_len, |
| 7154 | { "Length", "afp.server_addr.len", |
| 7155 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7156 | "Address length.", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7157 | |
| 7158 | { &hf_afp_server_addr_type, |
| 7159 | { "Type", "afp.server_addr.type", |
| 7160 | FT_UINT8, BASE_DEC|BASE_EXT_STRING0x00000200, &afp_server_addr_type_vals_ext, 0x0, |
| 7161 | "Address type.", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7162 | |
| 7163 | { &hf_afp_server_addr_value, |
| 7164 | { "Value", "afp.server_addr.value", |
| 7165 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 7166 | "Address value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7167 | |
| 7168 | /* Generated from convert_proto_tree_add_text.pl */ |
| 7169 | { &hf_afp_int64, { "int64", "afp.int64", FT_UINT64, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7170 | { &hf_afp_float, { "float", "afp.float", FT_DOUBLE, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7171 | { &hf_afp_unknown16, { "unknown1", "afp.unknown", FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7172 | { &hf_afp_unknown32, { "unknown2", "afp.unknown", FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7173 | { &hf_afp_cnid, { "CNID", "afp.cnid", FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7174 | { &hf_afp_null, { "null", "afp.null", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7175 | { &hf_afp_string, { "string", "afp.string", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7176 | { &hf_afp_utf_16_string, { "utf-16 string", "afp.utf_16_string", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7177 | { &hf_afp_bool, { "bool", "afp.bool", FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7178 | { &hf_afp_query_type, { "type", "afp.query_type", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7179 | { &hf_afp_toc_offset, { "ToC Offset", "afp.toc_offset", FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7180 | { &hf_afp_toc_entry, { "ToC Entry", "afp.toc_entry", FT_UINT64, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7181 | { &hf_afp_endianness, { "Endianness", "afp.endianness", FT_UINT64, BASE_HEX | BASE_VAL64_STRING0x00000400, VALS64(endian_vals)((0 ? (const struct _val64_string*)0 : ((endian_vals)))), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7182 | { &hf_afp_query_len, { "Query length", "afp.query_len", FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7183 | { &hf_afp_num_toc_entries, { "Number of entries", "afp.num_toc_entries", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7184 | { &hf_afp_machine_offset, { "Machine offset", "afp.machine_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7185 | { &hf_afp_version_offset, { "Version offset", "afp.version_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7186 | { &hf_afp_uams_offset, { "UAMS offset", "afp.uams_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7187 | { &hf_afp_icon_offset, { "Icon offset", "afp.icon_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7188 | { &hf_afp_signature_offset, { "Signature offset", "afp.signature_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7189 | { &hf_afp_network_address_offset, { "Network address offset", "afp.network_address_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7190 | { &hf_afp_directory_services_offset, { "Directory services offset", "afp.directory_services_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7191 | { &hf_afp_utf8_server_name_offset, { "UTF-8 server name offset", "afp.utf8_server_name_offset", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}, |
| 7192 | }; |
| 7193 | |
| 7194 | static int *ett[] = { |
| 7195 | &ett_afp, |
| 7196 | &ett_afp_server_vol, |
| 7197 | &ett_afp_vol_list, |
| 7198 | &ett_afp_vol_flag, |
| 7199 | &ett_afp_vol_bitmap, |
| 7200 | &ett_afp_vol_attribute, |
| 7201 | &ett_afp_dir_bitmap, |
| 7202 | &ett_afp_file_bitmap, |
| 7203 | &ett_afp_unix_privs, |
| 7204 | &ett_afp_enumerate, |
| 7205 | &ett_afp_enumerate_line, |
| 7206 | &ett_afp_access_mode, |
| 7207 | &ett_afp_dir_attribute, |
| 7208 | &ett_afp_file_attribute, |
| 7209 | &ett_afp_path_name, |
| 7210 | &ett_afp_lock_flags, |
| 7211 | &ett_afp_dir_ar, |
| 7212 | &ett_afp_cat_search, |
| 7213 | &ett_afp_cat_r_bitmap, |
| 7214 | &ett_afp_cat_spec, |
| 7215 | &ett_afp_vol_did, |
| 7216 | &ett_afp_user_bitmap, |
| 7217 | &ett_afp_message_bitmap, |
| 7218 | &ett_afp_extattr_bitmap, |
| 7219 | &ett_afp_extattr_names, |
| 7220 | &ett_afp_acl_list_bitmap, |
| 7221 | &ett_afp_acl_access_bitmap, |
| 7222 | &ett_afp_ace_entries, |
| 7223 | &ett_afp_ace_entry, |
| 7224 | &ett_afp_ace_flags, |
| 7225 | &ett_afp_spotlight_queries, |
| 7226 | &ett_afp_spotlight_query_line, |
| 7227 | &ett_afp_spotlight_query, |
| 7228 | &ett_afp_spotlight_data, |
| 7229 | &ett_afp_spotlight_toc, |
| 7230 | &ett_afp_prodos_info, |
| 7231 | |
| 7232 | /* Status stuff from ASP or DSI */ |
| 7233 | &ett_afp_status, |
| 7234 | &ett_afp_status_server_flag, |
| 7235 | &ett_afp_vers, |
| 7236 | &ett_afp_uams, |
| 7237 | &ett_afp_server_addr, |
| 7238 | &ett_afp_server_addr_line, |
| 7239 | &ett_afp_directory, |
| 7240 | &ett_afp_utf8_name |
| 7241 | }; |
| 7242 | |
| 7243 | static ei_register_info ei[] = { |
| 7244 | { &ei_afp_subquery_count_over_safety_limit, { "afp.subquery_count_over_safety_limit", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Subquery count > safety limit", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 7245 | { &ei_afp_subquery_count_over_query_count, { "afp.subquery_count_over_query_count", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Subquery count > query count", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 7246 | { &ei_afp_abnormal_num_subqueries, { "afp.abnormal_num_subqueries", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Abnormal number of subqueries", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 7247 | { &ei_afp_too_many_acl_entries, { "afp.too_many_acl_entries", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Too many ACL entries", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 7248 | { &ei_afp_ip_port_reused, { "afp.ip_port_reused", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "IP port reused, you need to split the capture file", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 7249 | { &ei_afp_toc_offset, { "afp.toc_offset.bogus", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "ToC offset bogus", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 7250 | }; |
| 7251 | expert_module_t* expert_afp; |
| 7252 | |
| 7253 | proto_afp = proto_register_protocol("Apple Filing Protocol", "AFP", "afp"); |
| 7254 | proto_register_field_array(proto_afp, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0])); |
| 7255 | proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0])); |
| 7256 | expert_afp = expert_register_protocol(proto_afp); |
| 7257 | expert_register_field_array(expert_afp, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0])); |
| 7258 | |
| 7259 | afp_request_hash = wmem_map_new_autoreset(wmem_epan_scope(), wmem_file_scope(), afp_hash, afp_equal); |
| 7260 | |
| 7261 | register_dissector("afp", dissect_afp, proto_afp); |
| 7262 | register_dissector("afp_server_status", dissect_afp_server_status, |
| 7263 | proto_afp); |
| 7264 | register_dissector("afp_spotlight", dissect_spotlight, proto_afp); |
| 7265 | |
| 7266 | afp_tap = register_tap("afp"); |
| 7267 | |
| 7268 | register_srt_table(proto_afp, NULL((void*)0), 1, afpstat_packet, afpstat_init, NULL((void*)0)); |
| 7269 | } |
| 7270 | |
| 7271 | void |
| 7272 | proto_reg_handoff_afp(void) |
| 7273 | { |
| 7274 | spotlight_handle = find_dissector_add_dependency("afp_spotlight", proto_afp); |
| 7275 | } |
| 7276 | |
| 7277 | /* ------------------------------- |
| 7278 | end |
| 7279 | */ |
| 7280 | |
| 7281 | /* |
| 7282 | * Editor modelines - https://www.wireshark.org/tools/modelines.html |
| 7283 | * |
| 7284 | * Local variables: |
| 7285 | * c-basic-offset: 8 |
| 7286 | * tab-width: 8 |
| 7287 | * indent-tabs-mode: t |
| 7288 | * End: |
| 7289 | * |
| 7290 | * vi: set shiftwidth=8 tabstop=8 noexpandtab: |
| 7291 | * :indentSize=8:tabSize=8:noTabs=false: |
| 7292 | */ |