/* * This is a special case code to check for an MDRAID device. We do * this special since it requires checking for a superblock at the end * of the device. */ static int check_mdraid(int fd, unsigned char *ret_uuid) { struct mdp_superblock_s *md; blkid_loff_t offset; char buf[4096]; if (fd < 0) return -BLKID_ERR_PARAM; offset = (blkid_get_dev_size(fd) & ~((blkid_loff_t)65535)) - 65536; if (blkid_llseek(fd, offset, 0) < 0 || read(fd, buf, 4096) != 4096) return -BLKID_ERR_IO; /* Check for magic number */ if (memcmp("\251+N\374", buf, 4) && memcmp("\374N+\251", buf, 4)) return -BLKID_ERR_PARAM; if (!ret_uuid) return 0; *ret_uuid = 0; /* The MD UUID is not contiguous in the superblock, make it so */ md = (struct mdp_superblock_s *)buf; if (md->set_uuid0 || md->set_uuid1 || md->set_uuid2 || md->set_uuid3) { memcpy(ret_uuid, &md->set_uuid0, 4); memcpy(ret_uuid + 4, &md->set_uuid1, 12); } return 0; }
static void get_block_device_size(struct device_info *info, int fd) { blkid_loff_t blkid_size; blkid_size = blkid_get_dev_size(fd); if (blkid_size) info->size = blkid_size; }
/* * sizeof_dev: Returns size of device in bytes */ static loff_t sizeof_dev(int fd) { loff_t numbytes; #ifdef HAVE_BLKID_BLKID_H numbytes = blkid_get_dev_size(fd); if (numbytes <= 0) { fprintf(stderr, "%s: blkid_get_dev_size(%s) failed", progname, devname); return 1; } goto out; #else # if defined BLKGETSIZE64 /* in sys/mount.h */ if (ioctl(fd, BLKGETSIZE64, &numbytes) >= 0) goto out; # endif # if defined BLKGETSIZE /* in sys/mount.h */ { unsigned long sectors; if (ioctl(fd, BLKGETSIZE, §ors) >= 0) { numbytes = (loff_t)sectors << 9; goto out; } } # endif { struct stat statbuf; if (fstat(fd, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) { numbytes = statbuf.st_size; goto out; } } fprintf(stderr, "%s: unable to determine size of %s\n", progname, devname); return 0; #endif out: if (verbose) printf("%s: %s is %llu bytes (%g GB) in size\n", progname, devname, (unsigned long long)numbytes, (double)numbytes / ONE_GB); return numbytes; }
int main(int argc, char **argv) { blkid_loff_t bytes; int fd; if (argc < 2) { fprintf(stderr, "Usage: %s device\n" "Determine the size of a device\n", argv[0]); return 1; } if ((fd = open(argv[1], O_RDONLY)) < 0) perror(argv[0]); bytes = blkid_get_dev_size(fd); printf("Device %s has %Ld 1k blocks.\n", argv[1], bytes >> 10); return 0; }
/* * Purpose of this function is to open a device and write random data to it as a way of hiding information on the disk. * * The above is accomplished by opening a plain mapper against the device and then write to the device through the mapper * */ int zuluCryptEXEWriteDeviceWithJunk( const struct_opts * opts,const char * mapping_name,uid_t uid ) { stringList_t stl = StringListInit() ; string_t * mapper = StringListAssign( stl ) ; string_t * confirm = StringListAssign( stl ); double size ; double size_written ; const char * device = opts->device ; char buffer[ SIZE ] ; int ratio ; int prev_ratio ; int k ; struct sigaction sigac; memset( &sigac,'\0',sizeof( struct sigaction ) ) ; sigac.sa_handler = &sigTERMhandler ; sigaction( SIGINT,&sigac,NULL ) ; sigaction( SIGTERM,&sigac,NULL ) ; sigaction( SIGHUP,&sigac,NULL ) ; __exit_as_requested = 0 ; if( ( k = open_plain_as_me_1( opts,mapping_name,uid,0 ) ) != 0 ){ return k ; } *mapper = zuluCryptCreateMapperName( device,mapping_name,uid,ZULUCRYPTshortMapperPath ) ; StringMultiplePrepend( *mapper,"/",crypt_get_dir(),NULL ) ; if( opts->ask_confirmation ){ printf( gettext( "\nWARNING, device \"%s\" will be overwritten with random data destroying all present data.\n" ),device ) ; printf( gettext( "Are you sure you want to proceed? Type \"YES\" and press enter if you are sure: " ) ) ; *confirm = StringGetFromTerminal_1( 3 ) ; if( *confirm == StringVoid ){ return zuluExit( stl,17 ) ; }else{ k = StringEqual( *confirm,gettext( "YES" ) ) ; if( k == 0 ){ if( zuluCryptSecurityGainElevatedPrivileges() ){ zuluCryptCloseMapper( StringContent( *mapper ) ) ; zuluCryptSecurityDropElevatedPrivileges() ; } return zuluExit( stl,5 ) ; } } } k = open( StringContent( *mapper ),O_WRONLY ) ; size = ( double ) blkid_get_dev_size( k ) ; memset( buffer,0,SIZE ) ; size_written = 0 ; prev_ratio = -1 ; while( write( k,buffer,SIZE ) > 0 ){ if( __exit_as_requested == 1 ){ break ; } size_written += SIZE ; ratio = ( int ) ( ( size_written / size ) * 100 ) ; if( ratio > prev_ratio ){ printf( "\r%s %d%%",gettext( "percentage complete: " ),ratio ) ; fflush( stdout ); prev_ratio = ratio ; } } close( k ) ; if( zuluCryptSecurityGainElevatedPrivileges() ){ zuluCryptCloseMapper( StringContent( *mapper ) ) ; zuluCryptSecurityDropElevatedPrivileges() ; } if( __exit_as_requested == 1 ){ return zuluExit( stl,15 ) ; }else{ return zuluExit( stl,3 ) ; } }