On Thu, 21 Oct 2004, Peter Pentchev wrote:

> Here's a little patch that teaches lock(1) about timeouts specified in
> seconds, hours, or days in addition to the minutes it currently assumes. 
> I could commit this in a week if there are no objections. 

I think the normal convention here (see also shutdown(8), etc) is to have
the unit be specified as part of the time specification rather than as a
separate argument.  I.e., lock -t 5m rather than lock -t 5 -u m.  If we
don't already have it, maybe we need humanize and dehumanize functions for
time as well as disk storage?

Robert N M Watson             FreeBSD Core Team, TrustedBSD Projects
[EMAIL PROTECTED]      Principal Research Scientist, McAfee Research


> 
> G'luck,
> Peter
> 
> Index: src/usr.bin/lock/lock.1
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/lock/lock.1,v
> retrieving revision 1.11
> diff -u -r1.11 lock.1
> --- src/usr.bin/lock/lock.1   2 Jul 2004 22:22:27 -0000       1.11
> +++ src/usr.bin/lock/lock.1   21 Oct 2004 10:39:13 -0000
> @@ -42,6 +42,7 @@
>  .Nm
>  .Op Fl npv
>  .Op Fl t Ar timeout
> +.Op Fl u Ar unit
>  .Sh DESCRIPTION
>  The
>  .Nm
> @@ -63,7 +64,22 @@
>  .It Fl t Ar timeout
>  The time limit (default 15 minutes) is changed to
>  .Ar timeout
> -minutes.
> +minutes, or units specified by the
> +.Fl u
> +option.
> +.It Fl u Ar unit
> +Specify the time measurement unit for the time limit.
> +The
> +.Ar unit
> +argument may be one of
> +.Sq s
> +for seconds,
> +.Sq m
> +for minutes (the default),
> +.Sq h
> +for hours, or
> +.Sq d
> +for days.
>  .It Fl v
>  Disable switching virtual terminals while this terminal is locked.
>  This option is implemented in a way similar to the
> Index: src/usr.bin/lock/lock.c
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/lock/lock.c,v
> retrieving revision 1.18
> diff -u -r1.18 lock.c
> --- src/usr.bin/lock/lock.c   22 Jan 2004 04:24:15 -0000      1.18
> +++ src/usr.bin/lock/lock.c   21 Oct 2004 11:07:36 -0000
> @@ -85,6 +85,20 @@
>  long nexttime;                       /* keep the timeout time */
>  int            no_timeout;                     /* lock terminal forever */
>  int  vtyunlock;                      /* Unlock flag and code. */
> +const char   *timeout_str = "minute";
> +int          timeout_mul = 60;
> +
> +struct timeout_spec {
> +     char             spec;
> +     int              mul;
> +     const char      *str;
> +} timeout_spec[] = {
> +     {'s',     1, "second"},
> +     {'m',    60, "minute"},
> +     {'h',  3600, "hour"},
> +     {'d', 86400, "day"},
> +     {'\0',    0, NULL},
> +};
>  
>  /*ARGSUSED*/
>  int
> @@ -98,20 +112,31 @@
>       int ch, failures, sectimeout, usemine, vtylock;
>       char *ap, *mypw, *ttynam, *tzn;
>       char hostname[MAXHOSTNAMELEN], s[BUFSIZ], s1[BUFSIZ];
> +     struct timeout_spec *ts;
>  
>       openlog("lock", LOG_ODELAY, LOG_AUTH);
>  
>       sectimeout = TIMEOUT;
> +     timeout_mul = 60;
>       mypw = NULL;
>       usemine = 0;
>       no_timeout = 0;
>       vtylock = 0;
> -     while ((ch = getopt(argc, argv, "npt:v")) != -1)
> +     while ((ch = getopt(argc, argv, "npt:u:v")) != -1)
>               switch((char)ch) {
>               case 't':
>                       if ((sectimeout = atoi(optarg)) <= 0)
>                               errx(1, "illegal timeout value");
>                       break;
> +             case 'u':
> +                     for (ts = timeout_spec; ts->spec != '\0'; ts++)
> +                             if (ts->spec == optarg[0])
> +                                     break;
> +                     if (ts->spec == '\0')
> +                             errx(1, "illegal timeout unit specifier");
> +                     timeout_mul = ts->mul;
> +                     timeout_str = ts->str;
> +                     break;
>               case 'p':
>                       usemine = 1;
>                       if (!(pw = getpwuid(getuid())))
> @@ -128,7 +153,7 @@
>               default:
>                       usage();
>               }
> -     timeout.tv_sec = sectimeout * 60;
> +     timeout.tv_sec = sectimeout * timeout_mul;
>  
>       setuid(getuid());               /* discard privs */
>  
> @@ -139,7 +164,7 @@
>               errx(1, "not a terminal?");
>       if (gettimeofday(&timval, (struct timezone *)NULL))
>               err(1, "gettimeofday");
> -     nexttime = timval.tv_sec + (sectimeout * 60);
> +     nexttime = timval.tv_sec + (sectimeout * timeout_mul);
>       timval_sec = timval.tv_sec;
>       timp = localtime(&timval_sec);
>       ap = asctime(timp);
> @@ -200,8 +225,8 @@
>       if (no_timeout)
>               (void)printf(" no timeout.");
>       else
> -             (void)printf(" timeout in %d minute%s.", sectimeout,
> -                 sectimeout != 1 ? "s" : "");
> +             (void)printf(" timeout in %d %s%s.", sectimeout,
> +                 timeout_str, sectimeout != 1 ? "s" : "");
>       if (vtylock)
>               (void)printf(" vty locked.");
>       (void)printf("\ntime now is %.20s%s%s", ap, tzn, ap + 19);
> @@ -243,7 +268,7 @@
>  static void
>  usage(void)
>  {
> -     (void)fprintf(stderr, "usage: lock [-npv] [-t timeout]\n");
> +     (void)fprintf(stderr, "usage: lock [-npv] [-t timeout] [-u unit]\n");
>       exit(1);
>  }
>  
> 
> -- 
> Peter Pentchev        [EMAIL PROTECTED]    [EMAIL PROTECTED]    [EMAIL PROTECTED]
> PGP key:      http://people.FreeBSD.org/~roam/roam.key.asc
> Key fingerprint       FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
> If I were you, who would be reading this sentence?
> 

_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to