#include "snapctl.h"
#include <snapfs_internal.h>
-#define IOC_PACK(ioc, length, input) \
-do{ \
- ioc.data = input; \
- ioc.len = length; \
-}while(0)
+#define IOC_BUF_MAX_LEN 8192
+static char rawbuf[IOC_BUF_MAX_LEN];
+static char *buf = rawbuf;
+/*FIXME add this temporary, will use obd_ioc_data later*/
+#define IOC_INIT(ptr) \
+do{ \
+ struct ioc_data* pbuf; \
+ memset(buf, 0, sizeof(rawbuf)); \
+ pbuf = (struct ioc_data*)buf; \
+ pbuf->ioc_inbuf = pbuf->ioc_bulk; \
+ ptr = (struct ioc_snap_tbl_data *)pbuf->ioc_bulk; \
+} while(0)
+
+#define IOC_PACK(length) \
+do{ \
+ struct ioc_data* pbuf; \
+ pbuf = (struct ioc_data*)buf; \
+ pbuf->ioc_inlen = length; \
+} while (0)
static struct list_head snap_list;
struct open_snap_device open_device_table;
}
memset(s_mnt, 0, sizeof(struct snap_mnt));
memcpy(&s_mnt->device.name[0], entry->mnt_fsname, strlen(entry->mnt_fsname));
+ memcpy(&s_mnt->device.mntpt[0], entry->mnt_dir, strlen(entry->mnt_dir));
opt = hasmntopt(entry, "loop");
memset(dev_name, 0, DEV_NAME_MAX_LEN);
if (opt) {
goto exit;
}
s_mnt->device.dev = (unsigned long)statbuf.st_rdev;
-
list_add(&s_mnt->snap_mnt_list, &snap_list);
}
}
return 0;
}
-int snapshot_dev(int argc, char **argv)
+int snap_dev_open(int argc, char **argv)
{
struct snap_mnt *snaplist;
char *dev_name;
}
}
release_snap_list();
- fprintf(stderr, "can not find the device %s", dev_name);
+ fprintf(stderr, "%s are not snapdevice\n", dev_name);
return (-EINVAL);
}
-int snapshot_list(int argc, char **argv)
+int snap_dev_list(int argc, char **argv)
{
struct snap_mnt *snaplist;
+ int index = 0;
+
if (argc != 1) {
fprintf(stderr, "The argument count is not right \n");
return CMD_HELP;
}
get_snaplist();
+ printf("index:\t\tmount_point:\t\tdevice:\n");
list_for_each_entry(snaplist, &snap_list, snap_mnt_list) {
- fprintf(stderr, "devid: %lu name: %s",
- snaplist->device.dev,
+ printf("%d\t\t%s\t\t%s \n", index,
+ &snaplist->device.mntpt[0],
&snaplist->device.name[0]);
+ index++;
}
release_snap_list();
return 0;
}
-int snapshot_add(int argc, char **argv)
+static inline void print_snap_table(void * buf)
{
- int rc, i;
+ struct ioc_snap_tbl_data *ptable;
+ int i;
+
+ ptable = (struct ioc_snap_tbl_data*)buf;
+
+ printf("There are %d snapshot in the system\n", ptable->count);
+ printf("index\t\tname\t\t\ttime\t\t\n");
+ for (i = 0; i < ptable->count; i++) {
+ struct tm* local_time;
+ char time[128];
+
+ memset (time, 0, sizeof(time));
+ local_time = localtime(&ptable->snaps[i].time);
+ if (local_time)
+ strftime(time, sizeof(time), "%a %b %d %Y %H:%M:%S", local_time);
+ printf("%-10d\t%-20s\t%s\n", ptable->snaps[i].index, ptable->snaps[i].name, time);
+ }
+}
+int snap_snap_list(int argc, char **argv)
+{
+ int i, rc = 0;
+
+ if (argc != 1 && argc != 2) {
+ fprintf(stderr, "The argument count is not right\n");
+ return CMD_HELP;
+ }
+ if (open_device_table.count == 0) {
+ fprintf(stderr, "Please open a snapdevice first\n");
+ return (-EINVAL);
+ }
+
+ for (i = 0; i < open_device_table.count; i++) {
+ struct ioc_snap_tbl_data *snap_ioc_data;
+
+ IOC_INIT(snap_ioc_data);
+
+ if (argc == 2) {
+ snap_ioc_data->no = atoi(argv[1]);
+ } else {
+ snap_ioc_data->no = 0;
+ }
+
+ IOC_PACK(sizeof(struct ioc_snap_tbl_data));
+
+ if ((rc = ioctl(open_device_table.device[i].fd,
+ IOC_SNAP_PRINTTABLE, buf))) {
+ fprintf(stderr, "can not retrive snaptable on device %s failed %d \n",
+ &open_device_table.device[i].name[0], rc);
+ return (rc);
+ }
+ if(((struct ioc_data*)buf)->ioc_bulk)
+ print_snap_table(((struct ioc_data*)buf)->ioc_bulk);
+ }
+ return rc;
+}
+int snap_snap_add(int argc, char **argv)
+{
+ int rc = 0, i;
if (argc != 3 && argc !=2) {
fprintf(stderr, "The argument count is not right \n");
}
if (open_device_table.count == 0) {
- fprintf(stderr, "Please first open a snapdevice \n");
+ fprintf(stderr, "Please open a snapdevice first\n");
return (-EINVAL);
}
for (i = 0; i < open_device_table.count; i++) {
- struct snap_table_data *snap_ioc_data;
- struct ioc_data ioc_data;
+ struct ioc_snap_tbl_data *snap_ioc_data;
+
+ IOC_INIT(snap_ioc_data);
- snap_ioc_data = (struct snap_table_data *)
- malloc(sizeof(struct snap_table_data));
- snap_ioc_data->tblcmd_count = 1;
+ snap_ioc_data->count = 1;
snap_ioc_data->dev = open_device_table.device[i].dev;
if (argc == 3) {
- snap_ioc_data->tblcmd_no = atoi(argv[1]);
- memcpy(&snap_ioc_data->tblcmd_snaps[0].name[0],
+ snap_ioc_data->no = atoi(argv[1]);
+ memcpy(snap_ioc_data->snaps[0].name,
argv[2], strlen(argv[2]));
} else {
- snap_ioc_data->tblcmd_no = 0;
- memcpy(&snap_ioc_data->tblcmd_snaps[0].name[0],
+ snap_ioc_data->no = 0;
+ memcpy(snap_ioc_data->snaps[0].name,
argv[1], strlen(argv[1]));
}
- snap_ioc_data->tblcmd_snaps[0].time = time(NULL);
- IOC_PACK(ioc_data, sizeof(struct snap_table_data), (char*)snap_ioc_data);
-
+ snap_ioc_data->snaps[0].time = time(NULL);
+
+ IOC_PACK(sizeof(struct ioc_snap_tbl_data) + sizeof(struct snap));
+
if ((rc = ioctl(open_device_table.device[i].fd,
- IOC_SNAP_ADD, &ioc_data))) {
- fprintf(stderr, "add snapshot %s failed %d \n",
- &snap_ioc_data->tblcmd_snaps[0].name[0], rc);
+ IOC_SNAP_ADD, buf))) {
+ fprintf(stderr, "add %s failed \n", argv[1]);
} else {
- fprintf(stderr, "add snapshot %s success\n",
- &snap_ioc_data->tblcmd_snaps[0].name[0]);
+ fprintf(stderr, "add %s success\n", argv[1]);
}
- free(snap_ioc_data);
- return rc;
}
- return 0;
+ return rc;
}