diff options
author | Christian Grothoff <christian@grothoff.org> | 2019-02-23 10:48:08 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2019-02-23 10:48:08 +0100 |
commit | f1e8076ed474a429aff32839ed5f8fc20371839c (patch) | |
tree | bb38cb99b0e9cb7b937d33b539e74b9eb9fe4d32 /src/gns | |
parent | 3d0f1dd3805bfef30ff7a7f8e246a926b7fa7838 (diff) | |
parent | 7b01b7b1760cc973719c9a20123f99e4a7e1b5a6 (diff) | |
download | gnunet-f1e8076ed474a429aff32839ed5f8fc20371839c.tar.gz gnunet-f1e8076ed474a429aff32839ed5f8fc20371839c.zip |
merge
Diffstat (limited to 'src/gns')
-rw-r--r-- | src/gns/.gitignore | 6 | ||||
-rw-r--r-- | src/gns/Makefile.am | 18 | ||||
-rw-r--r-- | src/gns/gnunet-gns-proxy-setup-ca.in (renamed from src/gns/gnunet-gns-proxy-setup-ca) | 9 | ||||
-rw-r--r-- | src/gns/gnunet-gns-proxy.c | 7 | ||||
-rw-r--r-- | src/gns/openssl.cnf | 245 | ||||
-rw-r--r-- | src/gns/test_gns_nick_shorten.conf | 24 | ||||
-rwxr-xr-x | src/gns/test_gns_rel_expiration.sh | 7 |
7 files changed, 281 insertions, 35 deletions
diff --git a/src/gns/.gitignore b/src/gns/.gitignore index 2b9a18f21..3bbb2eb3d 100644 --- a/src/gns/.gitignore +++ b/src/gns/.gitignore | |||
@@ -4,3 +4,9 @@ gnunet-dns2gns | |||
4 | gnunet-gns | 4 | gnunet-gns |
5 | gnunet-gns-proxy | 5 | gnunet-gns-proxy |
6 | gnunet-gns-benchmark | 6 | gnunet-gns-benchmark |
7 | test_gns_proxy | ||
8 | local.crt | ||
9 | local.der | ||
10 | local.key | ||
11 | server.csr | ||
12 | gnunet-gns-proxy-setup-ca | ||
diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am index 1abc57d57..434d50f34 100644 --- a/src/gns/Makefile.am +++ b/src/gns/Makefile.am | |||
@@ -14,7 +14,8 @@ EXTRA_DIST = \ | |||
14 | test_gns_simple_lookup.conf \ | 14 | test_gns_simple_lookup.conf \ |
15 | gns-helper-service-w32.conf \ | 15 | gns-helper-service-w32.conf \ |
16 | w32nsp.def \ | 16 | w32nsp.def \ |
17 | gnunet-gns-proxy-setup-ca \ | 17 | openssl.cnf \ |
18 | gnunet-gns-proxy-setup-ca.in \ | ||
18 | zonefiles/J7POEUT41A8PBFS7KVVDRF88GBOU4HK8PSU5QKVLVE3R9T91E99G.zkey \ | 19 | zonefiles/J7POEUT41A8PBFS7KVVDRF88GBOU4HK8PSU5QKVLVE3R9T91E99G.zkey \ |
19 | zonefiles/OEFL7A4VEF1B40QLEMTG5D8G1CN6EN16QUSG5R2DT71GRJN34LSG.zkey \ | 20 | zonefiles/OEFL7A4VEF1B40QLEMTG5D8G1CN6EN16QUSG5R2DT71GRJN34LSG.zkey \ |
20 | zonefiles/test_zonekey \ | 21 | zonefiles/test_zonekey \ |
@@ -79,19 +80,30 @@ bin_PROGRAMS = \ | |||
79 | noinst_PROGRAMS = \ | 80 | noinst_PROGRAMS = \ |
80 | gnunet-gns-benchmark | 81 | gnunet-gns-benchmark |
81 | 82 | ||
83 | pkgdata_DATA = \ | ||
84 | openssl.cnf | ||
85 | |||
82 | if HAVE_MHD | 86 | if HAVE_MHD |
83 | if LINUX | 87 | if LINUX |
84 | bin_PROGRAMS += gnunet-bcd | 88 | bin_PROGRAMS += gnunet-bcd |
85 | endif | 89 | endif |
86 | endif | 90 | endif |
87 | 91 | ||
88 | bin_SCRIPTS = gnunet-gns-proxy-setup-ca | ||
89 | |||
90 | plugin_LTLIBRARIES = \ | 92 | plugin_LTLIBRARIES = \ |
91 | libgnunet_plugin_block_gns.la \ | 93 | libgnunet_plugin_block_gns.la \ |
92 | libgnunet_plugin_gnsrecord_gns.la | 94 | libgnunet_plugin_gnsrecord_gns.la |
93 | 95 | ||
94 | 96 | ||
97 | bin_SCRIPTS = \ | ||
98 | gnunet-gns-proxy-setup-ca | ||
99 | |||
100 | # See: https://www.gnu.org/software/automake/manual/html_node/Scripts.html#Scripts | ||
101 | do_subst = sed -e 's,[@]pkgdatadir[@],$(pkgdatadir),g' | ||
102 | |||
103 | gnunet-gns-proxy-setup-ca: gnunet-gns-proxy-setup-ca.in Makefile | ||
104 | $(do_subst) < $(srcdir)/gnunet-gns-proxy-setup-ca.in > gnunet-gns-proxy-setup-ca | ||
105 | chmod +x gnunet-gns-proxy-setup-ca | ||
106 | |||
95 | libgnunet_plugin_gnsrecord_gns_la_SOURCES = \ | 107 | libgnunet_plugin_gnsrecord_gns_la_SOURCES = \ |
96 | plugin_gnsrecord_gns.c | 108 | plugin_gnsrecord_gns.c |
97 | libgnunet_plugin_gnsrecord_gns_la_LIBADD = \ | 109 | libgnunet_plugin_gnsrecord_gns_la_LIBADD = \ |
diff --git a/src/gns/gnunet-gns-proxy-setup-ca b/src/gns/gnunet-gns-proxy-setup-ca.in index 7c1d58dc2..0a6fab18a 100644 --- a/src/gns/gnunet-gns-proxy-setup-ca +++ b/src/gns/gnunet-gns-proxy-setup-ca.in | |||
@@ -3,15 +3,13 @@ | |||
3 | # and install it (for both GNUnet and your browser). | 3 | # and install it (for both GNUnet and your browser). |
4 | # | 4 | # |
5 | 5 | ||
6 | # TODO: We should sed the real paths to the binaries involved here. | 6 | OPENSSLCFG=@pkgdatadir@/openssl.cnf |
7 | |||
8 | if ! which openssl > /dev/null | 7 | if ! which openssl > /dev/null |
9 | then | 8 | then |
10 | echo "'openssl' command not found. Please install it." | 9 | echo "'openssl' command not found. Please install it." |
11 | exit 1 | 10 | exit 1 |
12 | fi | 11 | fi |
13 | 12 | ||
14 | |||
15 | echo "Generating CA" | 13 | echo "Generating CA" |
16 | options='' | 14 | options='' |
17 | while getopts "c:" opt; do | 15 | while getopts "c:" opt; do |
@@ -36,7 +34,7 @@ GNSCANO=`mktemp /tmp/gnscakeynoencXXXXXX.pem` | |||
36 | GNS_CA_CERT_PEM=`gnunet-config -s gns-proxy -o PROXY_CACERT -f $options` | 34 | GNS_CA_CERT_PEM=`gnunet-config -s gns-proxy -o PROXY_CACERT -f $options` |
37 | mkdir -p `dirname $GNS_CA_CERT_PEM` | 35 | mkdir -p `dirname $GNS_CA_CERT_PEM` |
38 | 36 | ||
39 | openssl req -new -x509 -days 3650 -extensions v3_ca -keyout $GNSCAKY -out $GNSCERT -subj "/C=ZZ/L=World/O=GNU/OU=GNUnet/CN=GNS Proxy CA/emailAddress=bounce@gnunet.org" -passout pass:"GNU Name System" | 37 | openssl req -config $OPENSSLCFG -new -x509 -days 3650 -extensions v3_ca -keyout $GNSCAKY -out $GNSCERT -subj "/C=ZZ/L=World/O=GNU/OU=GNUnet/CN=GNS Proxy CA/emailAddress=bounce@gnunet.org" -passout pass:"GNU Name System" |
40 | 38 | ||
41 | echo "Removing passphrase from key" | 39 | echo "Removing passphrase from key" |
42 | openssl rsa -passin pass:"GNU Name System" -in $GNSCAKY -out $GNSCANO | 40 | openssl rsa -passin pass:"GNU Name System" -in $GNSCAKY -out $GNSCANO |
@@ -46,7 +44,8 @@ cat $GNSCERT $GNSCANO > $GNS_CA_CERT_PEM | |||
46 | 44 | ||
47 | if ! which certutil > /dev/null | 45 | if ! which certutil > /dev/null |
48 | then | 46 | then |
49 | echo "'certutil' command not found. Not importing into browsers." | 47 | echo "The 'certutil' command was not found. Not importing into browsers." |
48 | echo "For 'certutil' install nss." | ||
50 | else | 49 | else |
51 | echo "Importing CA into browsers" | 50 | echo "Importing CA into browsers" |
52 | for f in ~/.mozilla/firefox/*.*/ | 51 | for f in ~/.mozilla/firefox/*.*/ |
diff --git a/src/gns/gnunet-gns-proxy.c b/src/gns/gnunet-gns-proxy.c index 21451651d..65a7b6018 100644 --- a/src/gns/gnunet-gns-proxy.c +++ b/src/gns/gnunet-gns-proxy.c | |||
@@ -972,7 +972,7 @@ check_ssl_certificate (struct Socks5Request *s5r) | |||
972 | if (CURLE_OK != | 972 | if (CURLE_OK != |
973 | curl_easy_getinfo (s5r->curl, | 973 | curl_easy_getinfo (s5r->curl, |
974 | CURLINFO_TLS_SESSION, | 974 | CURLINFO_TLS_SESSION, |
975 | (struct curl_slist **) &tlsinfo)) | 975 | &tlsinfo)) |
976 | return GNUNET_SYSERR; | 976 | return GNUNET_SYSERR; |
977 | if (CURLSSLBACKEND_GNUTLS != tlsinfo->backend) | 977 | if (CURLSSLBACKEND_GNUTLS != tlsinfo->backend) |
978 | { | 978 | { |
@@ -2045,11 +2045,12 @@ create_response (void *cls, | |||
2045 | const char *us; | 2045 | const char *us; |
2046 | long upload_size; | 2046 | long upload_size; |
2047 | 2047 | ||
2048 | upload_size = 0; | ||
2048 | us = MHD_lookup_connection_value (con, | 2049 | us = MHD_lookup_connection_value (con, |
2049 | MHD_HEADER_KIND, | 2050 | MHD_HEADER_KIND, |
2050 | MHD_HTTP_HEADER_CONTENT_LENGTH); | 2051 | MHD_HTTP_HEADER_CONTENT_LENGTH); |
2051 | if ( (NULL != us) && | 2052 | if ( (NULL != us) && |
2052 | (1 == sscanf (us, | 2053 | (1 == sscanf (us, |
2053 | "%ld", | 2054 | "%ld", |
2054 | &upload_size)) && | 2055 | &upload_size)) && |
2055 | (upload_size >= 0) ) | 2056 | (upload_size >= 0) ) |
@@ -2149,7 +2150,7 @@ create_response (void *cls, | |||
2149 | curl_easy_setopt (s5r->curl, | 2150 | curl_easy_setopt (s5r->curl, |
2150 | CURLOPT_USE_SSL, | 2151 | CURLOPT_USE_SSL, |
2151 | CURLUSESSL_ALL); | 2152 | CURLUSESSL_ALL); |
2152 | if (NULL != s5r->dane_data) | 2153 | if (0 < s5r->num_danes) |
2153 | curl_easy_setopt (s5r->curl, | 2154 | curl_easy_setopt (s5r->curl, |
2154 | CURLOPT_SSL_VERIFYPEER, | 2155 | CURLOPT_SSL_VERIFYPEER, |
2155 | 0L); | 2156 | 0L); |
diff --git a/src/gns/openssl.cnf b/src/gns/openssl.cnf new file mode 100644 index 000000000..503460f9f --- /dev/null +++ b/src/gns/openssl.cnf | |||
@@ -0,0 +1,245 @@ | |||
1 | # | ||
2 | # OpenSSL example configuration file. | ||
3 | # This is mostly being used for generation of certificate requests. | ||
4 | # | ||
5 | |||
6 | # This definition stops the following lines choking if HOME isn't | ||
7 | # defined. | ||
8 | HOME = . | ||
9 | RANDFILE = $ENV::HOME/.rnd | ||
10 | |||
11 | # Extra OBJECT IDENTIFIER info: | ||
12 | #oid_file = $ENV::HOME/.oid | ||
13 | oid_section = new_oids | ||
14 | |||
15 | # To use this configuration file with the "-extfile" option of the | ||
16 | # "openssl x509" utility, name here the section containing the | ||
17 | # X.509v3 extensions to use: | ||
18 | # extensions = | ||
19 | # (Alternatively, use a configuration file that has only | ||
20 | # X.509v3 extensions in its main [= default] section.) | ||
21 | |||
22 | [ new_oids ] | ||
23 | |||
24 | # We can add new OIDs in here for use by 'ca' and 'req'. | ||
25 | # Add a simple OID like this: | ||
26 | # testoid1=1.2.3.4 | ||
27 | # Or use config file substitution like this: | ||
28 | # testoid2=${testoid1}.5.6 | ||
29 | |||
30 | #################################################################### | ||
31 | [ ca ] | ||
32 | default_ca = CA_default # The default ca section | ||
33 | |||
34 | #################################################################### | ||
35 | [ CA_default ] | ||
36 | |||
37 | dir = ./demoCA # Where everything is kept | ||
38 | certs = $dir/certs # Where the issued certs are kept | ||
39 | crl_dir = $dir/crl # Where the issued crl are kept | ||
40 | database = $dir/index.txt # database index file. | ||
41 | new_certs_dir = $dir/newcerts # default place for new certs. | ||
42 | |||
43 | certificate = $dir/cacert.pem # The CA certificate | ||
44 | serial = $dir/serial # The current serial number | ||
45 | crl = $dir/crl.pem # The current CRL | ||
46 | private_key = $dir/private/cakey.pem# The private key | ||
47 | RANDFILE = $dir/private/.rand # private random number file | ||
48 | |||
49 | x509_extensions = usr_cert # The extentions to add to the cert | ||
50 | |||
51 | # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs | ||
52 | # so this is commented out by default to leave a V1 CRL. | ||
53 | # crl_extensions = crl_ext | ||
54 | |||
55 | default_days = 365 # how long to certify for | ||
56 | default_crl_days= 30 # how long before next CRL | ||
57 | default_md = md5 # which md to use. | ||
58 | preserve = no # keep passed DN ordering | ||
59 | |||
60 | # A few difference way of specifying how similar the request should look | ||
61 | # For type CA, the listed attributes must be the same, and the optional | ||
62 | # and supplied fields are just that :-) | ||
63 | policy = policy_match | ||
64 | |||
65 | # For the CA policy | ||
66 | [ policy_match ] | ||
67 | countryName = match | ||
68 | stateOrProvinceName = match | ||
69 | organizationName = match | ||
70 | organizationalUnitName = optional | ||
71 | commonName = supplied | ||
72 | emailAddress = optional | ||
73 | |||
74 | # For the 'anything' policy | ||
75 | # At this point in time, you must list all acceptable 'object' | ||
76 | # types. | ||
77 | [ policy_anything ] | ||
78 | countryName = optional | ||
79 | stateOrProvinceName = optional | ||
80 | localityName = optional | ||
81 | organizationName = optional | ||
82 | organizationalUnitName = optional | ||
83 | commonName = supplied | ||
84 | emailAddress = optional | ||
85 | |||
86 | #################################################################### | ||
87 | [ req ] | ||
88 | default_bits = 1024 | ||
89 | default_keyfile = privkey.pem | ||
90 | distinguished_name = req_distinguished_name | ||
91 | attributes = req_attributes | ||
92 | x509_extensions = v3_ca # The extentions to add to the self signed cert | ||
93 | |||
94 | # Passwords for private keys if not present they will be prompted for | ||
95 | # input_password = secret | ||
96 | # output_password = secret | ||
97 | |||
98 | # This sets a mask for permitted string types. There are several options. | ||
99 | # default: PrintableString, T61String, BMPString. | ||
100 | # pkix : PrintableString, BMPString. | ||
101 | # utf8only: only UTF8Strings. | ||
102 | # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). | ||
103 | # MASK:XXXX a literal mask value. | ||
104 | # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings | ||
105 | # so use this option with caution! | ||
106 | string_mask = nombstr | ||
107 | |||
108 | # req_extensions = v3_req # The extensions to add to a certificate request | ||
109 | |||
110 | [ req_distinguished_name ] | ||
111 | countryName = Country Name (2 letter code) | ||
112 | countryName_default = AU | ||
113 | countryName_min = 2 | ||
114 | countryName_max = 2 | ||
115 | |||
116 | stateOrProvinceName = State or Province Name (full name) | ||
117 | stateOrProvinceName_default = Some-State | ||
118 | |||
119 | localityName = Locality Name (eg, city) | ||
120 | |||
121 | 0.organizationName = Organization Name (eg, company) | ||
122 | 0.organizationName_default = Internet Widgits Pty Ltd | ||
123 | |||
124 | # we can do this but it is not needed normally :-) | ||
125 | #1.organizationName = Second Organization Name (eg, company) | ||
126 | #1.organizationName_default = World Wide Web Pty Ltd | ||
127 | |||
128 | organizationalUnitName = Organizational Unit Name (eg, section) | ||
129 | #organizationalUnitName_default = | ||
130 | |||
131 | commonName = Common Name (eg, YOUR name) | ||
132 | commonName_max = 64 | ||
133 | |||
134 | emailAddress = Email Address | ||
135 | emailAddress_max = 40 | ||
136 | |||
137 | # SET-ex3 = SET extension number 3 | ||
138 | |||
139 | [ req_attributes ] | ||
140 | challengePassword = A challenge password | ||
141 | challengePassword_min = 4 | ||
142 | challengePassword_max = 20 | ||
143 | |||
144 | unstructuredName = An optional company name | ||
145 | |||
146 | [ usr_cert ] | ||
147 | |||
148 | # These extensions are added when 'ca' signs a request. | ||
149 | |||
150 | # This goes against PKIX guidelines but some CAs do it and some software | ||
151 | # requires this to avoid interpreting an end user certificate as a CA. | ||
152 | |||
153 | basicConstraints=CA:FALSE | ||
154 | |||
155 | # Here are some examples of the usage of nsCertType. If it is omitted | ||
156 | # the certificate can be used for anything *except* object signing. | ||
157 | |||
158 | # This is OK for an SSL server. | ||
159 | # nsCertType = server | ||
160 | |||
161 | # For an object signing certificate this would be used. | ||
162 | # nsCertType = objsign | ||
163 | |||
164 | # For normal client use this is typical | ||
165 | # nsCertType = client, email | ||
166 | |||
167 | # and for everything including object signing: | ||
168 | # nsCertType = client, email, objsign | ||
169 | |||
170 | # This is typical in keyUsage for a client certificate. | ||
171 | # keyUsage = nonRepudiation, digitalSignature, keyEncipherment | ||
172 | |||
173 | # This will be displayed in Netscape's comment listbox. | ||
174 | nsComment = "OpenSSL Generated Certificate" | ||
175 | |||
176 | # PKIX recommendations harmless if included in all certificates. | ||
177 | subjectKeyIdentifier=hash | ||
178 | authorityKeyIdentifier=keyid,issuer:always | ||
179 | |||
180 | # This stuff is for subjectAltName and issuerAltname. | ||
181 | # Import the email address. | ||
182 | # subjectAltName=email:copy | ||
183 | |||
184 | # Copy subject details | ||
185 | # issuerAltName=issuer:copy | ||
186 | |||
187 | #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem | ||
188 | #nsBaseUrl | ||
189 | #nsRevocationUrl | ||
190 | #nsRenewalUrl | ||
191 | #nsCaPolicyUrl | ||
192 | #nsSslServerName | ||
193 | |||
194 | [ v3_req ] | ||
195 | |||
196 | # Extensions to add to a certificate request | ||
197 | |||
198 | basicConstraints = CA:FALSE | ||
199 | keyUsage = nonRepudiation, digitalSignature, keyEncipherment | ||
200 | |||
201 | [ v3_ca ] | ||
202 | |||
203 | |||
204 | # Extensions for a typical CA | ||
205 | |||
206 | |||
207 | # PKIX recommendation. | ||
208 | |||
209 | subjectKeyIdentifier=hash | ||
210 | |||
211 | authorityKeyIdentifier=keyid:always,issuer:always | ||
212 | |||
213 | # This is what PKIX recommends but some broken software chokes on critical | ||
214 | # extensions. | ||
215 | #basicConstraints = critical,CA:true | ||
216 | # So we do this instead. | ||
217 | basicConstraints = CA:true | ||
218 | |||
219 | # Key usage: this is typical for a CA certificate. However since it will | ||
220 | # prevent it being used as an test self-signed certificate it is best | ||
221 | # left out by default. | ||
222 | # keyUsage = cRLSign, keyCertSign | ||
223 | |||
224 | # Some might want this also | ||
225 | # nsCertType = sslCA, emailCA | ||
226 | |||
227 | # Include email address in subject alt name: another PKIX recommendation | ||
228 | # subjectAltName=email:copy | ||
229 | # Copy issuer details | ||
230 | # issuerAltName=issuer:copy | ||
231 | |||
232 | # DER hex encoding of an extension: beware experts only! | ||
233 | # obj=DER:02:03 | ||
234 | # Where 'obj' is a standard or added object | ||
235 | # You can even override a supported extension: | ||
236 | # basicConstraints= critical, DER:30:03:01:01:FF | ||
237 | |||
238 | [ crl_ext ] | ||
239 | |||
240 | # CRL extensions. | ||
241 | # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. | ||
242 | |||
243 | # issuerAltName=issuer:copy | ||
244 | authorityKeyIdentifier=keyid:always,issuer:always | ||
245 | |||
diff --git a/src/gns/test_gns_nick_shorten.conf b/src/gns/test_gns_nick_shorten.conf deleted file mode 100644 index 317477c80..000000000 --- a/src/gns/test_gns_nick_shorten.conf +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | @INLINE@ test_gns_defaults.conf | ||
2 | |||
3 | [PATHS] | ||
4 | GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-gns-peer-1/ | ||
5 | |||
6 | [dht] | ||
7 | START_ON_DEMAND = YES | ||
8 | |||
9 | [transport] | ||
10 | PLUGINS = | ||
11 | |||
12 | [gns] | ||
13 | #PREFIX = valgrind --leak-check=full --track-origins=yes | ||
14 | START_ON_DEMAND = YES | ||
15 | AUTO_IMPORT_PKEY = YES | ||
16 | MAX_PARALLEL_BACKGROUND_QUERIES = 10 | ||
17 | DEFAULT_LOOKUP_TIMEOUT = 15 s | ||
18 | RECORD_PUT_INTERVAL = 1 h | ||
19 | ZONE_PUBLISH_TIME_WINDOW = 1 h | ||
20 | DNS_ROOT=PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0 | ||
21 | #USE_CACHE = NO | ||
22 | |||
23 | [revocation] | ||
24 | WORKBITS = 1 | ||
diff --git a/src/gns/test_gns_rel_expiration.sh b/src/gns/test_gns_rel_expiration.sh index 66adbb631..c7c66bc27 100755 --- a/src/gns/test_gns_rel_expiration.sh +++ b/src/gns/test_gns_rel_expiration.sh | |||
@@ -7,6 +7,13 @@ if [ -z $LOCATION ] | |||
7 | then | 7 | then |
8 | LOCATION="gnunet-config" | 8 | LOCATION="gnunet-config" |
9 | fi | 9 | fi |
10 | |||
11 | if [ -z $(which timeout) ] | ||
12 | then | ||
13 | echo "timeout utility not found which is required for test." | ||
14 | exit 77 | ||
15 | fi | ||
16 | |||
10 | $LOCATION --version 1> /dev/null | 17 | $LOCATION --version 1> /dev/null |
11 | if test $? != 0 | 18 | if test $? != 0 |
12 | then | 19 | then |