diff options
Diffstat (limited to 'src/osd/sdl/sdlptty_unix.c')
-rw-r--r-- | src/osd/sdl/sdlptty_unix.c | 124 |
1 files changed, 77 insertions, 47 deletions
diff --git a/src/osd/sdl/sdlptty_unix.c b/src/osd/sdl/sdlptty_unix.c index 804b0ddae3e..6b618314d72 100644 --- a/src/osd/sdl/sdlptty_unix.c +++ b/src/osd/sdl/sdlptty_unix.c @@ -2,7 +2,7 @@ // copyright-holders:Olivier Galibert, R. Belmont //============================================================ // -// sdlptty_unix.c - SDL psuedo tty access functions +// sdlptty_unix.c - SDL pseudo tty access functions // // SDLMAME by Olivier Galibert and R. Belmont // @@ -28,6 +28,7 @@ #elif defined(SDLMAME_HAIKU) # include <bsd/pty.h> #endif +#include <stdlib.h> #include "sdlfile.h" @@ -39,68 +40,91 @@ const char *sdlfile_ptty_identifier = "/dev/pts"; file_error sdl_open_ptty(const char *path, UINT32 openflags, osd_file **file, UINT64 *filesize) { - int master; - int aslave; - char name[100]; - - if (openpty(&master, &aslave, name, NULL, NULL) >= 0) - { - printf("Slave of device %s is %s\n", path, name ); - fcntl(master, F_SETFL, O_NONBLOCK); - (*file)->handle = master; - *filesize = 0; - } - else - { - return FILERR_ACCESS_DENIED; - } - - return FILERR_NONE; + int master; + int aslave; + struct termios tios; + int oldflags; + + memset(&tios , 0 , sizeof(tios)); + cfmakeraw(&tios); + + if (openpty(&master, &aslave, NULL, &tios, NULL) >= 0) + { + oldflags = fcntl(master, F_GETFL, 0); + if (oldflags == -1) { + close(master); + return FILERR_FAILURE; + } + + fcntl(master, F_SETFL, oldflags | O_NONBLOCK); + close(aslave); + (*file)->handle = master; + *filesize = 0; + } + else + { + return FILERR_ACCESS_DENIED; + } + + return FILERR_NONE; } file_error sdl_read_ptty(osd_file *file, void *buffer, UINT64 offset, UINT32 count, UINT32 *actual) { - ssize_t result; + ssize_t result; - result = read(file->handle, buffer, count); + result = read(file->handle, buffer, count); - if (result < 0) - { - return error_to_file_error(errno); - } + if (result < 0) + { + return error_to_file_error(errno); + } - if (actual != NULL ) - { - *actual = result; - } + if (actual != NULL ) + { + *actual = result; + } - return FILERR_NONE; + return FILERR_NONE; } file_error sdl_write_ptty(osd_file *file, const void *buffer, UINT64 offset, UINT32 count, UINT32 *actual) { - ssize_t result; - result = write(file->handle, buffer, count); + ssize_t result; + result = write(file->handle, buffer, count); - if (result < 0) - { - return error_to_file_error(errno); - } + if (result < 0) + { + return error_to_file_error(errno); + } - if (actual != NULL ) - { - *actual = result; - } + if (actual != NULL ) + { + *actual = result; + } - return FILERR_NONE; + return FILERR_NONE; } file_error sdl_close_ptty(osd_file *file) { - close(file->handle); - osd_free(file); + close(file->handle); + osd_free(file); - return FILERR_NONE; + return FILERR_NONE; +} + +file_error sdl_slave_name_ptty(osd_file *file , char *name , size_t name_len) +{ + const char *slave_name = ptsname(file->handle); + + if (slave_name == NULL || strlen(slave_name) >= name_len) { + return FILERR_INVALID_ACCESS; + } + + strcpy(name , slave_name); + + return FILERR_NONE; } #else @@ -110,21 +134,27 @@ const char *sdlfile_ptty_identifier = ""; file_error sdl_open_ptty(const char *path, UINT32 openflags, osd_file **file, UINT64 *filesize) { - return FILERR_ACCESS_DENIED; + return FILERR_ACCESS_DENIED; } file_error sdl_read_ptty(osd_file *file, void *buffer, UINT64 offset, UINT32 count, UINT32 *actual) { - return FILERR_ACCESS_DENIED; + return FILERR_ACCESS_DENIED; } file_error sdl_write_ptty(osd_file *file, const void *buffer, UINT64 offset, UINT32 count, UINT32 *actual) { - return FILERR_ACCESS_DENIED; + return FILERR_ACCESS_DENIED; } file_error sdl_close_ptty(osd_file *file) { - return FILERR_ACCESS_DENIED; + return FILERR_ACCESS_DENIED; } + +file_error sdl_slave_name_ptty(osd_file *file) +{ + return FILERR_ACCESS_DENIED; +} + #endif |