[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gm2] Calling ttyname_r() from within gm2
From: |
john o goyo |
Subject: |
[Gm2] Calling ttyname_r() from within gm2 |
Date: |
Wed, 1 Sep 2010 22:10:57 -0400 |
First a bit of history.
It seems that POSIX.1c Draft 6 defined ttyname_r() as returning a
pointer to the name of the tty. The standard POSIX.1c defined
ttyname_r() as returning an integer error code. In Solaris 10, one
obtains the POSIX function by defining the compilation constant
_POSIX_PTHREAD_SEMANTICS, else by default one obtains the draft. In
either case, the buffer length must be at least _POSIX_PATH_MAX for
the function to return anything.
With this in mind, I first created a small test programme.
==[TTYlib.def]===
DEFINITION MODULE FOR "C" TTYlib;
FROM SYSTEM IMPORT ADDRESS;
(*
* char *ttyname_r(int fildes, char *name, int namelen); Draft 6
*)
PROCEDURE ttyname_r(fildes :INTEGER; name :ADDRESS;
namelen :INTEGER) :ADDRESS;
END TTYlib.
==============
==[getname.mod]===
MODULE getname;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM STextIO IMPORT WriteString, WriteLn;
FROM TTYlib IMPORT ttyname_r;
FROM StrLib IMPORT StrCopy;
PROCEDURE TTYname(VAR s :ARRAY OF CHAR) :BOOLEAN;
VAR
addr :ADDRESS;
name :ARRAY[0..127] OF CHAR;
BEGIN
addr := ttyname_r(0, ADR(name), 128);
IF addr = NIL THEN
RETURN FALSE
ELSE
StrCopy(name, s);
RETURN TRUE
END (*IF*);
RETURN FALSE
END TTYname;
VAR
name :ARRAY[0..31] OF CHAR;
BEGIN
IF TTYname(name) THEN
WriteString("TTYname returned: ");
WriteString(name)
ELSE
WriteString("TTYname failed")
END (*IF*);
WriteLn
END getname.
==============
The above works correctly so I tried it within TermFile.mod as
follows. (Could someone please
test the above on a Linux system?)
First, I defined ttyname_r() in gm2/gm2-libs/libc.def as follows.
=================================
(*
char *ttyname_r(int fildes, char *name, int namelen);
Note that namelen must be at least 128.
*)
PROCEDURE ttyname_r(fildes :INTEGER; name :ADDRESS;
namelen :INTEGER) :ADDRESS;
=================================
Next, I changed getname() in gm2/gm2-libs-iso/TermFile.mod as follows.
=================================
PROCEDURE getname (d: DeviceTablePtr;
VAR a: ARRAY OF CHAR) ;
VAR
addr :ADDRESS;
name :ARRAY[0..127] OF CHAR;
BEGIN
addr := libc.ttyname_r(0, ADR(name), 128);
Assign(name, a)
END getname ;
=================================
I am rewarded with exactly the same error as before, namely compiler
error.
john
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gm2] Calling ttyname_r() from within gm2,
john o goyo <=