summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/sdl/sdlptty_unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/sdl/sdlptty_unix.c')
-rw-r--r--src/osd/sdl/sdlptty_unix.c124
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