Index: options.py
===================================================================
--- options.py	(revision 878)
+++ options.py	(working copy)
@@ -560,6 +560,23 @@
         section.profile_options = None
         return section
 
+    def get_program_or_fcgi_program(self, program, all_sections):
+        program_section = "program:%s" % program
+        fcgi_section = "fcgi-program:%s" % program
+        if not program_section in all_sections and not fcgi_section in all_sections:
+            raise ValueError(
+                '[%s] names unknown program or fcgi-program %s' % (section, program))
+
+        if program_section in all_sections and fcgi_section in all_sections:
+            raise ValueError(
+                '[%s] names already a program or fcgi-program; a program and a fcgi-program cannot share the same name' % (section, program))
+
+        if program_section in all_sections:
+            return program_section
+
+        if fcgi_section in all_sections:
+            return fcgi_section
+
     def process_groups_from_parser(self, parser):
         groups = []
         all_sections = parser.sections()
@@ -575,10 +592,7 @@
             priority = integer(get(section, 'priority', 999))
             group_processes = []
             for program in programs:
-                program_section = "program:%s" % program
-                if not program_section in all_sections:
-                    raise ValueError(
-                        '[%s] names unknown program %s' % (section, program))
+                program_section = self.get_program_or_fcgi_program(program, all_sections)
                 homogeneous_exclude.append(program_section)
                 processes = self.processes_from_section(parser, program_section,
                                                         group_name,
