pkgobj/src/POSIX/OpSysPosix.m3


Copyright (C) 1994, Digital Equipment Corp.
OpSys.m3 -- OS dependent stuff -- Unix version

UNSAFE MODULE OpSysPosix EXPORTS OpSys;

IMPORT M3toC, Unix, Upwd, Uugid, Ustat;
FROM Ctypes IMPORT int, char_star;

CONST
  rwMask = Ustat.S_GWRITE + Ustat.S_OWRITE;

PROCEDURE Init () =
  BEGIN
        (* set process umask *)
    EVAL Unix.umask(rwMask);
    (*
    sigvecrec.mask := AsyncMask;
    sigvecrec.flags := UxTypes.SVFlags{};
    sigvecrec.handler.h := UxTypes.SignalDefault;
    EVAL Unix.sigvec(SigQuit, sigvecrec, ovec);
    *)
  END Init;

PROCEDURE GetHostName (): TEXT RAISES {Error} =
  VAR
    buffer: ARRAY [0..255] OF CHAR;
    nbytes: int;
  BEGIN
    nbytes := Unix.gethostname(ADR(buffer), BYTESIZE(buffer)-1);
    IF nbytes < 0 THEN RAISE Error; END;
    RETURN M3toC.CopyStoT(ADR(buffer));
  END GetHostName;

PROCEDURE GetUser (): TEXT RAISES {Error} =
  VAR
    uid: int;
    pw: Upwd.struct_passwd_star;
  BEGIN
    uid := Uugid.getuid();
    pw := Upwd.getpwuid(uid);
    IF pw = NIL THEN RAISE Error; END;
    RETURN M3toC.CopyStoT(pw^.pw_name);
  END GetUser;

PROCEDURE SetUser (who: TEXT) RAISES {Error} =
  VAR
    p: char_star;
    uid: int;
    pw: Upwd.struct_passwd_star;
  BEGIN
    p := M3toC.TtoS(who);
    pw := Upwd.getpwnam(p);
    IF pw = NIL THEN RAISE Error; END;
    uid := Uugid.getuid();
    IF uid # pw^.pw_uid THEN
      IF Uugid.setreuid(pw^.pw_uid, -1) < 0 THEN RAISE Error; END;
    END;
    EVAL Uugid.setreuid(-1, pw^.pw_uid);
  END SetUser;

BEGIN
END OpSysPosix.

interface OpSys is in:


interface Unix is in:


interface Upwd is in:


interface Uugid is in:


interface Ustat is in: