diff options
author | Thomas Markwalder <tmark@isc.org> | 2019-11-22 13:39:45 -0500 |
---|---|---|
committer | Thomas Markwalder <tmark@isc.org> | 2019-11-22 13:39:45 -0500 |
commit | 0cd94b5ef4a078097fc2bd1dc72f5e80c2cf1844 (patch) | |
tree | e4dfe9a92d676a49b18ab547d781fb3fb10c8e6a /client | |
parent | 97c155273c0df0c8518f226e2b5e338e3ad63e87 (diff) | |
download | isc-dhcp-0cd94b5ef4a078097fc2bd1dc72f5e80c2cf1844.tar.gz |
[#64,!35] Restored work
Restored cummulative work.
Diffstat (limited to 'client')
-rw-r--r-- | client/Makefile.in | 75 | ||||
-rw-r--r-- | client/clparse.c | 28 | ||||
-rw-r--r-- | client/dhc6.c | 19 | ||||
-rw-r--r-- | client/dhclient.c | 124 | ||||
-rw-r--r-- | client/tests/Makefile.in | 69 |
5 files changed, 219 insertions, 96 deletions
diff --git a/client/Makefile.in b/client/Makefile.in index a016bbe9..dc473f35 100644 --- a/client/Makefile.in +++ b/client/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -122,7 +122,10 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/includes depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/client_tables.Po \ + ./$(DEPDIR)/clparse.Po ./$(DEPDIR)/dhc6.Po \ + ./$(DEPDIR)/dhclient.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -190,7 +193,7 @@ am__recursive_targets = \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir + distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -404,8 +407,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -469,10 +472,16 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_tables.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clparse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhc6.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhclient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_tables.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clparse.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhc6.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhclient.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -694,7 +703,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -792,7 +804,10 @@ clean: clean-recursive clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am distclean: distclean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/client_tables.Po + -rm -f ./$(DEPDIR)/clparse.Po + -rm -f ./$(DEPDIR)/dhc6.Po + -rm -f ./$(DEPDIR)/dhclient.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -838,7 +853,10 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/client_tables.Po + -rm -f ./$(DEPDIR)/clparse.Po + -rm -f ./$(DEPDIR)/dhc6.Po + -rm -f ./$(DEPDIR)/dhclient.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -861,21 +879,22 @@ uninstall-man: uninstall-man5 uninstall-man8 .MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-sbinPROGRAMS cscopelist-am \ - ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-dist_sysconfDATA install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-man5 \ - install-man8 install-pdf install-pdf-am install-ps \ - install-ps-am install-sbinPROGRAMS install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-dist_sysconfDATA uninstall-man \ - uninstall-man5 uninstall-man8 uninstall-sbinPROGRAMS +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles check check-am clean clean-generic \ + clean-sbinPROGRAMS cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dist_sysconfDATA \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-man5 install-man8 install-pdf \ + install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-dist_sysconfDATA uninstall-man uninstall-man5 \ + uninstall-man8 uninstall-sbinPROGRAMS .PRECIOUS: Makefile diff --git a/client/clparse.c b/client/clparse.c index eaf48a8f..35e2d164 100644 --- a/client/clparse.c +++ b/client/clparse.c @@ -3,7 +3,7 @@ Parser for dhclient config and lease files... */ /* - * Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 2004-2019 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1996-2003 by Internet Software Consortium * * This Source Code Form is subject to the terms of the Mozilla Public @@ -47,6 +47,9 @@ static struct dhc6_addr *parse_client6_iaprefix_statement(struct parse *cfile); static void parse_lease_id_format (struct parse *cfile); +extern void discard_duplicate (struct client_lease** lease_list, + struct client_lease* lease); + /* client-conf-file :== client-declarations END_OF_FILE client-declarations :== <nil> | client-declaration @@ -1096,7 +1099,7 @@ void parse_client_lease_statement (cfile, is_static) struct parse *cfile; int is_static; { - struct client_lease *lease, *lp, *pl, *next; + struct client_lease *lease; struct interface_info *ip = (struct interface_info *)0; int token; const char *val; @@ -1154,22 +1157,11 @@ void parse_client_lease_statement (cfile, is_static) /* The new lease may supersede a lease that's not the active lease but is still on the lease list, so scan the lease list looking for a lease with the same address, and - if we find it, toss it. */ - pl = (struct client_lease *)0; - for (lp = client -> leases; lp; lp = next) { - next = lp -> next; - if (lp -> address.len == lease -> address.len && - !memcmp (lp -> address.iabuf, lease -> address.iabuf, - lease -> address.len)) { - if (pl) - pl -> next = next; - else - client -> leases = next; - destroy_client_lease (lp); - break; - } else - pl = lp; - } + if we find it, toss it. We only allow supercession if + the leases originated from the same source. In other words, + either both are from the config file or both are from the lease + file. This keeps us from discarding fallback leases */ + discard_duplicate (&client->leases, lease); /* If this is a preloaded lease, just put it on the list of recorded leases - don't make it the active lease. */ diff --git a/client/dhc6.c b/client/dhc6.c index 16a08380..55ecab80 100644 --- a/client/dhc6.c +++ b/client/dhc6.c @@ -816,8 +816,7 @@ dhc6_parse_ia_na(struct dhc6_ia **pia, struct packet *packet, } else { log_error("Invalid IA_NA option cache."); dfree(ia, MDL); - if (ds.len != 0) - data_string_forget(&ds, MDL); + data_string_forget(&ds, MDL); return ISC_R_UNEXPECTED; } } @@ -919,8 +918,7 @@ dhc6_parse_ia_ta(struct dhc6_ia **pia, struct packet *packet, } else { log_error("Invalid IA_TA option cache."); dfree(ia, MDL); - if (ds.len != 0) - data_string_forget(&ds, MDL); + data_string_forget(&ds, MDL); return ISC_R_UNEXPECTED; } } @@ -1042,8 +1040,7 @@ dhc6_parse_ia_pd(struct dhc6_ia **pia, struct packet *packet, } else { log_error("Invalid IA_PD option cache."); dfree(ia, MDL); - if (ds.len != 0) - data_string_forget(&ds, MDL); + data_string_forget(&ds, MDL); return ISC_R_UNEXPECTED; } } @@ -1158,8 +1155,7 @@ dhc6_parse_addrs(struct dhc6_addr **paddr, struct packet *packet, } else { log_error("Invalid IAADDR option cache."); dfree(addr, MDL); - if (ds.len != 0) - data_string_forget(&ds, MDL); + data_string_forget(&ds, MDL); return ISC_R_UNEXPECTED; } } @@ -1283,8 +1279,7 @@ dhc6_parse_prefixes(struct dhc6_addr **ppfx, struct packet *packet, } else { log_error("Invalid IAPREFIX option cache."); dfree(pfx, MDL); - if (ds.len != 0) - data_string_forget(&ds, MDL); + data_string_forget(&ds, MDL); return ISC_R_UNEXPECTED; } } @@ -1306,9 +1301,7 @@ dhc6_lease_destroy(struct dhc6_lease **src, const char *file, int line) } lease = *src; - if (lease->server_id.len != 0) - data_string_forget(&lease->server_id, file, line); - + data_string_forget(&lease->server_id, file, line); for (ia = lease->bindings ; ia != NULL ; ia = nia) { nia = ia->next; diff --git a/client/dhclient.c b/client/dhclient.c index 6828c676..4a22803a 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -51,6 +51,8 @@ static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT; char *path_dhclient_script = path_dhclient_script_array; const char *path_dhclient_duid = NULL; +static void add_to_tail(struct client_lease** lease_list, struct client_lease* lease); + /* False (default) => we write and use a pid file */ isc_boolean_t no_pid_file = ISC_FALSE; @@ -1556,8 +1558,16 @@ void bind_lease (client) write_client_lease(client, client->new, 0, 1); /* Replace the old active lease with the new one. */ - if (client->active) - destroy_client_lease(client->active); + if (client->active) { + if (client->active->is_static) { + // We need to preserve the fallback lease in case + // we lose DHCP service again. + add_to_tail(&client->leases, client->active); + } else { + destroy_client_lease(client->active); + } + } + client->active = client->new; client->new = NULL; @@ -2458,6 +2468,99 @@ void send_discover (cpp) add_timeout(&tv, send_discover, client, 0, 0); } + +/* + * \brief Remove leases from a list of leases which duplicate a given lease + * + * Searches through a linked-list of leases, remove the first one matches the + * given lease's address and value of is_static. The latter test is done + * so we only remove leases that are from the same source (i.e server/lease file + * vs config file). This ensures we do not discard "fallback" config file leases + * that happen to match non-config file leases. + * + * \param lease_list list of leases to clean + * \param lease lease for which duplicates should be removed + */ +void discard_duplicate (struct client_lease** lease_list, struct client_lease* lease) { + struct client_lease *cur, *prev, *next; + + if (!lease_list || !lease) { + return; + } + + prev = (struct client_lease *)0; + for (cur = *lease_list; cur; cur = next) { + next = cur->next; + if ((cur->is_static == lease->is_static) && + (cur->address.len == lease->address.len && + !memcmp (cur->address.iabuf, lease->address.iabuf, + lease->address.len))) { + if (prev) + prev->next = next; + else + *lease_list = next; + + destroy_client_lease (cur); + break; + } else { + prev = cur; + } + } +} + +/* + * \brief Add a given lease to the end of list of leases + * + * Searches through a linked-list of leases, removing any that match the + * given lease's address and value of is_static. The latter test is done + * so we only remove leases that are from the same source (i.e server/lease file + * vs config file). This ensures we do not discard "fallback" config file leases + * that happen to match non-config file leases. + * + * \param lease_list list of leases to clean + * \param lease lease for which duplicates should be removed + */ +void add_to_tail(struct client_lease** lease_list, + struct client_lease* lease) +{ + if (!lease_list || !lease) { + return; + } + + /* If there is already a lease for this address and + * is_static value, toss discard it. This ensures + * we only keep one dynamic and/or one static lease + * for a given address. */ + discard_duplicate(lease_list, lease); + + /* Find the tail */ + struct client_lease* tail; + for (tail = *lease_list; tail && tail->next; tail = tail->next){}; + + /* Ensure the tail points nowhere. */ + lease->next = NULL; + + /* Add to the tail. */ + if (!tail) { + *lease_list = lease; + } else { + tail->next = lease; + } +} + +#if 0 +void dbg_print_lease(char *text, struct client_lease* lease) { + if (!lease) { + log_debug("%s, lease is null", text); + } else { + log_debug ("%s: %p addr:%s expires:%ld :is_static? %d", + text, lease, piaddr (lease->address), + (lease->expiry - cur_time), + lease->is_static); + } +} +#endif + /* state_panic gets called if we haven't received any offers in a preset amount of time. When this happens, we try to use existing leases that haven't yet expired, and failing that, we call the client script and @@ -2483,8 +2586,10 @@ void state_panic (cpp) /* Run through the list of leases and see if one can be used. */ while (client -> active) { if (client -> active -> expiry > cur_time) { - log_info ("Trying recorded lease %s", - piaddr (client -> active -> address)); + log_info ("Trying %s lease %s", + (client -> active -> is_static + ? "fallback" : "recorded"), + piaddr (client -> active -> address)); /* Run the client script with the existing parameters. */ script_init(client, "TIMEOUT", @@ -2531,12 +2636,8 @@ void state_panic (cpp) activate_next: /* Otherwise, put the active lease at the end of the lease list, and try another lease.. */ - for (lp = client -> leases; lp -> next; lp = lp -> next) - ; - lp -> next = client -> active; - if (lp -> next) { - lp -> next -> next = (struct client_lease *)0; - } + add_to_tail(&client->leases, client->active); + client -> active = client -> leases; client -> leases = client -> leases -> next; @@ -4078,9 +4179,10 @@ void client_option_envadd (struct option_cache *oc, "option - discarded", name); } - data_string_forget (&data, MDL); } } + + data_string_forget (&data, MDL); } } diff --git a/client/tests/Makefile.in b/client/tests/Makefile.in index a7cfb89a..a68ce884 100644 --- a/client/tests/Makefile.in +++ b/client/tests/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -127,7 +127,9 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/includes depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/clparse.Po ./$(DEPDIR)/dhc6.Po \ + ./$(DEPDIR)/dhclient.Po ./$(DEPDIR)/duid_unittest.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -167,7 +169,7 @@ am__recursive_targets = \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir + distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -377,8 +379,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -403,10 +405,16 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clparse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhc6.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhclient.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/duid_unittest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clparse.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhc6.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhclient.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/duid_unittest.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -563,7 +571,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -660,7 +671,10 @@ clean: clean-recursive clean-am: clean-checkPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/clparse.Po + -rm -f ./$(DEPDIR)/dhc6.Po + -rm -f ./$(DEPDIR)/dhclient.Po + -rm -f ./$(DEPDIR)/duid_unittest.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-local distclean-tags @@ -704,7 +718,10 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/clparse.Po + -rm -f ./$(DEPDIR)/dhc6.Po + -rm -f ./$(DEPDIR)/dhclient.Po + -rm -f ./$(DEPDIR)/duid_unittest.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -724,19 +741,19 @@ uninstall-am: .MAKE: $(am__recursive_targets) check-am install-am install-strip -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-checkPROGRAMS clean-generic cscopelist-am \ - ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-local distclean-tags distdir dvi dvi-am html html-am \ - info info-am install install-am install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles check check-am clean clean-checkPROGRAMS \ + clean-generic cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-local \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile |