From: Liu Yuan <tailai.ly at taobao.com> Signed-off-by: Liu Yuan <tailai.ly at taobao.com> --- sheepfs/cluster.c | 5 ++++- sheepfs/core.c | 21 ++++++++++++++++++++- sheepfs/node.c | 10 ++++++++-- sheepfs/sheepfs.h | 4 ++++ sheepfs/vdi.c | 5 ++++- sheepfs/volume.c | 7 ++++--- 6 files changed, 44 insertions(+), 8 deletions(-) diff --git a/sheepfs/cluster.c b/sheepfs/cluster.c index 1f645ba..39415f8 100644 --- a/sheepfs/cluster.c +++ b/sheepfs/cluster.c @@ -47,9 +47,12 @@ int cluster_info_read(const char *path, char *buf, size_t size, off_t ignore) size_t cluster_info_get_size(const char *path) { - struct strbuf *buf = sheepfs_run_cmd("collie cluster info"); + struct strbuf *buf; size_t len; + char cmd[COMMAND_LEN]; + sprintf(cmd, "collie cluster info -a %s -p %d", sdhost, sdport); + buf = sheepfs_run_cmd(cmd); if (!buf) return 0; diff --git a/sheepfs/core.c b/sheepfs/core.c index 3a56333..5bd96ac 100644 --- a/sheepfs/core.c +++ b/sheepfs/core.c @@ -19,10 +19,12 @@ #include <pthread.h> #include <getopt.h> #include <syslog.h> +#include <stdlib.h> #include "strbuf.h" #include "util.h" #include "sheepfs.h" +#include "sheepdog_proto.h" #define SH_OP_NAME "user.sheepfs.opcode" #define SH_OP_SIZE sizeof(uint32_t) @@ -32,16 +34,20 @@ char sheepfs_shadow[PATH_MAX]; static int sheepfs_debug; static int sheepfs_fg; int sheepfs_page_cache = 0; +const char *sdhost = "localhost"; +int sdport = SD_LISTEN_PORT; static struct option const long_options[] = { + {"address", required_argument, NULL, 'a'}, {"debug", no_argument, NULL, 'd'}, {"help", no_argument, NULL, 'h'}, {"foreground", no_argument, NULL, 'f'}, {"pagecache", no_argument, NULL, 'k'}, + {"port", required_argument, NULL, 'p'}, {NULL, 0, NULL, 0}, }; -static const char *short_options = "dfhk"; +static const char *short_options = "a:dfhkp:"; static struct sheepfs_file_operation { int (*read)(const char *path, char *buf, size_t size, off_t); @@ -254,9 +260,11 @@ static void usage(int inval) printf("\ Usage: sheepfs [OPTION]... MOUNTPOINT\n\ Options:\n\ + -a --address specify the sheep address (default: localhost)\n\ -d, --debug enable debug output (implies -f)\n\ -f, --foreground sheepfs run in the foreground\n\ -k, --pagecache use local kernel's page cache to access volume\n\ + -p --port specify the sheep port (default: 7000)\n\ -h, --help display this help and exit\n\ "); exit(inval); @@ -272,6 +280,9 @@ int main(int argc, char **argv) while ((ch = getopt_long(argc, argv, short_options, long_options, &longindex)) >= 0) { switch (ch) { + case 'a': + sdhost = optarg; + break; case 'd': sheepfs_debug = 1; break; @@ -284,6 +295,14 @@ int main(int argc, char **argv) case 'k': sheepfs_page_cache = 1; break; + case 'p': + sdport = strtol(optarg, NULL, 10); + if (sdport < 1 || sdport > UINT16_MAX) { + fprintf(stderr, + "Invalid port number '%s'\n", optarg); + exit(1); + } + break; default: usage(1); } diff --git a/sheepfs/node.c b/sheepfs/node.c index 328ee79..38472e7 100644 --- a/sheepfs/node.c +++ b/sheepfs/node.c @@ -54,9 +54,12 @@ int node_info_read(const char *path, char *buf, size_t size, off_t ignore) size_t node_info_get_size(const char *path) { - struct strbuf *buf = sheepfs_run_cmd("collie node info"); + struct strbuf *buf; size_t len; + char cmd[COMMAND_LEN]; + sprintf(cmd, "collie node info -a %s -p %d", sdhost, sdport); + buf = sheepfs_run_cmd(cmd); if (!buf) return 0; @@ -73,9 +76,12 @@ int node_list_read(const char *path, char *buf, size_t size, off_t ignore) size_t node_list_get_size(const char *path) { - struct strbuf *buf = sheepfs_run_cmd("collie node list"); + struct strbuf *buf; size_t len; + char cmd[COMMAND_LEN]; + sprintf(cmd, "collie node list -a %s -p %d", sdhost, sdport); + buf = sheepfs_run_cmd(cmd); if (!buf) return 0; diff --git a/sheepfs/sheepfs.h b/sheepfs/sheepfs.h index b8eb6cd..c17ec55 100644 --- a/sheepfs/sheepfs.h +++ b/sheepfs/sheepfs.h @@ -14,8 +14,12 @@ enum sheepfs_opcode { OP_VOLUME, }; +#define COMMAND_LEN 512 + extern char sheepfs_shadow[]; extern int sheepfs_page_cache; +extern const char *sdhost; +extern int sdport; extern struct strbuf *sheepfs_run_cmd(const char *command); extern int sheepfs_set_op(const char *path, unsigned opcode); diff --git a/sheepfs/vdi.c b/sheepfs/vdi.c index ccb241c..980dfaa 100644 --- a/sheepfs/vdi.c +++ b/sheepfs/vdi.c @@ -59,9 +59,12 @@ int vdi_list_read(const char *path, char *buf, size_t size, off_t ignore) size_t vdi_list_get_size(const char *path) { - struct strbuf *buf = sheepfs_run_cmd("collie vdi list"); + struct strbuf *buf; size_t len; + char cmd[COMMAND_LEN]; + sprintf(cmd, "collie vdi list -a %s -p %d", sdhost, sdport); + buf = sheepfs_run_cmd(cmd); if (!buf) return 0; diff --git a/sheepfs/volume.c b/sheepfs/volume.c index 8bce6e5..d56fcd1 100644 --- a/sheepfs/volume.c +++ b/sheepfs/volume.c @@ -336,7 +336,7 @@ static int setup_socket_pool(int array[], int len) int fd, i, ret; for (i = 0; i < len; i++) { - fd = connect_to("localhost", 7000); + fd = connect_to(sdhost, sdport); if (fd < 0) { syslog(LOG_ERR, "[%s] connect_to %m\n", __func__); destroy_socket_pool(array, --i); @@ -361,9 +361,10 @@ static int init_vdi_info(const char *entry, uint32_t *vid, size_t *size) struct strbuf *buf; void *inode_buf = NULL; struct vdi_inode *inode = NULL, *dummy; - char command[256] = { 0 }; + char command[COMMAND_LEN]; - sprintf(command, "%s %s\n", "collie vdi list -r", entry); + sprintf(command, "collie vdi list -r %s -a %s -p %d", + entry, sdhost, sdport); buf = sheepfs_run_cmd(command); if (!buf) return -1; -- 1.7.10.2 |