Благодаря наличию сборки A2 в виде консольного приложения (все последние сборки в репозитории так собираются по-умолчанию). Для Linux это основной вариант сборки, для Window это через указание линковщику параметра
Код:
--fileFormat=PE32CUI
Мы можем теперь на базе этого сделать простейший CGI-скрипт, например:
Цитата:
System.Show Content-type: text/html~
System.Ln ~
System.Ln ~
System.Show <HTML> ~
System.Ln ~
System.Show <HEAD><TITLE>Hello from A2 OS</TITLE></HEAD> ~
System.Ln ~
System.Show <BODY> ~
System.Ln ~
System.Show <H1>Hello from A2 OS!</H1> ~
System.Ln ~
System.Show <H2>Version information:</H2> ~
System.Version ~
System.Ln ~
System.Show <H2>Some environment variables:</H2> ~
System.Ln ~
env.var HTTP_HOST ~
System.Show <BR> ~
System.Ln ~
env.var HTTP_USER_AGENT ~
System.Show <BR> ~
System.Ln ~
env.var REQUEST_URI ~
System.Show <BR> ~
System.Ln ~
env.var REQUEST_METHOD ~
System.Show <BR> ~
System.Ln ~
env.var SERVER_NAME ~
System.Show <BR> ~
System.Ln ~
env.var SERVER_SOFTWARE ~
System.Show <BR> ~
System.Ln ~
env.var SERVER_SIGNATURE ~
System.Show <BR> ~
System.Ln ~
env.var UNIQUE_ID ~
System.Show <BR> ~
System.Ln ~
System.Show <H2>Loaded modules:</H2> ~
System.ListModules ~
System.Ln ~
System.Show <H2>To be continued... Stay tuned!</H2> ~
System.Show </BODY></HTML> ~
System.Ln ~
System.PowerDown ~
И такой результат можем увидеть в браузере (CGI включён в shtml страничку через SSI):
Вложение:
A2 CGI.png [ 58.12 КБ | Просмотров: 9898 ]
env.var - это вызов простейшего модуля, реализующего процедуру чтения переменной окружения по имени:
Код:
MODULE env; (** AUTHOR "Yaroslav Romanchenko"; PURPOSE "Simple example of reading environment variables on Unix"; *)
IMPORT
SYSTEM, Commands, Unix;
PROCEDURE GetEnvVar(aName: ARRAY OF CHAR; VAR aVar: ARRAY OF CHAR): BOOLEAN;
VAR
addr: ADDRESS;
i, max: LONGINT;
c: CHAR;
bOk: BOOLEAN;
BEGIN
bOk := FALSE;
max := LEN(aVar) - 1;
(* For reading even one char we need at least array of length 2 *)
IF max >= 1 THEN
addr := Unix.getenv(ADDRESSOF(aName));
IF addr = 0 THEN
(* There is no such variable. Result is FALSE *)
aVar[0] := 0X
ELSE
REPEAT
SYSTEM.GET(addr, c);
aVar[i] := c;
INC(addr);
INC(i)
UNTIL (c = 0X) OR (i = max);
aVar[i] := 0X;
bOk := TRUE
END
END;
RETURN bOk
END GetEnvVar;
PROCEDURE var*(context: Commands.Context);
VAR
aName, aVar: ARRAY 256 OF CHAR;
BEGIN
context.arg.SkipWhitespace();
context.arg.Token(aName);
IF (aName[0] # 0X) & GetEnvVar(aName, aVar) THEN
context.out.String(aName);
context.out.Char('=');
context.out.String(aVar);
context.out.Ln
END;
END var;
END env.
Как организовать компиляцию исходника, предназначенного для Linux, из WinAos?
Очень просто. Сначала получаем список зависимостей, например, модуля
Commands, который нам точно нужен:
Цитата:
Release.RequiredModules Linux64 Commands ~
Видим, что в списке зависимостей модуль
Unix, который нам тоже нужен, уже включён. Значит список полон. Пишем команду компиляции под нужную платформу, включая список зависимостей, модуль
Commands.Mod и наш модуль
env.Mod и компилируем:
Цитата:
Compiler.Compile -p=Unix64
AMD64.Builtins.Mod Trace.Mod Linux.Glue.Mod Linux.Unix.Mod Unix.Machine.Mod
Heaps.Mod Modules.Mod Unix.Objects.Mod KernelLog.Mod RealConversions.Mod
Streams.Mod
Commands.Mod
env.Mod
~
Батник, который будет использован на сервере делаем через мощный юниксовый приём
Шебанг:
Цитата:
#!./oberon run env.txt
Полный Шебанг (что-бы вставить команды прямо в этот батник, а не отдельным файлом) пока не получается, интерпретатор команд A2 пытается исполнить первую строчку
#!./oberon и вылетает с ошибкой. Над этим ещё поработаю.