Gå til innhold

fstab editor review.


Anbefalte innlegg

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 av Eldox
Lenke til kommentar
Videoannonse
Annonse

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...