calendar – 터미널 기념일 유틸리티

unix 터미널에는 calendar라는 기념일 알림(reminder service) 유틸리티가 존재한다.

생소한 유틸리티지만 Linux 배포판과 macOS에도 기본 설치되어있다.

Linux에서 실행한 결과는 아래와 같다.

$ calendar 
Nov 11 Kurt Vonnegut, Jr, born in Indianapolis, 1922
Nov 11 Washington becomes the 42nd state, 1889
Nov 11 Angola gains independence from Portugal, 1975
Nov 11 Independence Day in Angola
Nov 11 Independence of Cartagena in Colombia
Nov 11 Remembrance Day in Canada
Nov 11 Republic Day in Maldives
Nov 11 Se firma el Pacto de San José de Flores, 1859
Nov 11 Sint Maarten
Nov 11 Elfde-van-de-elfde
Nov 11 Danilo E. Gondolfo <danilo@FreeBSD.org> born in Lobato, Parana, Brazil, 1987

calendar를 실행하면 /usr/share/calendar 하위의 파일들을 읽어 해당하는 일자의 정보를 출력해준다.

-rw-r--r--  1 root root  1305 Dec 29  2017 calendar.all
-rw-r--r--  1 root root  6444 Dec 29  2017 calendar.argentina
-rw-r--r--  1 root root  2411 May  4  2018 calendar.australia
-rw-r--r--  1 root root  2749 Dec 29  2017 calendar.belgium
-rw-r--r--  1 root root 13634 May  4  2018 calendar.birthday

정보 파일들은 텍스트 형태로 작성되어 있기 때문에 에디터를 사용하여 직접 편집도 가능하며 C 문법과 유사한 include 구문을 사용하여 다른 파일들을 포함시키는 것도 가능하다.

/*

 * International and national calendar files
 *
 * This is the calendar master file.  In the standard setup, it is
 * included by /etc/calendar/default, so you can make any system-wide
 * changes there and they will be kept when you upgrade.  If you want
 * to edit this file, copy it into /etc/calendar/calendar.all and
 * edit it there.
 *
 */

#ifndef _calendar_all_
#define _calendar_all_

#include <calendar.world>
#include <calendar.argentina>
#include <calendar.australia>
#include <calendar.belgium>
#include <calendar.birthday>
#include <calendar.christian>
#include <calendar.computer>

예제로 살펴본 calendar.freebsd 파일은 아래 처럼 시작한다.

/*
 * FreeBSD
 *
 * $FreeBSD: head/usr.bin/calendar/calendars/calendar.freebsd 326253 2017-11-27 14:13:30Z d
ch $
 */

#ifndef _calendar_freebsd_
#define _calendar_freebsd_

01/01Dimitry Andric <dim@FreeBSD.org> born in Utrecht, the Netherlands, 1969
01/01Lev Serebryakov <lev@FreeBSD.org> born in Leningrad, USSR, 1979
01/01Alexander Langer <alex@FreeBSD.org> born in Duesseldorf, Nordrhein-Westfalen, Germa
ny, 1981

macOS에도 calendar 실행 바이너리가 존재하지만 실행하면 아래와 같은 오류가 발생된다.

~ % calendar
calendar: can't open calendar file "calendar": No such file or directory (2)

Ghidra를 사용하여 디컴파일한 코드는 지저분하지만 대략적인 동작을 확인할 수 있었다.

macOS calendar 디컴파일 코드

100005330에는 바이너리 실행시 읽어올 calendar 정보 파일 문자열이 위치한다. calendar 바이너리를 실행하면 현재 경로에서 calendar 파일을 탐색한다. 실패하는 경우 홈 디렉터리 하위의 .calendar과 /usr/share/calendar에서 calendar 파일을 재탐색한다. macOS의 경우에는 /usr/share/calendar 경로에 여러 파일들이 존재하지만 정작 calendar 파일이 없기 때문에 오류가 발생된다.

어느 경로에서든 calendar 파일을 참조할 수 있게하면 프로그램이 정상 실행된다.

~ % ln -s /usr/share/calendar/calendar.all calendar
~ % calendar | head -n 5
11 ���     Veterans' Day
Nov 11     M�rton
11 nov     Tue ton cochon � la saint Martin
    Et invite ton voisin.
11 nov     Si l'hiver va droit son chemin,

원한다면 아래와 같이 새로운 내용을 추가하여 파일을 생성할 수 있다.

~ » cat calendar.kr
/*
 * Korean calendar file
 *
 */

#ifndef _calendar_korean_
#define _calendar_korean_

11/11    빼빼로 데이!
11/11    가래떡 먹는 날.

#endif /* !_calendar_korean_ */

새로 생성된 파일을 참조하도록 링크를 변경하거나 calendar.all 파일에 include 구문을 추가하여 내용을 확인할 수 있다. 아래는 calendar.kr 파일을 직접 참조하도록 링크를 수정한 결과이다.

~ $ rm calendar
~ $ ln -s ./calendar.kr calendar
~ $ calendar
Nov 11     가래떡 먹는 날.
Nov 11     빼빼로 데이!
~ $

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다