VPE@IFASGNV.BITNET (VAX-PRO Express) (08/29/87)
In response to the request for some code to access VMSMAIL.DAT:
here's some Pascal that does the job, though a quick hack. It
works for us.
George Fischer
bitnet: grf@ifasgnv
csnet: fischer@mosquito.cis.ufl.edu
PROGRAM get_mail_info (input,output);
(*
* R W Rourk 4/10/87 original writer.
* G R Fischer 8/01/87 cleaned it up a tad. still a hack...
*
* get_mail_info
*
* is a function aiding the applications programmer in finding a users
* mail information via VMSMAIL.DAT. It returns true if there is
* an entry for the the user USERNAME and there were no file errors. Process
* requires privilege such as BYPASS or READALL to function. If true returned,
* then the almost complete mail directory specification (e.g. [username.mail],
* no disk specification!), the forwarding address (null string if none)
* and the user's personal name (likewise null if none) are returned.
*)
CONST
string_length = 255;
TYPE
string = VARYING [string_length] OF CHAR;
PROCEDURE to_upper (VAR s : string);
VAR
i : INTEGER;
BEGIN
FOR i := 1 TO s.length DO
IF s[i] IN ['a'..'z'] THEN
s[i] := CHR (ORD('A') - ORD('a') + ORD (s[i]))
END;
FUNCTION get_mail_info (username : string;
VAR mail_directory,
forwarding_address,
personal_name : string):BOOLEAN;
(*
* VMSMAIL Record Type -- well, it works, anyway.
*)
TYPE
vmsmail_record = [UNSAFE] RECORD
username : [KEY(0)] PACKED ARRAY [1..31] OF CHAR;
remainder: array [1..256] of char;
END;
VAR
temp : string;
user_field : PACKED ARRAY [1..31] OF CHAR;
mail : FILE OF vmsmail_record;
pos, h, st, g: INTEGER;
field_lengths : array [1..4] OF INTEGER;
file_buffer_undefined : BOOLEAN;
TESTING : [EXTERNAL] BOOLEAN;
BEGIN
to_upper (username);
FOR h := 1 TO MIN (31, username.length) DO
user_field [h] := username [h];
FOR h := 1 + MIN (31, username.length) TO 31 DO
user_field [h] := ' ';
OPEN (mail,
'SYS$SYSTEM:VMSMAIL.DAT',
ACCESS_METHOD := keyed,
ORGANIZATION := indexed,
HISTORY := readonly,
SHARING := readwrite,
ERROR := continue);
resetk (mail, 0, ERROR := CONTINUE);
findk (mail, 0, user_field, ERROR:=CONTINUE);
st := status (mail);
file_buffer_undefined := ufb (mail);
CLOSE (mail, error := continue);
IF ((st <> 0) OR file_buffer_undefined) THEN
BEGIN
IF st <> 0 THEN
BEGIN (* too lazy to do this the right way... *)
IF st = 114 THEN
writeln ('privilege violation reading VMSMAIL.DAT')
ELSE
writeln ('can''t access VMSMAIL.DAT for ''', username, '''',
', RMS error status ', st:1)
END
ELSE
writeln ('''', username, ''' not found in VMSMAIL.DAT',
error := continue);
personal_name := '';
mail_directory := '';
forwarding_address := '';
get_mail_info := FALSE;
END
ELSE
BEGIN
get_mail_info := TRUE;
(*
* extract length codes out of record for forwarding addr, personal
* name, and directory
*)
FOR g := 1 TO 4 DO
field_lengths [g] := ORD (mail^.remainder [33 + g]);
pos := 38;
forwarding_address := '';
IF field_lengths [4] > 0 THEN
FOR g := 1 to MIN (STRING_LENGTH, field_lengths [4]) do
BEGIN
forwarding_address := forwarding_address +
mail^.remainder [pos];
pos := pos + 1;
END;
personal_name := '';
IF field_lengths [3] > 0 THEN
FOR g := 1 to MIN (STRING_LENGTH, field_lengths [3]) do
BEGIN
personal_name := personal_name + mail^.remainder [pos];
pos := pos + 1;
END;
(*
* copy directory -- top level account name is the same as username (on
* our system at least) so start with that.
*)
mail_directory := '[';
h := 1;
WHILE (user_field [h] <> ' ') AND (h <= 30) DO
BEGIN
mail_directory := mail_directory + user_field [h];
h := h + 1;
END; (* have "[username" so far... *)
h := h + 1;
pos := pos + 1;
IF field_lengths [2] > 0 THEN
FOR g:= 2 TO field_lengths [2] DO (* skip the "[" of "[.sub-dir]" *)
BEGIN
mail_directory := mail_directory + mail^.remainder [pos];
pos := pos + 1;
END
ELSE (* no sub-directory - add "]" *)
mail_directory := mail_directory + ']';
END;
END;
LABEL
KNUTH_SEZ;
VAR
name, dir, forw, pers : string;
BEGIN
writeln ('enter a username, ^z to exit');
KNUTH_SEZ:
name := '';
writeln;
write ('enter username: ');
IF NOT EOF THEN
BEGIN
readln (name);
IF get_mail_info (name, dir, forw, pers) THEN
BEGIN
writeln ('mail directory: ''', dir, '''');
writeln ('forwarding address: ''', forw, '''');
writeln ('personal name: ''', pers, '''')
END;
GOTO KNUTH_SEZ
END
END.