diff options
author | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2001-08-12 18:00:00 +0200 |
---|---|---|
committer | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2001-08-12 18:00:00 +0200 |
commit | efea0f64d08052b0189d962101e1a3634d4adfc8 (patch) | |
tree | a3feff7ccf6874da549b25ea3b671d15a65d0e3d /tools.c | |
parent | f1d1c9849c8e27cccb46cf9c0d0ccb59da3f91f9 (diff) | |
download | vdr-patch-lnbsharing-efea0f64d08052b0189d962101e1a3634d4adfc8.tar.gz vdr-patch-lnbsharing-efea0f64d08052b0189d962101e1a3634d4adfc8.tar.bz2 |
Version 0.91vdr-0.91
- Fixed displaying colored button texts that are too long.
- Suppressing replay progress display when replaying a DVD.
- Updated channels.conf.cable (thanks to Uwe Scheffler).
- Updated French OSD texts (thanks to Jean-Claude Repetto).
- Improved AC3 decoding when replaying DVDs (thanks to Matjaz Thaler).
- Fixed handling DVB card indexes when using only one card in a multi-card
system.
- Changed the 'Eject DVD' button text to a simple 'Eject' (the German text
was too long...).
- Made the font file generation more stable (thanks to Artur Skawina).
- Changed the default value for the "DiSEqC" setup parameter to "off".
- The new command line option '-E' can be used to define where the EPG data
shall be written to. This is especially useful if VDR runs in a system
that turns off the video disk when it is not used, and therefore needs
to write the EPG file to a ramdisk (or turn off writing it alltogether).
See 'vdr --help' for details.
- Making sure the disk is up and running before starting recording (this
is important for systems that turn off the video disk when it is not used).
- Added the "Jump" function in replay mode (thanks to Stefan Huelswitt).
See the description of the "Red" key in MANUAL under "Replay Control" for
details.
- Fixed displaying editing marks when toggling a mark in "pause" mode.
- If there is no free DVB device to record, the log message will now be given
only once.
- Made I/O more robust by handling EINTR (thanks to Werner Fink).
Diffstat (limited to 'tools.c')
-rw-r--r-- | tools.c | 61 |
1 files changed, 59 insertions, 2 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 1.35 2001/08/05 12:38:06 kls Exp $ + * $Id: tools.c 1.39 2001/08/12 15:12:54 kls Exp $ */ #define _GNU_SOURCE @@ -15,6 +15,7 @@ #if defined(DEBUG_OSD) #include <ncurses.h> #endif +#include <stdlib.h> #include <sys/time.h> #include <unistd.h> @@ -22,9 +23,33 @@ int SysLogLevel = 3; +ssize_t safe_read(int filedes, void *buffer, size_t size) +{ + for (;;) { + ssize_t p = read(filedes, buffer, size); + if (p < 0 && errno == EINTR) { + dsyslog(LOG_INFO, "EINTR while reading from file handle %d - retrying", filedes); + continue; + } + return p; + } +} + +ssize_t safe_write(int filedes, const void *buffer, size_t size) +{ + for (;;) { + ssize_t p = write(filedes, buffer, size); + if (p < 0 && errno == EINTR) { + dsyslog(LOG_INFO, "EINTR while writing to file handle %d - retrying", filedes); + continue; + } + return p; + } +} + void writechar(int filedes, char c) { - write(filedes, &c, sizeof(c)); + safe_write(filedes, &c, sizeof(c)); } char *readline(FILE *f) @@ -312,6 +337,38 @@ char *ReadLink(const char *FileName) return TargetName ? strdup(TargetName) : NULL; } +bool SpinUpDisk(const char *FileName) +{ + static char *buf = NULL; + for (int n = 0; n < 10; n++) { + delete buf; + if (DirectoryOk(FileName)) + asprintf(&buf, "%s/vdr-%06d", *FileName ? FileName : ".", n); + else + asprintf(&buf, "%s.vdr-%06d", FileName, n); + if (access(buf, F_OK) != 0) { // the file does not exist + timeval tp1, tp2; + gettimeofday(&tp1, NULL); + int f = open(buf, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + // O_SYNC doesn't work on all file systems + if (f >= 0) { + close(f); + system("sync"); + remove(buf); + gettimeofday(&tp2, NULL); + double seconds = (((long long)tp2.tv_sec * 1000000 + tp2.tv_usec) - ((long long)tp1.tv_sec * 1000000 + tp1.tv_usec)) / 1000000.0; + if (seconds > 0.5) + dsyslog(LOG_INFO, "SpinUpDisk took %.2f seconds\n", seconds); + return true; + } + else + LOG_ERROR_STR(buf); + } + } + esyslog(LOG_ERR, "ERROR: SpinUpDisk failed"); + return false; +} + // --- cFile ----------------------------------------------------------------- bool cFile::files[FD_SETSIZE] = { false }; |