summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith M Wesolowski <wesolows@foobazco.org>2014-01-06 18:53:47 +0000
committerKeith M Wesolowski <wesolows@foobazco.org>2014-01-06 18:53:57 +0000
commita80c3c1a7861e64ed6e68e86fd80010b314c6b7e (patch)
treebc27026184a204b8aaeee2babdacdf784e86c050
parent53186cb50f3aa35193741112d72db0b7ff68ba71 (diff)
parent9b5f5885b666050a9ec3f0ff18de2c6bf4703232 (diff)
downloadillumos-joyent-a80c3c1a7861e64ed6e68e86fd80010b314c6b7e.tar.gz
[illumos-gate merge]
commit 9b5f5885b666050a9ec3f0ff18de2c6bf4703232 4385 Missing hosts_ctl() prototype in tcpd.h commit 7ab03f887ff62508a7f59fd9c235aaeb3e17866a 2926 lex ignores -Y commit 4cf73299b119968f5f0090a5f98b799fad68dfc5 4436 ::dis -b fails to separate address columns Conflicts: usr/src/cmd/sgs/lex/common/main.c (OS-2097)
-rw-r--r--usr/src/cmd/mdb/common/mdb/mdb_cmds.c8
-rw-r--r--usr/src/cmd/sgs/lex/common/main.c38
-rw-r--r--usr/src/lib/libwrap/tcpd.h210
-rw-r--r--usr/src/man/man1/lex.115
4 files changed, 149 insertions, 122 deletions
diff --git a/usr/src/cmd/mdb/common/mdb/mdb_cmds.c b/usr/src/cmd/mdb/common/mdb/mdb_cmds.c
index d7e98e6d09..3a184555cc 100644
--- a/usr/src/cmd/mdb/common/mdb/mdb_cmds.c
+++ b/usr/src/cmd/mdb/common/mdb/mdb_cmds.c
@@ -2007,7 +2007,7 @@ cmd_dis(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
if (opt_a)
mdb_printf("%-#32p%8T%s\n", addr, buf);
else if (opt_b)
- mdb_printf("%-#10p%-#32a%8T%s\n",
+ mdb_printf("%-#?p %-#32a%8T%s\n",
addr, addr, buf);
else
mdb_printf("%-#32a%8T%s\n", addr, buf);
@@ -2031,7 +2031,7 @@ cmd_dis(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
if (opt_a)
mdb_printf("%-#32p%8T%s\n", oaddr, buf);
else if (opt_b)
- mdb_printf("%-#10p%-#32a%8T%s\n",
+ mdb_printf("%-#?p %-#32a%8T%s\n",
oaddr, oaddr, buf);
else
mdb_printf("%-#32a%8T%s\n", oaddr, buf);
@@ -2046,7 +2046,7 @@ cmd_dis(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
if (opt_a)
mdb_printf("%-#32p%8T%s%", addr, buf);
else if (opt_b)
- mdb_printf("%-#10p%-#32a%8T%s", addr, addr, buf);
+ mdb_printf("%-#?p %-#32a%8T%s", addr, addr, buf);
else
mdb_printf("%-#32a%8T%s%", addr, buf);
mdb_printf("%</b>\n");
@@ -2059,7 +2059,7 @@ cmd_dis(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
if (opt_a)
mdb_printf("%-#32p%8T%s\n", addr, buf);
else if (opt_b)
- mdb_printf("%-#10p%-#32a%8T%s\n",
+ mdb_printf("%-#?p %-#32a%8T%s\n",
addr, addr, buf);
else
mdb_printf("%-#32a%8T%s\n", addr, buf);
diff --git a/usr/src/cmd/sgs/lex/common/main.c b/usr/src/cmd/sgs/lex/common/main.c
index bd9d242ffc..a1fd526cf9 100644
--- a/usr/src/cmd/sgs/lex/common/main.c
+++ b/usr/src/cmd/sgs/lex/common/main.c
@@ -19,6 +19,8 @@
* CDDL HEADER END
*/
/*
+ * Copyright (c) 2014 Gary Mills
+ *
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -72,7 +74,8 @@ main(int argc, char **argv)
{
int i;
int c;
- char *path = NULL, *bpath = NULL;
+ char *apath = NULL;
+ char *ypath;
char pathbuf[PATH_MAX];
Boolean eoption = 0, woption = 0;
@@ -105,9 +108,13 @@ main(int argc, char **argv)
"lex: -Q should be followed by [y/n]");
break;
case 'Y':
- path = (char *)malloc(strlen(optarg) +
+ apath = (char *)malloc(strlen(optarg) +
sizeof ("/nceucform") + 1);
- path = strcpy(path, optarg);
+ if (apath == NULL)
+ error("No available memory "
+ "for directory name.");
+ else
+ apath = strcpy(apath, optarg);
break;
case 'c':
ratfor = FALSE;
@@ -135,7 +142,8 @@ main(int argc, char **argv)
break;
default:
(void) fprintf(stderr,
- "Usage: lex [-ewctvnVY] [-Q(y/n)] [file]\n");
+ "Usage: lex [-ewctvnV] [-Y directory] "
+ "[-Q(y/n)] [file]\n");
exit(1);
}
}
@@ -248,29 +256,31 @@ main(int argc, char **argv)
if (handleeuc) {
if (ratfor)
error("Ratfor is not supported by -w or -e option.");
- bpath = EUCNAME;
+ ypath = EUCNAME;
}
else
- bpath = ratfor ? RATNAME : CNAME;
+ ypath = ratfor ? RATNAME : CNAME;
- if (path == NULL) {
- path = pathbuf;
- (void) lex_construct_path(pathbuf, sizeof (pathbuf), bpath, 1);
- fother = fopen(path, "r");
+ if (apath == NULL) {
+ (void) lex_construct_path(pathbuf, sizeof (pathbuf), ypath, 1);
+ fother = fopen(pathbuf, "r");
if (fother == NULL) {
(void) lex_construct_path(pathbuf, sizeof (pathbuf),
- bpath, 0);
- fother = fopen(path, "r");
+ ypath, 0);
+ fother = fopen(pathbuf, "r");
}
} else {
- fother = fopen(path, "r");
+ apath = strcat(apath, "/");
+ ypath = strcat(apath, ypath);
+ fother = fopen(ypath, "r");
}
if (fother == NULL)
- error("Lex driver missing, file %s", path);
+ error("Lex driver missing, file %s", ypath);
while ((i = getc(fother)) != EOF)
(void) putc((char)i, fout);
(void) fclose(fother);
(void) fclose(fout);
+ free(apath);
if (report == 1)
statistics();
(void) fclose(stdout);
diff --git a/usr/src/lib/libwrap/tcpd.h b/usr/src/lib/libwrap/tcpd.h
index 03cce19ae8..2cda9e01e2 100644
--- a/usr/src/lib/libwrap/tcpd.h
+++ b/usr/src/lib/libwrap/tcpd.h
@@ -1,14 +1,17 @@
/*
+ * Copyright 2014 Sachidananda Urs <sacchi@gmail.com>
* Copyright 2001 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
- /*
- * @(#) tcpd.h 1.5 96/03/19 16:22:24
- *
- * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
- */
+/*
+ * @(#) tcpd.h 1.5 96/03/19 16:22:24
+ *
+ * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
+ */
+
+#ifndef _TCPD_H
+#define _TCPD_H
/*
* HAVE_IPV6 is traditionally configured at tcp_wrappers build time but for
@@ -19,7 +22,7 @@
/* Structure to describe one communications endpoint. */
-#define STRING_LENGTH 128 /* hosts, users, processes */
+#define STRING_LENGTH 128 /* hosts, users, processes */
#include <sys/socket.h>
#include <netinet/in.h>
@@ -31,7 +34,7 @@ typedef struct sockaddr_gen {
#ifdef HAVE_IPV6
struct sockaddr_in6 _sg_sin6;
#endif
- } sg_addr;
+ } sg_addr;
} sockaddr_gen;
typedef union gen_addr {
@@ -43,47 +46,47 @@ typedef union gen_addr {
extern void sockgen_simplify();
-#define sg_sa sg_addr._sg_sa
-#define sg_sin sg_addr._sg_sin
-#define sg_sin6 sg_addr._sg_sin6
-#define sg_family sg_sa.sa_family
+#define sg_sa sg_addr._sg_sa
+#define sg_sin sg_addr._sg_sin
+#define sg_sin6 sg_addr._sg_sin6
+#define sg_family sg_sa.sa_family
#ifdef HAVE_IPV6
-#define SGADDRSZ(sag) ((sag)->sg_family == AF_INET6 ? \
+#define SGADDRSZ(sag) ((sag)->sg_family == AF_INET6 ? \
sizeof (struct in6_addr) : \
sizeof (struct in_addr))
-#define SGSOCKADDRSZ(sag) ((sag)->sg_family == AF_INET6 ? \
+#define SGSOCKADDRSZ(sag) ((sag)->sg_family == AF_INET6 ? \
sizeof (struct sockaddr_in6) : \
sizeof (struct sockaddr_in))
-#define SGPORT(sag) (*((sag)->sg_family == AF_INET6 ? \
+#define SGPORT(sag) (*((sag)->sg_family == AF_INET6 ? \
&(sag)->sg_sin6.sin6_port : \
&(sag)->sg_sin.sin_port))
-#define SGADDRP(sag) (((sag)->sg_family == AF_INET6 ? \
- (char *) &(sag)->sg_sin6.sin6_addr : \
- (char *) &(sag)->sg_sin.sin_addr))
-#define SGFAM(sag) ((sag)->sg_family == AF_INET6 ? \
+#define SGADDRP(sag) (((sag)->sg_family == AF_INET6 ? \
+ (char *)&(sag)->sg_sin6.sin6_addr : \
+ (char *)&(sag)->sg_sin.sin_addr))
+#define SGFAM(sag) ((sag)->sg_family == AF_INET6 ? \
AF_INET6 : AF_INET)
-#define SG_IS_UNSPECIFIED(sag) \
+#define SG_IS_UNSPECIFIED(sag) \
((sag)->sg_family == AF_INET6 ? \
IN6_IS_ADDR_UNSPECIFIED(&(sag)->sg_sin6.sin6_addr) : \
(sag)->sg_sin.sin_addr.s_addr == 0)
-#define VALID_ADDRTYPE(t) ((t) == AF_INET || (t) == AF_INET6)
+#define VALID_ADDRTYPE(t) ((t) == AF_INET || (t) == AF_INET6)
#ifndef IPV6_ABITS
-#define IPV6_ABITS 128 /* Size of IPV6 address in bits */
+#define IPV6_ABITS 128 /* Size of IPV6 address in bits */
#endif
#else /* HAVE_IPV6 */
-#define SGADDRSZ(sag) sizeof(struct in_addr)
-#define SGSOCKADDRSZ(sag) sizeof(struct sockaddr_in)
-#define SGPORT(sag) ((sag)->sg_sin.sin_port)
-#define SGADDRP(sag) ((char*) &(sag)->sg_sin.sin_addr)
-#define SGFAM(sag) AF_INET
-#define SG_IS_UNSPECIFIED(sag) ((sag)->sg_sin.sin_addr.s_addr == 0)
+#define SGADDRSZ(sag) sizeof (struct in_addr)
+#define SGSOCKADDRSZ(sag) sizeof (struct sockaddr_in)
+#define SGPORT(sag) ((sag)->sg_sin.sin_port)
+#define SGADDRP(sag) ((char *)&(sag)->sg_sin.sin_addr)
+#define SGFAM(sag) AF_INET
+#define SG_IS_UNSPECIFIED(sag) ((sag)->sg_sin.sin_addr.s_addr == 0)
-#define VALID_ADDRTYPE(t) ((t) == AF_INET)
+#define VALID_ADDRTYPE(t) ((t) == AF_INET)
#endif /* HAVE_IPV6 */
@@ -98,7 +101,7 @@ struct host_info {
/* Structure to describe what we know about a service request. */
struct request_info {
- int fd; /* socket handle */
+ int fd; /* socket handle */
char user[STRING_LENGTH]; /* access via eval_user(request) */
char daemon[STRING_LENGTH]; /* access via eval_daemon(request) */
char pid[10]; /* access via eval_pid(request) */
@@ -113,32 +116,32 @@ struct request_info {
/* Common string operations. Less clutter should be more readable. */
-#define STRN_CPY(d,s,l) { strncpy((d),(s),(l)); (d)[(l)-1] = 0; }
+#define STRN_CPY(d, s, l) { strncpy((d), (s), (l)); (d)[(l)-1] = 0; }
-#define STRN_EQ(x,y,l) (strncasecmp((x),(y),(l)) == 0)
-#define STRN_NE(x,y,l) (strncasecmp((x),(y),(l)) != 0)
-#define STR_EQ(x,y) (strcasecmp((x),(y)) == 0)
-#define STR_NE(x,y) (strcasecmp((x),(y)) != 0)
+#define STRN_EQ(x, y, l) (strncasecmp((x), (y), (l)) == 0)
+#define STRN_NE(x, y, l) (strncasecmp((x), (y), (l)) != 0)
+#define STR_EQ(x, y) (strcasecmp((x), (y)) == 0)
+#define STR_NE(x, y) (strcasecmp((x), (y)) != 0)
- /*
- * Initially, all above strings have the empty value. Information that
- * cannot be determined at runtime is set to "unknown", so that we can
- * distinguish between `unavailable' and `not yet looked up'. A hostname
- * that we do not believe in is set to "paranoid".
- */
+/*
+ * Initially, all above strings have the empty value. Information that
+ * cannot be determined at runtime is set to "unknown", so that we can
+ * distinguish between `unavailable' and `not yet looked up'. A hostname
+ * that we do not believe in is set to "paranoid".
+ */
-#define STRING_UNKNOWN "unknown" /* lookup failed */
-#define STRING_PARANOID "paranoid" /* hostname conflict */
+#define STRING_UNKNOWN "unknown" /* lookup failed */
+#define STRING_PARANOID "paranoid" /* hostname conflict */
extern char unknown[];
extern char paranoid[];
-#define HOSTNAME_KNOWN(s) (STR_NE((s),unknown) && STR_NE((s),paranoid))
+#define HOSTNAME_KNOWN(s) (STR_NE((s), unknown) && STR_NE((s), paranoid))
#ifdef HAVE_IPV6
-#define NOT_INADDR(s) (strchr(s,':') == 0 && s[strspn(s,"0123456789./")] != 0)
+#define NOT_INADDR(s) (strchr(s, ':') == 0 && s[strspn(s, "0123456789./")] != 0)
#else
-#define NOT_INADDR(s) (s[strspn(s,"0123456789./")] != 0)
+#define NOT_INADDR(s) (s[strspn(s, "0123456789./")] != 0)
#endif
/* Global functions. */
@@ -146,9 +149,10 @@ extern char paranoid[];
#if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
extern void fromhost(); /* get/validate client host info */
#else
-#define fromhost sock_host /* no TLI support needed */
+#define fromhost sock_host /* no TLI support needed */
#endif
+extern int hosts_ctl(); /* wrapper around request_init() */
extern int hosts_access(); /* access control */
extern void shell_cmd(); /* execute shell command */
extern char *percent_x(); /* do %<char> expansion */
@@ -164,7 +168,7 @@ extern struct hostent *tcpd_gethostbyname();
#ifdef HAVE_IPV6
extern char *skip_ipv6_addrs(); /* skip over colons in IPv6 addrs */
#else
-#define skip_ipv6_addrs(x) x
+#define skip_ipv6_addrs(x) x
#endif
/* Global variables. */
@@ -177,36 +181,36 @@ extern int hosts_access_verbose; /* for verbose matching mode */
extern int rfc931_timeout; /* user lookup timeout */
extern int resident; /* > 0 if resident process */
- /*
- * Routines for controlled initialization and update of request structure
- * attributes. Each attribute has its own key.
- */
+/*
+ * Routines for controlled initialization and update of request structure
+ * attributes. Each attribute has its own key.
+ */
#ifdef __STDC__
-extern struct request_info *request_init(struct request_info *,...);
-extern struct request_info *request_set(struct request_info *,...);
+extern struct request_info *request_init(struct request_info *, ...);
+extern struct request_info *request_set(struct request_info *, ...);
#else
extern struct request_info *request_init(); /* initialize request */
extern struct request_info *request_set(); /* update request structure */
#endif
-#define RQ_FILE 1 /* file descriptor */
-#define RQ_DAEMON 2 /* server process (argv[0]) */
-#define RQ_USER 3 /* client user name */
-#define RQ_CLIENT_NAME 4 /* client host name */
-#define RQ_CLIENT_ADDR 5 /* client host address */
-#define RQ_CLIENT_SIN 6 /* client endpoint (internal) */
-#define RQ_SERVER_NAME 7 /* server host name */
-#define RQ_SERVER_ADDR 8 /* server host address */
-#define RQ_SERVER_SIN 9 /* server endpoint (internal) */
-
- /*
- * Routines for delayed evaluation of request attributes. Each attribute
- * type has its own access method. The trivial ones are implemented by
- * macros. The other ones are wrappers around the transport-specific host
- * name, address, and client user lookup methods. The request_info and
- * host_info structures serve as caches for the lookup results.
- */
+#define RQ_FILE 1 /* file descriptor */
+#define RQ_DAEMON 2 /* server process (argv[0]) */
+#define RQ_USER 3 /* client user name */
+#define RQ_CLIENT_NAME 4 /* client host name */
+#define RQ_CLIENT_ADDR 5 /* client host address */
+#define RQ_CLIENT_SIN 6 /* client endpoint (internal) */
+#define RQ_SERVER_NAME 7 /* server host name */
+#define RQ_SERVER_ADDR 8 /* server host address */
+#define RQ_SERVER_SIN 9 /* server endpoint (internal) */
+
+/*
+ * Routines for delayed evaluation of request attributes. Each attribute
+ * type has its own access method. The trivial ones are implemented by
+ * macros. The other ones are wrappers around the transport-specific host
+ * name, address, and client user lookup methods. The request_info and
+ * host_info structures serve as caches for the lookup results.
+ */
extern char *eval_user(); /* client user */
extern char *eval_hostname(); /* printable hostname */
@@ -214,15 +218,15 @@ extern char *eval_hostaddr(); /* printable host address */
extern char *eval_hostinfo(); /* host name or address */
extern char *eval_client(); /* whatever is available */
extern char *eval_server(); /* whatever is available */
-#define eval_daemon(r) ((r)->daemon) /* daemon process name */
-#define eval_pid(r) ((r)->pid) /* process id */
+#define eval_daemon(r) ((r)->daemon) /* daemon process name */
+#define eval_pid(r) ((r)->pid) /* process id */
/* Socket-specific methods, including DNS hostname lookups. */
extern void sock_host(); /* look up endpoint addresses */
extern void sock_hostname(); /* translate address to hostname */
extern void sock_hostaddr(); /* address to printable address */
-#define sock_methods(r) \
+#define sock_methods(r) \
{ (r)->hostname = sock_hostname; (r)->hostaddr = sock_hostaddr; }
/* The System V Transport-Level Interface (TLI) interface. */
@@ -231,11 +235,11 @@ extern void sock_hostaddr(); /* address to printable address */
extern void tli_host(); /* look up endpoint addresses etc. */
#endif
- /*
- * Problem reporting interface. Additional file/line context is reported
- * when available. The jump buffer (tcpd_buf) is not declared here, or
- * everyone would have to include <setjmp.h>.
- */
+/*
+ * Problem reporting interface. Additional file/line context is reported
+ * when available. The jump buffer (tcpd_buf) is not declared here, or
+ * everyone would have to include <setjmp.h>.
+ */
#ifdef __STDC__
extern void tcpd_warn(char *, ...); /* report problem and proceed */
@@ -247,27 +251,27 @@ extern void tcpd_jump();
struct tcpd_context {
char *file; /* current file */
- int line; /* current line */
+ int line; /* current line */
};
extern struct tcpd_context tcpd_context;
- /*
- * While processing access control rules, error conditions are handled by
- * jumping back into the hosts_access() routine. This is cleaner than
- * checking the return value of each and every silly little function. The
- * (-1) returns are here because zero is already taken by longjmp().
- */
+/*
+ * While processing access control rules, error conditions are handled by
+ * jumping back into the hosts_access() routine. This is cleaner than
+ * checking the return value of each and every silly little function. The
+ * (-1) returns are here because zero is already taken by longjmp().
+ */
-#define AC_PERMIT 1 /* permit access */
-#define AC_DENY (-1) /* deny_access */
-#define AC_ERROR AC_DENY /* XXX */
+#define AC_PERMIT 1 /* permit access */
+#define AC_DENY (-1) /* deny_access */
+#define AC_ERROR AC_DENY /* XXX */
- /*
- * In verification mode an option function should just say what it would do,
- * instead of really doing it. An option function that would not return
- * should clear the dry_run flag to inform the caller of this unusual
- * behavior.
- */
+/*
+ * In verification mode an option function should just say what it would do,
+ * instead of really doing it. An option function that would not return
+ * should clear the dry_run flag to inform the caller of this unusual
+ * behavior.
+ */
extern void process_options(); /* execute options */
extern int dry_run; /* verification flag */
@@ -275,36 +279,38 @@ extern int dry_run; /* verification flag */
/* Bug workarounds. */
#ifdef INET_ADDR_BUG /* inet_addr() returns struct */
-#define inet_addr fix_inet_addr
+#define inet_addr fix_inet_addr
extern long fix_inet_addr();
#endif
#ifdef BROKEN_FGETS /* partial reads from sockets */
-#define fgets fix_fgets
+#define fgets fix_fgets
extern char *fix_fgets();
#endif
#ifdef RECVFROM_BUG /* no address family info */
-#define recvfrom fix_recvfrom
+#define recvfrom fix_recvfrom
extern int fix_recvfrom();
#endif
#ifdef GETPEERNAME_BUG /* claims success with UDP */
-#define getpeername fix_getpeername
+#define getpeername fix_getpeername
extern int fix_getpeername();
#endif
#ifdef SOLARIS_24_GETHOSTBYNAME_BUG /* lists addresses as aliases */
-#define gethostbyname fix_gethostbyname
+#define gethostbyname fix_gethostbyname
extern struct hostent *fix_gethostbyname();
#endif
#ifdef USE_STRSEP /* libc calls strtok() */
-#define strtok fix_strtok
+#define strtok fix_strtok
extern char *fix_strtok();
#endif
#ifdef LIBC_CALLS_STRTOK /* libc calls strtok() */
-#define strtok my_strtok
+#define strtok my_strtok
extern char *my_strtok();
#endif
+
+#endif /* _TCPD_H */
diff --git a/usr/src/man/man1/lex.1 b/usr/src/man/man1/lex.1
index f12f22a3f8..b5caa7d5fb 100644
--- a/usr/src/man/man1/lex.1
+++ b/usr/src/man/man1/lex.1
@@ -1,4 +1,5 @@
'\" te
+.\" Copyright (c) 2014 Gary Mills
.\" Copyright (c) 1992, X/Open Company Limited All Rights Reserved Portions Copyright (c) 1997, Sun Microsystems, Inc. All Rights Reserved
.\" Sun Microsystems, Inc. gratefully acknowledges The Open Group for permission to reproduce portions of its copyrighted documentation. Original documentation from The Open Group can be obtained online at
.\" http://www.opengroup.org/bookstore/.
@@ -7,13 +8,13 @@
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
.\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
-.TH LEX 1 "Aug 22, 1997"
+.TH LEX 1 "Jan 1, 2014"
.SH NAME
lex \- generate programs for lexical tasks
.SH SYNOPSIS
.LP
.nf
-\fBlex\fR [\fB-cntv\fR] [\fB-e\fR | \fB-w\fR] [\fB-V\fR \fB-Q\fR [y | n]] [\fIfile\fR]...
+\fBlex\fR [\fB-cntv\fR] [\fB-e\fR | \fB-w\fR] [\fB-V\fR \fB-Q\fR [y | n]] [\fB-Y\fR \fIdirectory\fR]] [\fIfile\fR]...
.fi
.SH DESCRIPTION
@@ -112,6 +113,16 @@ Prints out version information to output file \fBlex.yy.c\fR by using
the default.
.RE
+.sp
+.ne 2
+.na
+\fB\fB\fR\fB-Y\fR \fBdirectory\fR \fR
+.ad
+.RS 12n
+Designates an alternate directory that contains the driver files
+used by \fBlex\fR.
+.RE
+
.SH OPERANDS
.sp
.LP