Fix EINVAL handling and O_DIRECT

This commit is contained in:
Moritz 'Morty' Strübe 2015-05-18 09:29:35 +02:00
parent 60a301ef9f
commit d8639df64b

View file

@ -164,13 +164,21 @@ main(int argc, char **argv)
} }
fprintf(stderr, "connecting to %s (%s)", device, speedname); fprintf(stderr, "connecting to %s (%s)", device, speedname);
#ifdef O_SYNC
#ifndef O_SYNC
#define O_SYNC 0
#endif
#ifdef O_DIRECT
fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_DIRECT | O_SYNC); fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_DIRECT | O_SYNC);
if(fd < 0 && errno == EINVAL){ // O_SYNC not supported (e.g. raspberian) // Some system do not support certain parameters (e.g. raspberian)
fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_DIRECT); // Just do some random testing. Not sure wheter ther is a better way
// of doing this.
if(fd < 0 && errno == EINVAL){
fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_SYNC);
} }
#else #else
fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_SYNC ); fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_SYNC);
#endif #endif
if(fd < 0) { if(fd < 0) {
fprintf(stderr, "\n"); fprintf(stderr, "\n");