--fail-under can now be specified in the rcfile. #314
diff --git a/CHANGES.txt b/CHANGES.txt
index 6cd8e9e..0ab3423 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,9 @@
   files reported by skipping files with 100% coverage.  Thanks, Krystian
   Kichewko.
 
+- You can now specify the ``--fail-under`` option in the ``.coveragerc`` file
+  as the ``[report] fail_under`` options.  This closes `issue 314`_.
+
 - The ``COVERAGE_OPTIONS`` environment variable is no longer supported.  It was
   a hack for ``--timid`` before configuration files were available.
 
@@ -44,6 +47,7 @@
 - Made some PyPy-specific tweaks to improve speed under PyPy.  Thanks, Alex
   Gaynor.
 
+.. _issue 314: https://bitbucket.org/ned/coveragepy/issue/314/fail_under-param-not-working-in-coveragerc
 .. _issue 328: https://bitbucket.org/ned/coveragepy/issue/328/misbehavior-in-run-source
 .. _issue 334: https://bitbucket.org/ned/coveragepy/issue/334/pragma-not-recognized-if-tab-character
 .. _issue 342: https://bitbucket.org/ned/coveragepy/issue/342/console-and-html-coverage-reports-differ
diff --git a/coverage/cmdline.py b/coverage/cmdline.py
index 7ad0ca1..ee8233e 100644
--- a/coverage/cmdline.py
+++ b/coverage/cmdline.py
@@ -430,6 +430,7 @@
             include = include,
             )
 
+        total = None
         if options.action == "report":
             total = self.coverage.report(
                 show_missing=options.show_missing,
@@ -445,21 +446,28 @@
             outfile = options.outfile
             total = self.coverage.xml_report(outfile=outfile, **report_args)
 
-        if options.fail_under is not None:
-            # Total needs to be rounded, but be careful of 0 and 100.
-            if 0 < total < 1:
-                total = 1
-            elif 99 < total < 100:
-                total = 99
-            else:
-                total = round(total)
+        if total is not None:
+            # Apply the command line fail-under options, and then use the config
+            # value, so we can get fail_under from the config file.
+            if options.fail_under is not None:
+                self.coverage.config["report:fail_under"] = options.fail_under
 
-            if total >= options.fail_under:
-                return OK
-            else:
-                return FAIL_UNDER
-        else:
-            return OK
+            if self.coverage.config["report:fail_under"]:
+
+                # Total needs to be rounded, but be careful of 0 and 100.
+                if 0 < total < 1:
+                    total = 1
+                elif 99 < total < 100:
+                    total = 99
+                else:
+                    total = round(total)
+
+                if total >= self.coverage.config["report:fail_under"]:
+                    return OK
+                else:
+                    return FAIL_UNDER
+
+        return OK
 
     def help(self, error=None, topic=None, parser=None):
         """Display an error message, or the named topic."""
diff --git a/coverage/config.py b/coverage/config.py
index d15810e..b14c6d6 100644
--- a/coverage/config.py
+++ b/coverage/config.py
@@ -153,6 +153,7 @@
 
         # Defaults for [report]
         self.exclude_list = DEFAULT_EXCLUDE[:]
+        self.fail_under = 0
         self.ignore_errors = False
         self.include = None
         self.omit = None
@@ -252,6 +253,7 @@
 
         # [report]
         ('exclude_list', 'report:exclude_lines', 'linelist'),
+        ('fail_under', 'report:fail_under', 'int'),
         ('ignore_errors', 'report:ignore_errors', 'boolean'),
         ('include', 'report:include', 'list'),
         ('omit', 'report:omit', 'list'),
diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py
index e0d1086..3399254 100644
--- a/tests/test_cmdline.py
+++ b/tests/test_cmdline.py
@@ -4,6 +4,7 @@
 import mock
 import coverage
 import coverage.cmdline
+from coverage.config import CoverageConfig
 from coverage.misc import ExceptionDuringRun
 
 from tests.coveragetest import CoverageTest, OK, ERR
@@ -45,6 +46,7 @@
         # We'll invoke .coverage as the constructor, and then keep using the
         # same object as the resulting coverage object.
         mk.coverage.return_value = mk
+        mk.config = CoverageConfig()
         return mk
 
     def mock_command_line(self, args):
diff --git a/tests/test_process.py b/tests/test_process.py
index e13ec95..2ed8c4a 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -663,6 +663,15 @@
         st, _ = self.run_command_status("coverage xml --fail-under=44")
         self.assertEqual(st, 2)
 
+    def test_fail_under_in_config(self):
+        self.make_file(".coveragerc", "[report]\nfail_under = 43\n")
+        st, _ = self.run_command_status("coverage report")
+        self.assertEqual(st, 0)
+
+        self.make_file(".coveragerc", "[report]\nfail_under = 44\n")
+        st, _ = self.run_command_status("coverage report")
+        self.assertEqual(st, 2)
+
 
 def possible_pth_dirs():
     """Produce a sequence of directories for trying to write .pth files."""