(* Программа showmsg - выводит данные об очереди сообщений *)
{$mode objfpc}
uses ipc,stdio,sysutils;

procedure mqstat_print(mkey:tkey; msq_id:longint; mstat:pmsqid_ds);
begin
  writeln (#$a'Ключ ', mkey, ', msg_qid ', msq_id, #$a);
  writeln(mstat^.msg_qnum, ' сообщений в очереди'#$a);

  writeln('Последнее сообщение послано процессом ', mstat^.msg_lspid, ' в ',
         ctime(mstat^.msg_stime));
  writeln('Последнее сообщение принято процессом ', mstat^.msg_lrpid, ' в ',
         ctime(mstat^.msg_rtime));
end;


var
  mkey:tkey;
  msq_id:longint;
  msq_status:tmsqid_ds;
begin
  if paramcount<>1 then
  begin
    writeln(stderr, 'Применение: showmsg значение_ключа');
    halt(1);
  end;

  (* Получаем идентификатор очереди сообщений *)
  try
    mkey:=tkey(strtoint(paramstr(1)));
  except
    on e:econverterror do
    begin
      writeln(stderr, 'Нечисловой идентификатор очереди сообщений');
      halt (2);
    end;
  end;
  
  msq_id := msgget(mkey, 0);
  if msq_id = -1 then
  begin
    perror('Ошибка вызова msgget');
    halt(2);
  end;

  (* Получаем информацию о статусе *)
  if not msgctl(msq_id, IPC_STAT, @msq_status) then
  begin
    perror('Ошибка вызова msgctl');
    halt(3);
  end;

  (* Выводим информацию о статусе *)
  mqstat_print(mkey, msq_id, @msq_status);
  halt(0);
end.
