From: Matthew Dillon Date: Tue, 1 Jan 2008 00:57:57 +0000 (+0000) Subject: Add the 'hammer' utility. This is going to be a catch-all for various X-Git-Tag: v2.0.1~1509 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/0dfeb6c87221f675dbcd113059b1e49553a1c2a8 Add the 'hammer' utility. This is going to be a catch-all for various hammer functions. At the moment it is just a skeleton. hammer now - return timestamp suitable for historical access via [path]@@ --- diff --git a/sbin/hammer/Makefile b/sbin/hammer/Makefile new file mode 100644 index 0000000000..b8c9afd800 --- /dev/null +++ b/sbin/hammer/Makefile @@ -0,0 +1,10 @@ +# +# $DragonFly: src/sbin/hammer/Makefile,v 1.1 2008/01/01 00:57:57 dillon Exp $ + +PROG= hammer +SRCS= hammer.c +MAN= hammer.8 + +CFLAGS+= -I${.CURDIR}/../../sys -I${MOUNT} + +.include diff --git a/sbin/hammer/hammer.8 b/sbin/hammer/hammer.8 new file mode 100644 index 0000000000..09b910439c --- /dev/null +++ b/sbin/hammer/hammer.8 @@ -0,0 +1,81 @@ +.\" Copyright (c) 2007 The DragonFly Project. All rights reserved. +.\" +.\" This code is derived from software contributed to The DragonFly Project +.\" by Matthew Dillon +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. Neither the name of The DragonFly Project nor the names of its +.\" contributors may be used to endorse or promote products derived +.\" from this software without specific, prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, +.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $DragonFly: src/sbin/hammer/hammer.8,v 1.1 2008/01/01 00:57:57 dillon Exp $ +.Dd December 31, 2007 +.Dt HAMMER 8 +.Os +.Sh NAME +.Nm hammer +.Nd HAMMER file system utility +.Sh SYNOPSIS +.Nm +.Ar command +.Ar ... +.Sh DESCRIPTION +The +.Nm +utility provides miscellanious functions related to managing a HAMMER +filesystem. +.Pp +The options are as follows: +.Bl -tag -width indent +.It Fl h +Get help +.El +.Pp +The commands are as follows: +.Bl -tag -width indent +.It Ar now +Generate a timestamp suitable for use in the @@ filename extension, +representing right now. +.It Ar stamp +Generate a timestamp suitable for use in the @@ filename extension. +A time specification of +.Pf yyyymmdd Oo :hhmmss Oc Ns Op .fractional +specifies an exact as-of timestamp in local (not UTC) time. +Set the TZ environment variable prior to running +.Nm +if you wish to specify the time by some other means. +.El +.Sh EXAMPLES +.Sh DIAGNOSTICS +Exit status is 0 on success and 1 on error. +.Sh SEE ALSO +.Xr newfs_hammer 8 +.Sh HISTORY +The +.Nm +utility first appeared in +.Dx 1.11 . +.Sh AUTHORS +.An Matthew Dillon Aq dillon@backplane.com diff --git a/sbin/hammer/hammer.c b/sbin/hammer/hammer.c new file mode 100644 index 0000000000..c4cc9c705d --- /dev/null +++ b/sbin/hammer/hammer.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2007 The DragonFly Project. All rights reserved. + * + * This code is derived from software contributed to The DragonFly Project + * by Matthew Dillon + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of The DragonFly Project nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific, prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $DragonFly: src/sbin/hammer/hammer.c,v 1.1 2008/01/01 00:57:57 dillon Exp $ + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void hammer_parsetime(u_int64_t *tidp, const char *timestr); +static void usage(int exit_code); + +int +main(int ac, char **av) +{ + u_int64_t tid; + int ch; + + while ((ch = getopt(ac, av, "h")) != -1) { + switch(ch) { + case 'h': + usage(0); + /* not reached */ + default: + usage(1); + /* not reached */ + } + } + ac -= optind; + av += optind; + if (ac < 1) { + usage(1); + /* not reached */ + } + + if (strcmp(av[0], "now") == 0) { + hammer_parsetime(&tid, "0s"); + printf("0x%08x\n", (int)(tid / 1000000000LL)); + } else if (strcmp(av[0], "stamp") == 0) { + if (av[1] == NULL) + usage(1); + hammer_parsetime(&tid, av[1]); + printf("0x%08x\n", (int)(tid / 1000000000LL)); + } else { + usage(1); + /* not reached */ + } + return(0); +} + +/* + * Parse a timestamp for the mount point + * + * yyyymmddhhmmss + * -N[s/h/d/m/y] + */ +static +void +hammer_parsetime(u_int64_t *tidp, const char *timestr) +{ + struct tm tm; + time_t t; + int32_t n; + char c; + double seconds = 0; + + t = time(NULL); + + if (*timestr == 0) + usage(1); + + if (isalpha(timestr[strlen(timestr)-1])) { + if (sscanf(timestr, "%d%c", &n, &c) != 2) + usage(1); + switch(c) { + case 'Y': + n *= 365; + goto days; + case 'M': + n *= 30; + /* fall through */ + case 'D': + days: + n *= 24; + /* fall through */ + case 'h': + n *= 60; + /* fall through */ + case 'm': + n *= 60; + /* fall through */ + case 's': + t -= n; + break; + default: + usage(1); + } + } else { + localtime_r(&t, &tm); + seconds = (double)tm.tm_sec; + tm.tm_year -= 1900; + tm.tm_mon -= 1; + n = sscanf(timestr, "%4d%2d%2d:%2d%2d%lf", + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, + &tm.tm_hour, &tm.tm_min, &seconds); + tm.tm_mon += 1; + tm.tm_year += 1900; + tm.tm_sec = (int)seconds; + t = mktime(&tm); + } + localtime_r(&t, &tm); + *tidp = (u_int64_t)t * 1000000000 + + (seconds - (int)seconds) * 1000000000; +} + +static +void +usage(int exit_code) +{ + fprintf(stderr, + "hammer -h\n" + "hammer now\n" + "hammer stamp