17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*27242a7cSthurlow * Common Development and Distribution License (the "License"). 6*27242a7cSthurlow * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*27242a7cSthurlow * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate /* 297c478bd9Sstevel@tonic-gate * nfs log - read buffer file and print structs in user-readable form 307c478bd9Sstevel@tonic-gate */ 317c478bd9Sstevel@tonic-gate 327c478bd9Sstevel@tonic-gate #define _REENTRANT 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #include <ctype.h> 357c478bd9Sstevel@tonic-gate #include <stdio.h> 367c478bd9Sstevel@tonic-gate #include <stdlib.h> 377c478bd9Sstevel@tonic-gate #include <stddef.h> 387c478bd9Sstevel@tonic-gate #include <string.h> 397c478bd9Sstevel@tonic-gate #include <strings.h> 407c478bd9Sstevel@tonic-gate #include <time.h> 417c478bd9Sstevel@tonic-gate #include <fcntl.h> 427c478bd9Sstevel@tonic-gate #include <unistd.h> 437c478bd9Sstevel@tonic-gate #include <signal.h> 447c478bd9Sstevel@tonic-gate #include <sys/types.h> 457c478bd9Sstevel@tonic-gate #include <sys/stat.h> 467c478bd9Sstevel@tonic-gate #include <sys/param.h> 477c478bd9Sstevel@tonic-gate #include <sys/utsname.h> 487c478bd9Sstevel@tonic-gate #include <errno.h> 497c478bd9Sstevel@tonic-gate #include <time.h> 507c478bd9Sstevel@tonic-gate #include <limits.h> 517c478bd9Sstevel@tonic-gate #include <libintl.h> 527c478bd9Sstevel@tonic-gate #include <pwd.h> 537c478bd9Sstevel@tonic-gate #include <netdb.h> 547c478bd9Sstevel@tonic-gate #include <syslog.h> 557c478bd9Sstevel@tonic-gate #include <rpc/rpc.h> 567c478bd9Sstevel@tonic-gate #include <netconfig.h> 577c478bd9Sstevel@tonic-gate #include <netdir.h> 587c478bd9Sstevel@tonic-gate #include <nfs/nfs_sec.h> 597c478bd9Sstevel@tonic-gate #include <nfs/export.h> 607c478bd9Sstevel@tonic-gate #include <rpc/auth.h> 617c478bd9Sstevel@tonic-gate #include <rpc/svc.h> 627c478bd9Sstevel@tonic-gate #include <rpc/xdr.h> 637c478bd9Sstevel@tonic-gate #include <rpc/clnt.h> 647c478bd9Sstevel@tonic-gate #include <nfs/nfs.h> 657c478bd9Sstevel@tonic-gate #include <nfs/nfs_log.h> 667c478bd9Sstevel@tonic-gate #include "fhtab.h" 677c478bd9Sstevel@tonic-gate #include "nfslogd.h" 687c478bd9Sstevel@tonic-gate 697c478bd9Sstevel@tonic-gate static char empty_name[4] = "-"; 707c478bd9Sstevel@tonic-gate 717c478bd9Sstevel@tonic-gate static char ftype3_names[NF3FIFO + 1][20] = { 727c478bd9Sstevel@tonic-gate "\"none\"", "\"file\"", "\"dir\"", "\"blk device\"", 737c478bd9Sstevel@tonic-gate "\"chr device\"", "\"link\"", "\"socket\"", "\"fifo\"" 747c478bd9Sstevel@tonic-gate }; 757c478bd9Sstevel@tonic-gate 767c478bd9Sstevel@tonic-gate #define NFSL_FTYPE3(ftype) \ 777c478bd9Sstevel@tonic-gate ((((ftype) >= 0) && ((ftype) <= NF3FIFO)) ? \ 787c478bd9Sstevel@tonic-gate ftype3_names[ftype] : empty_name) 797c478bd9Sstevel@tonic-gate 807c478bd9Sstevel@tonic-gate static char createmode3_names[EXCLUSIVE + 1][20] = { 817c478bd9Sstevel@tonic-gate "\"unchecked", "\"guarded\"", "\"exclusive\"" 827c478bd9Sstevel@tonic-gate }; 837c478bd9Sstevel@tonic-gate 847c478bd9Sstevel@tonic-gate #define NFSL_CREATEMODE3(createmode) \ 857c478bd9Sstevel@tonic-gate ((((createmode) >= 0) && ((createmode) <= EXCLUSIVE)) ? \ 867c478bd9Sstevel@tonic-gate createmode3_names[createmode] : empty_name) 877c478bd9Sstevel@tonic-gate 887c478bd9Sstevel@tonic-gate static char auth_flavor_name[RPCSEC_GSS + 1][20] = { 897c478bd9Sstevel@tonic-gate "\"auth_null\"", "\"auth_unix\"", "\"auth_short\"", "\"auth_des\"", 907c478bd9Sstevel@tonic-gate "\"auth_kerb\"", "\"none\"", "\"rpcsec_gss\"" 917c478bd9Sstevel@tonic-gate }; 927c478bd9Sstevel@tonic-gate 937c478bd9Sstevel@tonic-gate #define NFSL_AUTH_FLAVOR_PRINT(auth_flavor) \ 947c478bd9Sstevel@tonic-gate (((auth_flavor) <= RPCSEC_GSS) ? \ 957c478bd9Sstevel@tonic-gate auth_flavor_name[auth_flavor] : empty_name) 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate #define NFSL_ERR_CNT 31 /* Actual err numbers */ 987c478bd9Sstevel@tonic-gate 997c478bd9Sstevel@tonic-gate /* 1007c478bd9Sstevel@tonic-gate * Two arrays - one short ints containing err codes, the other the strings 1017c478bd9Sstevel@tonic-gate * (merged codes for both v2 and v3 1027c478bd9Sstevel@tonic-gate */ 1037c478bd9Sstevel@tonic-gate static char nfsl_status_name[NFSL_ERR_CNT][30] = { 1047c478bd9Sstevel@tonic-gate "\"ok\"", "\"perm\"", "\"noent\"", "\"io\"", 1057c478bd9Sstevel@tonic-gate "\"nxio\"", "\"access\"", "\"exist\"", "\"xdev\"", 1067c478bd9Sstevel@tonic-gate "\"nodev\"", "\"notdir\"", "\"isdir\"", "\"inval\"", 1077c478bd9Sstevel@tonic-gate "\"fbig\"", "\"nospc\"", "\"rofs\"", "\"mlink\"", 1087c478bd9Sstevel@tonic-gate "\"notsupp\"", "\"nametoolong\"", "\"notempty\"", "\"dquot\"", 1097c478bd9Sstevel@tonic-gate "\"stale\"", "\"remote\"", "\"wflush\"", "\"badhandle\"", 1107c478bd9Sstevel@tonic-gate "\"not_sync\"", "\"bad_cookie\"", "\"notsupp\"", "\"toosmall\"", 1117c478bd9Sstevel@tonic-gate "\"serverfault\"", "\"badtype\"", "\"jukebox\"", 1127c478bd9Sstevel@tonic-gate }; 1137c478bd9Sstevel@tonic-gate 1147c478bd9Sstevel@tonic-gate static short nfsl_status[NFSL_ERR_CNT] = { 1157c478bd9Sstevel@tonic-gate 0, 1, 2, 5, 6, 13, 17, 18, 1167c478bd9Sstevel@tonic-gate 19, 20, 21, 22, 27, 28, 30, 31, 1177c478bd9Sstevel@tonic-gate 45, 63, 66, 69, 70, 71, 99, 10001, 1187c478bd9Sstevel@tonic-gate 10002, 10003, 10004, 10005, 10006, 10007, 10008 1197c478bd9Sstevel@tonic-gate }; 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate /* list of open elf files */ 1227c478bd9Sstevel@tonic-gate static struct nfsl_log_file *elf_file_list = NULL; 1237c478bd9Sstevel@tonic-gate 1247c478bd9Sstevel@tonic-gate /* Imported functions */ 1257c478bd9Sstevel@tonic-gate extern void bcopy(const void *s1, void *s2, size_t n); 1267c478bd9Sstevel@tonic-gate 1277c478bd9Sstevel@tonic-gate /* Static functions */ 1287c478bd9Sstevel@tonic-gate static void nfsl_log_file_free(struct nfsl_log_file *elfrec); 1297c478bd9Sstevel@tonic-gate static void nfsl_log_file_add(struct nfsl_log_file *elfrec, 1307c478bd9Sstevel@tonic-gate struct nfsl_log_file **elf_listp); 1317c478bd9Sstevel@tonic-gate static struct nfsl_log_file *nfsl_log_file_find(struct nfsl_log_file *elfrec, 1327c478bd9Sstevel@tonic-gate struct nfsl_log_file *elf_list); 1337c478bd9Sstevel@tonic-gate static struct nfsl_log_file *nfsl_log_file_del(struct nfsl_log_file *elfrec, 1347c478bd9Sstevel@tonic-gate struct nfsl_log_file **elf_listp); 1357c478bd9Sstevel@tonic-gate 1367c478bd9Sstevel@tonic-gate static char *nfsl_get_time(time_t tt); 1377c478bd9Sstevel@tonic-gate static char *nfsl_get_date(time_t tt); 1387c478bd9Sstevel@tonic-gate static char *nfsl_get_date_nq(time_t tt); 1397c478bd9Sstevel@tonic-gate static int nfsl_write_elfbuf(struct nfsl_log_file *elfrec); 1407c478bd9Sstevel@tonic-gate static void nfsl_ipaddr_print(struct nfsl_log_file *, struct netbuf *); 1417c478bd9Sstevel@tonic-gate static void nfsl_elf_record_header_print(struct nfsl_log_file *, 1427c478bd9Sstevel@tonic-gate nfslog_record_header *, char *, char *, 1437c478bd9Sstevel@tonic-gate struct nfsl_proc_disp *, char *); 1447c478bd9Sstevel@tonic-gate static void nfsl_elf_buffer_header_print(struct nfsl_log_file *, 1457c478bd9Sstevel@tonic-gate nfslog_buffer_header *); 1467c478bd9Sstevel@tonic-gate static struct nfsl_proc_disp *nfsl_find_elf_dispatch( 1477c478bd9Sstevel@tonic-gate nfslog_request_record *, char **); 1487c478bd9Sstevel@tonic-gate static void nfsl_elf_rpc_print(struct nfsl_log_file *, 1497c478bd9Sstevel@tonic-gate nfslog_request_record *, struct nfsl_proc_disp *, 1507c478bd9Sstevel@tonic-gate char *, char *, char *); 1517c478bd9Sstevel@tonic-gate static void nfslog_size3_print(struct nfsl_log_file *, set_size3 *); 1527c478bd9Sstevel@tonic-gate 1537c478bd9Sstevel@tonic-gate static void nfslog_null_args(struct nfsl_log_file *, caddr_t *); 1547c478bd9Sstevel@tonic-gate static void nfslog_null_res(struct nfsl_log_file *, caddr_t *); 1557c478bd9Sstevel@tonic-gate 1567c478bd9Sstevel@tonic-gate 1577c478bd9Sstevel@tonic-gate /* 1587c478bd9Sstevel@tonic-gate * NFS VERSION 2 1597c478bd9Sstevel@tonic-gate */ 1607c478bd9Sstevel@tonic-gate 1617c478bd9Sstevel@tonic-gate /* Functions for elf print of the arguments */ 1627c478bd9Sstevel@tonic-gate static void nfslog_fhandle_print(struct nfsl_log_file *, fhandle_t *); 1637c478bd9Sstevel@tonic-gate static void nfslog_diropargs_print(struct nfsl_log_file *, nfslog_diropargs *); 1647c478bd9Sstevel@tonic-gate static void nfslog_setattrargs_print(struct nfsl_log_file *, 1657c478bd9Sstevel@tonic-gate nfslog_setattrargs *); 1667c478bd9Sstevel@tonic-gate static void nfslog_sattr_print(struct nfsl_log_file *, 1677c478bd9Sstevel@tonic-gate nfslog_sattr *); 1687c478bd9Sstevel@tonic-gate static void nfslog_nfsreadargs_print(struct nfsl_log_file *, 1697c478bd9Sstevel@tonic-gate nfslog_nfsreadargs *); 1707c478bd9Sstevel@tonic-gate static void nfslog_writeargs_print(struct nfsl_log_file *, 1717c478bd9Sstevel@tonic-gate nfslog_writeargs *); 1727c478bd9Sstevel@tonic-gate static void nfslog_writeresult_print(struct nfsl_log_file *, 1737c478bd9Sstevel@tonic-gate nfslog_writeresult *, bool_t); 1747c478bd9Sstevel@tonic-gate static void nfslog_creatargs_print(struct nfsl_log_file *, 1757c478bd9Sstevel@tonic-gate nfslog_createargs *); 1767c478bd9Sstevel@tonic-gate static void nfslog_rddirargs_print(struct nfsl_log_file *, nfslog_rddirargs *); 1777c478bd9Sstevel@tonic-gate static void nfslog_linkargs_print(struct nfsl_log_file *, nfslog_linkargs *); 1787c478bd9Sstevel@tonic-gate static void nfslog_rnmargs_print(struct nfsl_log_file *, nfslog_rnmargs *); 1797c478bd9Sstevel@tonic-gate static void nfslog_symlinkargs_print(struct nfsl_log_file *, 1807c478bd9Sstevel@tonic-gate nfslog_symlinkargs *); 1817c478bd9Sstevel@tonic-gate 1827c478bd9Sstevel@tonic-gate static void nfslog_sharefsargs_print(struct nfsl_log_file *, 1837c478bd9Sstevel@tonic-gate nfslog_sharefsargs *); 1847c478bd9Sstevel@tonic-gate static void nfslog_getfhargs_print(struct nfsl_log_file *, 1857c478bd9Sstevel@tonic-gate nfslog_getfhargs *); 1867c478bd9Sstevel@tonic-gate 1877c478bd9Sstevel@tonic-gate /* Functions for elf print of the response */ 1887c478bd9Sstevel@tonic-gate static void nfslog_nfsstat_print(struct nfsl_log_file *, enum nfsstat *, 1897c478bd9Sstevel@tonic-gate bool_t); 1907c478bd9Sstevel@tonic-gate static void nfslog_diropres_print(struct nfsl_log_file *, nfslog_diropres *, 1917c478bd9Sstevel@tonic-gate bool_t); 1927c478bd9Sstevel@tonic-gate static void nfslog_rdlnres_print(struct nfsl_log_file *, nfslog_rdlnres *, 1937c478bd9Sstevel@tonic-gate bool_t); 1947c478bd9Sstevel@tonic-gate static void nfslog_rdresult_print(struct nfsl_log_file *, 1957c478bd9Sstevel@tonic-gate nfslog_rdresult *, bool_t); 1967c478bd9Sstevel@tonic-gate static void nfslog_rddirres_print(struct nfsl_log_file *, nfslog_rddirres *, 1977c478bd9Sstevel@tonic-gate bool_t); 1987c478bd9Sstevel@tonic-gate 1997c478bd9Sstevel@tonic-gate /* 2007c478bd9Sstevel@tonic-gate * NFS VERSION 3 2017c478bd9Sstevel@tonic-gate */ 2027c478bd9Sstevel@tonic-gate 2037c478bd9Sstevel@tonic-gate /* Functions for elf print of the arguments */ 2047c478bd9Sstevel@tonic-gate static void nfslog_fh3_print(struct nfsl_log_file *, nfs_fh3 *); 2057c478bd9Sstevel@tonic-gate static void nfslog_diropargs3_print(struct nfsl_log_file *, 2067c478bd9Sstevel@tonic-gate nfslog_diropargs3 *); 2077c478bd9Sstevel@tonic-gate static void nfslog_SETATTR3args_print(struct nfsl_log_file *, 2087c478bd9Sstevel@tonic-gate nfslog_SETATTR3args *); 2097c478bd9Sstevel@tonic-gate static void nfslog_READ3args_print(struct nfsl_log_file *, nfslog_READ3args *); 2107c478bd9Sstevel@tonic-gate static void nfslog_WRITE3args_print(struct nfsl_log_file *, 2117c478bd9Sstevel@tonic-gate nfslog_WRITE3args *); 2127c478bd9Sstevel@tonic-gate static void nfslog_CREATE3args_print(struct nfsl_log_file *, 2137c478bd9Sstevel@tonic-gate nfslog_CREATE3args *); 2147c478bd9Sstevel@tonic-gate static void nfslog_MKDIR3args_print(struct nfsl_log_file *, 2157c478bd9Sstevel@tonic-gate nfslog_MKDIR3args *); 2167c478bd9Sstevel@tonic-gate static void nfslog_SYMLINK3args_print(struct nfsl_log_file *, 2177c478bd9Sstevel@tonic-gate nfslog_SYMLINK3args *); 2187c478bd9Sstevel@tonic-gate static void nfslog_MKNOD3args_print(struct nfsl_log_file *, 2197c478bd9Sstevel@tonic-gate nfslog_MKNOD3args *); 2207c478bd9Sstevel@tonic-gate static void nfslog_REMOVE3args_print(struct nfsl_log_file *, 2217c478bd9Sstevel@tonic-gate nfslog_REMOVE3args *); 2227c478bd9Sstevel@tonic-gate static void nfslog_RMDIR3args_print(struct nfsl_log_file *, 2237c478bd9Sstevel@tonic-gate nfslog_RMDIR3args *); 2247c478bd9Sstevel@tonic-gate static void nfslog_RENAME3args_print(struct nfsl_log_file *, 2257c478bd9Sstevel@tonic-gate nfslog_RENAME3args *); 2267c478bd9Sstevel@tonic-gate static void nfslog_LINK3args_print(struct nfsl_log_file *, 2277c478bd9Sstevel@tonic-gate nfslog_LINK3args *); 2287c478bd9Sstevel@tonic-gate static void nfslog_COMMIT3args_print(struct nfsl_log_file *, 2297c478bd9Sstevel@tonic-gate nfslog_COMMIT3args *); 2307c478bd9Sstevel@tonic-gate static void nfslog_READDIRPLUS3args_print(struct nfsl_log_file *, 2317c478bd9Sstevel@tonic-gate nfslog_READDIRPLUS3args *); 2327c478bd9Sstevel@tonic-gate 2337c478bd9Sstevel@tonic-gate /* Functions for elf print of the response */ 2347c478bd9Sstevel@tonic-gate static void nfslog_nfsstat3_print(struct nfsl_log_file *, 2357c478bd9Sstevel@tonic-gate nfsstat3 *, bool_t); 2367c478bd9Sstevel@tonic-gate static void nfslog_LOOKUP3res_print(struct nfsl_log_file *, 2377c478bd9Sstevel@tonic-gate nfslog_LOOKUP3res *, bool_t); 2387c478bd9Sstevel@tonic-gate static void nfslog_READLINK3res_print(struct nfsl_log_file *, 2397c478bd9Sstevel@tonic-gate nfslog_READLINK3res *, bool_t); 2407c478bd9Sstevel@tonic-gate static void nfslog_READ3res_print(struct nfsl_log_file *, 2417c478bd9Sstevel@tonic-gate nfslog_READ3res *, bool_t); 2427c478bd9Sstevel@tonic-gate static void nfslog_WRITE3res_print(struct nfsl_log_file *, 2437c478bd9Sstevel@tonic-gate nfslog_WRITE3res *, bool_t); 2447c478bd9Sstevel@tonic-gate static void nfslog_CREATE3res_print(struct nfsl_log_file *, 2457c478bd9Sstevel@tonic-gate nfslog_CREATE3res *, bool_t); 2467c478bd9Sstevel@tonic-gate static void nfslog_MKDIR3res_print(struct nfsl_log_file *, 2477c478bd9Sstevel@tonic-gate nfslog_MKDIR3res *, bool_t); 2487c478bd9Sstevel@tonic-gate static void nfslog_SYMLINK3res_print(struct nfsl_log_file *, 2497c478bd9Sstevel@tonic-gate nfslog_SYMLINK3res *, bool_t); 2507c478bd9Sstevel@tonic-gate static void nfslog_MKNOD3res_print(struct nfsl_log_file *, 2517c478bd9Sstevel@tonic-gate nfslog_MKNOD3res *, bool_t); 2527c478bd9Sstevel@tonic-gate static void nfslog_READDIRPLUS3res_print(struct nfsl_log_file *, 2537c478bd9Sstevel@tonic-gate nfslog_READDIRPLUS3res *, bool_t); 2547c478bd9Sstevel@tonic-gate 2557c478bd9Sstevel@tonic-gate extern int debug; 2567c478bd9Sstevel@tonic-gate static bool_t nfsl_print_fh = FALSE; /* print file handles? */ 2577c478bd9Sstevel@tonic-gate 2587c478bd9Sstevel@tonic-gate #define DFLT_BUFFERSIZE 8192 2597c478bd9Sstevel@tonic-gate #define DFLT_OVFSIZE 3072 /* Maximum logged or buffered size */ 2607c478bd9Sstevel@tonic-gate 2617c478bd9Sstevel@tonic-gate static char hostname[MAXHOSTNAMELEN]; /* name of host */ 2627c478bd9Sstevel@tonic-gate 2637c478bd9Sstevel@tonic-gate 2647c478bd9Sstevel@tonic-gate /* 2657c478bd9Sstevel@tonic-gate * Define the actions taken per prog/vers/proc: 2667c478bd9Sstevel@tonic-gate * 2677c478bd9Sstevel@tonic-gate * In some cases, the nl types are the same as the nfs types and a simple 2687c478bd9Sstevel@tonic-gate * bcopy should suffice. Rather that define tens of identical procedures, 2697c478bd9Sstevel@tonic-gate * simply define these to bcopy. Similarly this takes care of different 2707c478bd9Sstevel@tonic-gate * procs that use same parameter struct. 2717c478bd9Sstevel@tonic-gate */ 2727c478bd9Sstevel@tonic-gate 2737c478bd9Sstevel@tonic-gate static struct nfsl_proc_disp nfsl_elf_proc_v2[] = { 2747c478bd9Sstevel@tonic-gate /* 2757c478bd9Sstevel@tonic-gate * NFS VERSION 2 2767c478bd9Sstevel@tonic-gate */ 2777c478bd9Sstevel@tonic-gate 2787c478bd9Sstevel@tonic-gate /* RFS_NULL = 0 */ 2797c478bd9Sstevel@tonic-gate {nfslog_null_args, nfslog_null_res, "\"null\""}, 2807c478bd9Sstevel@tonic-gate 2817c478bd9Sstevel@tonic-gate /* RFS_GETATTR = 1 */ 2827c478bd9Sstevel@tonic-gate {nfslog_fhandle_print, nfslog_nfsstat_print, "\"getattr\""}, 2837c478bd9Sstevel@tonic-gate 2847c478bd9Sstevel@tonic-gate /* RFS_SETATTR = 2 */ 2857c478bd9Sstevel@tonic-gate {nfslog_setattrargs_print, nfslog_nfsstat_print, "\"setattr\""}, 2867c478bd9Sstevel@tonic-gate 2877c478bd9Sstevel@tonic-gate /* RFS_ROOT = 3 *** NO LONGER SUPPORTED *** */ 2887c478bd9Sstevel@tonic-gate {nfslog_null_args, nfslog_null_res, "\"root\""}, 2897c478bd9Sstevel@tonic-gate 2907c478bd9Sstevel@tonic-gate /* RFS_LOOKUP = 4 */ 2917c478bd9Sstevel@tonic-gate {nfslog_diropargs_print, nfslog_diropres_print, "\"lookup\""}, 2927c478bd9Sstevel@tonic-gate 2937c478bd9Sstevel@tonic-gate /* RFS_READLINK = 5 */ 2947c478bd9Sstevel@tonic-gate {nfslog_fhandle_print, nfslog_rdlnres_print, "\"readlink\""}, 2957c478bd9Sstevel@tonic-gate 2967c478bd9Sstevel@tonic-gate /* RFS_READ = 6 */ 2977c478bd9Sstevel@tonic-gate {nfslog_nfsreadargs_print, nfslog_rdresult_print, "\"read\""}, 2987c478bd9Sstevel@tonic-gate 2997c478bd9Sstevel@tonic-gate /* RFS_WRITECACHE = 7 *** NO LONGER SUPPORTED *** */ 3007c478bd9Sstevel@tonic-gate {nfslog_null_args, nfslog_null_res, "\"writecache\""}, 3017c478bd9Sstevel@tonic-gate 3027c478bd9Sstevel@tonic-gate /* RFS_WRITE = 8 */ 3037c478bd9Sstevel@tonic-gate {nfslog_writeargs_print, nfslog_writeresult_print, "\"write\""}, 3047c478bd9Sstevel@tonic-gate 3057c478bd9Sstevel@tonic-gate /* RFS_CREATE = 9 */ 3067c478bd9Sstevel@tonic-gate {nfslog_creatargs_print, nfslog_diropres_print, "\"create\""}, 3077c478bd9Sstevel@tonic-gate 3087c478bd9Sstevel@tonic-gate /* RFS_REMOVE = 10 */ 3097c478bd9Sstevel@tonic-gate {nfslog_diropargs_print, nfslog_nfsstat_print, "\"remove\""}, 3107c478bd9Sstevel@tonic-gate 3117c478bd9Sstevel@tonic-gate /* RFS_RENAME = 11 */ 3127c478bd9Sstevel@tonic-gate {nfslog_rnmargs_print, nfslog_nfsstat_print, "\"rename\""}, 3137c478bd9Sstevel@tonic-gate 3147c478bd9Sstevel@tonic-gate /* RFS_LINK = 12 */ 3157c478bd9Sstevel@tonic-gate {nfslog_linkargs_print, nfslog_nfsstat_print, "\"link\""}, 3167c478bd9Sstevel@tonic-gate 3177c478bd9Sstevel@tonic-gate /* RFS_SYMLINK = 13 */ 3187c478bd9Sstevel@tonic-gate {nfslog_symlinkargs_print, nfslog_nfsstat_print, "\"symlink\""}, 3197c478bd9Sstevel@tonic-gate 3207c478bd9Sstevel@tonic-gate /* RFS_MKDIR = 14 */ 3217c478bd9Sstevel@tonic-gate {nfslog_creatargs_print, nfslog_diropres_print, "\"mkdir\""}, 3227c478bd9Sstevel@tonic-gate 3237c478bd9Sstevel@tonic-gate /* RFS_RMDIR = 15 */ 3247c478bd9Sstevel@tonic-gate {nfslog_diropargs_print, nfslog_nfsstat_print, "\"rmdir\""}, 3257c478bd9Sstevel@tonic-gate 3267c478bd9Sstevel@tonic-gate /* RFS_READDIR = 16 */ 3277c478bd9Sstevel@tonic-gate {nfslog_rddirargs_print, nfslog_rddirres_print, "\"readdir\""}, 3287c478bd9Sstevel@tonic-gate 3297c478bd9Sstevel@tonic-gate /* RFS_STATFS = 17 */ 3307c478bd9Sstevel@tonic-gate {nfslog_fhandle_print, nfslog_nfsstat_print, "\"statfs\""}, 3317c478bd9Sstevel@tonic-gate }; 3327c478bd9Sstevel@tonic-gate 3337c478bd9Sstevel@tonic-gate 3347c478bd9Sstevel@tonic-gate /* 3357c478bd9Sstevel@tonic-gate * NFS VERSION 3 3367c478bd9Sstevel@tonic-gate */ 3377c478bd9Sstevel@tonic-gate 3387c478bd9Sstevel@tonic-gate static struct nfsl_proc_disp nfsl_elf_proc_v3[] = { 3397c478bd9Sstevel@tonic-gate 3407c478bd9Sstevel@tonic-gate /* NFSPROC3_NULL = 0 */ 3417c478bd9Sstevel@tonic-gate {nfslog_null_args, nfslog_null_res, "\"null\""}, 3427c478bd9Sstevel@tonic-gate 3437c478bd9Sstevel@tonic-gate /* NFSPROC3_GETATTR = 1 */ 3447c478bd9Sstevel@tonic-gate {nfslog_fh3_print, nfslog_nfsstat3_print, "\"getattr\""}, 3457c478bd9Sstevel@tonic-gate 3467c478bd9Sstevel@tonic-gate /* NFSPROC3_SETATTR = 2 */ 3477c478bd9Sstevel@tonic-gate {nfslog_SETATTR3args_print, nfslog_nfsstat3_print, "\"setattr\""}, 3487c478bd9Sstevel@tonic-gate 3497c478bd9Sstevel@tonic-gate /* NFSPROC3_LOOKUP = 3 */ 3507c478bd9Sstevel@tonic-gate {nfslog_diropargs3_print, nfslog_LOOKUP3res_print, "\"lookup\""}, 3517c478bd9Sstevel@tonic-gate 3527c478bd9Sstevel@tonic-gate /* NFSPROC3_ACCESS = 4 */ 3537c478bd9Sstevel@tonic-gate {nfslog_fh3_print, nfslog_nfsstat3_print, "\"access\""}, 3547c478bd9Sstevel@tonic-gate 3557c478bd9Sstevel@tonic-gate /* NFSPROC3_READLINK = 5 */ 3567c478bd9Sstevel@tonic-gate {nfslog_fh3_print, nfslog_READLINK3res_print, "\"readlink\""}, 3577c478bd9Sstevel@tonic-gate 3587c478bd9Sstevel@tonic-gate /* NFSPROC3_READ = 6 */ 3597c478bd9Sstevel@tonic-gate {nfslog_READ3args_print, nfslog_READ3res_print, "\"read\""}, 3607c478bd9Sstevel@tonic-gate 3617c478bd9Sstevel@tonic-gate /* NFSPROC3_WRITE = 7 */ 3627c478bd9Sstevel@tonic-gate {nfslog_WRITE3args_print, nfslog_WRITE3res_print, "\"write\""}, 3637c478bd9Sstevel@tonic-gate 3647c478bd9Sstevel@tonic-gate /* NFSPROC3_CREATE = 8 */ 3657c478bd9Sstevel@tonic-gate {nfslog_CREATE3args_print, nfslog_CREATE3res_print, "\"create\""}, 3667c478bd9Sstevel@tonic-gate 3677c478bd9Sstevel@tonic-gate /* NFSPROC3_MKDIR = 9 */ 3687c478bd9Sstevel@tonic-gate {nfslog_MKDIR3args_print, nfslog_MKDIR3res_print, "\"mkdir\""}, 3697c478bd9Sstevel@tonic-gate 3707c478bd9Sstevel@tonic-gate /* NFSPROC3_SYMLINK = 10 */ 3717c478bd9Sstevel@tonic-gate {nfslog_SYMLINK3args_print, nfslog_SYMLINK3res_print, "\"symlink\""}, 3727c478bd9Sstevel@tonic-gate 3737c478bd9Sstevel@tonic-gate /* NFSPROC3_MKNOD = 11 */ 3747c478bd9Sstevel@tonic-gate {nfslog_MKNOD3args_print, nfslog_MKNOD3res_print, "\"mknod\""}, 3757c478bd9Sstevel@tonic-gate 3767c478bd9Sstevel@tonic-gate /* NFSPROC3_REMOVE = 12 */ 3777c478bd9Sstevel@tonic-gate {nfslog_REMOVE3args_print, nfslog_nfsstat3_print, "\"remove\""}, 3787c478bd9Sstevel@tonic-gate 3797c478bd9Sstevel@tonic-gate /* NFSPROC3_RMDIR = 13 */ 3807c478bd9Sstevel@tonic-gate {nfslog_RMDIR3args_print, nfslog_nfsstat3_print, "\"rmdir\""}, 3817c478bd9Sstevel@tonic-gate 3827c478bd9Sstevel@tonic-gate /* NFSPROC3_RENAME = 14 */ 3837c478bd9Sstevel@tonic-gate {nfslog_RENAME3args_print, nfslog_nfsstat3_print, "\"rename\""}, 3847c478bd9Sstevel@tonic-gate 3857c478bd9Sstevel@tonic-gate /* NFSPROC3_LINK = 15 */ 3867c478bd9Sstevel@tonic-gate {nfslog_LINK3args_print, nfslog_nfsstat3_print, "\"link\""}, 3877c478bd9Sstevel@tonic-gate 3887c478bd9Sstevel@tonic-gate /* NFSPROC3_READDIR = 16 */ 3897c478bd9Sstevel@tonic-gate {nfslog_fh3_print, nfslog_nfsstat3_print, "\"readdir\""}, 3907c478bd9Sstevel@tonic-gate 3917c478bd9Sstevel@tonic-gate /* NFSPROC3_READDIRPLUS = 17 */ 3927c478bd9Sstevel@tonic-gate {nfslog_READDIRPLUS3args_print, nfslog_READDIRPLUS3res_print, 3937c478bd9Sstevel@tonic-gate "\"readdirplus\""}, 3947c478bd9Sstevel@tonic-gate 3957c478bd9Sstevel@tonic-gate /* NFSPROC3_FSSTAT = 18 */ 3967c478bd9Sstevel@tonic-gate {nfslog_fh3_print, nfslog_nfsstat3_print, "\"fsstat\""}, 3977c478bd9Sstevel@tonic-gate 3987c478bd9Sstevel@tonic-gate /* NFSPROC3_FSINFO = 19 */ 3997c478bd9Sstevel@tonic-gate {nfslog_fh3_print, nfslog_nfsstat3_print, "\"fsinfo\""}, 4007c478bd9Sstevel@tonic-gate 4017c478bd9Sstevel@tonic-gate /* NFSPROC3_PATHCONF = 20 */ 4027c478bd9Sstevel@tonic-gate {nfslog_fh3_print, nfslog_nfsstat3_print, "\"pathconf\""}, 4037c478bd9Sstevel@tonic-gate 4047c478bd9Sstevel@tonic-gate /* NFSPROC3_COMMIT = 21 */ 4057c478bd9Sstevel@tonic-gate {nfslog_COMMIT3args_print, nfslog_nfsstat3_print, "\"commit\""}, 4067c478bd9Sstevel@tonic-gate }; 4077c478bd9Sstevel@tonic-gate 4087c478bd9Sstevel@tonic-gate /* 4097c478bd9Sstevel@tonic-gate * NFSLOG VERSION 1 4107c478bd9Sstevel@tonic-gate */ 4117c478bd9Sstevel@tonic-gate 4127c478bd9Sstevel@tonic-gate static struct nfsl_proc_disp nfsl_log_elf_proc_v1[] = { 4137c478bd9Sstevel@tonic-gate 4147c478bd9Sstevel@tonic-gate /* NFSLOG_NULL = 0 */ 4157c478bd9Sstevel@tonic-gate {nfslog_null_args, nfslog_null_res, "\"null\""}, 4167c478bd9Sstevel@tonic-gate 4177c478bd9Sstevel@tonic-gate /* NFSLOG_SHARE = 1 */ 4187c478bd9Sstevel@tonic-gate {nfslog_sharefsargs_print, nfslog_nfsstat_print, "\"log_share\""}, 4197c478bd9Sstevel@tonic-gate 4207c478bd9Sstevel@tonic-gate /* NFSLOG_UNSHARE = 2 */ 4217c478bd9Sstevel@tonic-gate {nfslog_sharefsargs_print, nfslog_nfsstat_print, "\"log_unshare\""}, 4227c478bd9Sstevel@tonic-gate 4237c478bd9Sstevel@tonic-gate /* NFSLOG_LOOKUP = 3 */ 4247c478bd9Sstevel@tonic-gate {nfslog_diropargs3_print, nfslog_LOOKUP3res_print, "\"lookup\""}, 4257c478bd9Sstevel@tonic-gate 4267c478bd9Sstevel@tonic-gate /* NFSLOG_GETFH = 4 */ 4277c478bd9Sstevel@tonic-gate {nfslog_getfhargs_print, nfslog_nfsstat_print, "\"log_getfh\""}, 4287c478bd9Sstevel@tonic-gate }; 4297c478bd9Sstevel@tonic-gate 4307c478bd9Sstevel@tonic-gate static struct nfsl_vers_disp nfsl_elf_vers_disptable[] = { 4317c478bd9Sstevel@tonic-gate {sizeof (nfsl_elf_proc_v2) / sizeof (nfsl_elf_proc_v2[0]), 4327c478bd9Sstevel@tonic-gate nfsl_elf_proc_v2}, 4337c478bd9Sstevel@tonic-gate {sizeof (nfsl_elf_proc_v3) / sizeof (nfsl_elf_proc_v3[0]), 4347c478bd9Sstevel@tonic-gate nfsl_elf_proc_v3}, 4357c478bd9Sstevel@tonic-gate }; 4367c478bd9Sstevel@tonic-gate 4377c478bd9Sstevel@tonic-gate static struct nfsl_vers_disp nfsl_log_elf_vers_disptable[] = { 4387c478bd9Sstevel@tonic-gate {sizeof (nfsl_log_elf_proc_v1) / sizeof (nfsl_log_elf_proc_v1[0]), 4397c478bd9Sstevel@tonic-gate nfsl_log_elf_proc_v1}, 4407c478bd9Sstevel@tonic-gate }; 4417c478bd9Sstevel@tonic-gate 4427c478bd9Sstevel@tonic-gate static struct nfsl_prog_disp nfsl_elf_dispatch_table[] = { 4437c478bd9Sstevel@tonic-gate {NFS_PROGRAM, 4447c478bd9Sstevel@tonic-gate NFS_VERSMIN, 4457c478bd9Sstevel@tonic-gate sizeof (nfsl_elf_vers_disptable) / 4467c478bd9Sstevel@tonic-gate sizeof (nfsl_elf_vers_disptable[0]), 4477c478bd9Sstevel@tonic-gate nfsl_elf_vers_disptable, "nfs"}, 4487c478bd9Sstevel@tonic-gate {NFSLOG_PROGRAM, 4497c478bd9Sstevel@tonic-gate NFSLOG_VERSMIN, 4507c478bd9Sstevel@tonic-gate sizeof (nfsl_log_elf_vers_disptable) / 4517c478bd9Sstevel@tonic-gate sizeof (nfsl_log_elf_vers_disptable[0]), 4527c478bd9Sstevel@tonic-gate nfsl_log_elf_vers_disptable, "nfslog"}, 4537c478bd9Sstevel@tonic-gate }; 4547c478bd9Sstevel@tonic-gate 4557c478bd9Sstevel@tonic-gate static int nfsl_elf_dispatch_table_arglen = 4567c478bd9Sstevel@tonic-gate sizeof (nfsl_elf_dispatch_table) / 4577c478bd9Sstevel@tonic-gate sizeof (nfsl_elf_dispatch_table[0]); 4587c478bd9Sstevel@tonic-gate 4597c478bd9Sstevel@tonic-gate static char * 4607c478bd9Sstevel@tonic-gate nfslog_get_status(short status) 4617c478bd9Sstevel@tonic-gate { 4627c478bd9Sstevel@tonic-gate int low, mid, high; 4637c478bd9Sstevel@tonic-gate short errstat; 4647c478bd9Sstevel@tonic-gate 4657c478bd9Sstevel@tonic-gate /* Usually status is 0... */ 4667c478bd9Sstevel@tonic-gate if (status == 0) 4677c478bd9Sstevel@tonic-gate return (nfsl_status_name[0]); 4687c478bd9Sstevel@tonic-gate 4697c478bd9Sstevel@tonic-gate low = 0; 4707c478bd9Sstevel@tonic-gate high = NFSL_ERR_CNT; 4717c478bd9Sstevel@tonic-gate mid = NFSL_ERR_CNT / 2; 4727c478bd9Sstevel@tonic-gate /* binary search for status string */ 4737c478bd9Sstevel@tonic-gate while (((errstat = nfsl_status[mid]) != status) && (low < mid) && 4747c478bd9Sstevel@tonic-gate (mid < high)) { 4757c478bd9Sstevel@tonic-gate if (errstat > status) { /* search bottom half */ 4767c478bd9Sstevel@tonic-gate high = mid; 4777c478bd9Sstevel@tonic-gate } else { /* search upper half */ 4787c478bd9Sstevel@tonic-gate low = mid; 4797c478bd9Sstevel@tonic-gate } 4807c478bd9Sstevel@tonic-gate mid = low + ((high - low) / 2); 4817c478bd9Sstevel@tonic-gate } 4827c478bd9Sstevel@tonic-gate if (errstat == status) { /* found it */ 4837c478bd9Sstevel@tonic-gate return (nfsl_status_name[mid]); 4847c478bd9Sstevel@tonic-gate } 4857c478bd9Sstevel@tonic-gate return (NULL); 4867c478bd9Sstevel@tonic-gate } 4877c478bd9Sstevel@tonic-gate 4887c478bd9Sstevel@tonic-gate /* nfsl_get_time - return string with time formatted as hh:mm:ss */ 4897c478bd9Sstevel@tonic-gate static char * 4907c478bd9Sstevel@tonic-gate nfsl_get_time(time_t tt) 4917c478bd9Sstevel@tonic-gate { 4927c478bd9Sstevel@tonic-gate static char timestr[20]; 4937c478bd9Sstevel@tonic-gate static time_t lasttime; 4947c478bd9Sstevel@tonic-gate struct tm tmst; 4957c478bd9Sstevel@tonic-gate 4967c478bd9Sstevel@tonic-gate if (tt == lasttime) 4977c478bd9Sstevel@tonic-gate return (timestr); 4987c478bd9Sstevel@tonic-gate if (localtime_r(&tt, &tmst) == NULL) { 4997c478bd9Sstevel@tonic-gate return (empty_name); 5007c478bd9Sstevel@tonic-gate } 5017c478bd9Sstevel@tonic-gate (void) sprintf(timestr, "%02d:%02d:%02d", 5027c478bd9Sstevel@tonic-gate tmst.tm_hour, tmst.tm_min, tmst.tm_sec); 5037c478bd9Sstevel@tonic-gate lasttime = tt; 5047c478bd9Sstevel@tonic-gate return (timestr); 5057c478bd9Sstevel@tonic-gate } 5067c478bd9Sstevel@tonic-gate 5077c478bd9Sstevel@tonic-gate /* nfsl_get_date - return date string formatted as "yyyy-mm-dd hh:mm:ss" */ 5087c478bd9Sstevel@tonic-gate static char * 5097c478bd9Sstevel@tonic-gate nfsl_get_date(time_t tt) 5107c478bd9Sstevel@tonic-gate { 5117c478bd9Sstevel@tonic-gate static char timestr[30]; 5127c478bd9Sstevel@tonic-gate static time_t lasttime; 5137c478bd9Sstevel@tonic-gate struct tm tmst; 5147c478bd9Sstevel@tonic-gate 5157c478bd9Sstevel@tonic-gate if (tt == lasttime) 5167c478bd9Sstevel@tonic-gate return (timestr); 5177c478bd9Sstevel@tonic-gate if (localtime_r(&tt, &tmst) == NULL) { 5187c478bd9Sstevel@tonic-gate return (empty_name); 5197c478bd9Sstevel@tonic-gate } 5207c478bd9Sstevel@tonic-gate (void) sprintf(timestr, "\"%04d-%02d-%02d %02d:%02d:%02d\"", 5217c478bd9Sstevel@tonic-gate tmst.tm_year + 1900, tmst.tm_mon + 1, tmst.tm_mday, 5227c478bd9Sstevel@tonic-gate tmst.tm_hour, tmst.tm_min, tmst.tm_sec); 5237c478bd9Sstevel@tonic-gate lasttime = tt; 5247c478bd9Sstevel@tonic-gate return (timestr); 5257c478bd9Sstevel@tonic-gate } 5267c478bd9Sstevel@tonic-gate 5277c478bd9Sstevel@tonic-gate /* 5287c478bd9Sstevel@tonic-gate * nfsl_get_date_nq - return date string formatted as yyyy-mm-dd hh:mm:ss 5297c478bd9Sstevel@tonic-gate * (no quotes) 5307c478bd9Sstevel@tonic-gate */ 5317c478bd9Sstevel@tonic-gate static char * 5327c478bd9Sstevel@tonic-gate nfsl_get_date_nq(time_t tt) 5337c478bd9Sstevel@tonic-gate { 5347c478bd9Sstevel@tonic-gate static char timestr[30]; 5357c478bd9Sstevel@tonic-gate static time_t lasttime; 5367c478bd9Sstevel@tonic-gate struct tm tmst; 5377c478bd9Sstevel@tonic-gate 5387c478bd9Sstevel@tonic-gate if (tt == lasttime) 5397c478bd9Sstevel@tonic-gate return (timestr); 5407c478bd9Sstevel@tonic-gate if (localtime_r(&tt, &tmst) == NULL) { 5417c478bd9Sstevel@tonic-gate return (empty_name); 5427c478bd9Sstevel@tonic-gate } 5437c478bd9Sstevel@tonic-gate (void) sprintf(timestr, "%04d-%02d-%02d %02d:%02d:%02d", 5447c478bd9Sstevel@tonic-gate tmst.tm_year + 1900, tmst.tm_mon + 1, tmst.tm_mday, 5457c478bd9Sstevel@tonic-gate tmst.tm_hour, tmst.tm_min, tmst.tm_sec); 5467c478bd9Sstevel@tonic-gate return (timestr); 5477c478bd9Sstevel@tonic-gate } 5487c478bd9Sstevel@tonic-gate 5497c478bd9Sstevel@tonic-gate /* write log buffer out to file */ 5507c478bd9Sstevel@tonic-gate static int 5517c478bd9Sstevel@tonic-gate nfsl_write_elfbuf(struct nfsl_log_file *elfrec) 5527c478bd9Sstevel@tonic-gate { 5537c478bd9Sstevel@tonic-gate int rc; 5547c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 5557c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 5567c478bd9Sstevel@tonic-gate 5577c478bd9Sstevel@tonic-gate if (debug > 1) 5587c478bd9Sstevel@tonic-gate (void) printf("nfsl_write_elfbuf: bufoffset %d\n", 5597c478bd9Sstevel@tonic-gate elfbufoffset); 5607c478bd9Sstevel@tonic-gate if (elfbufoffset <= 0) 5617c478bd9Sstevel@tonic-gate return (0); 5627c478bd9Sstevel@tonic-gate elfbuf[elfbufoffset] = '\0'; 5637c478bd9Sstevel@tonic-gate if ((rc = fputs(elfbuf, elfrec->fp)) < 0) { 5647c478bd9Sstevel@tonic-gate syslog(LOG_ERR, gettext("Write to %s failed: %s\n"), 5657c478bd9Sstevel@tonic-gate elfrec->path, strerror(errno)); 5667c478bd9Sstevel@tonic-gate return (-1); 5677c478bd9Sstevel@tonic-gate } 5687c478bd9Sstevel@tonic-gate if (rc != elfbufoffset) { 5697c478bd9Sstevel@tonic-gate syslog(LOG_ERR, gettext("Write %d bytes to %s returned %d\n"), 5707c478bd9Sstevel@tonic-gate elfbufoffset, elfrec->path, rc); 5717c478bd9Sstevel@tonic-gate return (-1); 5727c478bd9Sstevel@tonic-gate } 5737c478bd9Sstevel@tonic-gate elfrec->bufoffset = 0; 5747c478bd9Sstevel@tonic-gate return (0); 5757c478bd9Sstevel@tonic-gate } 5767c478bd9Sstevel@tonic-gate 5777c478bd9Sstevel@tonic-gate /*ARGSUSED*/ 5787c478bd9Sstevel@tonic-gate static void 5797c478bd9Sstevel@tonic-gate nfslog_null_args(struct nfsl_log_file *elfrec, caddr_t *nfsl_args) 5807c478bd9Sstevel@tonic-gate { 5817c478bd9Sstevel@tonic-gate } 5827c478bd9Sstevel@tonic-gate 5837c478bd9Sstevel@tonic-gate /*ARGSUSED*/ 5847c478bd9Sstevel@tonic-gate static void 5857c478bd9Sstevel@tonic-gate nfslog_null_res(struct nfsl_log_file *elfrec, caddr_t *nfsl_res) 5867c478bd9Sstevel@tonic-gate { 5877c478bd9Sstevel@tonic-gate } 5887c478bd9Sstevel@tonic-gate 5897c478bd9Sstevel@tonic-gate static void 5907c478bd9Sstevel@tonic-gate nfslog_fh3_print(struct nfsl_log_file *elfrec, nfs_fh3 *fh3) 5917c478bd9Sstevel@tonic-gate { 5927c478bd9Sstevel@tonic-gate if (!nfsl_print_fh) 5937c478bd9Sstevel@tonic-gate return; 594*27242a7cSthurlow if (fh3->fh3_length == sizeof (fhandle_t)) { 595*27242a7cSthurlow nfslog_fhandle_print(elfrec, (fhandle_t *)&fh3->fh3_u.data); 5967c478bd9Sstevel@tonic-gate } else { 5977c478bd9Sstevel@tonic-gate nfslog_opaque_print_buf(fh3->fh3_u.data, fh3->fh3_length, 5987c478bd9Sstevel@tonic-gate elfrec->buf, &elfrec->bufoffset, 5997c478bd9Sstevel@tonic-gate DFLT_BUFFERSIZE + DFLT_OVFSIZE); 6007c478bd9Sstevel@tonic-gate } 6017c478bd9Sstevel@tonic-gate } 6027c478bd9Sstevel@tonic-gate 6037c478bd9Sstevel@tonic-gate /* 6047c478bd9Sstevel@tonic-gate * NFS VERSION 2 6057c478bd9Sstevel@tonic-gate */ 6067c478bd9Sstevel@tonic-gate 6077c478bd9Sstevel@tonic-gate 6087c478bd9Sstevel@tonic-gate /* Functions that elf print the arguments */ 6097c478bd9Sstevel@tonic-gate 6107c478bd9Sstevel@tonic-gate static void 6117c478bd9Sstevel@tonic-gate nfslog_fhandle_print(struct nfsl_log_file *elfrec, fhandle_t *args) 6127c478bd9Sstevel@tonic-gate { 6137c478bd9Sstevel@tonic-gate if (!nfsl_print_fh) 6147c478bd9Sstevel@tonic-gate return; 6157c478bd9Sstevel@tonic-gate nfslog_opaque_print_buf(args, sizeof (*args), 6167c478bd9Sstevel@tonic-gate elfrec->buf, &elfrec->bufoffset, 6177c478bd9Sstevel@tonic-gate DFLT_BUFFERSIZE + DFLT_OVFSIZE); 6187c478bd9Sstevel@tonic-gate } 6197c478bd9Sstevel@tonic-gate 6207c478bd9Sstevel@tonic-gate static void 6217c478bd9Sstevel@tonic-gate nfslog_diropargs_print(struct nfsl_log_file *elfrec, nfslog_diropargs *args) 6227c478bd9Sstevel@tonic-gate { 6237c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 6247c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 6257c478bd9Sstevel@tonic-gate 6267c478bd9Sstevel@tonic-gate if (nfsl_print_fh) { 6277c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->da_fhandle); 6287c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 6297c478bd9Sstevel@tonic-gate if (args->da_name != NULL) { 6307c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 6317c478bd9Sstevel@tonic-gate " \"%s\"", args->da_name); 6327c478bd9Sstevel@tonic-gate } else { 6337c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 6347c478bd9Sstevel@tonic-gate empty_name); 6357c478bd9Sstevel@tonic-gate } 6367c478bd9Sstevel@tonic-gate } 6377c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 6387c478bd9Sstevel@tonic-gate } 6397c478bd9Sstevel@tonic-gate 6407c478bd9Sstevel@tonic-gate static void 6417c478bd9Sstevel@tonic-gate nfslog_sattr_print(struct nfsl_log_file *elfrec, nfslog_sattr *args) 6427c478bd9Sstevel@tonic-gate { 6437c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 6447c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 6457c478bd9Sstevel@tonic-gate 6467c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ 6477c478bd9Sstevel@tonic-gate if (args->sa_mode != (uint32_t)-1) { 6487c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 6497c478bd9Sstevel@tonic-gate " \"mode=0%o\"", args->sa_mode); 6507c478bd9Sstevel@tonic-gate } 6517c478bd9Sstevel@tonic-gate if (args->sa_uid != (uint32_t)-1) { 6527c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 6537c478bd9Sstevel@tonic-gate " \"uid=0x%x\"", args->sa_uid); 6547c478bd9Sstevel@tonic-gate } 6557c478bd9Sstevel@tonic-gate if (args->sa_gid != (uint32_t)-1) { 6567c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 6577c478bd9Sstevel@tonic-gate " \"gid=0x%x\"", args->sa_gid); 6587c478bd9Sstevel@tonic-gate } 6597c478bd9Sstevel@tonic-gate if (args->sa_size != (uint32_t)-1) { 6607c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 6617c478bd9Sstevel@tonic-gate " \"size=0x%x\"", args->sa_size); 6627c478bd9Sstevel@tonic-gate } 6637c478bd9Sstevel@tonic-gate if (args->sa_atime.tv_sec != (uint32_t)-1) { 6647c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 6657c478bd9Sstevel@tonic-gate " \"atime=%s\"", 6667c478bd9Sstevel@tonic-gate nfsl_get_date_nq((time_t)args->sa_atime.tv_sec)); 6677c478bd9Sstevel@tonic-gate } 6687c478bd9Sstevel@tonic-gate if (args->sa_mtime.tv_sec != (uint32_t)-1) { 6697c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 6707c478bd9Sstevel@tonic-gate " \"mtime=%s\"", 6717c478bd9Sstevel@tonic-gate nfsl_get_date_nq((time_t)args->sa_mtime.tv_sec)); 6727c478bd9Sstevel@tonic-gate } 6737c478bd9Sstevel@tonic-gate /* END CSTYLED */ 6747c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 6757c478bd9Sstevel@tonic-gate } 6767c478bd9Sstevel@tonic-gate 6777c478bd9Sstevel@tonic-gate static void 6787c478bd9Sstevel@tonic-gate nfslog_setattrargs_print(struct nfsl_log_file *elfrec, nfslog_setattrargs *args) 6797c478bd9Sstevel@tonic-gate { 6807c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->saa_fh); 6817c478bd9Sstevel@tonic-gate nfslog_sattr_print(elfrec, &args->saa_sa); 6827c478bd9Sstevel@tonic-gate } 6837c478bd9Sstevel@tonic-gate 6847c478bd9Sstevel@tonic-gate static void 6857c478bd9Sstevel@tonic-gate nfslog_nfsreadargs_print(struct nfsl_log_file *elfrec, 6867c478bd9Sstevel@tonic-gate nfslog_nfsreadargs *args) 6877c478bd9Sstevel@tonic-gate { 6887c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 6897c478bd9Sstevel@tonic-gate int elfbufoffset; 6907c478bd9Sstevel@tonic-gate 6917c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->ra_fhandle); 6927c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 6937c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 6947c478bd9Sstevel@tonic-gate args->ra_offset); 6957c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 6967c478bd9Sstevel@tonic-gate args->ra_count); 6977c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 6987c478bd9Sstevel@tonic-gate args->ra_totcount); 6997c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 7007c478bd9Sstevel@tonic-gate } 7017c478bd9Sstevel@tonic-gate 7027c478bd9Sstevel@tonic-gate static void 7037c478bd9Sstevel@tonic-gate nfslog_writeargs_print(struct nfsl_log_file *elfrec, nfslog_writeargs *args) 7047c478bd9Sstevel@tonic-gate { 7057c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 7067c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 7077c478bd9Sstevel@tonic-gate 7087c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->waargs_fhandle); 7097c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 7107c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 7117c478bd9Sstevel@tonic-gate args->waargs_begoff); 7127c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 7137c478bd9Sstevel@tonic-gate args->waargs_offset); 7147c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 7157c478bd9Sstevel@tonic-gate args->waargs_totcount); 7167c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " 0x%x", 7177c478bd9Sstevel@tonic-gate args->waargs_count); 7187c478bd9Sstevel@tonic-gate } 7197c478bd9Sstevel@tonic-gate 7207c478bd9Sstevel@tonic-gate static void 7217c478bd9Sstevel@tonic-gate nfslog_writeresult_print(struct nfsl_log_file *elfrec, nfslog_writeresult *res, 7227c478bd9Sstevel@tonic-gate bool_t print_status) 7237c478bd9Sstevel@tonic-gate { 7247c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 7257c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 7267c478bd9Sstevel@tonic-gate 7277c478bd9Sstevel@tonic-gate if (print_status) { 7287c478bd9Sstevel@tonic-gate nfslog_nfsstat_print(elfrec, &res->wr_status, print_status); 7297c478bd9Sstevel@tonic-gate } else if (res->wr_status == NFS_OK) { 7307c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 7317c478bd9Sstevel@tonic-gate res->nfslog_writeresult_u.wr_size); 7327c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 7337c478bd9Sstevel@tonic-gate } 7347c478bd9Sstevel@tonic-gate } 7357c478bd9Sstevel@tonic-gate 7367c478bd9Sstevel@tonic-gate static void 7377c478bd9Sstevel@tonic-gate nfslog_creatargs_print(struct nfsl_log_file *elfrec, nfslog_createargs *args) 7387c478bd9Sstevel@tonic-gate { 7397c478bd9Sstevel@tonic-gate nfslog_diropargs_print(elfrec, &args->ca_da); 7407c478bd9Sstevel@tonic-gate nfslog_sattr_print(elfrec, &args->ca_sa); 7417c478bd9Sstevel@tonic-gate } 7427c478bd9Sstevel@tonic-gate 7437c478bd9Sstevel@tonic-gate 7447c478bd9Sstevel@tonic-gate static void 7457c478bd9Sstevel@tonic-gate nfslog_rddirargs_print(struct nfsl_log_file *elfrec, nfslog_rddirargs *args) 7467c478bd9Sstevel@tonic-gate { 7477c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 7487c478bd9Sstevel@tonic-gate int elfbufoffset; 7497c478bd9Sstevel@tonic-gate 7507c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->rda_fh); 7517c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 7527c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 7537c478bd9Sstevel@tonic-gate args->rda_offset); 7547c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 7557c478bd9Sstevel@tonic-gate args->rda_count); 7567c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 7577c478bd9Sstevel@tonic-gate } 7587c478bd9Sstevel@tonic-gate 7597c478bd9Sstevel@tonic-gate static void 7607c478bd9Sstevel@tonic-gate nfslog_rnmargs_print(struct nfsl_log_file *elfrec, nfslog_rnmargs *args) 7617c478bd9Sstevel@tonic-gate { 7627c478bd9Sstevel@tonic-gate nfslog_diropargs_print(elfrec, &args->rna_from); 7637c478bd9Sstevel@tonic-gate nfslog_diropargs_print(elfrec, &args->rna_to); 7647c478bd9Sstevel@tonic-gate } 7657c478bd9Sstevel@tonic-gate 7667c478bd9Sstevel@tonic-gate static void 7677c478bd9Sstevel@tonic-gate nfslog_linkargs_print(struct nfsl_log_file *elfrec, nfslog_linkargs *args) 7687c478bd9Sstevel@tonic-gate { 7697c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->la_from); 7707c478bd9Sstevel@tonic-gate nfslog_diropargs_print(elfrec, &args->la_to); 7717c478bd9Sstevel@tonic-gate } 7727c478bd9Sstevel@tonic-gate 7737c478bd9Sstevel@tonic-gate static void 7747c478bd9Sstevel@tonic-gate nfslog_symlinkargs_print(struct nfsl_log_file *elfrec, nfslog_symlinkargs *args) 7757c478bd9Sstevel@tonic-gate { 7767c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 7777c478bd9Sstevel@tonic-gate int elfbufoffset; 7787c478bd9Sstevel@tonic-gate 7797c478bd9Sstevel@tonic-gate nfslog_diropargs_print(elfrec, &args->sla_from); 7807c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 7817c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " \"%s\"", 7827c478bd9Sstevel@tonic-gate args->sla_tnm); 7837c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 7847c478bd9Sstevel@tonic-gate nfslog_sattr_print(elfrec, &args->sla_sa); 7857c478bd9Sstevel@tonic-gate } 7867c478bd9Sstevel@tonic-gate 7877c478bd9Sstevel@tonic-gate /* 7887c478bd9Sstevel@tonic-gate * SHARE/UNSHARE fs log args copy 7897c478bd9Sstevel@tonic-gate */ 7907c478bd9Sstevel@tonic-gate static void 7917c478bd9Sstevel@tonic-gate nfslog_sharefsargs_print(struct nfsl_log_file *elfrec, 7927c478bd9Sstevel@tonic-gate nfslog_sharefsargs *args) 7937c478bd9Sstevel@tonic-gate { 7947c478bd9Sstevel@tonic-gate unsigned int elfbufoffset; 7957c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 7967c478bd9Sstevel@tonic-gate 7977c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->sh_fh_buf); 7987c478bd9Sstevel@tonic-gate 7997c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 8007c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 8017c478bd9Sstevel@tonic-gate args->sh_flags); 8027c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 8037c478bd9Sstevel@tonic-gate args->sh_anon); 8047c478bd9Sstevel@tonic-gate if (nfsl_print_fh) { 8057c478bd9Sstevel@tonic-gate if (args->sh_path != NULL) { 8067c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 8077c478bd9Sstevel@tonic-gate " \"%s\"", args->sh_path); 8087c478bd9Sstevel@tonic-gate } else { 8097c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 8107c478bd9Sstevel@tonic-gate empty_name); 8117c478bd9Sstevel@tonic-gate } 8127c478bd9Sstevel@tonic-gate } 8137c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 8147c478bd9Sstevel@tonic-gate } 8157c478bd9Sstevel@tonic-gate 8167c478bd9Sstevel@tonic-gate static void 8177c478bd9Sstevel@tonic-gate nfslog_getfhargs_print(struct nfsl_log_file *elfrec, 8187c478bd9Sstevel@tonic-gate nfslog_getfhargs *args) 8197c478bd9Sstevel@tonic-gate { 8207c478bd9Sstevel@tonic-gate unsigned int elfbufoffset; 8217c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 8227c478bd9Sstevel@tonic-gate 8237c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, &args->gfh_fh_buf); 8247c478bd9Sstevel@tonic-gate 8257c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 8267c478bd9Sstevel@tonic-gate if (nfsl_print_fh) { 8277c478bd9Sstevel@tonic-gate if (args->gfh_path != NULL) { 8287c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 8297c478bd9Sstevel@tonic-gate " \"%s\"", args->gfh_path); 8307c478bd9Sstevel@tonic-gate } else { 8317c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 8327c478bd9Sstevel@tonic-gate empty_name); 8337c478bd9Sstevel@tonic-gate } 8347c478bd9Sstevel@tonic-gate } 8357c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 8367c478bd9Sstevel@tonic-gate } 8377c478bd9Sstevel@tonic-gate 8387c478bd9Sstevel@tonic-gate static void 8397c478bd9Sstevel@tonic-gate nfslog_nfsstat_print(struct nfsl_log_file *elfrec, enum nfsstat *res, 8407c478bd9Sstevel@tonic-gate bool_t print_status) 8417c478bd9Sstevel@tonic-gate { 8427c478bd9Sstevel@tonic-gate if (print_status) { 8437c478bd9Sstevel@tonic-gate char *statp = nfslog_get_status((short)(*res)); 8447c478bd9Sstevel@tonic-gate 8457c478bd9Sstevel@tonic-gate if (statp != NULL) 8467c478bd9Sstevel@tonic-gate elfrec->bufoffset += 8477c478bd9Sstevel@tonic-gate sprintf(&elfrec->buf[elfrec->bufoffset], " %s", 8487c478bd9Sstevel@tonic-gate statp); 8497c478bd9Sstevel@tonic-gate else 8507c478bd9Sstevel@tonic-gate elfrec->bufoffset += 8517c478bd9Sstevel@tonic-gate sprintf(&elfrec->buf[elfrec->bufoffset], " %5d", 8527c478bd9Sstevel@tonic-gate *res); 8537c478bd9Sstevel@tonic-gate } 8547c478bd9Sstevel@tonic-gate } 8557c478bd9Sstevel@tonic-gate 8567c478bd9Sstevel@tonic-gate static void 8577c478bd9Sstevel@tonic-gate nfslog_diropres_print(struct nfsl_log_file *elfrec, nfslog_diropres *res, 8587c478bd9Sstevel@tonic-gate bool_t print_status) 8597c478bd9Sstevel@tonic-gate { 8607c478bd9Sstevel@tonic-gate if (print_status) { 8617c478bd9Sstevel@tonic-gate nfslog_nfsstat_print(elfrec, &res->dr_status, print_status); 8627c478bd9Sstevel@tonic-gate } else if (res->dr_status == NFS_OK) { 8637c478bd9Sstevel@tonic-gate nfslog_fhandle_print(elfrec, 8647c478bd9Sstevel@tonic-gate &res->nfslog_diropres_u.dr_ok.drok_fhandle); 8657c478bd9Sstevel@tonic-gate } 8667c478bd9Sstevel@tonic-gate } 8677c478bd9Sstevel@tonic-gate 8687c478bd9Sstevel@tonic-gate static void 8697c478bd9Sstevel@tonic-gate nfslog_rdlnres_print(struct nfsl_log_file *elfrec, nfslog_rdlnres *res, 8707c478bd9Sstevel@tonic-gate bool_t print_status) 8717c478bd9Sstevel@tonic-gate { 8727c478bd9Sstevel@tonic-gate if (print_status) { 8737c478bd9Sstevel@tonic-gate nfslog_nfsstat_print(elfrec, &res->rl_status, print_status); 8747c478bd9Sstevel@tonic-gate } else if (res->rl_status == NFS_OK) { 8757c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 8767c478bd9Sstevel@tonic-gate " \"%s\"", res->nfslog_rdlnres_u.rl_ok); 8777c478bd9Sstevel@tonic-gate } 8787c478bd9Sstevel@tonic-gate } 8797c478bd9Sstevel@tonic-gate 8807c478bd9Sstevel@tonic-gate static void 8817c478bd9Sstevel@tonic-gate nfslog_rdresult_print(struct nfsl_log_file *elfrec, nfslog_rdresult *res, 8827c478bd9Sstevel@tonic-gate bool_t print_status) 8837c478bd9Sstevel@tonic-gate { 8847c478bd9Sstevel@tonic-gate if (print_status) { 8857c478bd9Sstevel@tonic-gate nfslog_nfsstat_print(elfrec, &res->r_status, print_status); 8867c478bd9Sstevel@tonic-gate } else if (res->r_status == NFS_OK) { 8877c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 8887c478bd9Sstevel@tonic-gate " 0x%x", res->nfslog_rdresult_u.r_ok.filesize); 8897c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 8907c478bd9Sstevel@tonic-gate " 0x%x", res->nfslog_rdresult_u.r_ok.rrok_count); 8917c478bd9Sstevel@tonic-gate } 8927c478bd9Sstevel@tonic-gate } 8937c478bd9Sstevel@tonic-gate 8947c478bd9Sstevel@tonic-gate static void 8957c478bd9Sstevel@tonic-gate nfslog_rddirres_print(struct nfsl_log_file *elfrec, nfslog_rddirres *res, 8967c478bd9Sstevel@tonic-gate bool_t print_status) 8977c478bd9Sstevel@tonic-gate { 8987c478bd9Sstevel@tonic-gate if (print_status) { 8997c478bd9Sstevel@tonic-gate nfslog_nfsstat_print(elfrec, &res->rd_status, print_status); 9007c478bd9Sstevel@tonic-gate } else if (res->rd_status == NFS_OK) { 9017c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 9027c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 9037c478bd9Sstevel@tonic-gate 9047c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 9057c478bd9Sstevel@tonic-gate res->nfslog_rddirres_u.rd_ok.rdok_offset); 9067c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 9077c478bd9Sstevel@tonic-gate res->nfslog_rddirres_u.rd_ok.rdok_size); 9087c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 9097c478bd9Sstevel@tonic-gate res->nfslog_rddirres_u.rd_ok.rdok_eof); 9107c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 9117c478bd9Sstevel@tonic-gate } 9127c478bd9Sstevel@tonic-gate } 9137c478bd9Sstevel@tonic-gate 9147c478bd9Sstevel@tonic-gate /* 9157c478bd9Sstevel@tonic-gate * NFS VERSION 3 9167c478bd9Sstevel@tonic-gate */ 9177c478bd9Sstevel@tonic-gate 9187c478bd9Sstevel@tonic-gate static void 9197c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(struct nfsl_log_file *elfrec, 9207c478bd9Sstevel@tonic-gate nfslog_diropargs3 *args) 9217c478bd9Sstevel@tonic-gate { 9227c478bd9Sstevel@tonic-gate if (nfsl_print_fh) { 9237c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &args->dir); 9247c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 9257c478bd9Sstevel@tonic-gate " \"%s\"", args->name); 9267c478bd9Sstevel@tonic-gate } 9277c478bd9Sstevel@tonic-gate } 9287c478bd9Sstevel@tonic-gate 9297c478bd9Sstevel@tonic-gate static void 9307c478bd9Sstevel@tonic-gate nfslog_size3_print(struct nfsl_log_file *elfrec, set_size3 *args) 9317c478bd9Sstevel@tonic-gate { 9327c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 9337c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 9347c478bd9Sstevel@tonic-gate 9357c478bd9Sstevel@tonic-gate if (args->set_it) { 9367c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 9377c478bd9Sstevel@tonic-gate /* CSTYLED */ 9387c478bd9Sstevel@tonic-gate " \"size=0x%llx\"", args->size); 9397c478bd9Sstevel@tonic-gate } 9407c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 9417c478bd9Sstevel@tonic-gate } 9427c478bd9Sstevel@tonic-gate 9437c478bd9Sstevel@tonic-gate static void 9447c478bd9Sstevel@tonic-gate nfslog_SETATTR3args_print(struct nfsl_log_file *elfrec, 9457c478bd9Sstevel@tonic-gate nfslog_SETATTR3args *args) 9467c478bd9Sstevel@tonic-gate { 9477c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &args->object); 9487c478bd9Sstevel@tonic-gate nfslog_size3_print(elfrec, &args->size); 9497c478bd9Sstevel@tonic-gate } 9507c478bd9Sstevel@tonic-gate 9517c478bd9Sstevel@tonic-gate static void 9527c478bd9Sstevel@tonic-gate nfslog_READ3args_print(struct nfsl_log_file *elfrec, nfslog_READ3args *args) 9537c478bd9Sstevel@tonic-gate { 9547c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &args->file); 9557c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " 0x%llx", 9567c478bd9Sstevel@tonic-gate args->offset); 9577c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " 0x%x", 9587c478bd9Sstevel@tonic-gate args->count); 9597c478bd9Sstevel@tonic-gate } 9607c478bd9Sstevel@tonic-gate 9617c478bd9Sstevel@tonic-gate static void 9627c478bd9Sstevel@tonic-gate nfslog_WRITE3args_print(struct nfsl_log_file *elfrec, 9637c478bd9Sstevel@tonic-gate nfslog_WRITE3args *args) 9647c478bd9Sstevel@tonic-gate { 9657c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 9667c478bd9Sstevel@tonic-gate int elfbufoffset; 9677c478bd9Sstevel@tonic-gate 9687c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &args->file); 9697c478bd9Sstevel@tonic-gate elfbufoffset = elfrec->bufoffset; 9707c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%llx", 9717c478bd9Sstevel@tonic-gate args->offset); 9727c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 9737c478bd9Sstevel@tonic-gate args->count); 9747c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 9757c478bd9Sstevel@tonic-gate args->stable); 9767c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 9777c478bd9Sstevel@tonic-gate } 9787c478bd9Sstevel@tonic-gate 9797c478bd9Sstevel@tonic-gate static void 9807c478bd9Sstevel@tonic-gate nfslog_CREATE3args_print(struct nfsl_log_file *elfrec, 9817c478bd9Sstevel@tonic-gate nfslog_CREATE3args *args) 9827c478bd9Sstevel@tonic-gate { 9837c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->where); 9847c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " %s", 9857c478bd9Sstevel@tonic-gate NFSL_CREATEMODE3(args->how.mode)); 9867c478bd9Sstevel@tonic-gate if (args->how.mode != EXCLUSIVE) { 9877c478bd9Sstevel@tonic-gate nfslog_size3_print(elfrec, 9887c478bd9Sstevel@tonic-gate &args->how.nfslog_createhow3_u.size); 9897c478bd9Sstevel@tonic-gate } 9907c478bd9Sstevel@tonic-gate } 9917c478bd9Sstevel@tonic-gate 9927c478bd9Sstevel@tonic-gate static void 9937c478bd9Sstevel@tonic-gate nfslog_MKDIR3args_print(struct nfsl_log_file *elfrec, 9947c478bd9Sstevel@tonic-gate nfslog_MKDIR3args *args) 9957c478bd9Sstevel@tonic-gate { 9967c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->where); 9977c478bd9Sstevel@tonic-gate } 9987c478bd9Sstevel@tonic-gate 9997c478bd9Sstevel@tonic-gate static void 10007c478bd9Sstevel@tonic-gate nfslog_SYMLINK3args_print(struct nfsl_log_file *elfrec, 10017c478bd9Sstevel@tonic-gate nfslog_SYMLINK3args *args) 10027c478bd9Sstevel@tonic-gate { 10037c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->where); 10047c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 10057c478bd9Sstevel@tonic-gate " \"%s\"", args->symlink_data); 10067c478bd9Sstevel@tonic-gate } 10077c478bd9Sstevel@tonic-gate 10087c478bd9Sstevel@tonic-gate static void 10097c478bd9Sstevel@tonic-gate nfslog_MKNOD3args_print(struct nfsl_log_file *elfrec, 10107c478bd9Sstevel@tonic-gate nfslog_MKNOD3args *args) 10117c478bd9Sstevel@tonic-gate { 10127c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->where); 10137c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " %s", 10147c478bd9Sstevel@tonic-gate NFSL_FTYPE3(args->type)); 10157c478bd9Sstevel@tonic-gate } 10167c478bd9Sstevel@tonic-gate 10177c478bd9Sstevel@tonic-gate static void 10187c478bd9Sstevel@tonic-gate nfslog_REMOVE3args_print(struct nfsl_log_file *elfrec, 10197c478bd9Sstevel@tonic-gate nfslog_REMOVE3args *args) 10207c478bd9Sstevel@tonic-gate { 10217c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->object); 10227c478bd9Sstevel@tonic-gate } 10237c478bd9Sstevel@tonic-gate 10247c478bd9Sstevel@tonic-gate static void 10257c478bd9Sstevel@tonic-gate nfslog_RMDIR3args_print(struct nfsl_log_file *elfrec, 10267c478bd9Sstevel@tonic-gate nfslog_RMDIR3args *args) 10277c478bd9Sstevel@tonic-gate { 10287c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->object); 10297c478bd9Sstevel@tonic-gate } 10307c478bd9Sstevel@tonic-gate 10317c478bd9Sstevel@tonic-gate static void 10327c478bd9Sstevel@tonic-gate nfslog_RENAME3args_print(struct nfsl_log_file *elfrec, 10337c478bd9Sstevel@tonic-gate nfslog_RENAME3args *args) 10347c478bd9Sstevel@tonic-gate { 10357c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->from); 10367c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->to); 10377c478bd9Sstevel@tonic-gate } 10387c478bd9Sstevel@tonic-gate 10397c478bd9Sstevel@tonic-gate static void 10407c478bd9Sstevel@tonic-gate nfslog_LINK3args_print(struct nfsl_log_file *elfrec, nfslog_LINK3args *args) 10417c478bd9Sstevel@tonic-gate { 10427c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &args->file); 10437c478bd9Sstevel@tonic-gate nfslog_diropargs3_print(elfrec, &args->link); 10447c478bd9Sstevel@tonic-gate } 10457c478bd9Sstevel@tonic-gate 10467c478bd9Sstevel@tonic-gate static void 10477c478bd9Sstevel@tonic-gate nfslog_READDIRPLUS3args_print(struct nfsl_log_file *elfrec, 10487c478bd9Sstevel@tonic-gate nfslog_READDIRPLUS3args *args) 10497c478bd9Sstevel@tonic-gate { 10507c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &args->dir); 10517c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " 0x%x", 10527c478bd9Sstevel@tonic-gate args->dircount); 10537c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " 0x%x", 10547c478bd9Sstevel@tonic-gate args->maxcount); 10557c478bd9Sstevel@tonic-gate } 10567c478bd9Sstevel@tonic-gate 10577c478bd9Sstevel@tonic-gate static void 10587c478bd9Sstevel@tonic-gate nfslog_COMMIT3args_print(struct nfsl_log_file *elfrec, 10597c478bd9Sstevel@tonic-gate nfslog_COMMIT3args *args) 10607c478bd9Sstevel@tonic-gate { 10617c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &args->file); 10627c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " 0x%llx", 10637c478bd9Sstevel@tonic-gate args->offset); 10647c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], " 0x%x", 10657c478bd9Sstevel@tonic-gate args->count); 10667c478bd9Sstevel@tonic-gate } 10677c478bd9Sstevel@tonic-gate 10687c478bd9Sstevel@tonic-gate static void 10697c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(struct nfsl_log_file *elfrec, enum nfsstat3 *res, 10707c478bd9Sstevel@tonic-gate bool_t print_status) 10717c478bd9Sstevel@tonic-gate { 10727c478bd9Sstevel@tonic-gate if (print_status) { 10737c478bd9Sstevel@tonic-gate char *statp = nfslog_get_status((short)(*res)); 10747c478bd9Sstevel@tonic-gate 10757c478bd9Sstevel@tonic-gate if (statp != NULL) 10767c478bd9Sstevel@tonic-gate elfrec->bufoffset += 10777c478bd9Sstevel@tonic-gate sprintf(&elfrec->buf[elfrec->bufoffset], " %s", 10787c478bd9Sstevel@tonic-gate statp); 10797c478bd9Sstevel@tonic-gate else 10807c478bd9Sstevel@tonic-gate elfrec->bufoffset += 10817c478bd9Sstevel@tonic-gate sprintf(&elfrec->buf[elfrec->bufoffset], " %5d", 10827c478bd9Sstevel@tonic-gate *res); 10837c478bd9Sstevel@tonic-gate } 10847c478bd9Sstevel@tonic-gate } 10857c478bd9Sstevel@tonic-gate 10867c478bd9Sstevel@tonic-gate static void 10877c478bd9Sstevel@tonic-gate nfslog_LOOKUP3res_print(struct nfsl_log_file *elfrec, 10887c478bd9Sstevel@tonic-gate nfslog_LOOKUP3res *res, bool_t print_status) 10897c478bd9Sstevel@tonic-gate { 10907c478bd9Sstevel@tonic-gate if (print_status) { 10917c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 10927c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 10937c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, &res->nfslog_LOOKUP3res_u.object); 10947c478bd9Sstevel@tonic-gate } 10957c478bd9Sstevel@tonic-gate } 10967c478bd9Sstevel@tonic-gate 10977c478bd9Sstevel@tonic-gate static void 10987c478bd9Sstevel@tonic-gate nfslog_READLINK3res_print(struct nfsl_log_file *elfrec, 10997c478bd9Sstevel@tonic-gate nfslog_READLINK3res *res, bool_t print_status) 11007c478bd9Sstevel@tonic-gate { 11017c478bd9Sstevel@tonic-gate if (print_status) { 11027c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 11037c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 11047c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 11057c478bd9Sstevel@tonic-gate " %s", res->nfslog_READLINK3res_u.data); 11067c478bd9Sstevel@tonic-gate } 11077c478bd9Sstevel@tonic-gate } 11087c478bd9Sstevel@tonic-gate 11097c478bd9Sstevel@tonic-gate static void 11107c478bd9Sstevel@tonic-gate nfslog_READ3res_print(struct nfsl_log_file *elfrec, nfslog_READ3res *res, 11117c478bd9Sstevel@tonic-gate bool_t print_status) 11127c478bd9Sstevel@tonic-gate { 11137c478bd9Sstevel@tonic-gate if (print_status) { 11147c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 11157c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 11167c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 11177c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 11187c478bd9Sstevel@tonic-gate 11197c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%llx", 11207c478bd9Sstevel@tonic-gate res->nfslog_READ3res_u.ok.filesize); 11217c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 11227c478bd9Sstevel@tonic-gate res->nfslog_READ3res_u.ok.count); 11237c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 11247c478bd9Sstevel@tonic-gate res->nfslog_READ3res_u.ok.eof); 11257c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 11267c478bd9Sstevel@tonic-gate res->nfslog_READ3res_u.ok.size); 11277c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 11287c478bd9Sstevel@tonic-gate } 11297c478bd9Sstevel@tonic-gate } 11307c478bd9Sstevel@tonic-gate 11317c478bd9Sstevel@tonic-gate static void 11327c478bd9Sstevel@tonic-gate nfslog_WRITE3res_print(struct nfsl_log_file *elfrec, nfslog_WRITE3res *res, 11337c478bd9Sstevel@tonic-gate bool_t print_status) 11347c478bd9Sstevel@tonic-gate { 11357c478bd9Sstevel@tonic-gate if (print_status) { 11367c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 11377c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 11387c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 11397c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 11407c478bd9Sstevel@tonic-gate 11417c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%llx", 11427c478bd9Sstevel@tonic-gate res->nfslog_WRITE3res_u.ok.filesize); 11437c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 11447c478bd9Sstevel@tonic-gate " 0x%x", res->nfslog_WRITE3res_u.ok.count); 11457c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfrec->buf[elfbufoffset], 11467c478bd9Sstevel@tonic-gate " 0x%x", res->nfslog_WRITE3res_u.ok.committed); 11477c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 11487c478bd9Sstevel@tonic-gate } 11497c478bd9Sstevel@tonic-gate } 11507c478bd9Sstevel@tonic-gate 11517c478bd9Sstevel@tonic-gate static void 11527c478bd9Sstevel@tonic-gate nfslog_CREATE3res_print(struct nfsl_log_file *elfrec, nfslog_CREATE3res *res, 11537c478bd9Sstevel@tonic-gate bool_t print_status) 11547c478bd9Sstevel@tonic-gate { 11557c478bd9Sstevel@tonic-gate if (print_status) { 11567c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 11577c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 11587c478bd9Sstevel@tonic-gate if (res->nfslog_CREATE3res_u.ok.obj.handle_follows) { 11597c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, 11607c478bd9Sstevel@tonic-gate &res->nfslog_CREATE3res_u.ok.obj.handle); 11617c478bd9Sstevel@tonic-gate } 11627c478bd9Sstevel@tonic-gate } 11637c478bd9Sstevel@tonic-gate } 11647c478bd9Sstevel@tonic-gate 11657c478bd9Sstevel@tonic-gate static void 11667c478bd9Sstevel@tonic-gate nfslog_MKDIR3res_print(struct nfsl_log_file *elfrec, nfslog_MKDIR3res *res, 11677c478bd9Sstevel@tonic-gate bool_t print_status) 11687c478bd9Sstevel@tonic-gate { 11697c478bd9Sstevel@tonic-gate if (print_status) { 11707c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 11717c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 11727c478bd9Sstevel@tonic-gate if (res->nfslog_MKDIR3res_u.obj.handle_follows) { 11737c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, 11747c478bd9Sstevel@tonic-gate &res->nfslog_MKDIR3res_u.obj.handle); 11757c478bd9Sstevel@tonic-gate } 11767c478bd9Sstevel@tonic-gate } 11777c478bd9Sstevel@tonic-gate } 11787c478bd9Sstevel@tonic-gate 11797c478bd9Sstevel@tonic-gate static void 11807c478bd9Sstevel@tonic-gate nfslog_SYMLINK3res_print(struct nfsl_log_file *elfrec, nfslog_SYMLINK3res *res, 11817c478bd9Sstevel@tonic-gate bool_t print_status) 11827c478bd9Sstevel@tonic-gate { 11837c478bd9Sstevel@tonic-gate if (print_status) { 11847c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 11857c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 11867c478bd9Sstevel@tonic-gate if (res->nfslog_SYMLINK3res_u.obj.handle_follows) { 11877c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, 11887c478bd9Sstevel@tonic-gate &res->nfslog_SYMLINK3res_u.obj.handle); 11897c478bd9Sstevel@tonic-gate } 11907c478bd9Sstevel@tonic-gate } 11917c478bd9Sstevel@tonic-gate } 11927c478bd9Sstevel@tonic-gate 11937c478bd9Sstevel@tonic-gate static void 11947c478bd9Sstevel@tonic-gate nfslog_MKNOD3res_print(struct nfsl_log_file *elfrec, nfslog_MKNOD3res *res, 11957c478bd9Sstevel@tonic-gate bool_t print_status) 11967c478bd9Sstevel@tonic-gate { 11977c478bd9Sstevel@tonic-gate if (print_status) { 11987c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 11997c478bd9Sstevel@tonic-gate } else if (res->status == NFS3_OK) { 12007c478bd9Sstevel@tonic-gate if (res->nfslog_MKNOD3res_u.obj.handle_follows) { 12017c478bd9Sstevel@tonic-gate nfslog_fh3_print(elfrec, 12027c478bd9Sstevel@tonic-gate &res->nfslog_MKNOD3res_u.obj.handle); 12037c478bd9Sstevel@tonic-gate } 12047c478bd9Sstevel@tonic-gate } 12057c478bd9Sstevel@tonic-gate } 12067c478bd9Sstevel@tonic-gate 12077c478bd9Sstevel@tonic-gate static void 12087c478bd9Sstevel@tonic-gate nfslog_READDIRPLUS3res_print(struct nfsl_log_file *elfrec, 12097c478bd9Sstevel@tonic-gate nfslog_READDIRPLUS3res *res, bool_t print_status) 12107c478bd9Sstevel@tonic-gate { 12117c478bd9Sstevel@tonic-gate if (print_status) { 12127c478bd9Sstevel@tonic-gate nfslog_nfsstat3_print(elfrec, &res->status, print_status); 12137c478bd9Sstevel@tonic-gate } 12147c478bd9Sstevel@tonic-gate } 12157c478bd9Sstevel@tonic-gate 12167c478bd9Sstevel@tonic-gate /* 12177c478bd9Sstevel@tonic-gate * **** End of table functions for logging specific procs **** 12187c478bd9Sstevel@tonic-gate * 12197c478bd9Sstevel@tonic-gate * Hereafter are the general logging management and dispatcher. 12207c478bd9Sstevel@tonic-gate */ 12217c478bd9Sstevel@tonic-gate 12227c478bd9Sstevel@tonic-gate 12237c478bd9Sstevel@tonic-gate /* 12247c478bd9Sstevel@tonic-gate * nfsl_ipaddr_print - extracts sender ip address from transport struct 12257c478bd9Sstevel@tonic-gate * and prints it in legible form. 12267c478bd9Sstevel@tonic-gate */ 12277c478bd9Sstevel@tonic-gate static void 12287c478bd9Sstevel@tonic-gate nfsl_ipaddr_print(struct nfsl_log_file *elfrec, struct netbuf *ptr) 12297c478bd9Sstevel@tonic-gate { 12307c478bd9Sstevel@tonic-gate struct hostent *hp; 12317c478bd9Sstevel@tonic-gate extern char *inet_ntop(); 12327c478bd9Sstevel@tonic-gate int size, sin_family, error; 12337c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 12347c478bd9Sstevel@tonic-gate char *addrp; 12357c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 12367c478bd9Sstevel@tonic-gate 12377c478bd9Sstevel@tonic-gate if (ptr->len == 0) { 12387c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 12397c478bd9Sstevel@tonic-gate empty_name); 12407c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 12417c478bd9Sstevel@tonic-gate empty_name); 12427c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 12437c478bd9Sstevel@tonic-gate return; 12447c478bd9Sstevel@tonic-gate } 12457c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " "); 12467c478bd9Sstevel@tonic-gate /* LINTED */ 12477c478bd9Sstevel@tonic-gate sin_family = ((struct sockaddr_in *)ptr->buf)->sin_family; 12487c478bd9Sstevel@tonic-gate switch (sin_family) { 12497c478bd9Sstevel@tonic-gate case (AF_INET): 12507c478bd9Sstevel@tonic-gate /* LINTED */ 12517c478bd9Sstevel@tonic-gate addrp = (char *)&((struct sockaddr_in *)ptr->buf)->sin_addr; 12527c478bd9Sstevel@tonic-gate size = sizeof (struct in_addr); 12537c478bd9Sstevel@tonic-gate break; 12547c478bd9Sstevel@tonic-gate case (AF_INET6): 12557c478bd9Sstevel@tonic-gate /* LINTED */ 12567c478bd9Sstevel@tonic-gate addrp = (char *)&((struct sockaddr_in6 *)ptr->buf)->sin6_addr; 12577c478bd9Sstevel@tonic-gate size = sizeof (struct in6_addr); 12587c478bd9Sstevel@tonic-gate break; 12597c478bd9Sstevel@tonic-gate default: 12607c478bd9Sstevel@tonic-gate /* unknown protocol: print address in hex form */ 12617c478bd9Sstevel@tonic-gate for (size = ptr->len, addrp = ptr->buf; size > 0; size--) { 12627c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], "%02x", 12637c478bd9Sstevel@tonic-gate *addrp); 12647c478bd9Sstevel@tonic-gate } 12657c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 12667c478bd9Sstevel@tonic-gate empty_name); 12677c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 12687c478bd9Sstevel@tonic-gate return; 12697c478bd9Sstevel@tonic-gate } 12707c478bd9Sstevel@tonic-gate if (inet_ntop(sin_family, addrp, &elfbuf[elfbufoffset], 12717c478bd9Sstevel@tonic-gate (size_t)(DFLT_BUFFERSIZE + DFLT_OVFSIZE - elfbufoffset)) 12727c478bd9Sstevel@tonic-gate == NULL) { 12737c478bd9Sstevel@tonic-gate /* Not enough space to print - should never happen */ 12747c478bd9Sstevel@tonic-gate elfbuf[elfrec->bufoffset] = '\0'; /* just in case */ 12757c478bd9Sstevel@tonic-gate return; 12767c478bd9Sstevel@tonic-gate } 12777c478bd9Sstevel@tonic-gate /* inet_ntop copied address into elfbuf, so update offset */ 12787c478bd9Sstevel@tonic-gate elfbufoffset += strlen(&elfbuf[elfbufoffset]); 12797c478bd9Sstevel@tonic-gate /* get host name and log it as well */ 12807c478bd9Sstevel@tonic-gate hp = getipnodebyaddr(addrp, size, sin_family, &error); 12817c478bd9Sstevel@tonic-gate if (hp != NULL) { 12827c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " \"%s\"", 12837c478bd9Sstevel@tonic-gate hp->h_name); 12847c478bd9Sstevel@tonic-gate } else { 12857c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 12867c478bd9Sstevel@tonic-gate empty_name); 12877c478bd9Sstevel@tonic-gate } 12887c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 12897c478bd9Sstevel@tonic-gate } 12907c478bd9Sstevel@tonic-gate 12917c478bd9Sstevel@tonic-gate static void 12927c478bd9Sstevel@tonic-gate nfsl_elf_record_header_print(struct nfsl_log_file *elfrec, 12937c478bd9Sstevel@tonic-gate nfslog_record_header *lhp, char *principal_name, char *tag, 12947c478bd9Sstevel@tonic-gate struct nfsl_proc_disp *disp, char *progname) 12957c478bd9Sstevel@tonic-gate { 12967c478bd9Sstevel@tonic-gate struct passwd *pwp = NULL; 12977c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 12987c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 12997c478bd9Sstevel@tonic-gate 13007c478bd9Sstevel@tonic-gate /* 13017c478bd9Sstevel@tonic-gate * Fields: time bytes tag rpc-program rpc-version rpc-procedure 13027c478bd9Sstevel@tonic-gate * auth-flavor s-user-name s-uid uid u-name gid net-id 13037c478bd9Sstevel@tonic-gate * c-ip c-dns s-dns status rpcarg-path <arguments> <response> 13047c478bd9Sstevel@tonic-gate */ 13057c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], "%s", 13067c478bd9Sstevel@tonic-gate nfsl_get_time((time_t)lhp->rh_timestamp.tv_sec)); 13077c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%x", 13087c478bd9Sstevel@tonic-gate lhp->rh_reclen); 13097c478bd9Sstevel@tonic-gate if ((tag != NULL) && (tag[0] != '\0')) { 13107c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " \"%s\"", tag); 13117c478bd9Sstevel@tonic-gate } else { 13127c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 13137c478bd9Sstevel@tonic-gate empty_name); 13147c478bd9Sstevel@tonic-gate } 13157c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s 0x%x %s", 13167c478bd9Sstevel@tonic-gate progname, lhp->rh_version, disp->procname); 13177c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 13187c478bd9Sstevel@tonic-gate NFSL_AUTH_FLAVOR_PRINT(lhp->rh_auth_flavor)); 13197c478bd9Sstevel@tonic-gate if ((principal_name != NULL) && (principal_name[0] != '\0')) { 13207c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " \"%s\"", 13217c478bd9Sstevel@tonic-gate principal_name); 13227c478bd9Sstevel@tonic-gate if ((pwp = getpwnam(principal_name)) != NULL) { 13237c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13247c478bd9Sstevel@tonic-gate " 0x%lx", pwp->pw_uid); 13257c478bd9Sstevel@tonic-gate } else { 13267c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13277c478bd9Sstevel@tonic-gate " %s", empty_name); 13287c478bd9Sstevel@tonic-gate } 13297c478bd9Sstevel@tonic-gate } else { 13307c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 13317c478bd9Sstevel@tonic-gate empty_name); 13327c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 13337c478bd9Sstevel@tonic-gate empty_name); 13347c478bd9Sstevel@tonic-gate } 13357c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%lx", lhp->rh_uid); 13367c478bd9Sstevel@tonic-gate if (((pwp = getpwuid(lhp->rh_uid)) != NULL) && (pwp->pw_name != NULL)) { 13377c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " \"%s\"", 13387c478bd9Sstevel@tonic-gate pwp->pw_name); 13397c478bd9Sstevel@tonic-gate } else { 13407c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " %s", 13417c478bd9Sstevel@tonic-gate empty_name); 13427c478bd9Sstevel@tonic-gate } 13437c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], " 0x%lx", lhp->rh_gid); 13447c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 13457c478bd9Sstevel@tonic-gate } 13467c478bd9Sstevel@tonic-gate 13477c478bd9Sstevel@tonic-gate static void 13487c478bd9Sstevel@tonic-gate nfsl_elf_buffer_header_print(struct nfsl_log_file *elfrec, 13497c478bd9Sstevel@tonic-gate nfslog_buffer_header *bufhdr) 13507c478bd9Sstevel@tonic-gate { 13517c478bd9Sstevel@tonic-gate int rc; 13527c478bd9Sstevel@tonic-gate struct utsname name; 13537c478bd9Sstevel@tonic-gate char *elfbuf = elfrec->buf; 13547c478bd9Sstevel@tonic-gate int elfbufoffset = elfrec->bufoffset; 13557c478bd9Sstevel@tonic-gate 13567c478bd9Sstevel@tonic-gate rc = uname(&name); 13577c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13587c478bd9Sstevel@tonic-gate "#Version %d.0\n#Software \"%s\"\n", 13597c478bd9Sstevel@tonic-gate bufhdr->bh_version, ((rc >= 0) ? name.sysname : empty_name)); 13607c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], "#Date %s\n", 13617c478bd9Sstevel@tonic-gate nfsl_get_date((time_t)bufhdr->bh_timestamp.tv_sec)); 13627c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], "#Remark %s\n", 13637c478bd9Sstevel@tonic-gate empty_name); 13647c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13657c478bd9Sstevel@tonic-gate "#Fields: time bytes tag"); 13667c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13677c478bd9Sstevel@tonic-gate " rpc-program rpc-version rpc-procedure"); 13687c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13697c478bd9Sstevel@tonic-gate " auth-flavor s-user-name s-uid uid u-name gid net-id c-ip"); 13707c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13717c478bd9Sstevel@tonic-gate " c-dns s-dns status rpcarg-path"); 13727c478bd9Sstevel@tonic-gate elfbufoffset += sprintf(&elfbuf[elfbufoffset], 13737c478bd9Sstevel@tonic-gate " rpc-arguments... rpc-response...\n"); 13747c478bd9Sstevel@tonic-gate elfrec->bufoffset = elfbufoffset; 13757c478bd9Sstevel@tonic-gate } 13767c478bd9Sstevel@tonic-gate 13777c478bd9Sstevel@tonic-gate /* 13787c478bd9Sstevel@tonic-gate * nfsl_find_elf_dispatch - get the dispatch struct for this request 13797c478bd9Sstevel@tonic-gate */ 13807c478bd9Sstevel@tonic-gate static struct nfsl_proc_disp * 13817c478bd9Sstevel@tonic-gate nfsl_find_elf_dispatch(nfslog_request_record *logrec, char **prognamep) 13827c478bd9Sstevel@tonic-gate { 13837c478bd9Sstevel@tonic-gate nfslog_record_header *logrechdr = &logrec->re_header; 13847c478bd9Sstevel@tonic-gate struct nfsl_prog_disp *progtable; /* prog struct */ 13857c478bd9Sstevel@tonic-gate struct nfsl_vers_disp *verstable; /* version struct */ 13867c478bd9Sstevel@tonic-gate int i, vers; 13877c478bd9Sstevel@tonic-gate 13887c478bd9Sstevel@tonic-gate /* Find prog element - search because can't use prog as array index */ 13897c478bd9Sstevel@tonic-gate for (i = 0; (i < nfsl_elf_dispatch_table_arglen) && 13907c478bd9Sstevel@tonic-gate (logrechdr->rh_prognum != nfsl_elf_dispatch_table[i].nfsl_dis_prog); 13917c478bd9Sstevel@tonic-gate i++); 13927c478bd9Sstevel@tonic-gate if (i >= nfsl_elf_dispatch_table_arglen) { /* program not logged */ 13937c478bd9Sstevel@tonic-gate /* not an error */ 13947c478bd9Sstevel@tonic-gate return (NULL); 13957c478bd9Sstevel@tonic-gate } 13967c478bd9Sstevel@tonic-gate progtable = &nfsl_elf_dispatch_table[i]; 13977c478bd9Sstevel@tonic-gate /* Find vers element - no validity check - if here it's valid vers */ 13987c478bd9Sstevel@tonic-gate vers = logrechdr->rh_version - progtable->nfsl_dis_versmin; 13997c478bd9Sstevel@tonic-gate verstable = &progtable->nfsl_dis_vers_table[vers]; 14007c478bd9Sstevel@tonic-gate /* Find proc element - no validity check - if here it's valid proc */ 14017c478bd9Sstevel@tonic-gate *prognamep = progtable->progname; 14027c478bd9Sstevel@tonic-gate return (&verstable->nfsl_dis_proc_table[logrechdr->rh_procnum]); 14037c478bd9Sstevel@tonic-gate } 14047c478bd9Sstevel@tonic-gate 14057c478bd9Sstevel@tonic-gate /* 14067c478bd9Sstevel@tonic-gate * nfsl_elf_rpc_print - Print the record buffer. 14077c478bd9Sstevel@tonic-gate */ 14087c478bd9Sstevel@tonic-gate static void 14097c478bd9Sstevel@tonic-gate nfsl_elf_rpc_print(struct nfsl_log_file *elfrec, 14107c478bd9Sstevel@tonic-gate nfslog_request_record *logrec, struct nfsl_proc_disp *disp, 14117c478bd9Sstevel@tonic-gate char *progname, char *path1, char *path2) 14127c478bd9Sstevel@tonic-gate { 14137c478bd9Sstevel@tonic-gate if (debug > 1) { 14147c478bd9Sstevel@tonic-gate (void) printf("%s %d %s", progname, 14157c478bd9Sstevel@tonic-gate logrec->re_header.rh_version, disp->procname); 14167c478bd9Sstevel@tonic-gate (void) printf(": '%s', '%s'\n", 14177c478bd9Sstevel@tonic-gate ((path1 != NULL) ? path1 : empty_name), 14187c478bd9Sstevel@tonic-gate ((path2 != NULL) ? path2 : empty_name)); 14197c478bd9Sstevel@tonic-gate } 14207c478bd9Sstevel@tonic-gate /* 14217c478bd9Sstevel@tonic-gate * XXXX programs using this file to get a usable record should 14227c478bd9Sstevel@tonic-gate * take "record" struct. 14237c478bd9Sstevel@tonic-gate */ 14247c478bd9Sstevel@tonic-gate /* 14257c478bd9Sstevel@tonic-gate * Print the variable fields: 14267c478bd9Sstevel@tonic-gate * principal name 14277c478bd9Sstevel@tonic-gate * netid 14287c478bd9Sstevel@tonic-gate * ip address 14297c478bd9Sstevel@tonic-gate * rpc args 14307c478bd9Sstevel@tonic-gate * rpc res 14317c478bd9Sstevel@tonic-gate * Use the displacements calculated earlier... 14327c478bd9Sstevel@tonic-gate */ 14337c478bd9Sstevel@tonic-gate 14347c478bd9Sstevel@tonic-gate /* 14357c478bd9Sstevel@tonic-gate * Fields: time bytes tag rpc-program rpc-version rpc-procedure 14367c478bd9Sstevel@tonic-gate * auth-flavor s-user-name s-uid uid u-name gid net-id c-ip 14377c478bd9Sstevel@tonic-gate * c-dns s-dns status rpcarg-path <arguments> <response> 14387c478bd9Sstevel@tonic-gate */ 14397c478bd9Sstevel@tonic-gate nfsl_elf_record_header_print(elfrec, &logrec->re_header, 14407c478bd9Sstevel@tonic-gate logrec->re_principal_name, logrec->re_tag, 14417c478bd9Sstevel@tonic-gate disp, progname); 14427c478bd9Sstevel@tonic-gate if ((logrec->re_netid != NULL) && (logrec->re_netid[0] != '\0')) { 14437c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 14447c478bd9Sstevel@tonic-gate " \"%s\"", logrec->re_netid); 14457c478bd9Sstevel@tonic-gate } else { 14467c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 14477c478bd9Sstevel@tonic-gate " %s", empty_name); 14487c478bd9Sstevel@tonic-gate } 14497c478bd9Sstevel@tonic-gate nfsl_ipaddr_print(elfrec, &logrec->re_ipaddr); 14507c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 14517c478bd9Sstevel@tonic-gate " \"%s\"", hostname); 14527c478bd9Sstevel@tonic-gate /* Next is return status */ 14537c478bd9Sstevel@tonic-gate (*disp->nfsl_dis_res)(elfrec, logrec->re_rpc_res, TRUE); 14547c478bd9Sstevel@tonic-gate /* Next is argpath */ 14557c478bd9Sstevel@tonic-gate if (path1 != NULL) { 14567c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 14577c478bd9Sstevel@tonic-gate " \"%s\"", path1); 14587c478bd9Sstevel@tonic-gate } else { 14597c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 14607c478bd9Sstevel@tonic-gate " %s", empty_name); 14617c478bd9Sstevel@tonic-gate } 14627c478bd9Sstevel@tonic-gate /* 14637c478bd9Sstevel@tonic-gate * path2 is non-empty for rename/link type operations. If it is non- 14647c478bd9Sstevel@tonic-gate * empty print it here as it's a part of the args 14657c478bd9Sstevel@tonic-gate */ 14667c478bd9Sstevel@tonic-gate if (path2 != NULL) { 14677c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], 14687c478bd9Sstevel@tonic-gate " \"%s\"", path2); 14697c478bd9Sstevel@tonic-gate } 14707c478bd9Sstevel@tonic-gate /* Next print formatted rpc args */ 14717c478bd9Sstevel@tonic-gate (*disp->nfsl_dis_args)(elfrec, logrec->re_rpc_arg); 14727c478bd9Sstevel@tonic-gate /* Next print formatted rpc res (minus status) */ 14737c478bd9Sstevel@tonic-gate (*disp->nfsl_dis_res)(elfrec, logrec->re_rpc_res, FALSE); 14747c478bd9Sstevel@tonic-gate elfrec->bufoffset += sprintf(&elfrec->buf[elfrec->bufoffset], "\n"); 14757c478bd9Sstevel@tonic-gate } 14767c478bd9Sstevel@tonic-gate 14777c478bd9Sstevel@tonic-gate /* 14787c478bd9Sstevel@tonic-gate * nfsl_log_file_add - add a new record to the list 14797c478bd9Sstevel@tonic-gate */ 14807c478bd9Sstevel@tonic-gate static void 14817c478bd9Sstevel@tonic-gate nfsl_log_file_add(struct nfsl_log_file *elfrec, 14827c478bd9Sstevel@tonic-gate struct nfsl_log_file **elf_listp) 14837c478bd9Sstevel@tonic-gate { 14847c478bd9Sstevel@tonic-gate elfrec->next = *elf_listp; 14857c478bd9Sstevel@tonic-gate elfrec->prev = NULL; 14867c478bd9Sstevel@tonic-gate if (*elf_listp != NULL) { 14877c478bd9Sstevel@tonic-gate (*elf_listp)->prev = elfrec; 14887c478bd9Sstevel@tonic-gate } 14897c478bd9Sstevel@tonic-gate *elf_listp = elfrec; 14907c478bd9Sstevel@tonic-gate } 14917c478bd9Sstevel@tonic-gate 14927c478bd9Sstevel@tonic-gate /* 14937c478bd9Sstevel@tonic-gate * nfsl_log_file_find - finds a record in the list, given a cookie (== elfrec) 14947c478bd9Sstevel@tonic-gate * Returns the record. 14957c478bd9Sstevel@tonic-gate */ 14967c478bd9Sstevel@tonic-gate static struct nfsl_log_file * 14977c478bd9Sstevel@tonic-gate nfsl_log_file_find(struct nfsl_log_file *elfrec, 14987c478bd9Sstevel@tonic-gate struct nfsl_log_file *elf_list) 14997c478bd9Sstevel@tonic-gate { 15007c478bd9Sstevel@tonic-gate struct nfsl_log_file *rec; 15017c478bd9Sstevel@tonic-gate 15027c478bd9Sstevel@tonic-gate for (rec = elf_list; (rec != NULL) && (rec != elfrec); 15037c478bd9Sstevel@tonic-gate rec = rec->next); 15047c478bd9Sstevel@tonic-gate return (rec); 15057c478bd9Sstevel@tonic-gate } 15067c478bd9Sstevel@tonic-gate 15077c478bd9Sstevel@tonic-gate /* 15087c478bd9Sstevel@tonic-gate * nfsl_log_file_del - delete a record from the list, does not free rec. 15097c478bd9Sstevel@tonic-gate * Returns the deleted record. 15107c478bd9Sstevel@tonic-gate */ 15117c478bd9Sstevel@tonic-gate static struct nfsl_log_file * 15127c478bd9Sstevel@tonic-gate nfsl_log_file_del(struct nfsl_log_file *elfrec, 15137c478bd9Sstevel@tonic-gate struct nfsl_log_file **elf_listp) 15147c478bd9Sstevel@tonic-gate { 15157c478bd9Sstevel@tonic-gate struct nfsl_log_file *rec; 15167c478bd9Sstevel@tonic-gate 15177c478bd9Sstevel@tonic-gate if ((rec = nfsl_log_file_find(elfrec, *elf_listp)) == NULL) { 15187c478bd9Sstevel@tonic-gate return (NULL); 15197c478bd9Sstevel@tonic-gate } 15207c478bd9Sstevel@tonic-gate if (rec->prev != NULL) { 15217c478bd9Sstevel@tonic-gate rec->prev->next = rec->next; 15227c478bd9Sstevel@tonic-gate } else { 15237c478bd9Sstevel@tonic-gate *elf_listp = rec->next; 15247c478bd9Sstevel@tonic-gate } 15257c478bd9Sstevel@tonic-gate if (rec->next != NULL) { 15267c478bd9Sstevel@tonic-gate rec->next->prev = rec->prev; 15277c478bd9Sstevel@tonic-gate } 15287c478bd9Sstevel@tonic-gate return (rec); 15297c478bd9Sstevel@tonic-gate } 15307c478bd9Sstevel@tonic-gate 15317c478bd9Sstevel@tonic-gate /* 15327c478bd9Sstevel@tonic-gate * nfsl_log_file_free - frees a record 15337c478bd9Sstevel@tonic-gate */ 15347c478bd9Sstevel@tonic-gate static void 15357c478bd9Sstevel@tonic-gate nfsl_log_file_free(struct nfsl_log_file *elfrec) 15367c478bd9Sstevel@tonic-gate { 15377c478bd9Sstevel@tonic-gate if (elfrec == NULL) 15387c478bd9Sstevel@tonic-gate return; 15397c478bd9Sstevel@tonic-gate if (elfrec->path != NULL) 15407c478bd9Sstevel@tonic-gate free(elfrec->path); 15417c478bd9Sstevel@tonic-gate if (elfrec->buf != NULL) 15427c478bd9Sstevel@tonic-gate free(elfrec->buf); 15437c478bd9Sstevel@tonic-gate free(elfrec); 15447c478bd9Sstevel@tonic-gate } 15457c478bd9Sstevel@tonic-gate 15467c478bd9Sstevel@tonic-gate /* 15477c478bd9Sstevel@tonic-gate * Exported Functions 15487c478bd9Sstevel@tonic-gate */ 15497c478bd9Sstevel@tonic-gate 15507c478bd9Sstevel@tonic-gate /* 15517c478bd9Sstevel@tonic-gate * nfslog_open_elf_file - open the output elf file and mallocs needed buffers 15527c478bd9Sstevel@tonic-gate * Returns a pointer to the nfsl_log_file on success, NULL on error. 15537c478bd9Sstevel@tonic-gate * 15547c478bd9Sstevel@tonic-gate * *error contains the last error encountered on this object, It can 15557c478bd9Sstevel@tonic-gate * be used to avoid reporting the same error endlessly, by comparing 15567c478bd9Sstevel@tonic-gate * the current error to the last error. It is reset to the current error 15577c478bd9Sstevel@tonic-gate * code on return. 15587c478bd9Sstevel@tonic-gate */ 15597c478bd9Sstevel@tonic-gate void * 15607c478bd9Sstevel@tonic-gate nfslog_open_elf_file(char *elfpath, nfslog_buffer_header *bufhdr, int *error) 15617c478bd9Sstevel@tonic-gate { 15627c478bd9Sstevel@tonic-gate struct nfsl_log_file *elfrec; 15637c478bd9Sstevel@tonic-gate struct stat stat_buf; 15647c478bd9Sstevel@tonic-gate int preverror = *error; 15657c478bd9Sstevel@tonic-gate 15667c478bd9Sstevel@tonic-gate if ((elfrec = malloc(sizeof (*elfrec))) == NULL) { 15677c478bd9Sstevel@tonic-gate *error = errno; 15687c478bd9Sstevel@tonic-gate if (*error != preverror) { 15697c478bd9Sstevel@tonic-gate syslog(LOG_ERR, gettext("nfslog_open_elf_file: %s"), 15707c478bd9Sstevel@tonic-gate strerror(*error)); 15717c478bd9Sstevel@tonic-gate } 15727c478bd9Sstevel@tonic-gate return (NULL); 15737c478bd9Sstevel@tonic-gate } 15747c478bd9Sstevel@tonic-gate bzero(elfrec, sizeof (*elfrec)); 15757c478bd9Sstevel@tonic-gate 15767c478bd9Sstevel@tonic-gate elfrec->buf = (char *)malloc(DFLT_BUFFERSIZE + DFLT_OVFSIZE); 15777c478bd9Sstevel@tonic-gate if (elfrec->buf == NULL) { 15787c478bd9Sstevel@tonic-gate *error = errno; 15797c478bd9Sstevel@tonic-gate if (*error != preverror) { 15807c478bd9Sstevel@tonic-gate syslog(LOG_ERR, gettext("nfslog_open_elf_file: %s"), 15817c478bd9Sstevel@tonic-gate strerror(*error)); 15827c478bd9Sstevel@tonic-gate } 15837c478bd9Sstevel@tonic-gate nfsl_log_file_free(elfrec); 15847c478bd9Sstevel@tonic-gate return (NULL); 15857c478bd9Sstevel@tonic-gate } 15867c478bd9Sstevel@tonic-gate 15877c478bd9Sstevel@tonic-gate if ((elfrec->path = strdup(elfpath)) == NULL) { 15887c478bd9Sstevel@tonic-gate *error = errno; 15897c478bd9Sstevel@tonic-gate if (*error != preverror) { 15907c478bd9Sstevel@tonic-gate syslog(LOG_ERR, gettext("nfslog_open_elf_file: %s"), 15917c478bd9Sstevel@tonic-gate strerror(*error)); 15927c478bd9Sstevel@tonic-gate } 15937c478bd9Sstevel@tonic-gate nfsl_log_file_free(elfrec); 15947c478bd9Sstevel@tonic-gate return (NULL); 15957c478bd9Sstevel@tonic-gate } 15967c478bd9Sstevel@tonic-gate 15977c478bd9Sstevel@tonic-gate if ((elfrec->fp = fopen(elfpath, "a")) == NULL) { 15987c478bd9Sstevel@tonic-gate *error = errno; 15997c478bd9Sstevel@tonic-gate if (*error != preverror) { 16007c478bd9Sstevel@tonic-gate syslog(LOG_ERR, gettext("Cannot open '%s': %s"), 16017c478bd9Sstevel@tonic-gate elfpath, strerror(*error)); 16027c478bd9Sstevel@tonic-gate } 16037c478bd9Sstevel@tonic-gate nfsl_log_file_free(elfrec); 16047c478bd9Sstevel@tonic-gate return (NULL); 16057c478bd9Sstevel@tonic-gate } 16067c478bd9Sstevel@tonic-gate 16077c478bd9Sstevel@tonic-gate if (stat(elfpath, &stat_buf) == -1) { 16087c478bd9Sstevel@tonic-gate *error = errno; 16097c478bd9Sstevel@tonic-gate if (*error != preverror) { 16107c478bd9Sstevel@tonic-gate syslog(LOG_ERR, gettext("Cannot stat '%s': %s"), 16117c478bd9Sstevel@tonic-gate elfpath, strerror(*error)); 16127c478bd9Sstevel@tonic-gate } 16137c478bd9Sstevel@tonic-gate (void) fclose(elfrec->fp); 16147c478bd9Sstevel@tonic-gate nfsl_log_file_free(elfrec); 16157c478bd9Sstevel@tonic-gate return (NULL); 16167c478bd9Sstevel@tonic-gate } 16177c478bd9Sstevel@tonic-gate 16187c478bd9Sstevel@tonic-gate nfsl_log_file_add(elfrec, &elf_file_list); 16197c478bd9Sstevel@tonic-gate 16207c478bd9Sstevel@tonic-gate if (stat_buf.st_size == 0) { 16217c478bd9Sstevel@tonic-gate /* 16227c478bd9Sstevel@tonic-gate * Print header unto logfile 16237c478bd9Sstevel@tonic-gate */ 16247c478bd9Sstevel@tonic-gate nfsl_elf_buffer_header_print(elfrec, bufhdr); 16257c478bd9Sstevel@tonic-gate } 16267c478bd9Sstevel@tonic-gate 16277c478bd9Sstevel@tonic-gate if (hostname[0] == '\0') { 16287c478bd9Sstevel@tonic-gate (void) gethostname(hostname, MAXHOSTNAMELEN); 16297c478bd9Sstevel@tonic-gate } 16307c478bd9Sstevel@tonic-gate 16317c478bd9Sstevel@tonic-gate return (elfrec); 16327c478bd9Sstevel@tonic-gate } 16337c478bd9Sstevel@tonic-gate 16347c478bd9Sstevel@tonic-gate /* 16357c478bd9Sstevel@tonic-gate * nfslog_close_elf_file - close elffile and write out last buffer 16367c478bd9Sstevel@tonic-gate */ 16377c478bd9Sstevel@tonic-gate void 16387c478bd9Sstevel@tonic-gate nfslog_close_elf_file(void **elfcookie) 16397c478bd9Sstevel@tonic-gate { 16407c478bd9Sstevel@tonic-gate struct nfsl_log_file *elfrec; 16417c478bd9Sstevel@tonic-gate 16427c478bd9Sstevel@tonic-gate if ((*elfcookie == NULL) || ((elfrec = nfsl_log_file_del( 16437c478bd9Sstevel@tonic-gate *elfcookie, &elf_file_list)) == NULL)) { 16447c478bd9Sstevel@tonic-gate *elfcookie = NULL; 16457c478bd9Sstevel@tonic-gate return; 16467c478bd9Sstevel@tonic-gate } 16477c478bd9Sstevel@tonic-gate if (elfrec->fp != NULL) { 16487c478bd9Sstevel@tonic-gate /* Write the last output buffer to disk */ 16497c478bd9Sstevel@tonic-gate (void) nfsl_write_elfbuf(elfrec); 16507c478bd9Sstevel@tonic-gate (void) fclose(elfrec->fp); 16517c478bd9Sstevel@tonic-gate } 16527c478bd9Sstevel@tonic-gate nfsl_log_file_free(elfrec); 16537c478bd9Sstevel@tonic-gate *elfcookie = NULL; 16547c478bd9Sstevel@tonic-gate } 16557c478bd9Sstevel@tonic-gate 16567c478bd9Sstevel@tonic-gate /* 16577c478bd9Sstevel@tonic-gate * nfslog_process_elf_rec - processes the record in the buffer and outputs 16587c478bd9Sstevel@tonic-gate * to the elf log. 16597c478bd9Sstevel@tonic-gate * Return 0 for success, errno else. 16607c478bd9Sstevel@tonic-gate */ 16617c478bd9Sstevel@tonic-gate int 16627c478bd9Sstevel@tonic-gate nfslog_process_elf_rec(void *elfcookie, nfslog_request_record *logrec, 16637c478bd9Sstevel@tonic-gate char *path1, char *path2) 16647c478bd9Sstevel@tonic-gate { 16657c478bd9Sstevel@tonic-gate struct nfsl_log_file *elfrec; 16667c478bd9Sstevel@tonic-gate struct nfsl_proc_disp *disp; 16677c478bd9Sstevel@tonic-gate char *progname; 16687c478bd9Sstevel@tonic-gate 16697c478bd9Sstevel@tonic-gate if ((elfrec = nfsl_log_file_find(elfcookie, elf_file_list)) == NULL) { 16707c478bd9Sstevel@tonic-gate return (EINVAL); 16717c478bd9Sstevel@tonic-gate } 16727c478bd9Sstevel@tonic-gate /* Make sure there is room */ 16737c478bd9Sstevel@tonic-gate if (elfrec->bufoffset > DFLT_BUFFERSIZE) { 16747c478bd9Sstevel@tonic-gate if (nfsl_write_elfbuf(elfrec) < 0) { 16757c478bd9Sstevel@tonic-gate return (errno); 16767c478bd9Sstevel@tonic-gate } 16777c478bd9Sstevel@tonic-gate } 16787c478bd9Sstevel@tonic-gate if ((disp = nfsl_find_elf_dispatch(logrec, &progname)) != NULL) { 16797c478bd9Sstevel@tonic-gate nfsl_elf_rpc_print(elfrec, logrec, disp, progname, 16807c478bd9Sstevel@tonic-gate path1, path2); 16817c478bd9Sstevel@tonic-gate } 16827c478bd9Sstevel@tonic-gate return (0); 16837c478bd9Sstevel@tonic-gate } 1684