if (read_header (fp, h) == 0)
{
- return 0;
+ return READ_EOF;
}
/* length should never be longer than one BUFSIZ */
if (h->len > BUFSIZ)
{
- fprintf (stderr, "h->len too big (%d) limit %d\n", h->len, BUFSIZ);
+ fprintf (stderr, "h->len too big (%ld) limit %ld\n",
+ (long)h->len, (long)BUFSIZ);
exit (-21);
}
if (fread (*buf, 1, h->len, fp) != h->len)
{
fseek (fp, offset, SEEK_SET);
- return 0;
+ return READ_EOF;
}
- return 1;
+ return READ_DATA;
}
int
/*
* Read persistently just like tail -f.
*/
- while (ttyread (fp, h, buf, 1) == 0)
+ while (ttyread (fp, h, buf, 1) == READ_EOF)
{
struct timeval w = { 0, 100000 };
select (0, NULL, NULL, NULL, &w);
endwin ();
printf ("Exiting due to 20 minutes of inactivity.\n");
exit (-23);
- return 0;
}
switch (c)
{
case 'q':
- return 0;
+ return READ_EOF;
break;
case 'm':
if (loggedin)
{
initcurses ();
domailuser (chosen_name);
- return 0;
+ return READ_RESTART;
}
break;
}
}
}
- return 1;
+ return READ_DATA;
}
void
/* do nothing */
}
-void
+int
ttyplay (FILE * fp, double speed, ReadFunc read_func,
WriteFunc write_func, WaitFunc wait_func, off_t offset)
{
int first_time = 1;
+ int r = READ_EOF;
struct timeval prev;
setbuf (stdout, NULL);
char *buf;
Header h;
- if (read_func (fp, &h, &buf, 0) == 0)
+ r = read_func (fp, &h, &buf, 0);
+ if (r != READ_DATA)
{
break;
}
prev = h.tv;
free (buf);
}
+ return r;
}
void
char *buf;
Header h;
- if (ttyread (fp, &h, &buf, 0) == 0)
+ if (ttyread (fp, &h, &buf, 0) != READ_DATA)
{
break;
}
}
void
-ttypeek (FILE * fp, double speed, ReadFunc read_func, WaitFunc wait_func)
+ttypeek (FILE * fp, double speed)
{
- ttyskipall (fp);
- set_seek_offset_clrscr (fp);
- if (seek_offset_clrscr)
- {
- ttyplay (fp, 0, ttyread, ttywrite, ttynowait, seek_offset_clrscr);
- }
- ttyplay (fp, speed, ttypread, ttywrite, ttynowait, 0);
+ int r;
+
+ do
+ {
+ ttyskipall (fp);
+ set_seek_offset_clrscr (fp);
+ if (seek_offset_clrscr)
+ {
+ ttyplay (fp, 0, ttyread, ttywrite, ttynowait, seek_offset_clrscr);
+ }
+ r = ttyplay (fp, speed, ttypread, ttywrite, ttynowait, 0);
+ } while (r == READ_RESTART);
}
double speed = 1.0;
ReadFunc read_func = ttyread;
WaitFunc wait_func = ttywait;
- ProcessFunc process = ttyplayback;
FILE *input = stdin;
struct termios old, new;
seek_offset_clrscr = 0;
- if (mode == 1)
- process = ttypeek;
-
input = efopen (ttyfile, "r");
tcgetattr (0, &old); /* Get current terminal state */
new.c_cc[VTIME] = 0;
tcsetattr (0, TCSANOW, &new); /* Make it current */
- process (input, speed, read_func, wait_func);
+ if (mode == 1)
+ ttypeek (input, speed);
+ else
+ ttyplayback (input, speed, read_func, wait_func);
+
tcsetattr (0, TCSANOW, &old); /* Return terminal state */
return 0;
struct timeval cur, double speed);
typedef int (*ReadFunc) (FILE * fp, Header * h, char **buf, int pread);
typedef void (*WriteFunc) (char *buf, int len);
-typedef void (*ProcessFunc) (FILE * fp, double speed,
- ReadFunc read_func, WaitFunc wait_func);
+
+/* Return values for ReadFunc (and ProcessFunc) */
+#define READ_DATA 0 /* Data */
+#define READ_EOF 1 /* Normal EOF or user aborted */
+#define READ_RESTART 2 /* Screen must be redrawn (after simplemail) */
#endif /* !INCLUDED_ttyplay_h */