コード例 #1
0
rtems_status_code rtems_disk_create_log(
  dev_t dev,
  dev_t phys,
  rtems_blkdev_bnum begin_block,
  rtems_blkdev_bnum block_count,
  const char *name
)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_disk_device *physical_disk = NULL;
  rtems_disk_device *dd = NULL;
  rtems_blkdev_bnum end_block = begin_block + block_count;

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  physical_disk = get_disk_entry(phys, true);
  if (physical_disk == NULL || !is_physical_disk(physical_disk)) {
    disk_unlock();

    return RTEMS_INVALID_ID;
  }

  if (
    begin_block >= physical_disk->size
      || end_block <= begin_block
      || end_block > physical_disk->size
  ) {
    disk_unlock();

    return RTEMS_INVALID_NUMBER;
  }

  sc = create_disk(dev, name, &dd);
  if (sc != RTEMS_SUCCESSFUL) {
    disk_unlock();

    return sc;
  }

  dd->phys_dev = physical_disk;
  dd->start = begin_block;
  dd->size = block_count;
  dd->block_size = physical_disk->block_size;
  dd->media_block_size = physical_disk->media_block_size;
  dd->block_to_media_block_shift = physical_disk->block_to_media_block_shift;
  dd->bds_per_group = physical_disk->bds_per_group;
  dd->ioctl = physical_disk->ioctl;
  dd->driver_data = physical_disk->driver_data;

  ++physical_disk->uses;

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}
コード例 #2
0
ファイル: filesys.c プロジェクト: ishitach/FAT-file-system
int FileSys_make(char *disk_name) {
	char buf[BLOCK_SIZE];
	if (create_disk(disk_name) == -1) return -1;	//  It creates a disk for the file system.
	if (Disk_open(disk_name) == -1) return -1;	//  It opens the disk . 
	strcpy(buf, disk_name);						
	if (writeBlock(0, buf) == -1) return -1;	// It writes the name of the file system to the disk.
	Disk_close(); 					// It closes the disk .
	return 0;					//The disk operations used are created in disk.c 
}
コード例 #3
0
ファイル: diskdevs.c プロジェクト: chch1028/rtems
rtems_status_code rtems_disk_create_log(
  dev_t dev,
  dev_t phys,
  rtems_blkdev_bnum block_begin,
  rtems_blkdev_bnum block_count,
  const char *name
)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_disk_device *phys_dd = NULL;
  rtems_disk_device *dd = NULL;
  char *alloc_name = NULL;

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  phys_dd = get_disk_entry(phys, true);
  if (phys_dd == NULL) {
    disk_unlock();

    return RTEMS_INVALID_ID;
  }

  sc = create_disk(dev, name, &dd, &alloc_name);
  if (sc != RTEMS_SUCCESSFUL) {
    disk_unlock();

    return sc;
  }

  sc = rtems_disk_init_log(
    dd,
    phys_dd,
    block_begin,
    block_count
  );

  dd->dev = dev;
  dd->name = alloc_name;

  ++phys_dd->uses;

  if (sc != RTEMS_SUCCESSFUL) {
    dd->ioctl = null_handler;
    rtems_disk_delete(dev);
    disk_unlock();

    return sc;
  }

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}
コード例 #4
0
rtems_status_code rtems_disk_create_phys(
  dev_t dev,
  uint32_t block_size,
  rtems_blkdev_bnum block_count,
  rtems_block_device_ioctl handler,
  void *driver_data,
  const char *name
)
{
  rtems_disk_device *dd = NULL;
  rtems_status_code sc = RTEMS_SUCCESSFUL;

  if (handler == NULL) {
    return RTEMS_INVALID_ADDRESS;
  }

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  sc = create_disk(dev, name, &dd);
  if (sc != RTEMS_SUCCESSFUL) {
    disk_unlock();

    return sc;
  }

  dd->phys_dev = dd;
  dd->start = 0;
  dd->size = block_count;
  dd->media_block_size = block_size;
  dd->ioctl = handler;
  dd->driver_data = driver_data;

  if ((*handler)(dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities) < 0) {
    dd->capabilities = 0;
  }

  sc = rtems_bdbuf_set_block_size(dd, block_size);
  if (sc != RTEMS_SUCCESSFUL) {
    dd->ioctl = null_handler;
    rtems_disk_delete(dev);
    disk_unlock();

    return sc;
  }

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}
コード例 #5
0
ファイル: diskdevs.c プロジェクト: chch1028/rtems
rtems_status_code rtems_disk_create_phys(
  dev_t dev,
  uint32_t block_size,
  rtems_blkdev_bnum block_count,
  rtems_block_device_ioctl handler,
  void *driver_data,
  const char *name
)
{
  rtems_disk_device *dd = NULL;
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  char *alloc_name = NULL;

  if (handler == NULL) {
    return RTEMS_INVALID_ADDRESS;
  }

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  sc = create_disk(dev, name, &dd, &alloc_name);
  if (sc != RTEMS_SUCCESSFUL) {
    disk_unlock();

    return sc;
  }

  sc = rtems_disk_init_phys(
    dd,
    block_size,
    block_count,
    handler,
    driver_data
  );

  dd->dev = dev;
  dd->name = alloc_name;

  if (sc != RTEMS_SUCCESSFUL) {
    dd->ioctl = null_handler;
    rtems_disk_delete(dev);
    disk_unlock();

    return sc;
  }

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}
コード例 #6
0
ファイル: test_disk2.c プロジェクト: gonzopancho/asuswrt
int main(int argc, char *argv[]){
	disk_info_t *disk_info, *disk_list;
	partition_info_t *partition_info;
	char buf[PATH_MAX];

	usb_dbg("%d: Using myself to get information:\n", VERSION);

	if(argc == 3){
		get_mount_path("sdb1", buf, PATH_MAX);
		printf("buf=%s.\n", buf);
	}
	else if(argc == 2){
		if(is_disk_name(argv[1])){ // Disk
			usb_dbg("%d: Get disk(%s)'s information:\n", VERSION, argv[1]);

			create_disk(argv[1], &disk_info);

			print_disk(disk_info);

			free_disk_data(&disk_info);
		}
		else{
			usb_dbg("%d: Get partition(%s)'s information:\n", VERSION, argv[1]);

			create_partition(argv[1], &partition_info);

			print_partition(partition_info);

			free_partition_data(&partition_info);
		}
	}
	else{
		usb_dbg("%d: Get all Disk information:\n", VERSION);

		disk_list = read_disk_data();

		print_disks(disk_list);

		free_disk_data(&disk_list);
	}

	return 0;
}
コード例 #7
0
disk_info_t *read_disk_data(void)
{
	FILE *fp;
	char line[64], device_name[32];
	u32 major, minor;
	disk_info_t *disk_info_list, *parent_disk_info, **follow_disk_info_list;
	partition_info_t *new_partition_info, **follow_partition_list;
	unsigned long long device_size;

	fp = fopen(PARTITION_FILE, "r");
	if (!fp)
		return NULL;

	if (!fgets(line, sizeof(line), fp)) {
		fclose(fp);
		return NULL;
	}

	fgets(line, sizeof(line), fp);

	disk_info_list = NULL;

	while (fgets(line, sizeof(line), fp))
	{
		device_name[0] = 0;
		if (sscanf(line, "%u %u %llu %[^\n ]", &major, &minor, &device_size, device_name) != 4)
			continue;
		if(major != USB_DISK_MAJOR)
			continue;
		if(device_size < 10)
			continue;
		
		if (is_disk_name(device_name))
		{
			follow_disk_info_list = &disk_info_list;
			while(*follow_disk_info_list)
				follow_disk_info_list = &((*follow_disk_info_list)->next);
			create_disk(device_name, follow_disk_info_list);
		}
		else if (is_partition_name(device_name, NULL))
		{
			parent_disk_info = disk_info_list;
			while(1)
			{
				if (!parent_disk_info)
					goto info_exit;
				
				if (!strncmp(device_name, parent_disk_info->device, 3))
					break;
				
				parent_disk_info = parent_disk_info->next;
			}
			
			follow_partition_list = &(parent_disk_info->partitions);
			while(*follow_partition_list)
				follow_partition_list = &((*follow_partition_list)->next);
			
			new_partition_info = create_partition(device_name, follow_partition_list);
			if(new_partition_info)
				new_partition_info->disk = parent_disk_info;
		}
	}

info_exit:
	fclose(fp);
	return disk_info_list;
}
コード例 #8
0
ファイル: test_disk2.c プロジェクト: gonzopancho/asuswrt
disk_info_t *read_disk_data(){
	disk_info_t *disk_info_list = NULL, *new_disk_info, **follow_disk_info_list;
	char *partition_info = read_whole_file(PARTITION_FILE);
	char *follow_info;
	char line[64], device_name[16];
	u32 major;
	disk_info_t *parent_disk_info;
	partition_info_t *new_partition_info, **follow_partition_list;
	u64 device_size;

	if(partition_info == NULL){
		usb_dbg("Failed to open \"%s\"!!\n", PARTITION_FILE);
		return disk_info_list;
	}
	follow_info = partition_info;

	memset(device_name, 0, 16);
	while(get_line_from_buffer(follow_info, line, 64) != NULL){
		follow_info += strlen(line);

		if(sscanf(line, "%u %*u %llu %[^\n ]", &major, &device_size, device_name) != 3)
			continue;
		if(major != USB_DISK_MAJOR)
			continue;
		if(device_size == 1) // extend partition.
			continue;

		if(is_disk_name(device_name)){ // Disk
			follow_disk_info_list = &disk_info_list;
			while(*follow_disk_info_list != NULL)
				follow_disk_info_list = &((*follow_disk_info_list)->next);

			new_disk_info = create_disk(device_name, follow_disk_info_list);
		}
		else if(is_partition_name(device_name, NULL)){ // Partition
			// Found a partition device.
			// Find the parent disk.
			parent_disk_info = disk_info_list;
			while(1){
				if(parent_disk_info == NULL){
					usb_dbg("Error while parsing %s: found "
									"partition '%s' but haven't seen the disk device "
									"of which it is a part.\n", PARTITION_FILE, device_name);
					free(partition_info);
					return disk_info_list;
				}

				if(!strncmp(device_name, parent_disk_info->device, 3))
					break;

				parent_disk_info = parent_disk_info->next;
			}

			follow_partition_list = &(parent_disk_info->partitions);
			while(*follow_partition_list != NULL){
				if((*follow_partition_list)->partition_order == 0){
					free_partition_data(follow_partition_list);
					parent_disk_info->partitions = NULL;
					follow_partition_list = &(parent_disk_info->partitions);
				}
				else
					follow_partition_list = &((*follow_partition_list)->next);
			}

			new_partition_info = create_partition(device_name, follow_partition_list);
			if(new_partition_info != NULL)
				new_partition_info->disk = parent_disk_info;
		}
	}

	free(partition_info);
	return disk_info_list;
}
コード例 #9
0
int main(int argc, char *argv[]) {
    _cleanup_strv_free_ char **disks_done = NULL;
    _cleanup_fclose_ FILE *f = NULL;
    unsigned n = 0;
    int r = EXIT_FAILURE, r2 = EXIT_FAILURE;
    char **i;

    if (argc > 1 && argc != 4) {
        log_error("This program takes three or no arguments.");
        return EXIT_FAILURE;
    }

    if (argc > 1)
        arg_dest = argv[1];

    log_set_target(LOG_TARGET_SAFE);
    log_parse_environment();
    log_open();

    umask(0022);

    if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
        goto cleanup;

    if (!arg_enabled) {
        r = r2 = EXIT_SUCCESS;
        goto cleanup;
    }

    strv_uniq(arg_disks);

    if (arg_read_crypttab) {
        struct stat st;

        f = fopen("/etc/crypttab", "re");
        if (!f) {
            if (errno == ENOENT)
                r = EXIT_SUCCESS;
            else
                log_error("Failed to open /etc/crypttab: %m");

            goto next;
        }

        if (fstat(fileno(f), &st) < 0) {
            log_error("Failed to stat /etc/crypttab: %m");
            goto next;
        }

        /* If we readd support for specifying passphrases
         * directly in crypttabe we should upgrade the warning
         * below, though possibly only if a passphrase is
         * specified directly. */
        if (st.st_mode & 0005)
            log_debug("/etc/crypttab is world-readable. This is usually not a good idea.");

        for (;;) {
            char line[LINE_MAX], *l;
            _cleanup_free_ char *name = NULL, *device = NULL, *password = NULL, *options = NULL;
            int k;

            if (!fgets(line, sizeof(line), f))
                break;

            n++;

            l = strstrip(line);
            if (*l == '#' || *l == 0)
                continue;

            k = sscanf(l, "%ms %ms %ms %ms", &name, &device, &password, &options);
            if (k < 2 || k > 4) {
                log_error("Failed to parse /etc/crypttab:%u, ignoring.", n);
                continue;
            }

            /*
              If options are specified on the kernel commandline, let them override
              the ones from crypttab.
            */
            STRV_FOREACH(i, arg_options) {
                _cleanup_free_ char *proc_uuid = NULL, *proc_options = NULL;
                const char *p = *i;

                k = sscanf(p, "%m[0-9a-fA-F-]=%ms", &proc_uuid, &proc_options);
                if (k == 2 && streq(proc_uuid, device + 5)) {
                    free(options);
                    options = strdup(p);
                    if (!proc_options) {
                        log_oom();
                        goto cleanup;
                    }
                }
            }

            if (arg_disks) {
                /*
                  If luks UUIDs are specified on the kernel command line, use them as a filter
                  for /etc/crypttab and only generate units for those.
                */
                STRV_FOREACH(i, arg_disks) {
                    _cleanup_free_ char *proc_device = NULL, *proc_name = NULL;
                    const char *p = *i;

                    if (startswith(p, "luks-"))
                        p += 5;

                    proc_name = strappend("luks-", p);
                    proc_device = strappend("UUID=", p);

                    if (!proc_name || !proc_device) {
                        log_oom();
                        goto cleanup;
                    }

                    if (streq(proc_device, device) || streq(proc_name, name)) {
                        if (create_disk(name, device, password, options) < 0)
                            goto cleanup;

                        if (strv_extend(&disks_done, p) < 0) {
                            log_oom();
                            goto cleanup;
                        }
                    }
                }
            } else if (create_disk(name, device, password, options) < 0)
コード例 #10
0
ファイル: findevs.c プロジェクト: jasonbking/illumos-gate
static int
add_devs(di_node_t node, di_minor_t minor, void *arg)
{
	struct search_args	*args;
	int result = DI_WALK_CONTINUE;

	args = (struct search_args *)arg;

	if (dm_debug > 1) {
		/* This is all just debugging code */
		char	*devpath;
		char	dev_name[MAXPATHLEN];

		devpath = di_devfs_path(node);
		(void) snprintf(dev_name, sizeof (dev_name), "%s:%s", devpath,
		    di_minor_name(minor));
		di_devfs_path_free((void *) devpath);

		(void) fprintf(stderr,
		    "INFO: dev: %s, node: %s%d, minor: 0x%x, type: %s\n",
		    dev_name, di_node_name(node), di_instance(node),
		    di_minor_spectype(minor),
		    (di_minor_nodetype(minor) != NULL ?
		    di_minor_nodetype(minor) : "NULL"));
	}

	if (bus_type(node, minor, args->ph) != NULL) {
		if (add_bus(args, node, minor, NULL) == NULL) {
			args->dev_walk_status = ENOMEM;
			result = DI_WALK_TERMINATE;
		}

	} else if (is_ctrl(node, minor)) {
		if (add_controller(args, node, minor) == NULL) {
			args->dev_walk_status = ENOMEM;
			result = DI_WALK_TERMINATE;
		}

	} else if (di_minor_spectype(minor) == S_IFCHR &&
	    (is_drive(minor) || is_zvol(node, minor))) {
		char	*devidstr;
		char	kernel_name[MAXPATHLEN];
		disk_t	*diskp;

		(void) snprintf(kernel_name, sizeof (kernel_name), "%s%d",
		    di_node_name(node), di_instance(node));
		devidstr = get_str_prop(DEVICE_ID_PROP, node);

		args->node = node;
		args->minor = minor;
		/*
		 * Check if we already got this disk and
		 * this is another slice.
		 */
		if (!have_disk(args, devidstr, kernel_name, &diskp)) {
			args->dev_walk_status = 0;
			/*
			 * This is a newly found disk, create the
			 * disk structure.
			 */
			diskp = create_disk(devidstr, kernel_name, args);
			if (diskp == NULL) {
				args->dev_walk_status = ENOMEM;
			}

			if (diskp->drv_type != DM_DT_FLOPPY) {
				/* add the controller relationship */
				if (args->dev_walk_status == 0) {
					if (add_disk2controller(diskp,
					    args) != 0) {
						args->dev_walk_status = ENOMEM;
					}
				}
			}
		}
		if (is_zvol(node, minor)) {
			char zvdsk[MAXNAMELEN];
			char *str;
			alias_t *ap;

			if (di_prop_lookup_strings(di_minor_devt(minor),
			    node, "name", &str) == -1)
				return (DI_WALK_CONTINUE);
			(void) snprintf(zvdsk, MAXNAMELEN, "/dev/zvol/rdsk/%s",
			    str);
			if ((ap = find_alias(diskp, kernel_name)) == NULL) {
				if (new_alias(diskp, kernel_name,
				    zvdsk, args) != 0) {
					args->dev_walk_status = ENOMEM;
				}
			} else {
				/*
				 * It is possible that we have already added
				 * this devpath.
				 * Do not add it again. new_devpath will
				 * return a 0 if found, and not add the path.
				 */
				if (new_devpath(ap, zvdsk) != 0) {
					args->dev_walk_status = ENOMEM;
				}
			}
		}

		/* Add the devpaths for the drive. */
		if (args->dev_walk_status == 0) {
			char	*devpath;
			char	slice_path[MAXPATHLEN];
			char	*pattern;

			/*
			 * We will come through here once for each of
			 * the raw slice device names.
			 */
			devpath = di_devfs_path(node);
			(void) snprintf(slice_path,
			    sizeof (slice_path), "%s:%s",
			    devpath, di_minor_name(minor));
			di_devfs_path_free((void *) devpath);

			if (libdiskmgt_str_eq(di_minor_nodetype(minor),
			    DDI_NT_FD)) {
				pattern = DEVLINK_FLOPPY_REGEX;
			} else {
				pattern = DEVLINK_REGEX;
			}

			/* Walk the /dev tree to get the devlinks. */
			(void) di_devlink_walk(args->handle, pattern,
			    slice_path, DI_PRIMARY_LINK, arg, add_devpath);
		}

		if (args->dev_walk_status != 0) {
			result = DI_WALK_TERMINATE;
		}
	}

	return (result);
}