1 .\" 2 .\" This file and its contents are supplied under the terms of the 3 .\" Common Development and Distribution License ("CDDL"), version 1.0. 4 .\" You may only use this file in accordance with the terms of version 5 .\" 1.0 of the CDDL. 6 .\" 7 .\" A full copy of the text of the CDDL should have accompanied this 8 .\" source. A copy of the CDDL is also available via the Internet at 9 .\" http://www.illumos.org/license/CDDL. 10 .\" 11 .\" 12 .\" Copyright 2010 Sun Microsystems, Inc. All rights reserved. 13 .\" Copyright 2017 Nexenta Systems, Inc. 14 .\" Copyright 2018 Joyent, Inc. 15 .\" 16 .Dd December 20, 2018 17 .Dt OFMT 3OFMT 18 .Os 19 .Sh NAME 20 .Nm ofmt_open , 21 .Nm ofmt_print , 22 .Nm ofmt_update_winsize , 23 .Nm ofmt_strerror , 24 .Nm ofmt_close 25 .Nd data structures and routines for printing output 26 .Sh LIBRARY 27 .Lb libofmt 28 .Sh SYNOPSIS 29 .In ofmt.h 30 .Ft ofmt_status_t 31 .Fo ofmt_open 32 .Fa "const char *fields" 33 .Fa "const ofmt_field_t *template" 34 .Fa "uint_t flags" 35 .Fa "uint_t maxcols" 36 .Fa "ofmt_handle_t *ofmt" 37 .Fc 38 .Ft void 39 .Fo ofmt_print 40 .Fa "ofmt_handle_t ofmt" 41 .Fa "void *cbarg" 42 .Fc 43 .Ft void 44 .Fo ofmt_update_winsize 45 .Fa "ofmt_handle_t ofmt" 46 .Fc 47 .Ft "char *" 48 .Fo ofmt_strerror 49 .Fa "ofmt_handle_t ofmt" 50 .Fa "ofmt_status_t error" 51 .Fa "char *buf" 52 .Fa "uint_t bufsize" 53 .Fc 54 .Ft void 55 .Fo ofmt_close 56 .Fa "ofmt_handle_t ofmt" 57 .Fc 58 .Sh DESCRIPTION 59 The 60 .Nm libofmt 61 library provides data structures and routines for printing output. 62 .Pp 63 Currently this is an internal interface. 64 The interface can and will change without notice as the project needs, at any 65 time. 66 .Pp 67 All output is assumed to be in a columnar format, where each column represents 68 a field to be printed out. 69 Multiple fields in parsable output are separated by 70 .Sq \&: , 71 with the 72 .Sq \&: 73 character itself escaped by a 74 .Sq \e 75 .Po e.g., IPv6 addresses may be printed as 76 .Qq fe80\e:\e:1 77 .Pc ; 78 single field output is printed as-is. 79 In multiline mode, every 80 .Bq field,value 81 pair is printed in a line of its own, thus: 82 .Qq field: value . 83 .Ss Data Structures 84 The 85 .Vt ofmt_field_t 86 data structure used in 87 .Sx ofmt_open 88 is defined as follows: 89 .Bd -literal 90 typedef struct ofmt_field_s { 91 char *of_name; /* column name */ 92 uint_t of_width; /* output column width */ 93 uint_t of_id; /* implementation specific cookie */ 94 ofmt_cb_t *of_cb; /* callback function defined by caller */ 95 } ofmt_field_t; 96 .Ed 97 .Pp 98 The 99 .Vt ofmt_arg_t 100 data structure which is passed to callback function is defined as follows: 101 .Bd -literal 102 typedef struct ofmt_arg_s { 103 uint_t ofmt_id; /* implementation specific cookie */ 104 uint_t ofmt_width; /* output column width */ 105 uint_t ofmt_index; /* unused */ 106 void *ofmt_cbarg; /* argument passed to ofmt_print() */ 107 } ofmt_arg_t; 108 .Ed 109 .Ss Fn ofmt_open 110 The 111 .Fn ofmt_open 112 function opens a handle returned in 113 .Fa ofmt 114 for each set of fields to be printed. 115 .Pp 116 .Fa fields 117 is a comma-separated list of the fields that have been selected for output 118 .Po typically the string passed to 119 .Fl o 120 in the command-line 121 .Pc . 122 Columns selected for output are identified by a match between the 123 .Va of_name 124 value in the 125 .Fa template 126 and the 127 .Fa fields 128 requested. 129 In human-friendly 130 .Pq non machine-parsable 131 mode, 132 .Dv NULL 133 .Fa fields , 134 or a value of 135 .Qq all 136 is treated as a request to print all allowable fields that fit other applicable 137 constraints. 138 .Pp 139 .Fa template 140 specifies the list of supported fields, along with formatting information 141 .Pq e.g., field width , 142 and a pointer to a callback function that can provide a string representation of 143 the value to be printed out. 144 The set of supported fields must be a 145 .Dv NULL 146 terminated array of type 147 .Vt ofmt_field_t , 148 described in 149 .Sx Data Structures , 150 as follows: 151 .Bd -literal -offset indent 152 {<of_name>, <of_width>, <of_id>, <of_cb> }, 153 \&.\&.\&. 154 {<of_name>, <of_width>, <of_id>, <of_cb> }, 155 {NULL, 0, 0, NULL} 156 .Ed 157 .Pp 158 .Va of_cb 159 is the application-specified callback function with the following prototype that 160 provides a string representation of the value to be printed for the field: 161 .Bd -literal -offset indent 162 boolean_t (*of_cb)(ofmt_arg_t *ofmt_arg, char *buf, uint_t bufsize) 163 .Ed 164 .Pp 165 The callback must not write beyond 166 .Fa bufsize 167 bytes of the string form into 168 .Fa buf . 169 If the function successfully translates the field into its string 170 representation and places it into 171 .Fa buf , 172 then the callback function should return 173 .Dv B_TRUE . 174 Otherwise, the callback function should return 175 .Dv B_FALSE . 176 .Pp 177 The interpretation of the 178 .Va of_id 179 field is completely private to the caller, and can be optionally used by the 180 callback function as a cookie to identify the field being printed when a single 181 callback function is shared between multiple 182 .Fa template 183 entries. 184 .Pp 185 The 186 .Fa flags 187 can be any valid combination of the following: 188 .Pp 189 .Bl -tag -width "OFMT_MULTILINE" -compact 190 .It Dv OFMT_PARSABLE 191 Machine-parsable mode. 192 Specifying a null or empty 193 .Va fields 194 in the machine-parsable mode will result in a returned error value of 195 .Dv OFMT_EPARSENONE . 196 An attempt to create a handle in machine-parsable mode with the 197 .Fa fields 198 set to 199 .Qq all 200 will result in a returned error value of 201 .Dv OFMT_EPARSEALL . 202 .It Dv OFMT_WRAP 203 Wrap output if field width is exceeded. 204 Currently output is wrapped at whitespace or comma characters. 205 .It Dv OFMT_MULTILINE 206 Multiline mode. 207 Specifying both 208 .Dv OFMT_MULTILINE 209 and 210 .Dv OFMT_PARSABLE 211 will result in 212 .Dv OFMT_EPARSEMULTI . 213 .It Dv OFMT_RIGHTJUST 214 Right justified output. 215 .El 216 .Pp 217 The non-zero 218 .Fa maxcols 219 limits the number of output columns. 220 .Ss Fn ofmt_print 221 The 222 .Fn ofmt_print 223 function prints a row of output. 224 .Pp 225 .Fa cbarg 226 points at the arguments to be passed to the callback function for each column in 227 the row. 228 The call to 229 .Fn ofmt_print 230 will result in the callback function of each selected field invoked with 231 .Va of_id , 232 .Va of_width 233 and 234 .Fa cbarg 235 embedded in 236 .Fa ofmt_arg , 237 described in 238 .Sx Data Structures . 239 .Pp 240 The callback function should fill 241 .Fa buf 242 with the string to be printed for the field using the data in 243 .Fa cbarg . 244 .Ss Fn ofmt_update_winsize 245 The 246 .Fn ofmt_update_winsize 247 function updates the window size information 248 .Pq which is initially computed when the handle is created 249 in the 250 .Fa ofmt . 251 If the 252 .Dv TIOCGWINSZ 253 ioctl fails, the window size is set to 80x24. 254 .Ss Fn ofmt_strerror 255 The 256 .Fn ofmt_strerror 257 function returns error diagnostics in 258 .Fa buf 259 using the information in the 260 .Fa ofmt 261 and 262 .Fa error . 263 .Pp 264 Using a 265 .Fa buf 266 size of 267 .Dv OFMT_BUFSIZE 268 is recommended. 269 .Ss Fn ofmt_close 270 The 271 .Fn ofmt_close 272 function frees any resources allocated for the handle after printing is 273 completed. 274 .Sh RETURN VALUES 275 If successful, the 276 .Fn ofmt_open 277 function will return 278 .Dv OFMT_SUCCESS , 279 with a non-null 280 .Fa ofmt_handle . 281 The function returns one of the failure codes 282 .Po enumerated in 283 .Vt ofmt_status_t 284 .Pc 285 listed below otherwise: 286 .Pp 287 .Bl -tag -width "OFMT_ENOTEMPLATE" -compact 288 .It Dv OFMT_ENOMEM 289 out of memory 290 .It Dv OFMT_EBADFIELDS 291 one or more bad fields with good fields 292 .It Dv OFMT_ENOFIELDS 293 no valid output fields 294 .It Dv OFMT_EPARSEALL 295 "all" is invalid in parsable mode 296 .It Dv OFMT_EPARSENONE 297 output fields missing in parsable mode 298 .It Dv OFMT_EPARSEWRAP 299 parsable mode incompatible with wrap mode 300 .It Dv OFMT_ENOTEMPLATE 301 no template provided for fields 302 .It Dv OFMT_EPARSEMULTI 303 parsable and multiline don't mix 304 .El 305 .Pp 306 More information about the type of failure can be obtained by calling 307 .Fn ofmt_strerror . 308 .Pp 309 The 310 .Fn ofmt_strerror 311 function returns the 312 .Fa buf . 313 .Sh INTERFACE STABILITY 314 .Sy Private . 315 .Sh SEE ALSO 316 .Xr ioctl 2 , 317 .Xr strerror 3C , 318 .Xr attributes 5