Eagle ULP - hoe weet ik welk OS ik heb?

fatbeard

Honourable Member

De titel zegt het al: hoe weet ik binnen een ULP op welk OS ik draai?
Er zijn namelijk wel enkele commando's die een OS-afhankelijke benadering behoeven, met name system() en de diverse file-afhandelingen...

Ik verwachtte een functie of een constante die dat zou vertellen maar heb niets kunnen vinden in de help of het toepasselijke ULP manual (v5.12)...

Verder speurend kom ik in het ULP-handboek versie 9.01 een builtin constant OS-SIGNATURE tegen, die helaas niet is versie 5.12 zit...

Wie weet er een truuk om in versie 5.12 erachter te komen op welk OS de ULP draait?

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.
Arco

Special Member

OS versie kun je toch in Windows/Linux zelf zien?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
fatbeard

Honourable Member

Ik moet het weten binnen de ULP...

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Ken je deze pagina http://analognotes.com/eagle/helpfiles/eagle-5.12.html

Ik weet niet of je de temp directory kunt gebruiken in Eagle. Mogelijk moet je het complete path invullen.
Je zou dit eens kunnen proberen:

code:

system("cmd.exe /c wmic os get version>%temp%\version.txt");
string lines[];
int nLines = fileread(lines, "%temp%\version.txt");

EDIT:
of

code:

system("cmd.exe /c ver > %temp%\version.txt");

nog wel even wat goochelen met de nummers die in de lines array staan:

code:

"10.0" = Windows 10
"6.3" = Windows 8.1
"6.2" = Windows 8.
"6.1" = Windows 7.
"6.0" = Windows Vista.
reading can seriously damage your ignorance
fatbeard

Honourable Member

Prachtig, maar dat werkt dus niet onder MAC OS of Linux...

Ik kan prima leven zonder MAC, maar het moet óók werken onder Linux...

[Bericht gewijzigd door fatbeard op dinsdag 23 november 2021 19:53:17 (39%)

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Je kunt toch meerdere system commando's uitvoeren en kijken waar ergens een bestand terecht is gekomen.

code:

system("uname -s -r>/tmp/version.txt");
system("cmd.exe /c ver>%temp%\version.txt");

Eentje zal de output geven die je wilt zien
Ik dacht dat OSX ook op een linux kernel draait. Mogelijk werkt "uname" dan ook.

reading can seriously damage your ignorance
fripster

Golden Member

OSX draait op een BSD kernel...

Maareh... Als je nou eens kijkt of de genoemde tests (de uname en de cmd) wel een goed resultaat terugkrijgen van "system" kun je bepalen binnen welk OS je grofweg zit. (Ik heb het over de return value van "system" zelf dus (ik ga er even van uit dat dat hier bestaat))

Hierna kun je dan idd de info die je krijgt parsen om te zien welke versie dan precies...

Just my two cents'

Groet,

Fripster

Edit: Zie dit:

Eens een wirehead,altijd een wirehead.... gopher://fripster.ydns.eu
EricP

mét CE

Met die 'system' function, kun je gewoon eens een commando proberen wat uniek voor het OS is. Dan zie je aan de exit code wel of het wat werd of niet.

Beetje lomp wellicht: kijk naar een path van het ene of andere file. Forward slashes: linux. Backslashed: M$.

Arco

Special Member

Of case sensitivity. Windows vindt beide cases goed, Linux niet...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

code:

int nLines;
string lines[];
string array[];
if( 0 == system( "cmd.exe /c ver>%TEMP%\\OS_version.txt" ) ) {
    dlgMessageBox( filedir( "%TEMP%\\OS_version.txt" ) );
    nLines = fileread( lines, "%TEMP%\\OS_version.txt" );
    if( nLines > 0 ) {
        dlgMessageBox(lines[1]);
    }
} else if( 0 == system( "uname -s -r>/tmp/OS_version.txt" ) ) {
    nLines = fileread( lines, "/tmp/OS_version.txt" );
    if( nLines > 0 ) {
        dlgMessageBox(lines[0]);
    }
} else {
    dlgMessageBox( "error" );
}

Dit werkt in Linux.
In Windows wordt het bestand in de temp directory wel gemaakt maar openen gaat fout omdat eagle de variabele %temp% niet herkent.
Ik zie zo geen oplossing daarvoor. Windows kent volgens mij geen statische directory naam waar iedereen in kan schrijven.

reading can seriously damage your ignorance
PE9SMS

Special Member

This signature is intentionally left blank.

Dan zou dat toch hier ook moeten gebeuren

code:

"cmd.exe /c ver>%TEMP%\\OS_version.txt"

Dat gaat wel goed

reading can seriously damage your ignorance
Schimanski

Golden Member

In https://community.element14.com/products/eagle/f/eagle-user-support-en… staat een oplossing, wel 10 jaar oud. Ik weet niet of het voor jouw situatie ook bruikbaar en/of betrouwbaar is (scroll naar een na laatste topic).

code:


enum {osWindows,osLinux,osMacintosh};
string OSNames[]={"Windows","Linux","Macintosh"};

int GetOSType() {

   int Nr;
   string Files[],Text;

   if ((strsub(argv[0],0,1)=="/") && (strsub(argv[0],0,2)!="//")) {
     
     Nr=fileglob(Files,"/proc/version");
     if (Nr==0)
       return osMacintosh;

     Nr=fileread(Text,"/proc/version");
     if (Nr<1)
       return osMacintosh;

     Text=strupr(Text);
     if (strstr(Text,"LINUX")<0)
       return osMacintosh;

     return osLinux;

   } else
     return osWindows;
}
What, me worry? // Radiozendamateur - PA2HGJ // Stuff is the junk you keep -- Junk is the stuff you throw away // Tinkeo Ergo Sum

Totdat macos voor Linux-compatiblity een proc/version file gaat aanbieden... :-)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
EricP

