Kaptein... Skrevet 7. juli 2009 Del Skrevet 7. juli 2009 (endret) Vet ikke om dette emne passer best under C/C++ eller GNU/Linux, men med tanke på at C/C++ delen av forumet er rimelig døddt tar jeg sjansen her Har sotte noen timer og knotet med et lite program som skal gjøre det lett å edite fstab for de som ikke er så Linux kyndig. Dette er mest et øvings prosjekt , men ser også at minst en av mine venner kunne hatt nytte av det. Om noen har inspill eller ideer hadde det vært supert PS: har ikke fokusert noe på rettskriving... #include <iostream> #include <fstream> #include <cstdio> #include <cstring> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; struct var { char SDA[20]; char SDA_INPUT[20]; char MP[80]; char MP_FSTAB[80]; char MP_N[80]; char FS[10]; char OPTIONS[20]; char DUMP[2]; char PASS[2]; char APPLY [100]; }IO; fstream FSTAB; int main() { //config helper system ("clear"); cout << "Fstab Editor\n\n"; cout << "Select the partition.\n\n"; cout << "If you not sure what to mount, type :? and gparted will be started.\n "; for (int o = 0; o<1;){ cout << "\n\n"; cout << "Select the partition: "; cin >> IO.SDA_INPUT; strcpy (IO.SDA,"/dev/"); strcat (IO.SDA, IO.SDA_INPUT); cout << endl << endl; if (IO.SDA == "?") system ("sudo apt-get install gparted && gksu gparted"); else o = 2; } system ("clear"); cout << "Make a mount point.\n\n"; cout << "List of exsisisting mountpoints:\n"; system ("dir /media"); cout << "\nNew mountpoint name: "; cin >> IO.MP_N; //MK mountpoint strcpy (IO.MP,"cd /media && sudo mkdir "); strcat (IO.MP, IO.MP_N); //output FSTAB strcpy (IO.MP_FSTAB,"/media/"); strcat (IO.MP_FSTAB, IO.MP_N); system ("clear"); cout << "Filesystem in use.\n\n"; cout << "Enter your filesystem: "; cin >>IO.FS; strcpy (IO.OPTIONS,"defaults"); strcpy (IO.DUMP,"0"); strcpy (IO.PASS,"0"); system ("clear"); cout << "Summary.\n\n"; cout << "dev\t\t" << IO.SDA_INPUT << endl; cout << "Mount Point\t/media/" << IO.MP_N << endl; cout << "Filesystem\t" << IO.FS << endl; cout << "Options\t\t" << IO.OPTIONS << endl; cout << "DUMP\t\t" << IO.DUMP << endl; cout << "PASS\t\t" << IO.PASS << endl; cout <<"\n\nPress any key to apply changes: "; cin >> IO.APPLY; //engine system(IO.MP); FSTAB.open ("/etc/fstab", fstream::out | fstream::app); FSTAB << endl << IO.SDA << "\t\t" << IO.MP_FSTAB << "\t\t" << IO.FS << "\t" << IO.OPTIONS << "\t" << IO.DUMP << "\t" << IO.PASS; FSTAB.close(); cout << "\n\nDone!\n"; return 0; } fste_.tar.gz Planlegger også å lage et script som installerer det automatisk. Endret 7. juli 2009 av Eldox Lenke til kommentar
del_diablo Skrevet 7. juli 2009 Del Skrevet 7. juli 2009 Ha autovalg for å mounte i ram, og noe for å auto-oppsette flyttinga og kopiering av der kanskje? Lenke til kommentar
Manuel Skrevet 8. juli 2009 Del Skrevet 8. juli 2009 Et par raske kommentarer: Strukturen som holder fstab-linjen består av statiske char-arrays, men når du fyller disse med data så utfører du ingen lengdekontroll. <<-operatoren på en istream, vil fortsette helt til den støter på whitespace eller linjeskift. Er strengen lengre enn den predefinerte størrelsen så er smasher du stacket og skriver over en omkringliggende variabel. Medlemsfunksjonen getline i istream-klassen kan utføre lengdekontroll, men da *må du sørge for* å tømme det som ligger i istream til neste gang du bruker cin. For å tømme istream, så kan du bruke medlemsfunksjonen ignore. Dette har lite å si i praksis. Det er likevel litt snodig at du veksler mellom å bruke funksjonen (med en ostream som kallende objekt) endl og å sette inn tegnet '\n'. Jeg er ikke en særlig stor "fan" av system(), men programmet er uansett Linux-spesifikt og clear-kommandoen er ikke avhengig av hvilket shell du bruker. Jeg liker likevel dårlig at programmer prøver å installere andre programmer (vha. pakkehåndtereren, men det er jo et designvalg fra din side. Uansett så tror jeg at shellet ikke returnerer etter å ha kjørt gparted, så det er en "fare" for at brukeren ikke skjønner at programmet ditt ikke har hengt seg. Jeg kan ikke se at du utfører noen feilsjekking i forhold til skriving til /etc/fstab. Du kaller på medlemsfunksjonen open (med riktige flagg), men kontrollerer ikke om du kan skrive til filen. En typisk grunn til at du ikke kan skrive til filen, er at prosessen kjører på vegne av en upriviligert bruker. Du kan sjekke om skriving er mulig ved å kjøre funksjonen good() på fstream FSTAB. Hvis FSTAB ikke er "good", så kan du "redde" arbeidet til brukeren ved å skrive ut en informativ feilmelding, den nye fstab-linjen og en oppfordring om å lime inn denne linjen i nevnte fil. Du kan sikkert gjøre dette veldig avansert ved å bruke linux-spesifikke kall for å sjekk eksistens av partisjon, gjøre utskriften til terminalen mer fancy (noe som krever at du enten kaster bort mye tid eller setter deg inn i et egnet bibliotek, som f.eks Ncurses). Du får selv vurdere hvor mye du gidder å gjøre ut av det. Uansett så er det god trening Lenke til kommentar
Kaptein... Skrevet 11. juli 2009 Forfatter Del Skrevet 11. juli 2009 Takker for konstruktiv og nyttig respons Manuel. Ja jeg ser helt klart at feilsjekking er noe jeg burde inkludere. Etter som jeg for tiden holder på å lære meg qt tenkte jeg å skrive programmet på nytt med et gui, så da kommer responsen din godt med Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå