1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32: #include <sys/cdefs.h>
33: #ifndef lint
34: __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
35: The Regents of the University of California. All rights reserved.\n");
36: #endif
37:
38: #ifndef lint
39: #if 0
40: static char sccsid[] = "@(#)rain.c 8.1 (Berkeley) 5/31/93";
41: #else
42: __RCSID("$NetBSD: rain.c,v 1.17 2004/05/02 21:31:23 christos Exp $");
43: #endif
44: #endif
45:
46:
47:
48:
49:
50:
51: #include <sys/types.h>
52: #include <curses.h>
53: #include <err.h>
54: #include <signal.h>
55: #include <stdio.h>
56: #include <stdlib.h>
57: #include <termios.h>
58: #include <unistd.h>
59: #include <errno.h>
60: #include <limits.h>
61:
62: static volatile sig_atomic_t sig_caught = 0;
63:
64: int main(int, char **);
65: static void onsig(int);
66:
67:
68: int
69: main(int argc, char **argv)
70: {
71: int x, y, j;
72: long cols, lines;
73: unsigned int delay = 0;
74: unsigned long val = 0;
75: int ch;
76: char *ep;
77: int xpos[5], ypos[5];
78:
79:
80: setregid(getgid(), getgid());
81:
82: while ((ch = getopt(argc, argv, "d:")) != -1)
83: switch (ch) {
84: case 'd':
85: val = strtoul(optarg, &ep, 0);
86: if (ep == optarg || *ep)
87: errx(1, "Invalid delay `%s'", optarg);
88: if (errno == ERANGE && val == ULONG_MAX)
89: err(1, "Invalid delay `%s'", optarg);
90: if (val >= 1000)
91: errx(1, "Invalid delay `%s' (1-999)", optarg);
92: delay = (unsigned int)val * 1000;
93: break;
94: default:
95: (void)fprintf(stderr, "Usage: %s [-d delay]\n",
96: getprogname());
97: return 1;
98: }
99:
100: initscr();
101: cols = COLS - 4;
102: lines = LINES - 4;
103:
104: (void)signal(SIGHUP, onsig);
105: (void)signal(SIGINT, onsig);
106: (void)signal(SIGTERM, onsig);
107:
108: curs_set(0);
109: for (j = 4; j >= 0; --j) {
110: xpos[j] = random() % cols + 2;
111: ypos[j] = random() % lines + 2;
112: }
113: for (j = 0;;) {
114: if (sig_caught) {
115: endwin();
116: exit(0);
117: }
118: x = random() % cols + 2;
119: y = random() % lines + 2;
120: mvaddch(y, x, '.');
121: mvaddch(ypos[j], xpos[j], 'o');
122: if (!j--)
123: j = 4;
124: mvaddch(ypos[j], xpos[j], 'O');
125: if (!j--)
126: j = 4;
127: mvaddch(ypos[j] - 1, xpos[j], '-');
128: mvaddstr(ypos[j], xpos[j] - 1, "|.|");
129: mvaddch(ypos[j] + 1, xpos[j], '-');
130: if (!j--)
131: j = 4;
132: mvaddch(ypos[j] - 2, xpos[j], '-');
133: mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\");
134: mvaddstr(ypos[j], xpos[j] - 2, "| O |");
135: mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /");
136: mvaddch(ypos[j] + 2, xpos[j], '-');
137: if (!j--)
138: j = 4;
139: mvaddch(ypos[j] - 2, xpos[j], ' ');
140: mvaddstr(ypos[j] - 1, xpos[j] - 1, " ");
141: mvaddstr(ypos[j], xpos[j] - 2, " ");
142: mvaddstr(ypos[j] + 1, xpos[j] - 1, " ");
143: mvaddch(ypos[j] + 2, xpos[j], ' ');
144: xpos[j] = x;
145: ypos[j] = y;
146: refresh();
147: if (delay)
148: usleep(delay);
149: else
150: tcdrain(STDOUT_FILENO);
151: }
152: }
153:
154: static void
155: onsig(int dummy __attribute__((__unused__)))
156: {
157: sig_caught = 1;
158: }