Index | Thread | Search

From:
Johannes Thyssen Tishman <jtt@openbsd.org>
Subject:
Re: cal's -y flag usage
To:
tech@openbsd.org
Date:
Fri, 26 Jun 2026 12:40:23 +0000

Download raw body.

Thread
2026-06-25T21:47:47+0200 Jeremie Courreges-Anglas <jca@wxcvbn.org>:
> On Thu, Jun 25, 2026 at 09:13:44AM +0000, Johannes Thyssen Tishman wrote:
> > While playing with cal I noticed that using the -y flag along with a
> > single non-numerical argument or with two arguments would essentially
> > cause the option to be ignored:
> > 
> > $ cal -y jun
> > $ cal -y jun 2026
> > $ cal -y 06 2026
> > 
> > All three commands output the calendar for June 2026 instead of the
> > entire year. Before I try to patch this, is this the desired/intended
> > behaviour?
> 
> IMO -y should be ignored when a year is later specified on the command
> line (current behavior), and should conflict with specifying a month.

So, like this (diff below)?

$ cal -y          # calendar for year 2026
$ cal -y 2000     # calendar for year 2000
$ cal -y jul      # error
$ cal -y jul 2000 # error

> > In case a change is desired, would it make sense to split the SYNOPSIS
> > in the man page into two lines? E.g.:
> > 
> > cal [-jmw] [month] [year]
> > cal [-jmwy] [year]
> 
> It doesn't really make sense to specify [year] when you specify -y.
> I'm not sure the synopsis needs to be amended.

I agree, I forgot that cal yyyy would print the year calendar already.

Index: usr.bin/cal/cal.1
===================================================================
RCS file: /cvs/src/usr.bin/cal/cal.1,v
diff -u -p -r1.33 cal.1
--- usr.bin/cal/cal.1	31 Jul 2024 17:09:23 -0000	1.33
+++ usr.bin/cal/cal.1	26 Jun 2026 12:35:41 -0000
@@ -72,6 +72,10 @@ and
 are mutually exclusive.
 .It Fl y
 Display a calendar for the current year.
+This option is ignored if
+.Ar year
+is specified and conflicts with specifying a
+.Ar month .
 .El
 .Pp
 A single numerical parameter specifies the
Index: usr.bin/cal/cal.c
===================================================================
RCS file: /cvs/src/usr.bin/cal/cal.c,v
diff -u -p -r1.33 cal.c
--- usr.bin/cal/cal.c	26 Jun 2026 12:34:45 -0000	1.33
+++ usr.bin/cal/cal.c	26 Jun 2026 12:35:41 -0000
@@ -193,10 +193,14 @@ main(int argc, char *argv[])
 	month = 0;
 	switch(argc) {
 	case 2:
+		if (yflag)
+			errx(1, "illegal year value: use 1-9999");
 		month = parsemonth(*argv++);
 		/* FALLTHROUGH */
 	case 1:
 		if (argc == 1 && !isdigit((unsigned char)*argv[0])) {
+			if (yflag)
+				errx(1, "illegal year value: use 1-9999");
 			month = parsemonth(*argv);
 			(void)time(&now);
 			local_time = localtime(&now);