Michael Van Canneyt wrote:


On Thu, 5 Dec 2013, Dennis Poon wrote:

I tried to read the mac address in the captioned file path.
In terminal, I can simply 'cat' and display the mac address.

In FPC, when I tried to use TFileStream to read it,

FS := TFileStream.Create('/sys/class/net/eth1/address', fmOpenRead+fmShareDenyWrite);

it raised "stream read error"

home: >./t
00:1f:d0:a2:df:c4

home: >cat t.pp
{$mode objfpc}
{$H+}
uses sysutils, classes;

Var
  S : String;

begin
  SetLength(S,100);
with TFileStream.Create('/sys/class/net/eth1/address', fmOpenRead+fmShareDenyWrite) do
    try
      SetLength(S,Read(S[1],100));
      Writeln(S);
    finally
      free;
    end;
end.


Works fine here. Permission problem on your machine maybe ?

Michael.


So, strange.
I tried again and found that it works if I uses BaseUnix and then call fpRead but not with TFileStream.Read

My interface uses are:

uses
  Classes, SysUtils, DB, iniFiles;

My implementation uses:
uses md5, uStrUtils
  {$IFDEF UNIX}
     ,BaseUnix
  {$ENDIF}

  ;


function GetUnixMac(TheDevice : String) : String;
const
  UnixPath = '/sys/class/net/%s/address';
  var s,
      FileName : String;
      FS : TFilestream;

    Var fHandle : cint;
        len : longint;
        buffer :string[255];
  begin
    result := '';
    FileName := Format(UnixPath,[TheDevice]);
    if FileExists(FileName) then begin
//this fpread will work and give me mac address
        fHandle:=fpOpen(FileName,O_RdOnly);
        If fHandle > 0 then
          try
            len := fpRead (fHandle,buffer[1],255);
            setlength(Buffer,len);

            Log(TheDevice+' Mac:'+buffer);
            result := StringReplace(buffer,#10,';',[rfReplaceAll]);
          finally
            fpClose(fHandle);
          end;

{//strange, the following will raise stream read error
        FS := TFilestream.Create(FileName, fmOpenRead+fmShareDenyWrite );
        try
          if FS.Size > 0 then begin
            SetLength(s, FS.Size);
            FS.ReadBuffer(s[1], FS.Size);
            Log(TheDevice+' Mac:'+S);
            result := StringReplace(s,#10,';',[rfReplaceAll]);
          end;
        finally
          FreeAndNil(FS);
        end;
}
    end;
  end;

Why your machine works but my does not and has to rely on fpRead instead of TFileStream???

Dennis



_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to