testdisk/src/diskacc.c

111 lines
3.4 KiB
C

/*
File: diskacc.c
Copyright (C) 2008 Christophe GRENIER <grenier@cgsecurity.org>
This software 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 the Free Software Foundation, Inc., 51
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "types.h"
#include "common.h"
#include "intrf.h"
#ifdef HAVE_NCURSES
#include "intrfn.h"
#endif
#include "log.h"
#include "diskacc.h"
#define INTER_DISK_X 0
#define INTER_DISK_Y 18
#ifdef HAVE_NCURSES
static int interface_check_disk_access_ncurses(disk_t *disk_car)
{
static const struct MenuItem menuDiskAccess[]=
{
{ 'C', "Continue", "Continue even if write access isn't available"},
{ 'Q', "Quit", "Return to disk selection"},
{ 0,NULL,NULL}
};
unsigned int menu=0;
int car;
int line=9;
aff_copy(stdscr);
wmove(stdscr,4,0);
wprintw(stdscr,"%s\n",disk_car->description_short(disk_car));
wmove(stdscr,6,0);
wprintw(stdscr,"Write access for this media is not available.");
wmove(stdscr,7,0);
wprintw(stdscr,"TestDisk won't be able to modify it.");
#ifdef DJGPP
#elif defined(__CYGWIN__) || defined(__MINGW32__)
wmove(stdscr,line++,0);
wprintw(stdscr,"- You may need to be administrator to have write access.\n");
wmove(stdscr,line++,0);
wprintw(stdscr,"Under Vista, select TestDisk, right-click and choose \"Run as administrator\".\n");
#elif defined HAVE_GETEUID
if(geteuid()!=0)
{
wmove(stdscr,line++,0);
wprintw(stdscr,"- You may need to be root to have write access.\n");
#if defined(__APPLE__)
wmove(stdscr,line++,0);
wprintw(stdscr,"Use the sudo command to launch TestDisk.\n");
#endif
wmove(stdscr,line++,0);
wprintw(stdscr,"- Check the OS permissions for this file or device.\n");
}
#endif
#if defined(__APPLE__)
wmove(stdscr,line++,0);
wprintw(stdscr,"- No partition from this disk must be mounted:\n");
wmove(stdscr,line++,0);
wprintw(stdscr,"Open the Disk Utility (In Finder -> Application -> Utility folder)\n");
wmove(stdscr,line++,0);
wprintw(stdscr,"and press Unmount button for each volume from this disk\n");
#endif
wmove(stdscr,line,0);
wprintw(stdscr,"- This media may be physically write-protected, check the jumpers.\n");
car= wmenuSelect_ext(stdscr, 23, INTER_DISK_Y, INTER_DISK_X, menuDiskAccess, 10,
"CQ", MENU_VERT | MENU_VERT_WARN | MENU_BUTTON, &menu,NULL);
if(car=='c' || car=='C')
return 0;
return 1;
}
#endif
int interface_check_disk_access(disk_t *disk_car, char **current_cmd)
{
if((disk_car->access_mode&TESTDISK_O_RDWR)==TESTDISK_O_RDWR)
return 0;
if(*current_cmd!=NULL)
return 0;
log_warning("Media is opened in read-only.\n");
log_flush();
#ifdef HAVE_NCURSES
return interface_check_disk_access_ncurses(disk_car);
#else
return 0;
#endif
}