mét CE

Als het linux compatible wordt... Dan hoef je er dus ook geen aparte trucen meer voor uit te halen. Toch?

Nouja... Soms wordt het "meer" compatible, dus dan is 1 onderdeeltje geimplementeerd, maar nog niet alles.

Maar goed, Fatbeard kan dus gewoon op /proc/version controleren. Als dat bestand bestaat zal het wel linux zijn anders windows.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
fatbeard

Honourable Member

Dank allen voor het meedenken en -zoeken. _/-\o_

De truuk die @Schimanski opgeduikeld heeft is verreweg de elegantste, deze ga ik implementeren.
Wat @hennep voorstelde zal ook werken, maar is wat te grofstoffelijk naar mijn smaak.

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Ik had jouw startpost niet goed gelezen, dacht dat je ook het versienummer wilde weten.
Ik vind juist de methode die Schimanski aandraagt minder elegant. Als er geen /proc/version van linux/osx is gevonden, dan zal het wel windows zijn. Ik zou dan nog steeds controleren of er een C:\windows bestaat. De windows directory zit er ook al vanaf het begin in.

reading can seriously damage your ignorance
fatbeard

Honourable Member

Dat is nergens voor nodig: argv[0] is de volledige naam van de gestarte ULP, inclusief een eventuele drive letter. En Linux gebruikt geen driveletters (de MAC ook niet, dacht ik zo)...

En in mijn gewoonlijke compacte stijl wordt het dan

code:

string getOStype()
{ string Files[],Text;
  if((strsub(argv[0],0,1)=="/") && (strsub(argv[0],0,2)!="//"))
  { if(!fileglob(Files,"/proc/version")) return "Macintosh";
    if(fileread(Text,"/proc/version")<1) return "Macintosh";
    if(strstr(strupr(Text),"LINUX")<0) return "Macintosh";
    return "Linux";
  }
  return "Windows";
}

[Bericht gewijzigd door fatbeard op woensdag 24 november 2021 10:32:13 (52%)

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.