Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:15-SP3
bcache-tools.14286
0004-bcache-tools-Bcache-command-should-follow-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0004-bcache-tools-Bcache-command-should-follow-symlinks.patch of Package bcache-tools.14286
From 88815851801103d17d1377fb13e82b9be5f863e7 Mon Sep 17 00:00:00 2001 From: Shaoxiong Li <dahefanteng@gmail.com> Date: Tue, 30 Jul 2019 22:02:26 +0800 Subject: [PATCH 09/16] bcache-tools: Bcache command should follow symlinks Git-commit: 88815851801103d17d1377fb13e82b9be5f863e7 Patch-mainline: bcache-tools-1.1 References: bsc#1139948 Sometimes we operate the bcache device using symlinks instead of real device path Signed-off-by: Shaoxiong Li <dahefanteng@gmail.com> --- bcache-main.c | 63 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 23 deletions(-) Index: bcache-tools/bcache-main.c =================================================================== --- bcache-tools.orig/bcache-main.c +++ bcache-tools/bcache-main.c @@ -16,6 +16,7 @@ #include "make.h" #include <locale.h> #include "list.h" +#include <limits.h> //utils function @@ -61,8 +62,16 @@ bool bad_uuid(char *uuid) return false; } -bool bad_dev(char *devname) +bool bad_dev(char **devname) { + + char *ptr = realpath(*devname, NULL); + + if (ptr == NULL) { + fprintf(stderr, "Error:Failed to resolve device name\n"); + return true; + } + *devname = ptr; char *pattern = "^/dev/[a-zA-Z0-9-]*$"; regex_t reg; int status; @@ -72,7 +81,7 @@ bool bad_dev(char *devname) fprintf(stderr, "Error happen when check device name format:%m\n"); } - status = regexec(®, devname, 1, ®matche, 0); + status = regexec(®, *devname, 1, ®matche, 0); regfree(®); if (status == REG_NOMATCH) return true; @@ -504,11 +513,11 @@ int main(int argc, char **argv) subcmd = argv[1]; argc--; argv += 1; + char *devname = NULL; if (strcmp(subcmd, "make") == 0) return make_bcache(argc, argv); else if (strcmp(subcmd, "show") == 0) { int o = 0; - char devname[40]; int more = 0; int device = 0; int help = 0; @@ -526,7 +535,7 @@ int main(int argc, char **argv) &option_index)) != EOF) { switch (o) { case 'd': - strcpy(devname, optarg); + devname = optarg; device = 1; break; case 'm': @@ -545,7 +554,7 @@ int main(int argc, char **argv) } else if (more) { return show_bdevs_detail(); } else if (device) { - if (bad_dev(devname)) { + if (bad_dev(&devname)) { fprintf(stderr, "Error:Wrong device name found\n"); return 1; @@ -561,15 +570,17 @@ int main(int argc, char **argv) } else if (strcmp(subcmd, "register") == 0) { if (argc != 2 || strcmp(argv[1], "-h") == 0) return register_usage(); - if (bad_dev(argv[1])) { + devname = argv[1]; + if (bad_dev(&devname)) { fprintf(stderr, "Error:Wrong device name found\n"); return 1; } - return register_dev(argv[1]); + return register_dev(devname); } else if (strcmp(subcmd, "unregister") == 0) { if (argc != 2 || strcmp(argv[1], "-h") == 0) return unregister_usage(); - if (bad_dev(argv[1])) { + devname = argv[1]; + if (bad_dev(&devname)) { fprintf(stderr, "Error:Wrong device name found\n"); return 1; } @@ -578,11 +589,11 @@ int main(int argc, char **argv) int type = 1; int ret; - ret = detail_dev(argv[1], &bd, &cd, &type); + ret = detail_dev(devname, &bd, &cd, &type); if (ret != 0) return ret; if (type == BCACHE_SB_VERSION_BDEV) { - return stop_backdev(argv[1]); + return stop_backdev(devname); } else if (type == BCACHE_SB_VERSION_CDEV || type == BCACHE_SB_VERSION_CDEV_WITH_UUID) { return unregister_cset(cd.base.cset); @@ -591,25 +602,30 @@ int main(int argc, char **argv) } else if (strcmp(subcmd, "attach") == 0) { if (argc != 3 || strcmp(argv[1], "-h") == 0) return attach_usage(); - if ((bad_dev(argv[1]) && bad_uuid(argv[1])) - || bad_dev(argv[2])) { + devname = argv[2]; + char *attachto = argv[1]; + + if ((bad_uuid(attachto) && bad_dev(&attachto)) + || bad_dev(&devname)) { fprintf(stderr, - "Error:Wrong device name or cache_set uuid found\n"); + "Error:Wrong device name or cache_set uuid found\n"); return 1; } - return attach_both(argv[1], argv[2]); + return attach_both(attachto, devname); } else if (strcmp(subcmd, "detach") == 0) { if (argc != 2 || strcmp(argv[1], "-h") == 0) return detach_usage(); - if (bad_dev(argv[1])) { + devname = argv[1]; + if (bad_dev(&devname)) { fprintf(stderr, "Error:Wrong device name found\n"); return 1; } - return detach_backdev(argv[1]); + return detach_backdev(devname); } else if (strcmp(subcmd, "set-cachemode") == 0) { if (argc != 3) return setcachemode_usage(); - if (bad_dev(argv[1])) { + devname = argv[1]; + if (bad_dev(&devname)) { fprintf(stderr, "Error:Wrong device name found\n"); return 1; } @@ -618,10 +634,10 @@ int main(int argc, char **argv) int type = 1; int ret; - ret = detail_dev(argv[1], &bd, &cd, &type); + ret = detail_dev(devname, &bd, &cd, &type); if (ret != 0) { fprintf(stderr, - "This device doesn't exist or failed to receive info from this device\n"); + "This device doesn't exist or failed to receive info from this device\n"); return ret; } if (type != BCACHE_SB_VERSION_BDEV @@ -630,11 +646,12 @@ int main(int argc, char **argv) "Only backend device is suppported\n"); return 1; } - return set_backdev_cachemode(argv[1], argv[2]); + return set_backdev_cachemode(devname, argv[2]); } else if (strcmp(subcmd, "set-label") == 0) { if (argc != 3) return setlabel_usage(); - if (bad_dev(argv[1])) { + devname = argv[1]; + if (bad_dev(&devname)) { fprintf(stderr, "Error:Wrong device name found\n"); return 1; } @@ -643,7 +660,7 @@ int main(int argc, char **argv) int type = 5; int ret; - ret = detail_dev(argv[1], &bd, &cd, &type); + ret = detail_dev(devname, &bd, &cd, &type); if (ret != 0) { fprintf(stderr, "This device doesn't exist or failed to receive info from this device\n"); @@ -659,7 +676,7 @@ int main(int argc, char **argv) fprintf(stderr, "Label is too long\n"); return 1; } - return set_label(argv[1], argv[2]); + return set_label(devname, argv[2]); } main_usage(); return 0;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor