void stat_a_file_helper( const char *file, int follow_link ) { int status; struct stat statbuf; int major1; int minor1; int major2; int minor2; rtems_test_assert( file ); if ( follow_link ) { printf( "stat( %s ) returned ", file ); fflush( stdout ); status = stat( file, &statbuf ); } else { printf( "lstat( %s ) returned ", file ); fflush( stdout ); status = lstat( file, &statbuf ); } if ( status == -1 ) { printf( ": %s\n", strerror( errno ) ); } else { rtems_filesystem_split_dev_t( statbuf.st_dev, major1, minor1 ); rtems_filesystem_split_dev_t( statbuf.st_rdev, major2, minor2 ); printf("\n...st_dev (0x%x:0x%x)\n", major1, minor1 ); printf( "...st_ino %" PRIxino_t "\n", statbuf.st_ino ); printf( "...st_mode %" PRIomode_t "\n", statbuf.st_mode ); printf( "...st_nlink %x\n", statbuf.st_nlink ); printf( "...st_uid %d\n", statbuf.st_uid ); printf( "...st_gid %d\n", statbuf.st_gid ); printf( "...st_rdev (0x%x:0x%x)\n", major2, minor2 ); printf( "...st_size %" PRIdoff_t "\n", statbuf.st_size ); printf( "...st_atime %s", ctime( &statbuf.st_atime ) ); printf( "...st_mtime %s", ctime( &statbuf.st_mtime ) ); printf( "...st_ctime %s", ctime( &statbuf.st_ctime ) ); printf( "...st_blksize %" PRIxblksize_t "\n", statbuf.st_blksize ); printf( "...st_blocks %" PRIxblkcnt_t "\n", statbuf.st_blocks ); } }
static rtems_disk_device * get_disk_entry(dev_t dev, bool lookup_only) { rtems_device_major_number major = 0; rtems_device_minor_number minor = 0; rtems_filesystem_split_dev_t(dev, major, minor); if (major < disktab_size && disktab != NULL) { rtems_disk_device_table *dtab = disktab + major; if (minor < dtab->size && dtab->minor != NULL) { rtems_disk_device *dd = dtab->minor [minor]; if (dd != NULL && !lookup_only) { if (!dd->deleted) { ++dd->uses; } else { dd = NULL; } } return dd; } } return NULL; }
/* * rtems_ide_part_table_initialize - initializes logical devices * on the physical IDE drive * * PARAMETERS: * dev_name - path to physical device in /dev filesystem * * RETURNS: * RTEMS_SUCCESSFUL if success, * RTEMS_NO_MEMOTY if cannot have not enough memory, * RTEMS_INTERNAL_ERROR if other error occurs. */ rtems_status_code rtems_ide_part_table_initialize(const char *dev_name) { int part_num; dev_t dev; rtems_disk_desc_t *disk_desc; rtems_device_major_number major; rtems_device_minor_number minor; rtems_status_code rc; rtems_part_desc_t *part_desc; /* logical device name /dev/hdxyy */ char name[RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX]; disk_desc = (rtems_disk_desc_t *) calloc(1, sizeof(rtems_disk_desc_t)); if (disk_desc == NULL) { return RTEMS_NO_MEMORY; } /* get partition table */ rc = partition_table_get(dev_name, disk_desc); if (rc != RTEMS_SUCCESSFUL) { free(disk_desc); return rc; } /* To avoid device numbers conflicts we have to use for logic disk the same * device major number as ATA device has, and minor number that equals to * sum of logic disk partition number and the minor number of physical disk */ rtems_filesystem_split_dev_t (disk_desc->dev, major, minor); /* create logical disks on the physical one */ for (part_num = 0; part_num < disk_desc->last_log_id; part_num++) { sprintf(name, "%s%d", dev_name, part_num + 1); dev = rtems_filesystem_make_dev_t(major, ++minor); part_desc = disk_desc->partitions[part_num]; if (part_desc == NULL) { continue; } rc = rtems_disk_create_log(dev, disk_desc->dev, part_desc->start, part_desc->size, name); if (rc != RTEMS_SUCCESSFUL) { fprintf(stdout,"Cannot create device %s, error code %d\n", name, rc); continue; } } partition_table_free(disk_desc); return RTEMS_SUCCESSFUL; }
static int rtems_rfs_rtems_mknod (const rtems_filesystem_location_info_t *parentloc, const char *name, size_t namelen, mode_t mode, dev_t dev) { rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parentloc); rtems_rfs_ino parent = rtems_rfs_rtems_get_pathloc_ino (parentloc); rtems_rfs_ino ino; rtems_rfs_inode_handle inode; uid_t uid; gid_t gid; int rc; uid = geteuid (); gid = getegid (); rc = rtems_rfs_inode_create (fs, parent, name, namelen, rtems_rfs_rtems_imode (mode), 1, uid, gid, &ino); if (rc > 0) { return rtems_rfs_rtems_error ("mknod: inode create", rc); } rc = rtems_rfs_inode_open (fs, ino, &inode, true); if (rc > 0) { return rtems_rfs_rtems_error ("mknod: inode open", rc); } if (S_ISDIR(mode) || S_ISREG(mode)) { } else if (S_ISCHR (mode) || S_ISBLK (mode)) { int major; int minor; rtems_filesystem_split_dev_t (dev, major, minor); rtems_rfs_inode_set_block (&inode, 0, major); rtems_rfs_inode_set_block (&inode, 1, minor); } else { rtems_rfs_inode_close (fs, &inode); return rtems_rfs_rtems_error ("mknod: bad mode", EINVAL); } rc = rtems_rfs_inode_close (fs, &inode); if (rc > 0) { return rtems_rfs_rtems_error ("mknod: closing inode", rc); } return 0; }
static void rtems_disk_cleanup(rtems_disk_device *disk_to_remove) { rtems_disk_device *const physical_disk = disk_to_remove->phys_dev; rtems_device_major_number major = 0; rtems_device_minor_number minor = 0; if (physical_disk->deleted) { dev_t dev = physical_disk->dev; unsigned deleted_count = 0; for (major = 0; major < disktab_size; ++major) { rtems_disk_device_table *dtab = disktab + major; for (minor = 0; minor < dtab->size; ++minor) { rtems_disk_device *dd = dtab->minor [minor]; if (dd != NULL && dd->phys_dev->dev == dev && dd != physical_disk) { if (dd->uses == 0) { ++deleted_count; dtab->minor [minor] = NULL; free_disk_device(dd); } else { dd->deleted = true; } } } } physical_disk->uses -= deleted_count; if (physical_disk->uses == 0) { rtems_filesystem_split_dev_t(physical_disk->dev, major, minor); disktab [major].minor [minor] = NULL; free_disk_device(physical_disk); } } else { if (disk_to_remove->uses == 0) { --physical_disk->uses; rtems_filesystem_split_dev_t(disk_to_remove->dev, major, minor); disktab [major].minor [minor] = NULL; free_disk_device(disk_to_remove); } } }
rtems_disk_device * rtems_disk_next(dev_t dev) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_disk_device_table *dtab = NULL; rtems_device_major_number major = 0; rtems_device_minor_number minor = 0; if (dev != (dev_t) -1) { rtems_filesystem_split_dev_t(dev, major, minor); /* If minor wraps around */ if ((minor + 1) < minor) { /* If major wraps around */ if ((major + 1) < major) { return NULL; } ++major; minor = 0; } else { ++minor; } } sc = disk_lock(); if (sc != RTEMS_SUCCESSFUL) { return NULL; } if (major >= disktab_size) { disk_unlock(); return NULL; } dtab = disktab + major; while (true) { if (dtab->minor == NULL || minor >= dtab->size) { minor = 0; ++major; if (major >= disktab_size) { disk_unlock(); return NULL; } dtab = disktab + major; } else if (dtab->minor [minor] == NULL) { ++minor; } else { ++dtab->minor [minor]->uses; disk_unlock(); return dtab->minor [minor]; } } }
int IMFS_mknod( const char *token, /* IN */ mode_t mode, /* IN */ dev_t dev, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { IMFS_token_types type = 0; IMFS_jnode_t *new_node; int result; char new_name[ IMFS_NAME_MAX + 1 ]; IMFS_types_union info; IMFS_get_token( token, strlen( token ), new_name, &result ); /* * Figure out what type of IMFS node this is. */ if ( S_ISDIR(mode) ) type = IMFS_DIRECTORY; else if ( S_ISREG(mode) ) type = IMFS_MEMORY_FILE; else if ( S_ISBLK(mode) || S_ISCHR(mode) ) { type = IMFS_DEVICE; rtems_filesystem_split_dev_t( dev, info.device.major, info.device.minor ); } else if (S_ISFIFO(mode)) type = IMFS_FIFO; else IMFS_assert( 0 ); /* * Allocate and fill in an IMFS jnode * * NOTE: Coverity Id 21 reports this as a leak. * While technically not a leak, it indicated that IMFS_create_node * was ONLY passed a NULL when we created the root node. We * added a new IMFS_create_root_node() so this path no longer * existed. The result was simpler code which should not have * this path. */ new_node = IMFS_create_node( pathloc, type, new_name, mode, &info ); if ( !new_node ) rtems_set_errno_and_return_minus_one( ENOMEM ); IMFS_update_ctime(new_node->Parent); IMFS_update_mtime(new_node->Parent); return 0; }
void del_ramdisk (void) { int rc = 0; rtems_device_major_number major = 0; rtems_device_minor_number minor = 0; rc = rtems_disk_delete (dev); rtems_test_assert (rc == 0); rtems_filesystem_split_dev_t (dev, major, minor); rtems_test_assert (major >= 0); rtems_test_assert (minor >= 0); rc = rtems_io_unregister_driver (major); rtems_test_assert (rc == 0); rc = rtems_disk_io_done (); rtems_test_assert (rc == 0); }
static void get_type_and_info_by_mode_and_dev( mode_t mode, dev_t dev, IMFS_jnode_types_t *type, IMFS_types_union *info ) { if ( S_ISDIR( mode ) ) { *type = IMFS_DIRECTORY; } else if ( S_ISBLK( mode ) || S_ISCHR( mode ) ) { *type = IMFS_DEVICE; rtems_filesystem_split_dev_t( dev, info->device.major, info->device.minor ); } else if (S_ISFIFO( mode )) { *type = IMFS_FIFO; } else { IMFS_assert( S_ISREG( mode ) ); *type = IMFS_MEMORY_FILE; } }
rtems_status_code rtems_bdpart_register( const char *disk_name, const rtems_bdpart_partition *pt, size_t count ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_status_code esc = RTEMS_SUCCESSFUL; rtems_device_major_number major = 0; rtems_device_minor_number minor = 0; rtems_blkdev_bnum disk_end = 0; dev_t disk = 0; dev_t logical_disk = 0; char *logical_disk_name = NULL; char *logical_disk_marker = NULL; size_t disk_name_size = strlen( disk_name); size_t i = 0; int fd = -1; const rtems_disk_device *dd = NULL; /* Get disk data */ sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end); if (sc != RTEMS_SUCCESSFUL) { return sc; } disk = rtems_disk_get_device_identifier( dd); close( fd); /* Get the disk device identifier */ rtems_filesystem_split_dev_t( disk, major, minor); /* Create logical disk name */ logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE); if (logical_disk_name == NULL) { return RTEMS_NO_MEMORY; } strncpy( logical_disk_name, disk_name, disk_name_size); logical_disk_marker = logical_disk_name + disk_name_size; /* Create a logical disk for each partition */ for (i = 0; i < count; ++i) { const rtems_bdpart_partition *p = pt + i; int rv = 0; /* New minor number */ ++minor; /* Create a new device identifier */ logical_disk = rtems_filesystem_make_dev_t( major, minor); /* Set partition number for logical disk name */ rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1); if (rv >= RTEMS_BDPART_NUMBER_SIZE) { esc = RTEMS_INVALID_NAME; goto cleanup; } /* Create logical disk */ sc = rtems_disk_create_log( logical_disk, disk, p->begin, p->end - p->begin, logical_disk_name ); if (sc != RTEMS_SUCCESSFUL) { esc = sc; goto cleanup; } } cleanup: free( logical_disk_name); return esc; }