Forum

Z PMD 85 Infoserver

:: späť na zoznam tém ::
Správa
Autor  Autor ::  JL
Poslaná  Poslaná ::  24.12.2013 22:44:12
Predmet  Predmet ::  drobná nepříjemnost v utilitce cim
Ahoj

Teď jsem musel projet debuggerem utilitu cim pro práci s diskovými obrazy.

Psalo mi to že nemůže otevřít soubory zadané pomocí 'cesta/*.*'

Myslel jsem že je chyba ve vyhodnocení cesty nebo wildcard, ale to pracuje správně.

Nakonec to bylo tím, že se program pokouší soubor otevřít v režimu "r+b" čili pro čtení a zápis a soubory měly (po rozbalení ze zipu z internetu) nastavený atribut zápisu na nulu.

Nechci se v programu šťourat, ale myslím si že pokud spouštím funkci od které očekávám, že soubory bude jen číst (zápis z adresáře do image), nemělo by mu tohle vadit.

Pokud by se to autorovi chtělo opravovat ...

Uvedené chování platí pro linux, pro win netuším.
 
Správa
Autor  Autor ::  Roman Bórik
Poslaná  Poslaná ::  25.12.2013 10:35:28
Predmet  Predmet ::  Re: drobná nepříjemnost v utilitce cim
Vďaka za info.
Je to tak a platí to aj pre Win. V slabej chvíľke sa na to pozriem a upravím.
 
Správa
Autor  Autor ::  JL
Poslaná  Poslaná ::  25.12.2013 11:49:12
Predmet  Predmet ::  Re: drobná nepříjemnost v utilitce cim
Pokud už budeš u toho, měl bych jedno případné přání.
Pokud není v aktuálním adresáři soubor ini, pak se použije globální.

Nevím jestli to není zase odlišnost od win, ale když mám program někde v cestě a volám jej tam kde je potřeba, hledá se ini v tom aktuálním adresáři místo toho, kde je fyzicky program umístěn.

Zatím jsem si to tam zakódoval na tvrdo.

int ReadConfig(char *ext) {
char buff[1024];
char *p, *q;
FILE *f;
int e, flg, i, j;

if (*ext == 0)
return ERR_IMG_EXT_MISSING;

strcpy(buff, exePath);
strcat(buff, exeName);
strcat(buff, ".ini");
f = fopen(buff, "r");
if (f == NULL) {
f = fopen("/opt/bin/cim.ini", "r");
if (f == NULL)
return ERR_CONF_FILE_MISSING;
}
 
Správa
Autor  Autor ::  Roman Bórik
Poslaná  Poslaná ::  25.12.2013 16:24:00
Predmet  Predmet ::  Re: drobná nepříjemnost v utilitce cim
Som proti tomu, hardkódovať do programu nejakú "absolútnu" cestu.

Teda, pravdupovediac, vôbec netuším, ako je to na Linuxe, keďže ho nepoužívam.

Ja mám vo Win do systémovej premennej PATH pridanú cestu k adresáru s rôznymi utilitami. Tam je aj CIM.exe a aj CIM.ini.
Takže môžem CIM spustiť odkiaľkoľvek bez toho, aby som zadával cestu k utilite. Teda, aktuálny adresár môže byť akýkoľvek.
Po spustení utility je v argv[0] úplná cesta k CIM.exe (aspoň vo Win) a vo funkcii PrepareParams(...) je extrahovaná cesta k CIM.exe do premennej 'exePath', ktorá je potom použitá pre nájdenie CIM.ini.
Ak sú CIM.exe a CIM.ini v jednom adresári, musí byť INI súbor bez problémov nájdený.
 
Správa
Autor  Autor ::  JL
Poslaná  Poslaná ::  25.12.2013 19:30:04
Predmet  Predmet ::  Re: drobná nepříjemnost v utilitce cim
Ano taky jsem proti hardkódování cesty.

Proto jsem taky uvedl že jsem to "zatím zakódoval natvrdo" a to proto, že nevím jak to udělat lépe.

Když mám na linuxu program v adresáři kam ukazuje proměnná PATH, např. /opt/bin/ a spustím jej z jiného adresáře, např /home/ladmanj, tak v argv[0] je bohužel jen cim.
Program potom hledá /home/ladmanj/cim.ini a ten neexistuje.

Nechci se hádat co je správně, tady se to jeví jako pitomost na straně unixu, ale třeba je k tomu jiný rozumný důvod.
Každopádně C vzniklo na unixu, tak v rámci přenositelnosti je spíš chyba, že to nerespektují překladače pro win.

Unixově košer by možná bylo, hledat konfigurák relativně v ../etc/ nebo ../share/, ale opět relativně k umístění programu, a ne pwd odkud se spouští. Nebo v ~/.cim/ což je obvyklý způsob ukládání uživatelských konfigurací.

Každopádně je to asi jeno

Když si udělám bash skript, kterým budu cim spouštět, už si to tam vyřeším a nemusím modifikovat zdroják.
:: späť na zoznam tém ::