socsvn commit: r239309 - soc2012/vchan/gtcp/bwalex-tc-play
vchan at FreeBSD.org
vchan at FreeBSD.org
Thu Jul 12 16:53:41 UTC 2012
Author: vchan
Date: Thu Jul 12 16:53:38 2012
New Revision: 239309
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239309
Log:
whole lotta changes to tcplay
Modified:
soc2012/vchan/gtcp/bwalex-tc-play/Makefile
soc2012/vchan/gtcp/bwalex-tc-play/tcplay.c
Modified: soc2012/vchan/gtcp/bwalex-tc-play/Makefile
==============================================================================
--- soc2012/vchan/gtcp/bwalex-tc-play/Makefile Thu Jul 12 16:49:50 2012 (r239308)
+++ soc2012/vchan/gtcp/bwalex-tc-play/Makefile Thu Jul 12 16:53:38 2012 (r239309)
@@ -21,7 +21,7 @@
OBJS= tcplay.o crc32.o safe_mem.o io.o hdr.o humanize.o
OBJS+= crypto.o generic_xts.o
-CFLAGS+= $(WARNFLAGS) -I/usr/include
+CFLAGS+= $(WARNFLAGS) -I/usr/include -I/usr/local/include
ifeq (${DEBUG}, yes)
CFLAGS+= -O0 -g -DDEBUG
Modified: soc2012/vchan/gtcp/bwalex-tc-play/tcplay.c
==============================================================================
--- soc2012/vchan/gtcp/bwalex-tc-play/tcplay.c Thu Jul 12 16:49:50 2012 (r239308)
+++ soc2012/vchan/gtcp/bwalex-tc-play/tcplay.c Thu Jul 12 16:53:38 2012 (r239309)
@@ -31,6 +31,7 @@
//#if defined(__DragonFly__)
#include <sys/param.h>
+
//#endif
#include <stdio.h>
@@ -42,12 +43,24 @@
#include <string.h>
#include <err.h>
#include <time.h>
+
//#if defined(__linux__)
//#include <libdevmapper.h>
//#include <uuid/uuid.h>
//#elif defined(__DragonFly__)
//#include <libdm.h>
#include <uuid.h>
+
+//FreeBSD specific headers
+#include <stdint.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <sys/time.h>
+#include <sys/bio.h>
+#include <sys/disk.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/syslog.h>
#include <geom/gate/g_gate.h>
#include <ggate.h>
@@ -71,6 +84,7 @@
/* new for FreeBSD */
static int unit = G_GATE_UNIT_AUTO;
static int force = 0;
+static unsigned sectorsize = 0;
void
tc_log(int is_err, const char *fmt, ...)
@@ -926,41 +940,98 @@
return -1;
}
+/* not correct yet
int
-map_volume(const char *map_name, int sflag,
- int interactive, time_t timeout)
-
+map_volume(int fd, int interactive)
{
- struct g_gate_ctl_create ggioc;
- int fd;
+ struct g_gate_ctl_io ggio;
+ size_t bsize;
+
+ if (g_gate_verbose == 0) {
+ if (daemon(0, 0) == -1) {
+ g_gate_destroy(unit, 1);
+ err(EXIT_FAILURE, "Cannot daemonize");
+ }
+ }
+ g_gate_log(LOG_DEBUG, "Worker created: %u.", getpid());
+ ggio.gctl_version = G_GATE_VERSION;
+ ggio.gctl_unit = unit;
+ bsize = sectorsize;
+ ggio.gctl_data = malloc(bsize);
+ for (;;) {
+ int error;
+once_again:
+ ggio.gctl_length = bsize;
+ ggio.gctl_error = 0;
+ g_gate_ioctl(G_GATE_CMD_START, &ggio);
+ error = ggio.gctl_error;
+ switch (error) {
+ case 0:
+ break;
+ case ECANCELED:
+ /* Exit gracefully.
+ free(ggio.gctl_data);
+ g_gate_close_device();
+ close(fd);
+ exit(EXIT_SUCCESS);
+ case ENOMEM:
+ /* Buffer too small.
+ assert(ggio.gctl_cmd == BIO_DELETE ||
+ ggio.gctl_cmd == BIO_WRITE);
+ ggio.gctl_data = realloc(ggio.gctl_data,
+ ggio.gctl_length);
+ if (ggio.gctl_data != NULL) {
+ bsize = ggio.gctl_length;
+ goto once_again;
+ }
+ /* FALLTHROUGH
+ case ENXIO:
+ default:
+ g_gate_xlog("ioctl(/dev/%s): %s.", G_GATE_CTL_NAME,
+ strerror(error));
+ }
+
+ error = 0;
+ switch (ggio.gctl_cmd) {
+ case BIO_READ:
+ if ((size_t)ggio.gctl_length > bsize) {
+ ggio.gctl_data = realloc(ggio.gctl_data,
+ ggio.gctl_length);
+ if (ggio.gctl_data != NULL)
+ bsize = ggio.gctl_length;
+ else
+ error = ENOMEM;
+ }
+ if (error == 0) {
+ if (pread(fd, ggio.gctl_data, ggio.gctl_length,
+ ggio.gctl_offset) == -1) {
+ error = errno;
+ }
+ }
+ break;
+ case BIO_DELETE:
+ case BIO_WRITE:
+ if (pwrite(fd, ggio.gctl_data, ggio.gctl_length,
+ ggio.gctl_offset) == -1) {
+ error = errno;
+ }
+ break;
+ default:
+ error = EOPNOTSUPP;
+ }
+
+ ggio.gctl_error = error;
+ g_gate_ioctl(G_GATE_CMD_DONE, &ggio);
+ }
- fd = open(map_name, g_gate_openflags(sflags) | O_DIRECT | O_FSYNC);
- if (fd == -1)
- err(EXIT_FAILURE, "Cannot open %s", map_name);
- ggioc.gctl_version = G_GATE_VERSION;
- ggioc.gctl_unit = unit;
- ggioc.gctl_mediasize = g_gate_mediasize(fd);
- if (sectorsize == 0)
- sectorsize = g_gate_sectorsize(fd);
- ggioc.gctl_sectorsize = sectorsize;
- ggioc.gctl_timeout = timeout;
- ggioc.gctl_flags = sflags;
- ggioc.gctl_maxcount = 0;
- strlcpy(ggioc.gctl_info, map_name, sizeof(ggioc.gctl_info));
- g_gate_ioctl(G_GATE_CMD_CREATE, &ggioc);
- if (unit == -1)
- printf("%s%u\n", G_GATE_PROVIDER_NAME, ggioc.gctl_unit);
- unit = ggioc.gctl_unit;
- g_gatel_serve(fd);
-}
if (interactive)
printf("All ok!\n");
return 0;
-}
-/*
+}*/
+
int
map_volume(const char *map_name, const char *device, int sflag,
const char *sys_dev, int protect_hidden, const char *keyfiles[],
@@ -971,6 +1042,7 @@
{
struct tcplay_info *info;
int error;
+ int fd;
info = info_map_common(device, sflag, sys_dev, protect_hidden,
keyfiles, nkeyfiles, h_keyfiles, n_hkeyfiles,
@@ -979,7 +1051,7 @@
if (info == NULL)
return -1;
- if ((error = dm_setup(map_name, info)) != 0) {
+ if ((error = dm_setup(fd, info)) != 0) {
tc_log(1, "Could not set up mapping %s\n", map_name);
if (info->hdr)
free_safe_mem(info->hdr);
@@ -994,7 +1066,7 @@
return 0;
}
-*/
+
static
int
@@ -1038,7 +1110,7 @@
}
int
-dm_setup(const char *mapname, struct tcplay_info *info)
+dm_setup(int fd, struct tcplay_info *info)
{
/* Commented out variables not needed in freeBSD*/
struct tc_cipher_chain *cipher_chain;
@@ -1080,7 +1152,7 @@
cipher_chain = cipher_chain->prev, j++) {
cookie = 0;
- force = 1; //used in g_gate_destroy
+ //force = 1; used in g_gate_destroy
/* aes-cbc-essiv:sha256 7997f8af... 0 /dev/ad0s0a 8 */
/* iv off---^ block off--^ */
@@ -1101,18 +1173,18 @@
/*
* If this is the last element in the cipher chain, use the
* final map name. Otherwise pick a secondary name...
- */
+
if (cipher_chain->prev == NULL)
strcpy(map, mapname);
else
sprintf(map, "%s.%d", mapname, j);
- /* changed from, "if ((dm_task_set_name(dmt, map)) == 0" */
+ /* changed from, "if ((dm_task_set_name(dmt, map)) == 0"
if (map == NULL) {
tc_log(1, "task_set_name failed\n");
ret = -1;
goto out;
- }
+ }*/
/*#if defined(__linux__)
uuid_generate(info->uuid);
@@ -1175,8 +1247,89 @@
dm_udev_wait(cookie);
*/
+//FreeBSD
+
+ struct g_gate_ctl_io ggio;
+ size_t bsize;
- if ((r = asprintf(&uu_stack[uu_stack_idx++], "%s", map)) < 0)
+ if (g_gate_verbose == 0) {
+ if (daemon(0, 0) == -1) {
+ g_gate_destroy(unit, 1);
+ err(EXIT_FAILURE, "Cannot daemonize");
+ }
+ }
+ g_gate_log(LOG_DEBUG, "Worker created: %u.", getpid());
+ ggio.gctl_version = G_GATE_VERSION;
+ ggio.gctl_unit = unit;
+ bsize = sectorsize;
+ ggio.gctl_data = malloc(bsize);
+ for (;;) {
+ int error;
+once_again:
+ ggio.gctl_length = bsize;
+ ggio.gctl_error = 0;
+ g_gate_ioctl(G_GATE_CMD_START, &ggio);
+ error = ggio.gctl_error;
+ switch (error) {
+ case 0:
+ break;
+ case ECANCELED:
+ /* Exit gracefully. */
+ free(ggio.gctl_data);
+ g_gate_close_device();
+ close(fd);
+ exit(EXIT_SUCCESS);
+ case ENOMEM:
+ /* Buffer too small. */
+ assert(ggio.gctl_cmd == BIO_DELETE ||
+ ggio.gctl_cmd == BIO_WRITE);
+ ggio.gctl_data = realloc(ggio.gctl_data,
+ ggio.gctl_length);
+ if (ggio.gctl_data != NULL) {
+ bsize = ggio.gctl_length;
+ goto once_again;
+ }
+ /* FALLTHROUGH */
+ case ENXIO:
+ default:
+ g_gate_xlog("ioctl(/dev/%s): %s.", G_GATE_CTL_NAME,
+ strerror(error));
+ }
+
+ error = 0;
+ switch (ggio.gctl_cmd) {
+ case BIO_READ:
+ if ((size_t)ggio.gctl_length > bsize) {
+ ggio.gctl_data = realloc(ggio.gctl_data,
+ ggio.gctl_length);
+ if (ggio.gctl_data != NULL)
+ bsize = ggio.gctl_length;
+ else
+ error = ENOMEM;
+ }
+ if (error == 0) {
+ if (pread(fd, ggio.gctl_data, ggio.gctl_length,
+ ggio.gctl_offset) == -1) {
+ error = errno;
+ }
+ }
+ break;
+ case BIO_DELETE:
+ case BIO_WRITE:
+ if (pwrite(fd, ggio.gctl_data, ggio.gctl_length,
+ ggio.gctl_offset) == -1) {
+ error = errno;
+ }
+ break;
+ default:
+ error = EOPNOTSUPP;
+ }
+
+ ggio.gctl_error = error;
+ g_gate_ioctl(G_GATE_CMD_DONE, &ggio);
+ }
+
+/* if ((r = asprintf(&uu_stack[uu_stack_idx++], "%s", map)) < 0)
tc_log(1, "warning, asprintf failed. won't be able to "
"unroll changes\n");
@@ -1185,15 +1338,15 @@
start = 0;
sprintf(dev, "/dev/mapper/%s.%d", mapname, j);
- g_gate_destroy(unit, force); /* was dm_task_destroy(dmt); */
- /*not needed in FreeBSD dm_task_update_nodes(); */
+ /* was dm_task_destroy(dmt);
+ /*not needed in FreeBSD dm_task_update_nodes();
}
out:
/*
* If an error occured, try to unroll changes made before it
* happened.
- */
+
if (ret) {
j = uu_stack_idx;
while (j > 0) {
@@ -1209,7 +1362,7 @@
}
}
}
-
+*/
while (uu_stack_idx > 0)
free(uu_stack[--uu_stack_idx]);
More information about the svn-soc-all
mailing list