Add the program name as the first parameter in the command of the btrfs tool
authorGoffredo Baroncelli <kreijack@inwind.it>
Thu, 11 Mar 2010 20:08:22 +0000 (21:08 +0100)
committerChris Mason <chris.mason@oracle.com>
Fri, 12 Mar 2010 03:09:38 +0000 (22:09 -0500)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
btrfs.c
btrfs_cmds.c

diff --git a/btrfs.c b/btrfs.c
index 20f7413..7e91fc8 100644 (file)
--- 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 )
 {
 
index 3a21be3..86a7913 100644 (file)
@@ -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;
+}
+