[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