Imported Upstream version 4.88
[platform/upstream/lsof.git] / usage.c
1 /*
2  * usage.c - usage functions for lsof
3  */
4
5
6 /*
7  * Copyright 1998 Purdue Research Foundation, West Lafayette, Indiana
8  * 47907.  All rights reserved.
9  *
10  * Written by Victor A. Abell
11  *
12  * This software is not subject to any license of the American Telephone
13  * and Telegraph Company or the Regents of the University of California.
14  *
15  * Permission is granted to anyone to use this software for any purpose on
16  * any computer system, and to alter it and redistribute it freely, subject
17  * to the following restrictions:
18  *
19  * 1. Neither the authors nor Purdue University are responsible for any
20  *    consequences of the use of this software.
21  *
22  * 2. The origin of this software must not be misrepresented, either by
23  *    explicit claim or by omission.  Credit to the authors and Purdue
24  *    University must appear in documentation and sources.
25  *
26  * 3. Altered versions must be plainly marked as such, and must not be
27  *    misrepresented as being the original software.
28  *
29  * 4. This notice may not be removed or altered.
30  */
31
32 #ifndef lint
33 static char copyright[] =
34 "@(#) Copyright 1998 Purdue Research Foundation.\nAll rights reserved.\n";
35 static char *rcsid = "$Id: usage.c,v 1.32 2014/10/13 22:36:20 abe Exp $";
36 #endif
37
38
39 #include "lsof.h"
40 #include "version.h"
41
42
43 /*
44  * Local function prototypes
45  */
46
47 _PROTOTYPE(static char *isnullstr,(char *s));
48 _PROTOTYPE(static int print_in_col,(int col, char *cp));
49 _PROTOTYPE(static void report_HASDCACHE,(int type, char *ttl, char *det));
50 _PROTOTYPE(static void report_HASKERNIDCK,(char *pfx, char *verb));
51 _PROTOTYPE(static void report_SECURITY,(char *pfx, char *punct));
52 _PROTOTYPE(static void report_WARNDEVACCESS,(char *pfx, char *verb,
53                                              char *punct));
54
55
56 /*
57  * isnullstr() - is it a null string?
58  */
59
60 static char *
61 isnullstr(s)
62         char *s;                        /* string pointer */
63 {
64         if (!s)
65                 return((char *)NULL);
66         while (*s) {
67                 if (*s != ' ')
68                         return(s);
69                 s++;
70         }
71         return((char *)NULL);
72 }
73
74
75 /*
76  * print_in_col() -- print character string in help column
77  */
78
79 static int
80 print_in_col(col, cp)
81         int col;                                /* column number */
82         char *cp;                               /* what to print */
83 {
84         if (cp && *cp) {
85             switch (col) {
86             case 1:
87                 (void) fprintf(stderr, "  %-23.23s", cp);
88                 break;
89             case 2:
90                 (void) fprintf(stderr, "  %-25.25s", cp);
91                 break;
92             default:
93                 (void) fprintf(stderr, "  %s\n", cp);
94                 col = 0;
95             }
96             col++;
97         }
98         return(col);
99 }
100
101
102 /*
103  * report_HASDCACHE() -- report device cache file state
104  */
105
106 static void
107 report_HASDCACHE(type, ttl, det)
108         int type;                               /* type: 0 == read path report
109                                                  *       1 == full report */
110         char *ttl;                              /* title lines prefix
111                                                  * (NULL if none) */
112         char *det;                              /* detail lines prefix
113                                                  * (NULL if none) */
114 {
115
116 #if     defined(HASDCACHE)
117         char *cp;
118         int dx;
119
120 # if    defined(WILLDROPGID)
121         int saved_Setgid = Setgid;
122
123         Setgid = 0;
124 # endif /* defined(WILLDROPGID) */
125
126         if (type) {
127
128         /*
129          * Report full device cache information.
130          */
131             (void) fprintf(stderr, "%sDevice cache file read-only paths:\n",
132                 ttl ? ttl : "");
133             if ((dx = dcpath(1, 0)) < 0)
134                 (void) fprintf(stderr, "%snone\n", det ? det : "");
135             else {
136                 (void) fprintf(stderr, "%sNamed via -D: %s\n",
137                     det ? det : "",
138                     DCpath[0] ? DCpath[0] : "none");
139
140 # if    defined(HASENVDC)
141                 (void) fprintf(stderr,
142                     "%sNamed in environment variable %s: %s\n",
143                     det ? det : "",
144                     HASENVDC, DCpath[1] ? DCpath[1] : "none");
145 # endif /* defined(HASENVDC) */
146
147 # if    defined(HASSYSDC)
148                 if (DCpath[2])
149                     (void) fprintf(stderr,
150                         "%sSystem-wide device cache: %s\n",
151                         det ? det : "",
152                         DCpath[2]);
153 # endif /* defined(HASSYSDC) */
154
155 # if    defined(HASPERSDC)
156                 (void) fprintf(stderr,
157                     "%sPersonal path format (HASPERSDC): \"%s\"\n",
158                     det ? det : "",
159                     HASPERSDC);
160 #  if   defined(HASPERSDCPATH)
161                 (void) fprintf(stderr,
162                     "%sModified personal path environment variable: %s\n",
163                     det ? det : "",
164                     HASPERSDCPATH);
165                 cp = getenv(HASPERSDCPATH);
166                 (void) fprintf(stderr, "%s%s value: %s\n",
167                     det ? det : "",
168                     HASPERSDCPATH, cp ? cp : "none");
169 #  endif        /* defined(HASPERSDCPATH) */
170                 (void) fprintf(stderr, "%sPersonal path: %s\n",
171                     det ? det : "",
172                     DCpath[3] ? DCpath[3] : "none");
173 # endif /* defined(HASPERSDC) */
174             }
175             (void) fprintf(stderr, "%sDevice cache file write paths:\n",
176                 ttl ? ttl : "");
177             if ((dx = dcpath(2, 0)) < 0)
178                 (void) fprintf(stderr, "%snone\n", det ? det : "");
179             else {
180                 (void) fprintf(stderr, "%sNamed via -D: %s\n",
181                     det ? det : "",
182                     DCstate == 2 ? "none"
183                                  : DCpath[0] ? DCpath[0] : "none");
184
185 # if    defined(HASENVDC)
186                 (void) fprintf(stderr,
187                     "%sNamed in environment variable %s: %s\n",
188                     det ? det : "",
189                     HASENVDC, DCpath[1] ? DCpath[1] : "none");
190 # endif /* defined(HASENVDC) */
191
192 # if    defined(HASPERSDC)
193                 (void) fprintf(stderr,
194                     "%sPersonal path format (HASPERSDC): \"%s\"\n",
195                     det ? det : "",
196                     HASPERSDC);
197 #  if   defined(HASPERSDCPATH)
198                 (void) fprintf(stderr,
199                     "%sModified personal path environment variable: %s\n",
200                     det ? det : "",
201                     HASPERSDCPATH);
202                 cp = getenv(HASPERSDCPATH);
203                 (void) fprintf(stderr, "%s%s value: %s\n",
204                     det ? det : "",
205                     HASPERSDCPATH, cp ? cp : "none");
206 #  endif        /* defined(HASPERSDCPATH) */
207                  (void) fprintf(stderr, "%sPersonal path: %s\n",
208                     det ? det : "",
209                     DCpath[3] ? DCpath[3] : "none");
210 # endif /* defined(HASPERSDC) */
211             }
212         } else {
213
214         /*
215          * Report device cache read file path.
216          */
217
218 # if    defined(HASENVDC) || defined(HASPERSDC) || defined(HASSYSDC)
219             cp = NULL;
220 #  if   defined(HASENVDC)
221             if ((dx = dcpath(1, 0)) >= 0)
222                 cp = DCpath[1];
223 #  endif        /* defined(HASENVDC) */
224 #  if   defined(HASSYSDC)
225             if (!cp)
226                 cp = HASSYSDC;
227 #  endif        /* defined(HASSYSDC) */
228 #  if   defined(HASPERSDC)
229             if (!cp && dx != -1 && (dx = dcpath(1, 0)) >= 0)
230                 cp = DCpath[3];
231 #  endif        /* defined(HASPERSDC) */
232             if (cp)
233                 (void) fprintf(stderr,
234                     "%s%s is the default device cache file read path.\n",
235                     ttl ? ttl : "",
236                     cp
237                 );
238 # endif    /* defined(HASENVDC) || defined(HASPERSDC) || defined(HASSYSDC) */
239         }
240
241 # if    defined(WILLDROPGID)
242         Setgid = saved_Setgid;
243 # endif /* defined(WILLDROPGID) */
244
245 #endif  /* defined(HASDCACHE) */
246
247 }
248
249
250 /*
251  * report_HASKERNIDCK() -- report HASKERNIDCK state
252  */
253
254 static void
255 report_HASKERNIDCK(pfx, verb)
256         char *pfx;                              /* prefix (NULL if none) */
257         char *verb;                             /* verb (NULL if none) */
258 {
259         (void) fprintf(stderr, "%sernel ID check %s%s%s.\n",
260             pfx ? pfx : "",
261             verb ? verb : "",
262             verb ? " " : "",
263
264 #if     defined(HASKERNIDCK)
265                 "enabled"
266 #else   /* !defined(HASKERNIDCK) */
267                 "disabled"
268 #endif  /* defined(HASKERNIDCK) */
269
270             );
271 }
272
273
274 /*
275  * report_SECURITY() -- report *SECURITY states
276  */
277
278 static void
279 report_SECURITY(pfx, punct)
280         char *pfx;                              /* prefix (NULL if none) */
281         char *punct;                            /* short foem punctuation
282                                                  * (NULL if none) */
283 {
284         fprintf(stderr, "%s%s can list all files%s",
285             pfx ? pfx : "",
286
287 #if     defined(HASSECURITY)
288             "Only root",
289 # if    defined(HASNOSOCKSECURITY)
290             ", but anyone can list socket files.\n"
291 # else  /* !defined(HASNOSOCKSECURITY) */
292             punct ? punct : ""
293 # endif /* defined(HASNOSOCKSECURITY) */
294 #else   /* !defined(HASSECURITY) */
295             "Anyone",
296             punct ? punct : ""
297 #endif  /* defined(HASSECURITY) */
298
299         );
300 }
301
302
303 /*
304  * report_WARNDEVACCESS() -- report WEARNDEVACCESS state
305  */
306
307 static void
308 report_WARNDEVACCESS(pfx, verb, punct)
309         char *pfx;                              /* prefix (NULL if none) */
310         char *verb;                             /* verb (NULL if none) */
311         char *punct;                            /* punctuation */
312 {
313         (void) fprintf(stderr, "%s/dev warnings %s%s%s%s",
314             pfx ? pfx : "",
315             verb ? verb : "",
316             verb ? " " : "",
317
318 #if     defined(WARNDEVACCESS)
319             "enabled",
320 #else   /* !defined(WARNDEVACCESS) */
321             "disabled",
322 #endif  /* defined(WARNDEVACCESS) */
323
324             punct);
325 }
326
327
328 /*
329  * usage() - display usage and exit
330  */
331
332 void
333 usage(xv, fh, version)
334         int xv;                         /* exit value */
335         int fh;                         /* ``-F ?'' status */
336         int version;                    /* ``-v'' status */
337 {
338         char buf[MAXPATHLEN+1], *cp, *cp1, *cp2;
339         int col, i;
340
341         if (Fhelp || xv) {
342             (void) fprintf(stderr, "%s %s\n latest revision: %s\n",
343                 Pn, LSOF_VERSION, LSOF_URL);
344             (void) fprintf(stderr, " latest FAQ: %sFAQ\n", LSOF_URL);
345             (void) fprintf(stderr, " latest man page: %slsof_man\n", LSOF_URL);
346             (void) fprintf(stderr,
347                 " usage: [-?ab%sh%slnNoOP%s%stUvV%s]",
348
349 #if     defined(HASNCACHE)
350                 "C",
351 #else   /* !defined(HASNCACHE) */
352                 "",
353 #endif  /* defined(HASNCACHE) */
354
355 #if     defined(HASTASKS)
356                 "K",
357 #else   /* !defined(HASTASKS) */
358                 "",
359 #endif  /* defined(HASTASKS) */
360
361 #if     defined(HASPPID)
362                 "R",
363 #else   /* !defined(HASPPID) */
364                 "",
365 #endif  /* defined(HASPPID) */
366
367 #if     defined(HASTCPUDPSTATE)
368                 "",
369 #else   /* !defined(HASTCPUDPSTATE) */
370                 "s",
371 #endif  /* defined(HASTCPUDPSTATE) */
372
373 #if     defined(HASXOPT)
374 # if    defined(HASXOPT_ROOT)
375                 (Myuid == 0) ? "X" : ""
376 # else  /* !defined(HASXOPT_ROOT) */
377                 "X"
378 # endif /* defined(HASXOPT_ROOT) */
379 #else   /* !defined(HASXOPT) */
380                 ""
381 #endif  /* defined(HASXOPT) */
382
383             );
384
385 #if     defined(HAS_AFS) && defined(HASAOPT)
386             (void) fprintf(stderr, " [-A A]");
387 #endif  /* defined(HAS_AFS) && defined(HASAOPT) */
388
389             (void) fprintf(stderr, " [+|-c c] [+|-d s] [+%sD D]%s",
390 #if     defined(HASDCACHE)
391                 "|-",
392 #else   /* !defined(HASDCACHE) */
393                 "",
394 #endif  /* defined(HASDCACHE) */
395
396 #if     defined(HASEPTOPTS)
397                 " [+|-E]"
398 #else   /* !defined(HASEPTOPTS) */
399                 ""
400 #endif  /* defined(HASEPTOPTS) */
401
402                 );
403
404             (void) fprintf(stderr,
405                 " %s[+|-f%s%s%s%s%s%s]\n [-F [f]] [-g [s]] [-i [i]]",
406
407 #if     defined(HASEOPT)
408                 "[+|-e s] ",
409 #else   /* !defined(HASEOPT) */
410                 "",
411 #endif  /* defined(HASEOPT) */
412
413 #if     defined(HASFSTRUCT)
414                 "[",
415
416 # if    defined(HASNOFSCOUNT)
417                 "",
418 # else  /* !defined(HASNOFSCOUNT) */
419                 "c",
420 # endif /* defined(HASNOFSCOUNT) */
421
422 # if    defined(HASNOFSADDR)
423                 "",
424 # else  /* !defined(HASNOFSADDR) */
425                 "f",
426 # endif /* defined(HASNOFSADDR) */
427
428 # if    defined(HASNOFSFLAGS)
429                 "",
430 # else  /* !defined(HASNOFSFLAGS) */
431                 "gG",
432 # endif /* defined(HASNOFSFLAGS) */
433
434 # if    defined(HASNOFSNADDR)
435                 "",
436 # else  /* !defined(HASNOFSNADDR) */
437                 "n",
438 # endif /* defined(HASNOFSNADDR) */
439
440                 "]"
441 #else   /* !defined(HASFSTRUCT) */
442                 "", "", "", "", "", ""
443 #endif  /* defined(HASFSTRUCT) */
444
445                 );
446
447 #if     defined(HASKOPT)
448             (void) fprintf(stderr, " [-k k]");
449 #endif  /* defined(HASKOPT) */
450
451             (void) fprintf(stderr, " [+|-L [l]]");
452
453 #if     defined(HASMOPT) || defined(HASMNTSUP)
454             (void) fprintf(stderr,
455 # if    defined(HASMOPT)
456 #  if   defined(HASMNTSUP)
457                 " [+|-m [m]]"
458 #  else /* !defined(HASMNTSUP) */
459                 " [-m m]"
460 #  endif        /* defined(HASMNTSUP) */
461 # else  /* !defined(HASMOPT) */
462                 " [+m [m]]"
463 # endif /* defined(HASMOPT) */
464                 );
465 #endif  /* defined(HASMOPT) || defined(HASMNTSUP) */
466
467 #if     !defined(HASNORPC_H)
468             (void) fprintf(stderr, " [+|-M]");
469 #endif  /* !defined(HASNORPC_H) */
470
471             (void) fprintf(stderr,
472                 " [-o [o]] [-p s]\n [+|-r [t]]%s [-S [t]] [-T [t]]",
473
474 #if     defined(HASTCPUDPSTATE)
475                 " [-s [p:s]]"
476 #else   /* !defined(HASTCPUDPSTATE) */
477                 ""
478 #endif  /* defined(HASTCPUDPSTATE) */
479
480                 );
481             (void) fprintf(stderr, " [-u s] [+|-w] [-x [fl]]");
482
483 #if     defined(HASZONES)
484             (void) fprintf(stderr, " [-z [z]]");
485 #else   /* !defined(HASZONES) */
486 # if    defined(HASSELINUX)
487             if (CntxStatus)
488                 (void) fprintf(stderr, " [-Z [Z]]");
489 # endif /* defined(HASSELINUX) */
490 #endif  /* defined(HASZONES) */
491
492             (void) fprintf(stderr, " [--] [names]\n");
493         }
494         if (xv && !Fhelp) {
495             (void) fprintf(stderr,
496                 "Use the ``-h'' option to get more help information.\n");
497             if (!fh)
498                 Exit(xv);
499         }
500         if (Fhelp) {
501             (void) fprintf(stderr,
502                 "Defaults in parentheses; comma-separated set (s) items;");
503             (void) fprintf(stderr, " dash-separated ranges.\n");
504             col = print_in_col(1, "-?|-h list help");
505             col = print_in_col(col, "-a AND selections (OR)");
506             col = print_in_col(col, "-b avoid kernel blocks");
507             col = print_in_col(col,  "-c c  cmd c ^c /c/[bix]");
508             (void) snpf(buf, sizeof(buf), "+c w  COMMAND width (%d)", CMDL);
509             col = print_in_col(col, buf);
510
511 #if     defined(HASNCACHE)
512            col = print_in_col(col, "-C no kernel name cache");
513 #endif  /* defined(HASNCACHE) */
514
515             col = print_in_col(col, "+d s  dir s files");
516             col = print_in_col(col,  "-d s  select by FD set");
517             col = print_in_col(col,  "+D D  dir D tree *SLOW?*");
518
519 #if     defined(HASDCACHE)
520             if (Setuidroot)
521                 cp = "?|i|r";
522
523 # if    !defined(WILLDROPGID)
524             else if (Myuid)
525                 cp = "?|i|r<path>";
526 # endif /* !defined(WILLDROPGID) */
527
528             else
529                 cp = "?|i|b|r|u[path]";
530             (void) snpf(buf, sizeof(buf), "-D D  %s", cp);
531 #else   /* !defined(HASDCACHE) */
532             buf[0] = '\0';
533 #endif  /* defined(HASDCACHE) */
534
535             col = print_in_col(col, buf);
536
537 #if     defined(HASEOPT)
538             col = print_in_col(col, "+|-e s  exempt s *RISKY*");
539 #endif  /* defined(HASEOPT) */
540
541             (void) snpf(buf, sizeof(buf), "-i select IPv%s files",
542
543 #if     defined(HASIPv6)
544                           "[46]"
545 #else   /* !defined(HASIPv6) */
546                           "4"
547 #endif  /* defined(HASIPv6) */
548
549                           );
550             col = print_in_col(col, buf);
551
552 #if     defined(HASTASKS)
553             col = print_in_col(col, "-K list tasKs (threads)");
554 #endif  /* defined(HASTASKS) */
555
556             col = print_in_col(col, "-l list UID numbers");
557             col = print_in_col(col, "-n no host names");
558             col = print_in_col(col, "-N select NFS files");
559             col = print_in_col(col, "-o list file offset");
560             col = print_in_col(col, "-O no overhead *RISKY*");
561             col = print_in_col(col, "-P no port names");
562
563 #if     defined(HASPPID)
564              col = print_in_col(col, "-R list paRent PID");
565 #endif  /* defined(HASPPID) */
566
567             col = print_in_col(col,  "-s list file size");
568             col = print_in_col(col,  "-t terse listing");
569             col = print_in_col(col,  "-T disable TCP/TPI info");
570             col = print_in_col(col,  "-U select Unix socket");
571             col = print_in_col(col,  "-v list version info");
572             col = print_in_col(col,  "-V verbose search");
573             (void) snpf(buf, sizeof(buf), "+|-w  Warnings (%s)",
574
575 #if     defined(WARNINGSTATE)
576                 "-");
577 #else   /* !defined(WARNINGSTATE) */
578                 "+");
579 #endif  /* defined(WARNINGSTATE) */
580
581             col = print_in_col(col, buf);
582
583 #if     defined(HASXOPT)
584 # if    defined(HASXOPT_ROOT)
585             if (Myuid == 0)
586                 (void) snpf(buf, sizeof(buf), "-X %s", HASXOPT);
587             else
588                 buf[0] = '\0';
589 # else  /* !defined(HASXOPT_ROOT) */
590             (void) snpf(buf, sizeof(buf), "-X %s", HASXOPT);
591 # endif /* defined(HASXOPT_ROOT) */
592 # else  /* !defined(HASXOPT) */
593             buf[0] = '\0';
594 #endif  /* defined(HASXOPT) */
595
596             col = print_in_col(col, buf);
597
598 #if     defined(HASZONES)
599             col = print_in_col(col, "-z z  zone [z]");
600 #endif  /* defined(HASZONES) */
601
602 #if     defined(HASSELINUX)
603             col = print_in_col(col, "-Z Z  context [Z]");
604 #endif  /* defined(HASSELINUX) */
605
606             col = print_in_col(col, "-- end option scan");
607             if (col != 1)
608                 (void) fprintf(stderr, "\n");
609
610 #if     defined(HASEPTOPTS)
611             (void) fprintf(stderr, "  %-36.36s  %s\n",
612                 "-E display endpoint info",
613                 "+E display endpoint info and files"
614             );
615 #endif  /* defined(HASEPTOPTS) */
616
617             (void) fprintf(stderr, "  %-36.36s",
618                 "+f|-f  +filesystem or -file names");
619
620 #if     defined(HASFSTRUCT)
621             (void) fprintf(stderr,
622                 "  +|-f[%s%s%s%s]%s%s%s%s %s%s%s%s%s%s%s\n",
623
624 # if    defined(HASNOFSCOUNT)
625                 "",
626 # else  /* !defined(HASNOFSCOUNT) */
627                 "c",
628 # endif /* defined(HASNOFSCOUNT) */
629
630 # if    defined(HASNOFSADDR)
631                 "",
632 # else  /* !defined(HASNOFSADDR) */
633                 "f",
634 # endif /* defined(HASNOFSADDR) */
635
636 # if    defined(HASNOFSFLAGS)
637                 "",
638 # else  /* !defined(HASNOFSFLAGS) */
639                 "gG",
640 # endif /* defined(HASNOFSFLAGS) */
641
642 # if    defined(HASNOFSNADDR)
643                 "",
644 # else  /* !defined(HASNOFSNADDR) */
645                 "n",
646 # endif /* defined(HASNOFSNADDR) */
647
648 # if    defined(HASNOFSCOUNT)
649                 "",
650 # else  /* !defined(HASNOFSCOUNT) */
651                 " Ct",
652 # endif /* defined(HASNOFSCOUNT) */
653
654 # if    defined(HASNOFSADDR)
655                 "",
656 # else  /* !defined(HASNOFSADDR) */
657                 " Fstr",
658 # endif /* defined(HASNOFSADDR) */
659
660 # if    defined(HASNOFSFLAGS)
661                 "",
662 # else  /* !defined(HASNOFSFLAGS) */
663                 " flaGs",
664 # endif /* defined(HASNOFSFLAGS) */
665
666 # if    defined(HASNOFSNADDR)
667                 "",
668 # else  /* !defined(HASNOFSNADDR) */
669                 " Node",
670 # endif /* defined(HASNOFSNADDR) */
671
672                 Fsv ? "(" : "",
673                 (Fsv & FSV_CT) ? "C" : "",
674                 (Fsv & FSV_FA) ? "F" : "",
675                 ((Fsv & FSV_FG) && FsvFlagX)  ? "g" : "",
676                 ((Fsv & FSV_FG) && !FsvFlagX) ? "G" : "",
677                 (Fsv & FSV_NI) ? "N" : "",
678                 Fsv ? ")" : "");
679 #else   /* !defined(HASFSTRUCT) */
680             putc('\n', stderr);
681 #endif  /* defined(HASFSTRUCT) */
682
683             (void) fprintf(stderr, "  %-36.36s",
684                 "-F [f] select fields; -F? for help");
685
686 #if     defined(HASKOPT)
687             (void) fprintf(stderr,
688                 "  -k k   kernel symbols (%s)\n",
689                 Nmlst ? Nmlst
690 # if    defined(N_UNIX)
691                       : N_UNIX
692 # else  /* !defined(N_UNIX) */
693                       : (Nmlst = get_nlist_path(1)) ? Nmlst
694                                                     : "none found"
695 # endif /* defined(N_UNIX) */
696
697             );
698 #else   /* !defined(HASKOPT) */
699             putc('\n', stderr);
700 #endif  /* defined(HASKOPT) */
701
702             (void) fprintf(stderr,
703                 "  +|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)\n");
704
705 #if     defined(HASMOPT) || defined(HASMNTSUP)
706 # if    defined(HASMOPT)
707             (void) snpf(buf, sizeof(buf), "-m m   kernel memory (%s)", KMEM);
708 # else  /* !defined(HASMOPT) */
709             buf[0] = '\0';
710 # endif /* defined(HASMOPT) */
711
712             (void) fprintf(stderr, "  %-36.36s", buf);
713
714 # if    defined(HASMNTSUP)
715             (void) fprintf(stderr, "  +m [m] use|create mount supplement\n");
716 # else  /* !defined(HASMNTSUP) */
717             (void) fprintf(stderr, "\n");
718 # endif /* defined(HASMNTSUP) */
719 #endif  /* defined(HASMOPT) || defined(HASMNTSUP) */
720
721 #if     !defined(HASNORPC_H)
722             (void) snpf(buf, sizeof(buf), "+|-M   portMap registration (%s)",
723
724 # if    defined(HASPMAPENABLED)
725                 "+"
726 # else  /* !defined(HASPMAPENABLED) */
727                 "-"
728 # endif /* defined(HASPMAPENABLED) */
729
730             );
731 #else   /* defined(HASNORPC_H) */
732             buf[0] = '\0';
733 #endif  /* !defined(HASNORPC_H) */
734
735             (void) fprintf(stderr, "  %-36.36s", buf);
736             (void) snpf(buf, sizeof(buf), "-o o   o 0t offset digits (%d)",
737                 OFFDECDIG);
738             (void) fprintf(stderr, "  %s\n", buf);
739             (void) fprintf(stderr, "  %-36.36s",
740                 "-p s   exclude(^)|select PIDs");
741             (void) fprintf(stderr, "  -S [t] t second stat timeout (%d)\n",
742                 TMLIMIT);
743             (void) snpf(buf, sizeof(buf),
744                 "-T %s%ss%s TCP/TPI %s%sSt%s (s) info",
745
746 #if     defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
747                 "f",
748 #else   /* !defined(HASSOOPT) && !defined(HASSOSTATE) && !defined(HASTCPOPT)*/
749                 "",
750 #endif  /* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)*/
751
752 #if     defined(HASTCPTPIQ)
753                 "q",
754 #else   /* !defined(HASTCPTPIQ) */
755                 " ",
756 #endif  /* defined(HASTCPTPIQ) */
757
758 #if     defined(HASTCPTPIW)
759                 "w",
760 #else   /* !defined(HASTCPTPIW) */
761                 "",
762 #endif  /* defined(HASTCPTPIW) */
763
764 #if     defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
765                 "Fl,",
766 #else   /* !defined(HASSOOPT) && !defined(HASSOSTATE) && !defined(HASTCPOPT)*/
767                 "",
768 #endif  /* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)*/
769
770 #if     defined(HASTCPTPIQ)
771                 "Q,",
772 #else   /* !defined(HASTCPTPIQ) */
773                 "",
774 #endif  /* defined(HASTCPTPIQ) */
775
776 #if     defined(HASTCPTPIW)
777                 ",Win"
778 #else   /* !defined(HASTCPTPIW) */
779                 ""
780 #endif  /* defined(HASTCPTPIW) */
781
782             );
783             (void) fprintf(stderr, "  %s\n", buf);
784
785 #if     defined(HAS_AFS) && defined(HASAOPT)
786             (void) fprintf(stderr,
787                 "  -A A   AFS name list file (%s)\n", AFSAPATHDEF);
788 #endif  /* defined(HAS_AFS) && defined(HASAOPT) */
789
790             (void) fprintf(stderr,
791                 "  -g [s] exclude(^)|select and print process group IDs\n");
792             (void) fprintf(stderr, "  -i i   select by IPv%s address:",
793
794 #if     defined(HASIPv6)
795                           "[46]"
796 #else   /* !defined(HASIPv6) */
797                           "4"
798 #endif  /* defined(HASIPv6) */
799
800                           );
801             (void) fprintf(stderr,
802                 " [%s][proto][@host|addr][:svc_list|port_list]\n",
803
804 #if     defined(HASIPv6)
805                 "46"
806 #else   /* !defined(HASIPv6) */
807                 "4"
808 #endif  /* defined(HASIPv6) */
809
810                 );
811
812             (void) fprintf(stderr,
813                 "  +|-r [%s] repeat every t seconds (%d); %s",
814
815 #if     defined(HAS_STRFTIME)
816                 "t[m<fmt>]",
817 #else   /* !defined(has_STRFTIME) */
818                 "t",
819 #endif  /* defined(HAS_STRFTIME) */
820
821                 RPTTM,
822                 " + until no files, - forever.\n");
823
824 #if     defined(HAS_STRFTIME)
825             (void) fprintf(stderr,
826                 "       An optional suffix to t is m<fmt>; m must separate %s",
827                 "t from <fmt> and\n");
828             (void) fprintf(stderr, "      <fmt> is an strftime(3) format %s",
829                 "for the marker line.\n");
830 #endif  /* defined(HAS_STRFTIME) */
831
832 #if     defined(HASTCPUDPSTATE)
833             (void) fprintf(stderr,
834                 "  -s p:s  exclude(^)|select protocol (p = TCP|UDP) states");
835             (void) fprintf(stderr, " by name(s).\n");
836 #endif  /* defined(HASTCPUDPSTATE) */
837
838             (void) fprintf(stderr,
839                 "  -u s   exclude(^)|select login|UID set s\n");
840             (void) fprintf(stderr,
841                 "  -x [fl] cross over +d|+D File systems or symbolic Links\n");
842             (void) fprintf(stderr,
843                 "  names  select named files or files on named file systems\n");
844             (void) report_SECURITY(NULL, "; ");
845             (void) report_WARNDEVACCESS(NULL, NULL, ";");
846             (void) report_HASKERNIDCK(" k", NULL);
847             (void) report_HASDCACHE(0, NULL, NULL);
848
849 #if     defined(DIALECT_WARNING)
850             (void) fprintf(stderr, "WARNING: %s\n", DIALECT_WARNING);
851 #endif  /* defined(DIALECT_WARNING) */
852
853         }
854         if (fh) {
855             (void) fprintf(stderr, "%s:\tID    field description\n", Pn);
856             for (i = 0; FieldSel[i].nm; i++) {
857
858 #if     !defined(HASPPID)
859                 if (FieldSel[i].id == LSOF_FID_PPID)
860                     continue;
861 #endif  /* !defined(HASPPID) */
862
863 #if     !defined(HASFSTRUCT)
864                 if (FieldSel[i].id == LSOF_FID_FA
865                 ||  FieldSel[i].id == LSOF_FID_CT
866                 ||  FieldSel[i].id == LSOF_FID_FG
867                 ||  FieldSel[i].id == LSOF_FID_NI)
868                     continue;
869 #else   /* defined(HASFSTRUCT) */
870 # if    defined(HASNOFSADDR)
871                 if (FieldSel[i].id == LSOF_FID_FA)
872                     continue;
873 # endif /* defined(HASNOFSADDR) */
874
875 # if    defined(HASNOFSCOUNT)
876                 if (FieldSel[i].id == LSOF_FID_CT)
877                     continue;
878 # endif /* !defined(HASNOFSCOUNT) */
879
880 # if    defined(HASNOFSFLAGS)
881                 if (FieldSel[i].id == LSOF_FID_FG)
882                     continue;
883 # endif /* defined(HASNOFSFLAGS) */
884
885 # if    defined(HASNOFSNADDR)
886                 if (FieldSel[i].id == LSOF_FID_NI)
887                     continue;
888 # endif /* defined(HASNOFSNADDR) */
889 #endif  /* !defined(HASFSTRUCT) */
890
891 #if     !defined(HASZONES)
892                 if (FieldSel[i].id == LSOF_FID_ZONE)
893                     continue;
894 #endif  /* !defined(HASZONES) */
895  
896 #if     defined(HASSELINUX)
897                 if ((FieldSel[i].id == LSOF_FID_CNTX) && !CntxStatus)
898                     continue;
899 #else   /* !defined(HASSELINUX) */
900                 if (FieldSel[i].id == LSOF_FID_CNTX)
901                     continue;
902 #endif  /* !defined(HASSELINUX) */
903
904                 (void) fprintf(stderr, "\t %c    %s\n",
905                     FieldSel[i].id, FieldSel[i].nm);
906             }
907         }
908
909 #if     defined(HASDCACHE)
910         if (DChelp)
911             report_HASDCACHE(1, NULL, "    ");
912 #endif  /* defined(HASDCACHE) */
913
914         if (version) {
915
916         /*
917          * Display version information in reponse to ``-v''.
918          */
919             (void) fprintf(stderr, "%s version information:\n", Pn);
920             (void) fprintf(stderr, "    revision: %s\n", LSOF_VERSION);
921             (void) fprintf(stderr, "    latest revision: %s\n", LSOF_URL);
922             (void) fprintf(stderr, "    latest FAQ: %sFAQ\n",
923                 LSOF_URL);
924             (void) fprintf(stderr, "    latest man page: %slsof_man\n",
925                 LSOF_URL);
926
927 #if     defined(LSOF_CINFO)
928             if ((cp = isnullstr(LSOF_CINFO)))
929                 (void) fprintf(stderr, "    configuration info: %s\n", cp);
930 #endif  /* defined(LSOF_CINFO) */
931
932             if ((cp = isnullstr(LSOF_CCDATE)))
933                 (void) fprintf(stderr, "    constructed: %s\n", cp);
934             cp = isnullstr(LSOF_HOST);
935             if (!(cp1 = isnullstr(LSOF_LOGNAME)))
936                 cp1 = isnullstr(LSOF_USER);
937             if (cp || cp1) {
938                 if (cp && cp1)
939                     cp2 = "by and on";
940                 else if (cp)
941                     cp2 = "on";
942                 else
943                     cp2 = "by";
944                 (void) fprintf(stderr, "    constructed %s: %s%s%s\n",
945                     cp2,
946                     cp1 ? cp1 : "",
947                     (cp && cp1) ? "@" : "",
948                     cp  ? cp  : ""
949                 );
950             }
951
952 #if     defined(LSOF_BLDCMT)
953             if ((cp = isnullstr(LSOF_BLDCMT)))
954                 (void) fprintf(stderr, "    builder's comment: %s\n", cp);
955 #endif  /* defined(LSOF_BLDCMT) */
956
957             if ((cp = isnullstr(LSOF_CC)))
958                 (void) fprintf(stderr, "    compiler: %s\n", cp);
959             if ((cp = isnullstr(LSOF_CCV)))
960                 (void) fprintf(stderr, "    compiler version: %s\n", cp);
961             if ((cp = isnullstr(LSOF_CCFLAGS)))
962                 (void) fprintf(stderr, "    compiler flags: %s\n", cp);
963             if ((cp = isnullstr(LSOF_LDFLAGS)))
964                 (void) fprintf(stderr, "    loader flags: %s\n", cp);
965             if ((cp = isnullstr(LSOF_SYSINFO)))
966                 (void) fprintf(stderr, "    system info: %s\n", cp);
967             (void) report_SECURITY("    ", ".\n");
968             (void) report_WARNDEVACCESS("    ", "are", ".\n");
969             (void) report_HASKERNIDCK("    K", "is");
970
971 #if     defined(DIALECT_WARNING)
972             (void) fprintf(stderr, "    WARNING: %s\n", DIALECT_WARNING);
973 #endif  /* defined(DIALECT_WARNING) */
974
975             (void) report_HASDCACHE(1, "    ", "\t");
976         }
977         Exit(xv);
978 }