aboutsummaryrefslogtreecommitdiffstats
path: root/diskdev_cmds/fdisk.tproj/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'diskdev_cmds/fdisk.tproj/misc.c')
-rw-r--r--diskdev_cmds/fdisk.tproj/misc.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/diskdev_cmds/fdisk.tproj/misc.c b/diskdev_cmds/fdisk.tproj/misc.c
new file mode 100644
index 0000000..a477001
--- /dev/null
+++ b/diskdev_cmds/fdisk.tproj/misc.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+
+/*
+ * Copyright (c) 1997 Tobias Weingartner
+ * All rights reserved.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Tobias Weingartner.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "misc.h"
+
+
+int
+ask_cmd(cmd_t *cmd)
+{
+ char lbuf[100], *cp, *buf;
+
+ /* Get input */
+ if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
+ errx(1, "eof");
+ lbuf[strlen(lbuf)-1] = '\0';
+
+ /* Parse input */
+ buf = lbuf;
+ buf = &buf[strspn(buf, " \t")];
+ cp = &buf[strcspn(buf, " \t")];
+ *cp++ = '\0';
+ strncpy(cmd->cmd, buf, 10);
+ buf = &cp[strspn(cp, " \t")];
+ strncpy(cmd->args, buf, 100);
+
+ return (0);
+}
+
+int
+ask_num(const char *str, int flags, unsigned int dflt, unsigned int low, unsigned int high, void (*help) __P((void)))
+{
+ char lbuf[100], *cp;
+ unsigned int num;
+
+ do {
+again:
+ num = dflt;
+ if (flags == ASK_HEX)
+ printf("%s [%X - %X]: [%X] ", str, low, high, num);
+ else
+ printf("%s [%u - %u]: [%u] ", str, low, high, num);
+ if (help)
+ printf("(? for help) ");
+
+ if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
+ errx(1, "eof");
+ lbuf[strlen(lbuf)-1] = '\0';
+
+ if (help && lbuf[0] == '?') {
+ (*help)();
+ goto again;
+ }
+
+ /* Convert */
+ cp = lbuf;
+ num = strtoul(lbuf, &cp, ((flags==ASK_HEX)?16:10));
+
+ /* Make sure only number present */
+ if (cp == lbuf)
+ num = dflt;
+ if (*cp != '\0') {
+ printf("'%s' is not a valid number.\n", lbuf);
+ num = low - 1;
+ } else if (num < low || num > high) {
+ printf("'%u' is out of range.\n", num);
+ }
+ } while (num < low || num > high);
+
+ return (num);
+}
+
+int
+ask_yn(const char *str, int default_answer)
+{
+ int ch, first;
+
+ printf("%s [%c] ", str, default_answer ? 'y' : 'n');
+ fflush(stdout);
+
+ first = ch = getchar();
+ while (ch != '\n' && ch != EOF)
+ ch = getchar();
+
+ if (ch == EOF || first == EOF)
+ errx(1, "eof");
+
+ if (first == '\n')
+ return default_answer;
+
+ return (first == 'y' || first == 'Y');
+}
+
+u_int16_t
+getshort(void *p)
+{
+ unsigned char *cp = p;
+
+ return (cp[0] | (cp[1] << 8));
+}
+
+void
+putshort(void *p, u_int16_t l)
+{
+ unsigned char *cp = p;
+
+ *cp++ = l;
+ *cp++ = l >> 8;
+}
+
+u_int32_t
+getlong(void *p)
+{
+ unsigned char *cp = p;
+
+ return (cp[0] | (cp[1] << 8) | (cp[2] << 16) | (cp[3] << 24));
+}
+
+void
+putlong(void *p, u_int32_t l)
+{
+ unsigned char *cp = p;
+
+ *cp++ = l;
+ *cp++ = l >> 8;
+ *cp++ = l >> 16;
+ *cp++ = l >> 24;
+}