gm2
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]