From 62c79c5a4076dddcd70d128e63ff567722633a74 Mon Sep 17 00:00:00 2001
From: waylonis <waylonis@4c0a9323-5329-0410-9bdc-e9ce6186880e>
Date: Tue, 19 Dec 2006 21:57:09 +0000
Subject: Add Mac symupload tool.  Reviewed by bryner.  Fixes issue #96.

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@95 4c0a9323-5329-0410-9bdc-e9ce6186880e
---
 src/tools/mac/symupload/minidump_upload.m          | 135 +++++++++
 src/tools/mac/symupload/symupload.m                | 173 ++++++++++++
 .../symupload/symupload.xcodeproj/project.pbxproj  | 303 +++++++++++++++++++++
 3 files changed, 611 insertions(+)
 create mode 100644 src/tools/mac/symupload/minidump_upload.m
 create mode 100644 src/tools/mac/symupload/symupload.m
 create mode 100644 src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj

(limited to 'src')

diff --git a/src/tools/mac/symupload/minidump_upload.m b/src/tools/mac/symupload/minidump_upload.m
new file mode 100644
index 00000000..4552bb1e
--- /dev/null
+++ b/src/tools/mac/symupload/minidump_upload.m
@@ -0,0 +1,135 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * 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.
+//     * Neither the name of Google Inc. 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
+// OWNER 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.
+
+// minidump_upload.m: Upload a minidump to a HTTP server.  The upload is sent as
+// a multipart/form-data POST request with the following parameters:
+//  prod: the product name
+//  ver: the product version
+//  symbol_file: the airbag format symbol file
+
+#import <unistd.h>
+
+#import <Foundation/Foundation.h>
+
+#import "common/mac/HTTPMultipartUpload.h"
+
+typedef struct {
+  NSString *minidumpPath;
+  NSString *uploadURLStr;
+  NSString *product;
+  NSString *version;
+  BOOL success;
+} Options;
+
+//=============================================================================
+static void Start(Options *options) {
+  NSURL *url = [NSURL URLWithString:options->uploadURLStr];
+  HTTPMultipartUpload *ul = [[HTTPMultipartUpload alloc] initWithURL:url];
+  NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+
+  // Add parameters
+  [parameters setObject:options->product forKey:@"prod"];
+  [parameters setObject:options->version forKey:@"ver"];
+  [ul setParameters:parameters];
+
+  // Add file
+  [ul addFileAtPath:options->minidumpPath name:@"upload_file_minidump"];
+
+  // Send it
+  NSError *error = nil;
+  NSData *data = [ul send:&error];
+  NSString *result = [[NSString alloc] initWithData:data
+                                           encoding:NSUTF8StringEncoding];
+
+  NSLog(@"Send: %@", error ? [error description] : @"No Error");
+  NSLog(@"Response: %d", [[ul response] statusCode]);
+  NSLog(@"Result: %d bytes\n%@", [data length], result);
+
+  [result release];
+  [ul release];
+  options->success = !error;
+}
+
+//=============================================================================
+static void
+Usage(int argc, const char *argv[]) {
+  fprintf(stderr, "Submit minidump information.\n");
+  fprintf(stderr, "Usage: %s -p <product> -v <version> <minidump> "
+          "<upload-URL>\n", argv[0]);
+  fprintf(stderr, "<minidump> should be a minidump.\n");
+  fprintf(stderr, "<upload-URL> is the destination for the upload\n");
+
+  fprintf(stderr, "\t-h: Usage\n");
+  fprintf(stderr, "\t-?: Usage\n");
+}
+
+//=============================================================================
+static void
+SetupOptions(int argc, const char *argv[], Options *options) {
+  extern int optind;
+  char ch;
+
+  while ((ch = getopt(argc, (char * const *)argv, "p:v:h?")) != -1) {
+    switch (ch) {
+      case 'p':
+        options->product = [NSString stringWithCString:optarg];
+        break;
+      case 'v':
+        options->version = [NSString stringWithCString:optarg];
+        break;
+
+      default:
+        Usage(argc, argv);
+        exit(0);
+        break;
+    }
+  }
+
+  if ((argc - optind) != 2) {
+    fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]);
+    Usage(argc, argv);
+    exit(1);
+  }
+
+  options->minidumpPath = [NSString stringWithCString:argv[optind]];
+  options->uploadURLStr = [NSString stringWithCString:argv[optind + 1]];
+}
+
+//=============================================================================
+int main (int argc, const char * argv[]) {
+  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+  Options options;
+
+  bzero(&options, sizeof(Options));
+  SetupOptions(argc, argv, &options);
+  Start(&options);
+
+  [pool release];
+  return options.success ? 0 : 1;
+}
diff --git a/src/tools/mac/symupload/symupload.m b/src/tools/mac/symupload/symupload.m
new file mode 100644
index 00000000..6f7db19f
--- /dev/null
+++ b/src/tools/mac/symupload/symupload.m
@@ -0,0 +1,173 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * 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.
+//     * Neither the name of Google Inc. 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
+// OWNER 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.
+
+// symupload.m: Upload a symbol file to a HTTP server.  The upload is sent as
+// a multipart/form-data POST request with the following parameters:
+//  code_file: the basename of the module, e.g. "app"
+//  debug_file: the basename of the debugging file, e.g. "app"
+//  debug_identifier: the debug file's identifier, usually consisting of
+//                    the guid and age embedded in the pdb, e.g.
+//                    "11111111BBBB3333DDDD555555555555F"
+//  version: the file version of the module, e.g. "1.2.3.4"
+//  os: the operating system that the module was built for
+//  cpu: the CPU that the module was built for (x86 or ppc)
+//  symbol_file: the contents of the airbag-format symbol file
+
+#include <unistd.h>
+
+#include <Foundation/Foundation.h>
+#include "HTTPMultipartUpload.h"
+
+typedef struct {
+  NSString *symbolsPath;
+  NSString *uploadURLStr;
+  NSString *version;
+  BOOL success;
+} Options;
+
+//=============================================================================
+static NSArray *ModuleDataForSymbolFile(NSString *file) {
+  NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:file];
+  NSData *data = [fh readDataOfLength:1024];
+  NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+  NSScanner *scanner = [NSScanner scannerWithString:str];
+  NSString *line;
+  NSArray *parts = nil;
+
+  if ([scanner scanUpToString:@"\n" intoString:&line])
+    parts = [line componentsSeparatedByString:@" "];
+
+  [str release];
+
+  return parts;
+}
+
+//=============================================================================
+static NSString *CompactIdentifier(NSString *uuid, NSString *age) {
+  NSMutableString *str = [NSMutableString stringWithString:uuid];
+  [str replaceOccurrencesOfString:@"-" withString:@"" options:0
+                            range:NSMakeRange(0, [str length])];
+  [str appendString:age];
+  return str;
+}
+
+//=============================================================================
+static void Start(Options *options) {
+  NSURL *url = [NSURL URLWithString:options->uploadURLStr];
+  HTTPMultipartUpload *ul = [[HTTPMultipartUpload alloc] initWithURL:url];
+  NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+  NSArray *moduleParts = ModuleDataForSymbolFile(options->symbolsPath);
+  NSString *compactedID = CompactIdentifier([moduleParts objectAtIndex:3],
+                                            [moduleParts objectAtIndex:4]);
+
+  // Add parameters
+  if (options->version)
+    [parameters setObject:options->version forKey:@"version"];
+
+  // MODULE <os> <cpu> <uuid> <age> <module-name>
+  // 0      1    2     3      4     5
+  [parameters setObject:@"1" forKey:@"age"];
+  [parameters setObject:[moduleParts objectAtIndex:1] forKey:@"os"];
+  [parameters setObject:[moduleParts objectAtIndex:2] forKey:@"cpu"];
+  [parameters setObject:[moduleParts objectAtIndex:5] forKey:@"debug_file"];
+  [parameters setObject:[moduleParts objectAtIndex:5] forKey:@"code_file"];
+  [parameters setObject:compactedID forKey:@"debug_identifier"];
+  [ul setParameters:parameters];
+
+  // Add file
+  [ul addFileAtPath:options->symbolsPath name:@"symbol_file"];
+
+  // Send it
+  NSError *error = nil;
+  NSData *data = [ul send:&error];
+  NSString *result = [[NSString alloc] initWithData:data
+                                           encoding:NSUTF8StringEncoding];
+
+  fprintf(stdout, "Send: %s\n", error ? [[error description] UTF8String] :
+          "No Error");
+  fprintf(stdout, "Response: %d\n", [[ul response] statusCode]);
+  fprintf(stdout, "Result: %d bytes\n%s\n", [data length], [result UTF8String]);
+
+  [result release];
+  [ul release];
+  options->success = !error;
+}
+
+//=============================================================================
+static void
+Usage(int argc, const char *argv[]) {
+  fprintf(stderr, "Submit symbol information.\n");
+  fprintf(stderr, "Usage: %s [-v version] <symbols> <upload-URL>\n", argv[0]);
+  fprintf(stderr, "<symbols> should be created by using the dump_syms tool.\n");
+  fprintf(stderr, "<upload-URL> is the destination for the upload\n");
+  fprintf(stderr, "\t-v: Version information (e.g., 1.2.3.4)\n");
+  fprintf(stderr, "\t-h: Usage\n");
+  fprintf(stderr, "\t-?: Usage\n");
+}
+
+//=============================================================================
+static void
+SetupOptions(int argc, const char *argv[], Options *options) {
+  extern int optind;
+  char ch;
+
+  while ((ch = getopt(argc, (char * const *)argv, "v:h?")) != -1) {
+    switch (ch) {
+      case 'v':
+        options->version = [NSString stringWithCString:optarg];
+        break;
+      default:
+        Usage(argc, argv);
+        exit(0);
+        break;
+    }
+  }
+
+  if ((argc - optind) != 2) {
+    fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]);
+    Usage(argc, argv);
+    exit(1);
+  }
+
+  options->symbolsPath = [NSString stringWithCString:argv[optind]];
+  options->uploadURLStr = [NSString stringWithCString:argv[optind + 1]];
+}
+
+//=============================================================================
+int main (int argc, const char * argv[]) {
+  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+  Options options;
+
+  bzero(&options, sizeof(Options));
+  SetupOptions(argc, argv, &options);
+  Start(&options);
+
+  [pool release];
+  return options.success ? 0 : 1;
+}
diff --git a/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj b/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..d2f4a1ca
--- /dev/null
+++ b/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj
@@ -0,0 +1,303 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 42;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		8DD76F9A0486AA7600D96B5E /* symupload.m in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* symupload.m */; settings = {ATTRIBUTES = (); }; };
+		8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; };
+		9BC1D49E0B37427A00F2A2B4 /* minidump_upload.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BD836000B0544BA0055103E /* minidump_upload.m */; };
+		9BD8336A0B03E4080055103E /* HTTPMultipartUpload.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD833680B03E4080055103E /* HTTPMultipartUpload.h */; };
+		9BD8336B0B03E4080055103E /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BD833690B03E4080055103E /* HTTPMultipartUpload.m */; };
+		9BD836180B0549F70055103E /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BD833690B03E4080055103E /* HTTPMultipartUpload.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		8DD76F9E0486AA7600D96B5E /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 8;
+			dstPath = /usr/share/man/man1/;
+			dstSubfolderSpec = 0;
+			files = (
+				9BD8336A0B03E4080055103E /* HTTPMultipartUpload.h in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		08FB7796FE84155DC02AAC07 /* symupload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = symupload.m; sourceTree = "<group>"; };
+		08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
+		8DD76FA10486AA7600D96B5E /* symupload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = symupload; sourceTree = BUILT_PRODUCTS_DIR; };
+		9BD833680B03E4080055103E /* HTTPMultipartUpload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPMultipartUpload.h; path = ../../../common/mac/HTTPMultipartUpload.h; sourceTree = "<group>"; };
+		9BD833690B03E4080055103E /* HTTPMultipartUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPMultipartUpload.m; path = ../../../common/mac/HTTPMultipartUpload.m; sourceTree = "<group>"; };
+		9BD835FB0B0544950055103E /* minidump_upload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = minidump_upload; sourceTree = BUILT_PRODUCTS_DIR; };
+		9BD836000B0544BA0055103E /* minidump_upload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = minidump_upload.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		8DD76F9B0486AA7600D96B5E /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		9BD835F90B0544950055103E /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		08FB7794FE84155DC02AAC07 /* symupload */ = {
+			isa = PBXGroup;
+			children = (
+				08FB7796FE84155DC02AAC07 /* symupload.m */,
+				9BD836000B0544BA0055103E /* minidump_upload.m */,
+				9BD833680B03E4080055103E /* HTTPMultipartUpload.h */,
+				9BD833690B03E4080055103E /* HTTPMultipartUpload.m */,
+				08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */,
+				1AB674ADFE9D54B511CA2CBB /* Products */,
+			);
+			name = symupload;
+			sourceTree = "<group>";
+		};
+		08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = {
+			isa = PBXGroup;
+			children = (
+				08FB779EFE84155DC02AAC07 /* Foundation.framework */,
+			);
+			name = "External Frameworks and Libraries";
+			sourceTree = "<group>";
+		};
+		1AB674ADFE9D54B511CA2CBB /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				8DD76FA10486AA7600D96B5E /* symupload */,
+				9BD835FB0B0544950055103E /* minidump_upload */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		8DD76F960486AA7600D96B5E /* symupload */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "symupload" */;
+			buildPhases = (
+				8DD76F990486AA7600D96B5E /* Sources */,
+				8DD76F9B0486AA7600D96B5E /* Frameworks */,
+				8DD76F9E0486AA7600D96B5E /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = symupload;
+			productInstallPath = "$(HOME)/bin";
+			productName = symupload;
+			productReference = 8DD76FA10486AA7600D96B5E /* symupload */;
+			productType = "com.apple.product-type.tool";
+		};
+		9BD835FA0B0544950055103E /* minidump_upload */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 9BD836020B0544BB0055103E /* Build configuration list for PBXNativeTarget "minidump_upload" */;
+			buildPhases = (
+				9BD835F80B0544950055103E /* Sources */,
+				9BD835F90B0544950055103E /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = minidump_upload;
+			productName = minidump_upload;
+			productReference = 9BD835FB0B0544950055103E /* minidump_upload */;
+			productType = "com.apple.product-type.tool";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		08FB7793FE84155DC02AAC07 /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "symupload" */;
+			hasScannedForEncodings = 1;
+			mainGroup = 08FB7794FE84155DC02AAC07 /* symupload */;
+			projectDirPath = "";
+			targets = (
+				8DD76F960486AA7600D96B5E /* symupload */,
+				9BD835FA0B0544950055103E /* minidump_upload */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+		8DD76F990486AA7600D96B5E /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				8DD76F9A0486AA7600D96B5E /* symupload.m in Sources */,
+				9BD8336B0B03E4080055103E /* HTTPMultipartUpload.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		9BD835F80B0544950055103E /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				9BD836180B0549F70055103E /* HTTPMultipartUpload.m in Sources */,
+				9BC1D49E0B37427A00F2A2B4 /* minidump_upload.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		1DEB927508733DD40010E9CD /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_C_LANGUAGE_STANDARD = c99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_MODEL_TUNING = G5;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PRECOMPILE_PREFIX_HEADER = NO;
+				GCC_PREFIX_HEADER = "";
+				INSTALL_PATH = "$(HOME)/bin";
+				PRODUCT_NAME = symupload;
+				USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)";
+				ZERO_LINK = NO;
+			};
+			name = Debug;
+		};
+		1DEB927608733DD40010E9CD /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = (
+					ppc,
+					i386,
+				);
+				GCC_C_LANGUAGE_STANDARD = c99;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_MODEL_TUNING = G5;
+				GCC_PRECOMPILE_PREFIX_HEADER = NO;
+				GCC_PREFIX_HEADER = "";
+				INSTALL_PATH = "$(HOME)/bin";
+				PRODUCT_NAME = symupload;
+				USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)";
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		1DEB927908733DD40010E9CD /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				PREBINDING = NO;
+				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+			};
+			name = Debug;
+		};
+		1DEB927A08733DD40010E9CD /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				PREBINDING = NO;
+				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+			};
+			name = Release;
+		};
+		9BD836030B0544BB0055103E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_MODEL_TUNING = G5;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
+				INSTALL_PATH = "$(HOME)/bin";
+				OTHER_LDFLAGS = (
+					"-framework",
+					Foundation,
+					"-framework",
+					AppKit,
+				);
+				PREBINDING = NO;
+				PRODUCT_NAME = minidump_upload;
+				USER_HEADER_SEARCH_PATHS = "../../../**";
+				ZERO_LINK = NO;
+			};
+			name = Debug;
+		};
+		9BD836040B0544BB0055103E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_MODEL_TUNING = G5;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
+				INSTALL_PATH = "$(HOME)/bin";
+				OTHER_LDFLAGS = (
+					"-framework",
+					Foundation,
+					"-framework",
+					AppKit,
+				);
+				PREBINDING = NO;
+				PRODUCT_NAME = minidump_upload;
+				USER_HEADER_SEARCH_PATHS = "../../../**";
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "symupload" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1DEB927508733DD40010E9CD /* Debug */,
+				1DEB927608733DD40010E9CD /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "symupload" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1DEB927908733DD40010E9CD /* Debug */,
+				1DEB927A08733DD40010E9CD /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		9BD836020B0544BB0055103E /* Build configuration list for PBXNativeTarget "minidump_upload" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				9BD836030B0544BB0055103E /* Debug */,
+				9BD836040B0544BB0055103E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
-- 
cgit v1.2.1