]> git.saurik.com Git - apple/security.git/blobdiff - SecurityTool/macOS/db_commands.cpp
Security-59306.11.20.tar.gz
[apple/security.git] / SecurityTool / macOS / db_commands.cpp
diff --git a/SecurityTool/macOS/db_commands.cpp b/SecurityTool/macOS/db_commands.cpp
new file mode 100644 (file)
index 0000000..381501f
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2003-2005,2012,2014 Apple 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@
+ *
+ * db_commands.cpp -- commands to directly manipulate Db's using the DL API.
+ */
+
+#include "db_commands.h"
+
+#include "readline_cssm.h"
+#include "security_tool.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <security_cdsa_client/dlclient.h>
+
+using namespace CssmClient;
+
+static int
+do_db_create(const CSSM_GUID guid, const char *dbname, Boolean do_openparams, Boolean do_autocommit, Boolean do_mode, mode_t mode, Boolean do_version_0_params)
+{
+       int result = 0;
+
+       try
+       {
+               CSSM_APPLEDL_OPEN_PARAMETERS openParameters = { sizeof(CSSM_APPLEDL_OPEN_PARAMETERS),
+                       (do_version_0_params ? 0 : CSSM_APPLEDL_OPEN_PARAMETERS_VERSION) };
+               Cssm cssm;
+               Module module(guid, cssm);
+               DL dl(module);
+               Db db(dl, dbname);
+
+               if (do_openparams)
+               {
+                       openParameters.autoCommit = do_autocommit;
+                       if (!do_version_0_params && do_mode)
+                       {
+                               openParameters.mask |= kCSSM_APPLEDL_MASK_MODE;
+                               openParameters.mode = mode;
+                       }
+
+                       db->openParameters(&openParameters);
+               }
+
+               db->create();
+       }
+       catch (const CommonError &e)
+       {
+               OSStatus status = e.osStatus();
+               sec_error("CSSM_DbCreate %s: %s", dbname, sec_errstr(status));
+       }
+       catch (...)
+       {
+               result = 1;
+       }
+
+       return result;
+}
+
+static int
+parse_guid(const char *name, CSSM_GUID *guid)
+{
+       size_t len = strlen(name);
+
+       if (!strncmp("dl", name, len))
+               *guid = gGuidAppleFileDL;
+       else if (!strncmp("cspdl", name, len))
+               *guid = gGuidAppleCSPDL;
+       else
+       {
+               sec_error("Invalid guid: %s", name);
+               return SHOW_USAGE_MESSAGE;
+       }
+
+       return 0;
+}
+
+
+static int
+parse_mode(const char *name, mode_t *pmode)
+{
+       int result = 0;
+       mode_t mode = 0;
+       const char *p;
+
+       if (!name || !pmode || *name != '0')
+       {
+               result = 2;
+               goto loser;
+       }
+
+       for (p = name + 1; *p; ++p)
+       {
+               if (*p < '0' || *p > '7')
+               {
+                       result = 2;
+                       goto loser;
+               }
+
+               mode = (mode << 3) + *p - '0';
+       }
+
+       *pmode = mode;
+       return 0;
+
+loser:
+       sec_error("Invalid mode: %s", name);
+       return result;
+}
+
+int
+db_create(int argc, char * const *argv)
+{
+       int free_dbname = 0;
+       char *dbname = NULL;
+       int ch, result = 0;
+       bool do_autocommit = true, do_mode = false;
+       bool do_openparams = false, do_version_0_params = false;
+       mode_t mode = 0666;
+       CSSM_GUID guid = gGuidAppleFileDL;
+
+       while ((ch = getopt(argc, argv, "0ahg:m:o")) != -1)
+       {
+               switch  (ch)
+               {
+               case '0':
+                       do_version_0_params = true;
+                       do_openparams = true;
+                       break;
+               case 'a':
+                       do_autocommit = false;
+                       do_openparams = true;
+                       break;
+               case 'g':
+                       result = parse_guid(optarg, &guid);
+                       if (result)
+                               goto loser;
+                       break;
+               case 'm':
+                       result = parse_mode(optarg, &mode);
+                       if (result)
+                               goto loser;
+                       do_mode = true;
+                       do_openparams = true;
+                       break;
+               case 'o':
+                       do_openparams = true;
+                       break;
+               case '?':
+               default:
+                       return SHOW_USAGE_MESSAGE;
+               }
+       }
+
+       argc -= optind;
+       argv += optind;
+
+       if (argc > 0)
+               dbname = *argv;
+       else
+       {
+               fprintf(stderr, "db to create: ");
+               dbname = readline(NULL, 0);
+               if (!dbname)
+               {
+                       result = -1;
+                       goto loser;
+               }
+
+               free_dbname = 1;
+               if (*dbname == '\0')
+                       goto loser;
+       }
+
+       do
+       {
+               result = do_db_create(guid, dbname, do_openparams, do_autocommit, do_mode, mode, do_version_0_params);
+               if (result)
+                       goto loser;
+
+               argc--;
+               argv++;
+               dbname = *argv;
+       } while (argc > 0);
+
+loser:
+       if (free_dbname)
+               free(dbname);
+
+       return result;
+}