/* nparted - a frontend to libparted for manipulating disk partitions thinked to dbootstrap Copyright (C) 1998-2000 Mario Teijeiro Otero Esteve Fernández Jaime Villate La Espiral Mario Teijeiro Otero Esteve Fernández < esteve@crosswinds.net > Jaime Villate La Espiral http://www.laespiral.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Consideraciones, es mejor abrir y cerrar todos los disks y devices * que se utilicen , no dejarlos abiertos y que se cierren cuando se * salga. así es más fácil de que no se nos escape algúna estructura * sin cerrar */ #include "nparted.h" char ptrb[256]; size screen_size; size mainwin_size; typedef struct _itemlist itemlist; struct _itemlist{ char dev[20]; /*Nombre del dispositivo al cual pertenece */ int part; /* Número de partición -1 si es un disco*/ }; void done_parted(void); /* crea una lista de componentes con data un itemlist*/ int do_list_disks( newtComponent list ) { PedDevice *dev; PedPartition *part; PedDisk *disk; PedGeometry *geom; PedFileSystemType *fs_type; itemlist *item; char fs_name[40]; int i; long long tam,start,end; dev=NULL; for (i=0;(dev=ped_device_get_next(dev))!=NULL;i++){ tam=(dev->sector_size*dev->length)/(1024*1024); sprintf(ptrb,"%s: %s-%s(%d-%d-%d %dB/sec) %LdMb",dev->path, get_name_device_type(dev->type), dev->model,dev->heads,dev->sectors, dev->cylinders, dev->sector_size, tam); item=(itemlist*)NP_malloc(sizeof(itemlist)); strcpy(item->dev,dev->path); item->dev[8]='\0'; item->part=-1; newtListboxAppendEntry(list,ptrb,item); disk=ped_disk_open(dev); part=NULL; if (disk==NULL){ if(ped_exception_throw(PED_EXCEPTION_FATAL, PED_EXCEPTION_IGNORE+ PED_EXCEPTION_CANCEL, _("Device detected, but I can't open it"))== PED_EXCEPTION_CANCEL){ done_parted(); exit (-1); }else{ continue; } } while((part=ped_disk_next_partition(disk,part))!=NULL){ if(part->num==-1){ if (part->type!=PED_PARTITION_FREESPACE) continue; } geom=&(part->geom); fs_type=ped_file_system_probe(geom); if (fs_type!=NULL && fs_type->name!=NULL) strcpy(fs_name,fs_type->name); else strcpy(fs_name,""); tam=geom->length*dev->sector_size; //bytes tam=tam/(1024*1024); //Mbytes /* Tam-cilindro=head*sectors*sizeofsector*/ start=geom->start/(dev->heads*dev->sectors)+1; end=geom->end/(dev->heads*dev->sectors)+1; sprintf(ptrb," %s%-2d: %-8s Cil:(%Ld-%Ld) %LdMB %-8s", dev->path, part->num, ped_partition_type_get_name(part->type), start,end,tam,fs_name); item=(itemlist*)NP_malloc(sizeof(itemlist)); strcpy(item->dev,dev->path); item->dev[8]='\0'; item->part=part->num; newtListboxAppendEntry(list,ptrb,item); } ped_disk_close(disk); } if (i==0){ /*Ningún disco duro encontrado, Mejor lanzamos una excepción diciendo que se no se encontró ningún disco y que posiblemente sea porque no es superusuario */ ped_exception_throw(PED_EXCEPTION_FATAL, PED_EXCEPTION_OK, _("No device detected, Are you root? ")); // done_parted(); /* Pero esto que coño hace aquí, // deben ser restos de primeras pruebas */ //exit(0); return 0; } return 1; } /* Esta función debe volver cuando hay que salir del programa */ void do_main_window() { newtComponent formMain,list_disks,add,del,edit,copy,quit,ans; struct newtExitStruct toexit; itemlist *item; int key; mainwin_size.width=screen_size.width-5; mainwin_size.height=screen_size.height-5; newtCenteredWindow(mainwin_size.width, mainwin_size.height, _("Select the disk or partition")); formMain=newtForm(NULL,NULL,0); list_disks=newtListbox(1,2,13,NEWT_FLAG_SCROLL); newtListboxSetWidth(list_disks,62); if (!do_list_disks(list_disks)) return; add=newtButton (mainwin_size.width-10,2,_(" Add ")); del=newtButton(mainwin_size.width-10,7,_(" Del ")); edit=newtButton(mainwin_size.width-10,12,_(" Edit")); copy=newtButton(5,16,_(" Copy")); quit=newtButton(mainwin_size.width-30,16,_(" Quit")); newtFormAddComponents(formMain,add,del,edit,copy,quit,list_disks, NULL); ans=NULL; do{ newtFormRun(formMain,&toexit); key=-1; if (toexit.reason==NEWT_EXIT_COMPONENT) ans=toexit.u.co; else key=toexit.u.key; if(ans==edit){ item=(itemlist*)newtListboxGetCurrent(list_disks); if((!item)&& (item->dev[0]!='/')){ ped_exception_throw(PED_EXCEPTION_FATAL, PED_EXCEPTION_OK, _("Intern error have ocurred")); done_parted(); exit(-1); } if (item->part==-1){ ped_exception_throw(PED_EXCEPTION_INFORMATION, PED_EXCEPTION_OK, _("A Hard disk, can't edit, select a partition or add a new partition")); ped_exception_catch(); }else{ edit_partition(ped_device_get(item->dev), item->part); } }else if (ans==add){ item=(itemlist*) newtListboxGetCurrent(list_disks); add_partition(ped_device_get(item->dev)); }else if (ans==del){ item=(itemlist*) newtListboxGetCurrent(list_disks); if(item->part==-1){ ped_exception_throw(PED_EXCEPTION_INFORMATION, PED_EXCEPTION_OK, _("Can't del a hard disk, if you want del, remove it from equipment ;-)")); ped_exception_catch(); }else{ del_partition(ped_device_get(item->dev), item->part); } }else if (ans==copy){ item=(itemlist*) newtListboxGetCurrent(list_disks); if (item->part==-1){ ped_exception_throw(PED_EXCEPTION_INFORMATION, PED_EXCEPTION_OK, _("Please, select the partition to copy,I can't copy the whole disk")); ped_exception_catch(); }else{ copy_partition(ped_device_get(item->dev), item->part); } } /* Después de cada operación volvemos a leer la lista * de particiones, así que tenemos que actualizar list_disks */ if(ans!=quit){ /*FIXME:Borramos todas las entradas, quizas no libere el * data de la lista, pero es poca memoria, quizas hay * que eliminar entrada por entrada*/ newtListboxClear(list_disks) /* Volvemos a leer la lista*/; do_list_disks( list_disks ); } }while(key!=NEWT_KEY_F1&&ans!=quit); newtFormDestroy(formMain); } void init_parted (void ) { ped_exception_set_handler(exception_handler); ped_init(); ped_device_probe_all(); newtInit(); newtCls(); newtDrawRootText(0,0,_("Debian Instalation")); #if defined(VERSION) && defined(PACKAGE) sprintf(ptrb,_("%s v.%s"),PACKAGE,VERSION); #else sprintf(ptrb,_("NParted ")); #endif newtDrawRootText(-25,-1,ptrb); newtGetScreenSize(&screen_size.width, &screen_size.height); } void done_parted(void ) { newtFinished(); ped_done(); } #ifndef BOOTFLOPPIES int main (void) #else int init_nparted(void) #endif { init_parted(); do_main_window(); done_parted(); return 0; }