Add ExitCode, an enum-like class. (dart-lang/io#5)

diff --git a/pkgs/io/CHANGELOG.md b/pkgs/io/CHANGELOG.md
index 9334d24..e8dcf55 100644
--- a/pkgs/io/CHANGELOG.md
+++ b/pkgs/io/CHANGELOG.md
@@ -1,7 +1,5 @@
 ## 0.1.0
 
-- Initial commit of `FutureOr<bool> String isExecutable(path)`:
-
-```dart
-
-```
\ No newline at end of file
+- Initial commit of...
+   - `FutureOr<bool> String isExecutable(path)`.
+   - `ExitCode`.
diff --git a/pkgs/io/README.md b/pkgs/io/README.md
index e470cf5..ac5833f 100644
--- a/pkgs/io/README.md
+++ b/pkgs/io/README.md
@@ -10,3 +10,9 @@
  
 Returns whether a provided file path is considered _executable_ on the host
 operating system.
+
+### Processes
+
+#### `ExitCode`
+
+An enum-type class that contains known exit codes.
\ No newline at end of file
diff --git a/pkgs/io/lib/io.dart b/pkgs/io/lib/io.dart
index 35a6663..552217c 100644
--- a/pkgs/io/lib/io.dart
+++ b/pkgs/io/lib/io.dart
@@ -2,5 +2,5 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-export 'src/permissions.dart'
-    show FilePermissionRole, FilePermission, hasPermission, isExecutable;
+export 'src/exit_codes.dart' show ExitCode;
+export 'src/permissions.dart' show isExecutable;
diff --git a/pkgs/io/lib/src/exit_codes.dart b/pkgs/io/lib/src/exit_codes.dart
new file mode 100644
index 0000000..50d7f7e
--- /dev/null
+++ b/pkgs/io/lib/src/exit_codes.dart
@@ -0,0 +1,82 @@
+// Copyright 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Exit code constants.
+///
+/// [Source](https://www.freebsd.org/cgi/man.cgi?query=sysexits).
+class ExitCode {
+  /// Command completed successfully.
+  static const success = const ExitCode._(0, 'success');
+
+  /// Command was used incorrectly.
+  ///
+  /// This may occur if the wrong number of arguments was used, a bad flag, or
+  /// bad syntax in a parameter.
+  static const usage = const ExitCode._(64, 'usage');
+
+  /// Input data was used incorrectly.
+  ///
+  /// This should occur only for user data (not system files).
+  static const data = const ExitCode._(65, 'data');
+
+  /// An input file (not a system file) did not exist or was not readable.
+  static const noInput = const ExitCode._(66, 'noInput');
+
+  /// User specified did not exist.
+  static const noUser = const ExitCode._(67, 'noUser');
+
+  /// Host specified did not exist.
+  static const noHost = const ExitCode._(68, 'noHost');
+
+  /// A service is unavailable.
+  ///
+  /// This may occur if a support program or file does not exist. This may also
+  /// be used as a catch-all error when something you wanted to do does not
+  /// work, but you do not know why.
+  static const unavailable = const ExitCode._(69, 'unavailable');
+
+  /// An internal software error has been detected.
+  ///
+  /// This should be limited to non-operating system related errors as possible.
+  static const software = const ExitCode._(70, 'software');
+
+  /// An operating system error has been detected.
+  ///
+  /// This intended to be used for such thing as `cannot fork` or `cannot pipe`.
+  static const osError = const ExitCode._(71, 'osError');
+
+  /// Some system file (e.g. `/etc/passwd`) does not exist or could not be read.
+  static const osFile = const ExitCode._(72, 'osFile');
+
+  /// A (user specified) output file cannot be created.
+  static const cantCreate = const ExitCode._(73, 'cantCreate');
+
+  /// An error occurred doing I/O on some file.
+  static const ioError = const ExitCode._(74, 'ioError');
+
+  /// Temporary failure, indicating something is not really an error.
+  ///
+  /// In some cases, this can be re-attempted and will succeed later.
+  static const tempFail = const ExitCode._(75, 'tempFail');
+
+  /// You did not have sufficient permissions to perform the operation.
+  ///
+  /// This is not intended for file system problems, which should use [noInput]
+  /// or [cantCreate], but rather for higher-level permissions.
+  static const noPerm = const ExitCode._(77, 'noPerm');
+
+  /// Something was found in an unconfigured or misconfigured state.
+  static const config = const ExitCode._(78, 'config');
+
+  /// Exit code value.
+  final int code;
+
+  /// Name of the exit code.
+  final String _name;
+
+  const ExitCode._(this.code, this._name);
+
+  @override
+  String toString() => '$_name: $code';
+}