summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGoffredo Baroncelli <kreijack@inwind.it>2010-03-11 21:08:22 +0100
committerChris Mason <chris.mason@oracle.com>2010-03-11 22:09:38 -0500
commit7ebebb7bb14ad3a5e78d8d9047350591fa96f585 (patch)
tree17d05cddc1bebeb22648e47963cc0344b8d232e9
parent6d2cf042471cc728b5399b2beae54603739bc66a (diff)
Add the program name as the first parameter in the command of the btrfs tool
Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--btrfs.c47
-rw-r--r--btrfs_cmds.c75
2 files changed, 91 insertions, 31 deletions
diff --git a/btrfs.c b/btrfs.c
index 20f74134..7e91fc81 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -104,6 +104,9 @@ static struct Command commands[] = {
{ 0, 0 , 0 }
};
+
+
+
static char *get_prgname(char *programname)
{
char *np;
@@ -208,6 +211,41 @@ static int check_ambiguity(struct Command *cmd, char **argv){
}
/*
+ * This function, compacts the program name and the command in the first
+ * element of the '*av' array
+ */
+static int prepare_args(int *ac, char ***av, char *prgname, struct Command *cmd ){
+
+ char **ret;
+ int i;
+ char *newname;
+
+ ret = (char **)malloc(sizeof(char*)*(*ac+1));
+ newname = (char*)malloc(strlen(prgname)+strlen(cmd->verb)+2);
+ if( !ret || !newname ){
+ free(ret);
+ free(newname);
+ return -1;
+ }
+
+ ret[0] = newname;
+ for(i=0; i < *ac ; i++ )
+ ret[i+1] = (*av)[i];
+
+ strcpy(newname, prgname);
+ strcat(newname, " ");
+ strcat(newname, cmd->verb);
+
+ (*ac)++;
+ *av = ret;
+
+ return 0;
+
+}
+
+
+
+/*
This function perform the following jobs:
- show the help if '--help' or 'help' or '-h' are passed
@@ -307,15 +345,20 @@ static int parse_args(int argc, char **argv,
matchcmd->verb, -matchcmd->nargs);
return -2;
}
- if(matchcmd->nargs >= 0 && matchcmd->nargs != *nargs_ && matchcmd->nargs != 999 ){
+ if(matchcmd->nargs >= 0 && matchcmd->nargs != *nargs_ && matchcmd->nargs != 999){
fprintf(stderr, "ERROR: '%s' requires %d arg(s)\n",
matchcmd->verb, matchcmd->nargs);
return -2;
}
+
+ if (prepare_args( nargs_, args_, prgname, matchcmd )){
+ fprintf(stderr, "ERROR: not enough memory\\n");
+ return -20;
+ }
+
return 1;
}
-
int main(int ac, char **av )
{
diff --git a/btrfs_cmds.c b/btrfs_cmds.c
index 3a21be31..86a79130 100644
--- a/btrfs_cmds.c
+++ b/btrfs_cmds.c
@@ -142,7 +142,7 @@ static u64 parse_size(char *s)
return atoll(s) * mult;
}
-int do_defrag(int ac, char **avp)
+int do_defrag(int ac, char **av)
{
int fd;
int compress = 0;
@@ -156,17 +156,6 @@ int do_defrag(int ac, char **avp)
int verbose = 0;
int fancy_ioctl = 0;
struct btrfs_ioctl_defrag_range_args range;
- char **av;
-
- /*
- * getopt expects av[0] to be the program name and it seems
- * to get confused when this isn't the case
- */
- av = malloc((ac + 2) * sizeof(char *));
- av[0] = "defrag";
- av[ac + 1] = NULL;
- memcpy(av + 1, avp, ac * sizeof(char *));
- ac += 1;
optind = 1;
while(1) {
@@ -264,7 +253,7 @@ int do_subvol_list(int argc, char **argv)
int ret;
char *subvol;
- subvol = argv[0];
+ subvol = argv[1];
ret = test_issubvolume(subvol);
if (ret < 0) {
@@ -294,8 +283,8 @@ int do_clone(int argc, char **argv)
char *newname;
char *dstdir;
- subvol = argv[0];
- dst = argv[1];
+ subvol = argv[1];
+ dst = argv[2];
struct btrfs_ioctl_vol_args args;
res = test_issubvolume(subvol);
@@ -375,7 +364,7 @@ int do_delete_subvolume(int argc, char **argv)
int res, fd, len;
struct btrfs_ioctl_vol_args args;
char *dname, *vname, *cpath;
- char *path = argv[0];
+ char *path = argv[1];
res = test_issubvolume(path);
if(res<0){
@@ -436,7 +425,7 @@ int do_create_subvol(int argc, char **argv)
char *newname;
char *dstdir;
struct btrfs_ioctl_vol_args args;
- char *dst = argv[0];
+ char *dst = argv[1];
res = test_isdir(dst);
if(res >= 0 ){
@@ -487,7 +476,7 @@ int do_create_subvol(int argc, char **argv)
int do_fssync(int argc, char **argv)
{
int fd, res;
- char *path = argv[0];
+ char *path = argv[1];
fd = open_file_or_dir(path);
if (fd < 0) {
@@ -506,10 +495,10 @@ int do_fssync(int argc, char **argv)
return 0;
}
-int do_scan(int nargs, char **argv)
+int do_scan(int argc, char **argv)
{
int i, fd;
- if(!nargs){
+ if(argc<=1){
int ret;
printf("Scanning for Btrfs filesystems\n");
@@ -527,9 +516,9 @@ int do_scan(int nargs, char **argv)
return 10;
}
- for( i = 0 ; i < nargs ; i++ ){
- struct btrfs_ioctl_vol_args args;
- int ret;
+ for( i = 1 ; i < argc ; i++ ){
+ struct btrfs_ioctl_vol_args args;
+ int ret;
printf("Scanning for Btrfs filesystems in '%s'\n", argv[i]);
@@ -558,7 +547,7 @@ int do_resize(int argc, char **argv)
struct btrfs_ioctl_vol_args args;
int fd, res, len;
- char *amount=argv[0], *path=argv[1];
+ char *amount=argv[1], *path=argv[2];
fd = open_file_or_dir(path);
if (fd < 0) {
@@ -646,7 +635,7 @@ int do_show_filesystem(int argc, char **argv)
struct list_head *all_uuids;
struct btrfs_fs_devices *fs_devices;
struct list_head *cur_uuid;
- char *search = argv[0];
+ char *search = argv[1];
int ret;
ret = btrfs_scan_one_dir("/dev", 0);
@@ -680,8 +669,8 @@ int do_add_volume(int nargs, char **args)
return 12;
}
- for(i=0 ; i < (nargs-1) ; i++ ){
- struct btrfs_ioctl_vol_args ioctl_args;
+ for(i=1 ; i < (nargs-1) ; i++ ){
+ struct btrfs_ioctl_vol_args ioctl_args;
int devfd, res;
u64 dev_block_count = 0;
struct stat st;
@@ -737,8 +726,8 @@ int do_balance(int argc, char **argv)
{
int fdmnt, ret=0;
- char *path = argv[0];
struct btrfs_ioctl_vol_args args;
+ char *path = argv[1];
fdmnt = open_file_or_dir(path);
if (fdmnt < 0) {
@@ -768,7 +757,7 @@ int do_remove_volume(int nargs, char **args)
return 12;
}
- for(i=0 ; i < (nargs-1) ; i++ ){
+ for(i=1 ; i < (nargs-1) ; i++ ){
struct btrfs_ioctl_vol_args arg;
int res;
@@ -786,3 +775,31 @@ int do_remove_volume(int nargs, char **args)
else
return 0;
}
+
+int do_set_default_subvol(int nargs, char **argv)
+{
+ int ret=0, fd;
+ u64 objectid;
+ char *path = argv[2];
+ char *subvolid = argv[1];
+
+ fd = open_file_or_dir(path);
+ if (fd < 0) {
+ fprintf(stderr, "ERROR: can't access to '%s'\n", path);
+ return 12;
+ }
+
+ objectid = (unsigned long long)strtoll(subvolid, NULL, 0);
+ if (errno == ERANGE) {
+ fprintf(stderr, "ERROR: invalid tree id (%s)\n",subvolid);
+ return 30;
+ }
+ ret = ioctl(fd, BTRFS_IOC_DEFAULT_SUBVOL, &objectid);
+ close(fd);
+ if( ret < 0 ){
+ fprintf(stderr, "ERROR: unable to set a new default subvolume\n");
+ return 30;
+ }
+ return 0;
+}
+