[DRBD-cvs] r1591 - trunk/user
svn at svn.drbd.org
svn at svn.drbd.org
Fri Oct 15 17:26:30 CEST 2004
Author: phil
Date: 2004-10-15 17:26:27 +0200 (Fri, 15 Oct 2004)
New Revision: 1591
Modified:
trunk/user/drbdadm_main.c
trunk/user/drbdmeta.c
trunk/user/drbdsetup.c
trunk/user/drbdtool_common.c
trunk/user/drbdtool_common.h
Log:
Now drbdmeta compiles and can print its usage...
Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c 2004-10-14 13:32:57 UTC (rev 1590)
+++ trunk/user/drbdadm_main.c 2004-10-15 15:26:27 UTC (rev 1591)
@@ -43,7 +43,7 @@
#include <getopt.h>
#include <signal.h>
#include <time.h>
-
+#include "drbdtool_common.h"
#include "drbdadm.h"
static int indent = 0;
@@ -139,9 +139,6 @@
{ "sh-md-idx", sh_md_idx, 0 ,0,1 }
};
-
-#define ARRY_SIZE(A) (sizeof(A)/sizeof(A[0]))
-
/*** These functions are used to the print the config ***/
static char* esc(char* str)
@@ -813,25 +810,6 @@
return 0;
}
-const char* make_optstring(struct option *options)
-{
- static char buffer[200];
- static struct option* buffer_valid_for=NULL;
- struct option *opt;
- char *c;
-
- if(options==buffer_valid_for) return buffer;
- opt=buffer_valid_for=options;
- c=buffer;
- while(opt->name) {
- *c++=opt->val;
- if(opt->has_arg) *c++=':';
- opt++;
- }
- *c=0;
- return buffer;
-}
-
void print_usage()
{
int i;
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2004-10-14 13:32:57 UTC (rev 1590)
+++ trunk/user/drbdmeta.c 2004-10-15 15:26:27 UTC (rev 1591)
@@ -21,15 +21,28 @@
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#include <unistd.h>
#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <glib.h> // gint32, GINT64_FROM_BE()
#include "drbdtool_common.h"
-#include <glib.h> // gint32, GINT64_FROM_BE()
#define ALIGN(x,a) ( ((x) + (a)-1) &~ ((a)-1) )
-char* basename = 0;
+#if G_MAXLONG == 0x7FFFFFFF
+#define LN2_BPL 5
+#elif G_MAXLONG == 0x7FFFFFFFFFFFFFFF
+#define LN2_BPL 6
+#else
+#error "LN2 of BITS_PER_LONG unknown!"
+#endif
+char* progname = 0;
+
enum MetaDataFlags {
__MDF_Consistent,
__MDF_PrimaryInd,
@@ -51,13 +64,13 @@
};
struct meta_data {
- guint32 gc[GEN_CNT_SIZE]; // v06
-
- guint64 la_size; // v07
- int bm_size; // v07
- unsigned long *bitmap; // v07
- int al_size; // v07
- unsigned int *act_log; // v07
+ guint32 gc[GEN_CNT_SIZE]; // v06
+
+ guint64 la_size; // v07
+ int bm_size; // v07
+ unsigned long *bitmap; // v07
+ int al_size; // v07
+ unsigned int *act_log; // v07
};
struct meta_data_on_disk_07 {
@@ -71,159 +84,274 @@
};
struct conf_06 {
- int fd;
- int minor;
+ int fd;
+ int minor;
};
struct conf_07 {
- int fd;
- char *device_name;
- int index;
+ int fd;
+ char *device_name;
+ int index;
};
typedef void* conf_t;
-struct version {
- const char* name;
- int (* parse)(conf_t, char **argv);
- int (* open) (conf_t);
- int (* close)(conf_t);
- struct meta_data * (* alloc) (conf_t);
- void (* free) (conf_t, struct meta_data *);
- int (* read) (conf_t, struct meta_data *);
- int (* write)(conf_t, struct meta_data *);
+struct format {
+ const char* name;
+ char** args;
+ int conf_size;
+ int (* parse)(conf_t, char **argv, int*);
+ int (* open) (conf_t);
+ int (* close)(conf_t);
+ int (* read) (conf_t, struct meta_data *);
+ int (* write)(conf_t, struct meta_data *);
};
-struct meta_cmd {
- const char* name;
- int (* function)(void *,char* );
- int show_in_usage;
-};
-
-int meta_dump(void* v, char* c)
-{
- return 0;
-}
-
-struct meta_cmd cmds[] = {
- { "dump", meta_dump, 1 }
-};
-
-int v07_parse(conf_t config, char **argv);
+int v07_parse(conf_t config, char **argv, int *ai);
int v07_open(conf_t config);
int v07_close(conf_t config);
-struct meta_data * vxx_alloc(conf_t config);
-void vxx_free(conf_t config, struct meta_data * m);
int v07_read(conf_t config, struct meta_data *);
int v07_write(conf_t config, struct meta_data *);
-struct version versions[] = {
- { "v07",v07_parse,v07_open,v07_close,vxx_alloc,vxx_free,v07_read,v07_write},
+struct format formats[] = {
+ { "v07",
+ (char *[]) { "device","index",0 },
+ sizeof(struct conf_07),
+ v07_parse,
+ v07_open,
+ v07_close,
+ v07_read,
+ v07_write
+ }
};
/* capacity in units of 512 byte (AKA sectors)
*/
int bm_words(unsigned long capacity)
{
- unsigned long bits;
- int words;
+ unsigned long bits;
+ int words;
- //bits = ALIGN(capacity,BM_SECTORS_PER_BIT) >> (BM_BLOCK_SIZE_B-9);
- bits = ALIGN(capacity,8) >> 3;
- words = ALIGN(bits,64) >> LN2_BPL;
+ //bits = ALIGN(capacity,BM_SECTORS_PER_BIT) >> (BM_BLOCK_SIZE_B-9);
+ bits = ALIGN(capacity,8) >> 3;
+ words = ALIGN(bits,64) >> LN2_BPL;
- return words;
+ return words;
}
-int v07_parse(conf_t config, char **argv)
+int v07_parse(conf_t config, char **argv, int *ai)
{
- struct conf_07* cfg = (struct conf_07*) config;
- char *e;
+ struct conf_07* cfg = (struct conf_07*) config;
+ char *e;
- cfg.device_name = strdup(argv[0]);
- e = argv[1];
- cfg.index = strtol(argv[1],&e,0);
- if(*e != 0) {
- fprintf(stderr,"'%s' is not a valid index number.\n",argv[1]);
- return 0;
- }
- return 1;
+ cfg->device_name = strdup(argv[0]);
+ e = argv[1];
+ cfg->index = strtol(argv[1],&e,0);
+ if(*e != 0) {
+ fprintf(stderr,"'%s' is not a valid index number.\n",argv[1]);
+ return 0;
+ }
+
+ *ai+=2;
+
+ return 1;
}
int v07_open(conf_t config)
{
- struct conf_07* cfg = (struct conf_07*) config;
+ struct conf_07* cfg = (struct conf_07*) config;
- cfg.fd = open(cfg.device_name,O_RDWR);
+ cfg->fd = open(cfg->device_name,O_RDWR);
- return (cfg.fd != -1) ;
+ return (cfg->fd != -1) ;
}
int v07_close(conf_t config)
{
- struct conf_07* cfg = (struct conf_07*) config;
+ struct conf_07* cfg = (struct conf_07*) config;
- return close(cfg.fd) == 0;
+ return close(cfg->fd) == 0;
}
-struct meta_data * vxx_alloc(conf_t config)
+struct meta_data * md_alloc()
{
- struct meta_data *m;
+ struct meta_data *m;
- m = malloc(sizeof(struct meta_data ));
- memset(m,sizeof(struct meta_data ),1);
+ m = malloc(sizeof(struct meta_data ));
+ memset(m,sizeof(struct meta_data ),1);
- return m;
+ return m;
}
-void vxx_free(conf_t config, struct meta_data * m)
+void md_free(struct meta_data * m)
{
- struct meta_data *m;
- if(m->bitmap) free(m->bitmap);
- if(m->act_log) free(m->act_log);
+ if(m->bitmap) free(m->bitmap);
+ if(m->act_log) free(m->act_log);
- free(m);
+ free(m);
}
int v07_read(conf_t config, struct meta_data * m)
{
- struct meta_data_on_disk * buffer;
- int rr,i,bmw;
+ struct conf_07* cfg = (struct conf_07*) config;
+ struct meta_data_on_disk_07 * buffer;
+ int rr,i,bmw;
- buffer = malloc(sizeof(struct meta_data_on_disk));
+ buffer = malloc(sizeof(struct meta_data_on_disk_07));
- rr = read(cfg.fd, buffer, sizeof(struct meta_data_on_disk));
- if( rr != sizeof(struct meta_data_on_disk)) {
- PERROR("read failed");
- exit(20);
- }
+ rr = read(cfg->fd, buffer, sizeof(struct meta_data_on_disk_07));
+ if( rr != sizeof(struct meta_data_on_disk_07)) {
+ PERROR("read failed");
+ exit(20);
+ }
- for (i = Flags; i < GEN_CNT_SIZE; i++)
- m->gc[i] = GINT32_FROM_BE(buffer->gc[Flags]);
+ for (i = Flags; i < GEN_CNT_SIZE; i++)
+ m->gc[i] = GINT32_FROM_BE(buffer->gc[Flags]);
- m->la_size = GINT64_FROM_BE(buffer->la_size);
- bmw = bm_words(m->la_size);
+ m->la_size = GINT64_FROM_BE(buffer->la_size);
+ bmw = bm_words(m->la_size);
-
+ return 1;
}
-int v07_write(conf_t config)
+int v07_write(conf_t config, struct meta_data * m)
{
+ return 0;
}
+struct meta_cmd {
+ const char* name;
+ const char* args;
+ int (* function)(struct format*, conf_t);
+ int show_in_usage;
+};
+int meta_show_gc(struct format* fmt, conf_t fcfg)
+{
+ struct meta_data* md;
+ char ppb[10];
+
+ md = md_alloc();
+
+ fmt->open(fcfg);
+ fmt->read(fcfg,md);
+ printf(
+ " WantFullSync |\n"
+ " ConnectedInd | |\n"
+ " lastState | | |\n"
+ " ArbitraryCnt | | | |\n"
+ " ConnectedCnt | | | | |\n"
+ " TimeoutCnt | | | | | |\n"
+ " HumanCnt | | | | | | |\n"
+ "Consistent | | | | | | | | Size\n"
+ " --------+-----+-----+-----+-----+-----+-----+-----+------------------+\n"
+ " %3s | %3d | %3d | %3d | %3d | %3s | %3s | %3s | %s\n",
+ md->gc[Flags] & MDF_Consistent ? "1/c" : "0/i",
+ md->gc[HumanCnt],
+ md->gc[TimeoutCnt],
+ md->gc[ConnectedCnt],
+ md->gc[ArbitraryCnt],
+ md->gc[Flags] & MDF_PrimaryInd ? "1/p" : "0/s",
+ md->gc[Flags] & MDF_ConnectedInd ? "1/c" : "0/n",
+ md->gc[Flags] & MDF_FullSync ? "1/y" : "0/n",
+ ppsize(ppb,md->la_size));
+
+ fmt->close(fcfg);
+
+ md_free(md);
+
+ return 1;
+}
+
+int meta_create_md(struct format* fmt, conf_t fcfg) { return 0; }
+int meta_dump_md(struct format* fmt, conf_t fcfg) { return 0; }
+int meta_convert_md(struct format* fmt, conf_t fcfg) { return 0; }
+int meta_modify_gc(struct format* fmt, conf_t fcfg) { return 0; }
+
+struct meta_cmd cmds[] = {
+ { "create-md", 0, meta_create_md, 1 },
+ { "show-gc", 0, meta_show_gc, 1 },
+ { "dump-md", 0, meta_dump_md, 1 },
+ { "convert-md", "FORMAT [FORMAT ARGS...]", meta_convert_md, 1 },
+ { "modify-gc", "ID=VAL ...", meta_modify_gc, 0 }
+};
+
+void print_usage()
+{
+ int i;
+ char **args;
+
+ printf("\nUSAGE: %s DEVICE FORMAT [FORMAT ARGS...] COMMAND [CMD ARGS...]\n"
+ ,progname);
+
+ printf("\nFORMATS:\n");
+ for (i = 0; i < ARRY_SIZE(formats); i++ ) {
+ printf(" %s",formats[i].name);
+ if ((args = formats[i].args)) {
+ while(*args) {
+ printf(" %s",*args++);
+ }
+ }
+ printf("\n");
+ }
+
+ printf("\nCOMMANDS:\n");
+ for (i = 0; i < ARRY_SIZE(cmds); i++ ) {
+ if(!cmds[i].show_in_usage) continue;
+ printf(" %s %s\n",cmds[i].name,
+ cmds[i].args ? cmds[i].args : "" );
+ }
+
+ exit(0);
+}
+
int main(int argc, char** argv)
{
- int drbd_fd;
+ int i,ai,drbd_fd;
+ struct format* fmt = NULL;
+ struct meta_cmd* command = NULL;
+ conf_t fcfg;
- if ( (basename = strrchr(argv[0],'/')) )
- argv[0] = ++basename;
- else
- basename = argv[0];
+ if ( (progname = strrchr(argv[0],'/')) ) {
+ argv[0] = ++progname;
+ } else {
+ progname = argv[0];
+ }
- chdir("/");
+ if (argc < 4) print_usage();
- drbd_fd=dt_open_drbd_device(device); // This creates the lock file.
+ ai = 1;
+ drbd_fd=dt_open_drbd_device(argv[ai++]); // This creates the lock file.
+
+ for (i = 0; i < ARRY_SIZE(formats); i++ ) {
+ if( !strcmp(formats[i].name,argv[ai]) ) {
+ fmt = formats+i;
+ break;
+ }
+ }
+ if(fmt == NULL) {
+ fprintf(stderr,"Unknown format '%s'.\n",argv[ai]);
+ }
+ ai++;
+
+ fcfg = malloc(fmt->conf_size);
+ fmt->parse(fcfg,argv+2,&ai);
+
+ for (i = 0; i < ARRY_SIZE(cmds); i++ ) {
+ if( !strcmp(cmds[i].name,argv[ai]) ) {
+ command = cmds+i;
+ break;
+ }
+ }
+ if(command == NULL) {
+ fprintf(stderr,"Unknown command '%s'.\n",argv[ai]);
+ }
+ ai++;
+
+ command->function(fmt,fcfg);
+
+ dt_close_drbd_device(drbd_fd);
+ return 0;
}
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2004-10-14 13:32:57 UTC (rev 1590)
+++ trunk/user/drbdsetup.c 2004-10-15 15:26:27 UTC (rev 1591)
@@ -49,8 +49,6 @@
#include <mntent.h>
#include "drbdtool_common.h"
-#define ARRY_SIZE(A) (sizeof(A)/sizeof(A[0]))
-
/* Default values */
#define DEF_NET_TIMEOUT 60 // 6 seconds
#define DEF_NET_TRY_CON_I 10 // 10 seconds
@@ -220,27 +218,6 @@
return s;
}
-const char* make_optstring(struct option *options)
-{
- static char buffer[200];
- static struct option* buffer_valid_for=NULL;
- struct option *opt;
- char *c;
-
- if(options==buffer_valid_for) return buffer;
- opt=buffer_valid_for=options;
- c=buffer;
- *c++='-';
- while(opt->name)
- {
- *c++=opt->val;
- if(opt->has_arg) *c++=':';
- opt++;
- }
- *c=0;
- return buffer;
-}
-
int port_part(const char* s)
{
char *b;
Modified: trunk/user/drbdtool_common.c
===================================================================
--- trunk/user/drbdtool_common.c 2004-10-14 13:32:57 UTC (rev 1590)
+++ trunk/user/drbdtool_common.c 2004-10-15 15:26:27 UTC (rev 1591)
@@ -6,9 +6,46 @@
#include <errno.h>
#include <signal.h>
#include <stdio.h>
+#define _GNU_SOURCE
+#include <getopt.h>
#include <stdlib.h>
#include "drbdtool_common.h"
+char* ppsize(char* buf, size_t size)
+{
+ // Needs 9 bytes at max.
+ static char units[] = { 'K','M','G','T' };
+ int base = 0;
+ while (size >= 10000 ) {
+ size = size >> 10;
+ base++;
+ }
+ sprintf(buf,"%d %cB",size,units[base]);
+
+ return buf;
+}
+
+const char* make_optstring(struct option *options)
+{
+ static char buffer[200];
+ static struct option* buffer_valid_for=NULL;
+ struct option *opt;
+ char *c;
+
+ if(options==buffer_valid_for) return buffer;
+ opt=buffer_valid_for=options;
+ c=buffer;
+ *c++='-';
+ while(opt->name)
+ {
+ *c++=opt->val;
+ if(opt->has_arg) *c++=':';
+ opt++;
+ }
+ *c=0;
+ return buffer;
+}
+
unsigned long m_strtol(const char* s,int def_mult)
{
char *e = (char*)s;
@@ -69,24 +106,6 @@
fclose(fi);
}
-void dt_release_lockfile(int drbd_fd)
-{
- int err;
- struct stat drbd_stat;
- char lfname[40];
-
- err=fstat(drbd_fd, &drbd_stat);
- if(err)
- {
- PERROR("fstat() failed");
- }
-
- snprintf(lfname,39,"/var/lock/drbd-%d-%d.pid",
- major(drbd_stat.st_dev),minor(drbd_stat.st_dev));
-
- remove(lfname);
-}
-
int dt_open_drbd_device(const char* device)
{
int drbd_fd,err;
@@ -115,3 +134,27 @@
return drbd_fd;
}
+
+void dt_release_lockfile(int drbd_fd)
+{
+ int err;
+ struct stat drbd_stat;
+ char lfname[40];
+
+ err=fstat(drbd_fd, &drbd_stat);
+ if(err)
+ {
+ PERROR("fstat() failed");
+ }
+
+ snprintf(lfname,39,"/var/lock/drbd-%d-%d.pid",
+ major(drbd_stat.st_dev),minor(drbd_stat.st_dev));
+
+ remove(lfname);
+}
+
+int dt_close_drbd_device(int drbd_fd)
+{
+ dt_release_lockfile(drbd_fd);
+ return close(drbd_fd);
+}
Modified: trunk/user/drbdtool_common.h
===================================================================
--- trunk/user/drbdtool_common.h 2004-10-14 13:32:57 UTC (rev 1590)
+++ trunk/user/drbdtool_common.h 2004-10-15 15:26:27 UTC (rev 1591)
@@ -1,11 +1,19 @@
#ifndef DRBDTOOL_COMMON_H
#define DRBDTOOL_COMMON_H
+#define ARRY_SIZE(A) (sizeof(A)/sizeof(A[0]))
+
#define PERROR(fmt, args...) \
do { fprintf(stderr,fmt ": " , ##args); perror(0); } while (0)
+struct option;
+
extern void dt_release_lockfile(int drbd_fd);
extern int dt_open_drbd_device(const char* device);
+extern int dt_close_drbd_device(int drbd_fd);
extern unsigned long m_strtol(const char* s,int def_mult);
+const char* make_optstring(struct option *options);
+char* ppsize(char* buf, size_t size);
#endif
+
More information about the drbd-cvs
mailing list