globus_ftp_control-4.7/ 0000775 0000764 0000764 00000000000 12227171044 012303 5 0000000 0000000 globus_ftp_control-4.7/globus_automake_pre 0000644 0000764 0000764 00000001200 12225575522 016173 0000000 0000000 ## Special globus installation directories
setupdir = @setupdir@
## setup = [ DATA,PROGRAMS,SCRIPTS ]
testdir = @testdir@
## test = [ DATA,PROGRAMS,SCRIPTS ]
scriptsysconfdir = ${sysconfdir}
## scriptsysconf = [ PROGRAMS,SCRIPTS ]
flavorincludedir = @flavorincludedir@
## flavorinclude = [ HEADERS ]
pkgdir = @pkgdir@
## pkg = [ DATA ]
aclocaldir = @aclocaldir@
## aclocal = [ DATA ]
amdirdir = ${datadir}/globus_amdir
## amdir = [ DATA ]
perlmoduledir = @perlmoduledir@
## perlmodule = [ DATA ]
doxygendir = @doxygendir@
## doxygen = [ DATA ]
docdir = @docdir@
## doc = [ DATA ]
LINK_BAK = orig
AUTOMAKE_OPTIONS=no-dependencies
globus_ftp_control-4.7/globus_i_ftp_control.h 0000666 0000764 0000764 00000016160 10363624663 016627 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef GLOBUS_INCLUDE_FTP_I_CONTROL_H
#define GLOBUS_INCLUDE_FTP_I_CONTROL_H 1
#define GLOBUS_I_FTP_CONTROL_BUF_SIZE 200
#define GLOBUS_I_FTP_CONTROL_BUF_INCR 100
#define GLOBUS_I_TELNET_IP "\xFF\xF4"
#define GLOBUS_I_TELNET_SYNCH "\xFF\xF2"
#define GLOBUS_I_TELNET_IAC '\xFF'
#include "globus_config.h"
extern
FILE * globus_i_ftp_control_devnull;
typedef enum
{
GLOBUS_I_FTP_AUTH,
GLOBUS_I_FTP_ACCT,
GLOBUS_I_FTP_ADAT,
GLOBUS_I_FTP_QUIT,
GLOBUS_I_FTP_USER,
GLOBUS_I_FTP_PASS,
GLOBUS_I_FTP_NOOP
}
globus_i_ftp_cmd_t;
typedef struct globus_i_ftp_passthru_cb_arg_s
{
globus_ftp_control_response_callback_t user_cb;
void * user_cb_arg;
globus_i_ftp_cmd_t cmd;
globus_ftp_control_handle_t * handle;
} globus_i_ftp_passthru_cb_arg_t;
typedef struct globus_i_ftp_server_passthru_cb_arg_s
{
globus_ftp_control_server_callback_t callback;
void * callback_arg;
globus_ftp_control_server_t * server_handle;
} globus_i_ftp_server_passthru_cb_arg_t;
void
globus_i_ftp_control_call_close_cb(
globus_ftp_control_handle_t * handle);
void
globus_i_ftp_control_write_next(
globus_ftp_control_handle_t * handle);
globus_result_t
globus_i_ftp_control_radix_encode(
unsigned char * inbuf,
unsigned char * outbuf,
int * length);
globus_result_t
globus_i_ftp_control_radix_decode(
unsigned char * inbuf,
unsigned char * outbuf,
int * length);
globus_result_t
globus_i_ftp_control_decode_command(
char * cmd,
char ** decoded_cmd,
globus_ftp_control_auth_info_t * auth_info);
globus_result_t
globus_i_ftp_control_encode_command(
globus_ftp_cc_handle_t * cc_handle,
char * cmd,
char ** encoded_cmd);
globus_result_t
globus_i_ftp_control_encode_reply(
char * reply,
char ** encoded_reply,
globus_ftp_control_auth_info_t * auth_info);
globus_result_t
globus_i_ftp_control_data_set_netlogger(
globus_ftp_control_handle_t * handle,
globus_netlogger_handle_t * nl_handle,
globus_bool_t nl_ftp_control,
globus_bool_t nl_globus_io);
globus_result_t
globus_i_ftp_control_client_set_netlogger(
globus_ftp_control_handle_t * handle,
globus_netlogger_handle_t * nl_handle);
globus_result_t
globus_i_ftp_control_data_activate(void);
globus_result_t
globus_i_ftp_control_data_deactivate(void);
globus_result_t
globus_i_ftp_control_client_activate(void);
globus_result_t
globus_i_ftp_control_client_deactivate(void);
globus_result_t
globus_i_ftp_control_server_activate(void);
globus_result_t
globus_i_ftp_control_server_deactivate(void);
globus_result_t
globus_i_ftp_control_data_cc_destroy(
globus_ftp_control_handle_t * control_handle);
globus_result_t
globus_i_ftp_control_data_cc_blocking_destroy(
globus_ftp_control_handle_t * control_handle);
globus_result_t
globus_i_ftp_control_data_abort(
globus_ftp_control_handle_t * control_handle,
globus_object_t * error);
globus_result_t
globus_i_ftp_control_auth_info_init(
globus_ftp_control_auth_info_t * dest,
globus_ftp_control_auth_info_t * src);
globus_result_t
globus_i_ftp_control_auth_info_destroy(
globus_ftp_control_auth_info_t * auth_info);
globus_result_t
globus_i_ftp_control_get_connection_info(
globus_ftp_control_handle_t * handle,
int * local_host,
unsigned short * local_port,
int * remote_host,
unsigned short * remote_port);
/*
* internal function defintions
*/
globus_result_t
globus_i_ftp_parallelism_copy(
globus_ftp_control_parallelism_t * dest_parallelism,
globus_ftp_control_parallelism_t * src_parallelism);
int
globus_i_ftp_parallelism_get_size(
globus_ftp_control_parallelism_t * parallelism);
int
globus_i_ftp_parallelism_get_min_size(
globus_ftp_control_parallelism_t * parallelism);
int
globus_i_ftp_parallelism_get_max_size(
globus_ftp_control_parallelism_t * parallelism);
void
globus_ftp_control_host_port_init(
globus_ftp_control_host_port_t * host_port,
char * host,
unsigned short port);
void
globus_ftp_control_host_port_destroy(
globus_ftp_control_host_port_t * host_port);
void
globus_ftp_control_host_port_get_host(
globus_ftp_control_host_port_t * host_port,
char * host);
unsigned short
globus_ftp_control_host_port_get_port(
globus_ftp_control_host_port_t * host_port);
void
globus_ftp_control_host_port_copy(
globus_ftp_control_host_port_t * dest,
globus_ftp_control_host_port_t * src);
globus_result_t
globus_i_ftp_control_client_get_connection_info(
globus_ftp_control_handle_t * handle,
int localhost[4],
unsigned short * localport,
int remotehost[4],
unsigned short * remoteport);
extern const char * globus_i_ftp_server_welcome;
extern const char * globus_i_ftp_server_user_reply;
extern const char * globus_i_ftp_server_pass_reply;
extern int globus_i_ftp_control_debug_level;
#ifdef BUILD_DEBUG
#define globus_i_ftp_control_debug(Level) \
(globus_i_ftp_control_debug_level >= (Level))
#define globus_i_ftp_control_debug_printf(level, message) \
do { \
if (globus_i_ftp_control_debug(level)) \
{ \
globus_libc_fprintf message; \
} \
} while (0)
#else
#define globus_i_ftp_control_debug_printf(level, message)
#endif
#endif
globus_ftp_control-4.7/globus_gridftp_protocol_extensions.doc 0000666 0000764 0000764 00000061657 11522621135 022143 0000000 0000000 /**
@anchor page_extensions
@page globus_ftp_extensions GridFTP: Protocol Extensions to FTP for the Grid
@section extensions_intro Introduction
This section defines extensions to the FTP specification STD 9, RFC
959, @ref rfc959 "FILE TRANSFER PROTOCOL (FTP)" (October 1985)
These extensions provide striped data transfer, parallel data
transfer, extended data transfer, data buffer size configuration, and
data channel authentication.
The following new commands are introduced in this specification
- @ref sec_SPAS "Striped Passive (SPAS)"
- @ref sec_SPOR "Striped Data Port (SPOR)"
- @ref sec_ERET "Extended Retrieve (ERET)"
- @ref sec_ESTO "Extended Store (ESTO)"
- @ref sec_SBUF "Set Data Buffer Size (SBUF)"
- @ref sec_DCAU "Data Channel Authentication Mode (DCAU)"
A new transfer mode (@ref mode_e "extended-block mode") is
introduced for parallel and striped data transfers. Also, a set of
extension @ref sec_OPTS "options to RETR" are added to control
striped data layout and parallelism.
The following new feature names are to be included in the FTP server's
response to FEAT if it implements the following sets of functionality
@par PARALLEL
The server supports the SPOR, SPAS, the RETR options mentioned above,
and extended block mode.
@par ESTO
The server implements the ESTO command as described in this document.
@par ERET
The server implements the ERET command as described in this document.
@par SBUF
The server implements the SBUF command as described in this document.
@par DCAU
The server implements the DCAU command as described in this document,
including the requirement that data channels are authenticated by
default, if @ref rfc2228 "RFC 2228" authentication is used to establish
the control channel.
@section term Terminology
@par Parallel transfer
From a single data server, splitting file data for transfer over multiple
data connections.
@par Striped transfer
Distributing a file's data over multiple independent
data nodes, and transerring over multiple data connections.
@par Data Node
In a striped data transfer, a data node is one of the stripe
destinations returned in the SPAS command, or one of the stripe
destinations sent in the SPOR command.
@par DTP
The data transfer process establishes and manages the data connection.
The DTP can be passive or active.
@par PI
The protocol interpreter. The user and server sides of the protocol
have distinct roles implemented in a user-PI and a server-PI.
@section Existing FTP Standards Used
- RFC 959, @ref rfc959 "FILE TRANSFER PROTOCOL (FTP)", J. Postel,
R. Reynolds (October 1985)
- Commands used by GridFTP
- USER
- PASS
- ACCT
- CWD
- CDUP
- QUIT
- REIN
- PORT
- PASV
- TYPE
- MODE
- RETR
- STOR
- STOU
- APPE
- ALLO
- REST
- RNFR
- RNTO
- ABOR
- DELE
- RMD
- MKD
- PWD
- LIST
- NLST
- SITE
- SYST
- STAT
- HELP
- NOOP
- Features used by GridFTP
- ASCII and Image types
- Stream mode
- File structure
- RFC 2228, @ref rfc2228 "FTP Security Extensions", Horowitz, M. and
S. Lunt (October 1997)
- Commands used by GridFTP
- AUTH
- ADAT
- MIC
- CONF
- ENC
- Features used by GridFTP
- GSSAPI authentication
- RFC 2389, @ref rfc2389 "Feature negotiation mechanism for the File Transfer Protocol", P. Hethmon , R. Elz (August 1998)
- Commands used by GridFTP
- FEAT
- OPTS
- Features used by GridFTP
- @ref ietfftpext "FTP Extensions", R. Elz, P. Hethmon (September 2000)
- Commands used by GridFTP
- SIZE
- Features used by GridFTP
- Restart of a stream mode transfer
@anchor sec_SPAS
@section SPAS Striped Passive (SPAS)
This extension is used to establish a vector of data socket listeners for for a
server with one or more stripes. This command MUST be used in conjunction with
the extended block mode. The response to this command includes a list of
host and port addresses the server is listening on.
Due to the nature of the extended block mode protocol, SPAS must be used in
conjunction with data transfer commands which receive data (such as
STOR, ESTO, or APPE) and can not be used with commands which send data
on the data channels.
@par Syntax
The syntax of the SPAS command is:
@code
spas = "SPAS"
@endcode
@par Responses
The server-PI will respond to the SPAS command with a 229 reply
giving the list of host-port strings for the remote server-DTP or
user-DTP to connect to.
@code
spas-response = "229-Entering Striped Passive Mode" CRLF
1*( host-port CRLF)
229 End
@endcode
Where the command is correctly parsed, but the server-DTP cannot
process the SPAS request, it must return the same error responses as
the PASV command.
@par OPTS for SPAS
There are no options in this SPAS specification, and hence there is no
OPTS command defined.
@anchor sec_SPOR
@section SPOR Striped Data Port (SPOR)
This extension is to be used as a complement to the SPAS command to
implement striped third-party transfers. This command MUST always be used in
conjunction with the extended block mode. The argument to SPOR is a vector of
host/TCP listener port pairs to which the server is to connect. This
Due to the nature of the extended block mode protocol, SPOR must be used in
conjunction with data transfer commands which send data (such as
RETR, ERET, LIST, or NLST) and can not be used with commands which receive data
on the data channels.
@par Syntax
The syntax of the SPOR command is:
@code
SPOR 1*( )
@endcode
The host-port sequence in the command structure MUST match the
host-port replies to a SPAS command.
@par Responses
The server-PI will respond to the SPOR command with the same response
set as the PORT command described in the @ref rfc959 "ftp specification".
@par OPTS for SPOR
There are no options in this SPOR specification, and hence there is no
OPTS command defined.
@anchor sec_ERET
@section ERET Extended Retrieve (ERET)
The extended retrieve extension is used to request that a retrieve be
done with some additional processing on the server. This command an
extensible way of providing server-side data reduction or other
modifications to the RETR command. This command is used in place of
OPTS to the RETR command to allow server side processing to be done
with a single round trip (one command sent to the server instead of
two) for latency-critical applications.
ERET may be used with either the data transports defined in RFC 959, or using
extended block mode as defined in this document. Using an ERET creates a new
virtual file which will be sent, with it's own size and byte range starting
at zero. Restart markers generated while processing an ERET
are relative to the beginning of this view of the file.
@par Syntax
The syntax of the ERET command is
@code
ERET
retrieve-mode ::= P
offset ::= 64 bit integer
size ::= 64 bit integer
@endcode
The @b retrieve-mode defines behavior of the extended-retrieve
mode. There is one mode defined by this specification, but other general
purpose or application-specific ones may be added later.
@par modes_ERET Extended Retrieve Modes
@par Partial Retrieve Mode (P)
A section of the file will be retrieved from the data server. The
section is defined by the starting @b offset and extent @b size
parameters. When used with extended block mode, the extended block
headers sent along with data will send the data with offset of 0 meaning
the beginning of the section of the file which was requested.
@anchor sec_ESTO
@section ESTO Extended Store (ESTO)
The extended store extension is used to request that a store be done with some
additional processing on the server. Arbitrary data processing algorithms may
be added by defining additional ESTO store-modes. Similar to the ERET, the
ESTO command expects data sent to satisfy the request to be sent as if
it were a new file with data block offset 0 being beginning the beginning
of the new file.
The format of the ESTO command is
@code
ESTO
store-mode ::= A
@endcode
The store-mode defines the behavior of the extended store. There is
one mode defined by this specification, but others may be added later.
@par Extended Store Modes
@par Adjusted store (A)
The data in the file is to stored with @b offset added to the file pointer
before storing the blocks of the file. In extended block mode, this value is
added to the offset in the extended block header by the server when writing to
disk. Extended block headers should therefore send the beginning of the byte
range on the data channel with offset of zero. In stream mode, the offset is
added to the implicit offset of 0 for the beginning of the data before
writing. If a stream mode restart marker is used in conjunction with this ESTO
mode, the restart marker's offset is added to the offset passed as the
parameter to the adjusted store.
@anchor sec_SBUF
@section SBUF Set Buffer Size (SBUF)
This extension adds the capability of a client to set the TCP buffer
size for subsequent data connections to a value. This replaces the
server-specific commands SITE RBUFSIZE, SITE RETRBUFSIZE, SITE RBUFSZ,
SITE SBUFSIZE, SITE SBUFSZ, and SITE BUFSIZE. Clients may wish to consider
supporting these other commands to ensure wider compatibility.
@par Syntax
The syntax of the SBUF command is
@code
sbuf = SBUF
buffer-size ::=
@endcode
The @b buffer-size value is the TCP buffer size in bytes. The TCP
window size should be set accordingly by the server.
@par Response Codes
If the server-PI is able to set the buffer size state to the requested
buffer-size, then it will return a 200 reply.
@note Even if the SBUF is accepted by the server, an error may occur
later when the data connections are actually created, depending on how
the server or client operating systems' TCP implementations.
@anchor sec_DCAU
@section DCAU Data Channel Authentication (DCAU)
This extension provides a method for specifying the type of
authentication to be performed on FTP data channels. This extension
may only be used when the control connection was authenticated using
RFC 2228 Security extensions.
The format of the DCAU command is
@code
DCAU
authentication-mode ::=
|
|
no-authentication ::= N
authenticate-with-self ::= A
authenticate-with-subject ::= S
subject-name ::= string
@endcode
@par Authentication Modes
- No authentication (N)
No authentication handshake will be done upon data connection
establishment.
- Self authentication (A)
A security-protocol specific authentication will be used on the data
channel. The identity of the remote data connection will be the same
as the identity of the user which authenticated to the control
connection.
- Subject-name authentication (S)
A security-protocol specific authentication will be used on the data
channel. The identity of the remote data connection MUST match the
supplied @b subject-name string.
The default data channel authentication mode is @b A for FTP sessions which
are RFC 2228 authenticated---the client must explicitly send a DCAU N message
to disable it if it does not implement data channel authentication.
If the security handshake fails, the server should return the error
response 432 (Data channel authentication failed).
@section mode_e Extended Block Mode
The striped and parallel data transfer methods described above require
an extended transfer mode to support out-of-sequence data delivery,
and partial data transmission per data connection. The extended block
mode described here extends the block mode header to provide support
for these as well as large blocks, and end-of-data synchronization.
Clients indicate that they want to use extended block mode by sending
the command
@code
MODE E
@endcode
on the control channel before a transfer command is sent.
The structure of the extended block header is
@code
Extended Block Header
+----------------+-------/-----------+------/------------+
| Descriptor | Byte Count | Offset Count |
| 8 bits | 64 bits | 64 bits |
+----------------+-------/-----------+------/------------+
@endcode
The descriptor codes are indicated by bit flags in the
descriptor byte. Six codes have been assigned, where each
code number is the decimal value of the corresponding bit in
the byte.
@code
Code Meaning
128 End of data block is EOR (Legacy)
64 End of data block is EOF
32 Suspected errors in data block
16 Data block is a restart marker
8 End of data block is EOD for a parallel/striped transfer
4 Sender will close the data connection
@endcode
With this encoding, more than one descriptor coded condition
may exist for a particular block. As many bits as necessary
may be flagged.
Some additional protocol is added to the extended block mode data
channels, to properly handle end-of-file detection in the presence of
an unknown number of data streams.
- When no more data is to be sent on the data channel, then the sender
will mark the last block, or send a zero-length block after the last
block with the EOD bit (8) set in the extended block header.
- After receiving an EOD the data connection can be cached for use in a
subsequent transfer. To signifiy that the data connection will be closed
the sender sets the close bit (4) in the header on the last message sent.
- The sender communicates end of file by sending an EOF message to all
servers receiving data. The EOF message format follows.
Extended Block EOF Header
@code
+----------------+-------/--------+------/---------------+
| Descriptor | unused | EOD count expected |
| 8 bits | 64 bits | 64 bits |
+----------------+-------/--------+------/---------------+
@endcode
EOF Descriptor.
The EOF header descriptor has the same definition as the regular data
message header described above.
EOD Count Expected.
This 64 bit field represents the total number of data connections that
will be established with the server receiving the file. This number is
used by the receiver to determine it has received all of the data. When
the number of EOD messages received equals the number represented by the
"EOD Count Expected" field the receiver has hit end of file.
Simply waiting for EOD on all open data connections is not sufficient.
It is possible that the receiver reads an EOD message on all of its open
data connects while an additional data connection is in flight. If the
receiver were to assume it reached end of file it would fail to receive
the data on the in flight connection.
To handle EOF in the multi-striped server case a 126 response has been
introduced. When receiving data from a striped server a client makes a
control connection to a single host, but several host may create several
data connections back to the client. Each host can independently decide
how many data connections it will use, but only a single EOF message may
be sent to back to the client, therefore it must be possible to aggregate
the total number of data connections used in the transfer across the
stripes. The 126 response serves this purpose.
The 126 is an intermediate response to RETR command. It has the following
format.
126 1*(count of data connections)
Several "Count of data connections" can be in a single reply. They
correspond to the stripes returned in the response to the SPAS command.
Discussion of protocol change to enable bidirectional data channels
brought up the following problem if doing bidirectional data channels
If the client is pasv, and sending to a multi-stripe server, then the
server creates data connections connections; since the client didn't
do SPAS, it cannot associate HOST/PORT pairs on the data connections
with stripes on the server (it doesn't even know how many there
are). it cannot reliably determine which nodes to send data
to. (Becomes even more complex in the third-party transfer case,
because the sender may have multiple stripes of data.) The basic
problem is that we need to know logical stripe numbers to know where
to send the data.
@par EOF Handling in Extended Block Mode
If you are in either striped or parallel mode, you will get exactly
one EOF on each SPAS-specified ports (stripes). Hosts in extended
block mode must be prepared to accept an arbitrary number of
connections on each SPOR port before the EOF block is sent.
@par Restarting
In general, opaque restart markers passed via the block header should
not be used in extended block mode. Instead, the destination server
should send extended data marker responses over the control
connection, in the following form:
@code
extended-mark-response = "111" "Range Marker"
byte-ranges-list = [ *("," ) ]
byte-range = "-"
start-offset ::=
end-offset ::=
@endcode
The byte ranges in the marker are an incremental set of byte ranges
which have been stored to disk by the data server. The complete
restart marker is a concatenation of all byte ranges received by the
client in 111 responses.
The client MAY combine adjacent ranges received over several range
responses into any number of ranges when sending the REST command to
the server to restart a transfer.
For example, the client, on receiving the responses:
@code
111 Range Marker 0-29
111 Range Marker 30-89
@endcode
may send, equivalently,
@code
REST 0-29,30-89
REST 0-89
REST 30-59,0-29,60-89
@endcode
to restart the transfer after those 90 bytes have been received.
The server MAY indicate that a given range of data has been received
in multiple subsequent range markers. The client MUST be able to
handle this. For example:
@code
111 Range Marker 30-59
111 Range Marker 0-89
@endcode
is equivalent to
@code
111 Range Marker 30-59
111 Range Marker 0-29,60-89
@endcode
Similarly, the client, if it is doing no processing of the restart
markers, MAY send redundant information in a restart.
Should these be allowed as restart markers for stream mode?
@par Performance Monitoring
In order to monitor the performance of extended block mode transfer,
an additional preliminary reply MAY be transmitted over the control
channel. This reply is of the form:
@code
extended-perf-response = "112-Perf Marker" CRLF
"Timestamp:" CRLF
"Stripe Index:" CRLF
"Stripe Bytes Transferred:" CRLF
"Total Stripe Count:" CRLF
"112 End" CRLF
timestamp = [ "." ]
@endcode
is seconds since the epoch
The performance marker can contain these or any other perf-line facts
which provide useful information about the current performance.
All perf-line facts represent an instantaneous state of the transfer
at the given timestamp. The meaning of the facts are
- Timestamp - The time at which the server computed the performance
information. This is in seconds since the epoch (00:00:00 UTC, January 1,
1970).
- Stripe Index - the index (0-number of stripes on the STOR side of the
transfer) which this marker pertains to.
- Stripe Bytes Transferred - The number of bytes which have been received
on this stripe.
A transfer start time can be specified by a perf marker with
'Stripe Bytes Transferred' set to zero. Only the first marker per stripe
can be used to specify the start time of that stripe. Any subsequent
markers with 'Stripe Bytes Transferred' set to zero simply indicates no data
transfer over the interval.
A server should send a 'start' marker for each stripe. A server should also
send a final perf marker for each stripe. This is a marker with
'Stripe Bytes Transferred' set to the total transfer size for that stripe.
@anchor sec_OPTS
@section opts Options to RETR
The options described in this section provide a means to convey
striping and transfer parallelism information to the server-DTP. For
the RETR command, the Client-FTP may specify a parallelism and
striping mode it wishes the server-DTP to use. These options are only
used by the server-DTP if the retrieve operation is done in extended
block mode. These options are implemented as @ref rfc2389 "RFC 2389"
extensions.
The format of the RETR OPTS is specified by:
@code
retr-opts = "OPTS" "RETR" [ option-list] CRLF
option-list = [ layout-opts ";" ] [ parallel-opts ";" ]
layout-opts = "StripeLayout=Partitioned"
| "StripeLayout=Blocked;BlockSize="
parallel-opts = "Parallelism=" ","
","
block-size ::=
starting-parallelism ::=
minimum-parallelism ::=
maximum-parallelism ::=
@endcode
@par Layout Options
The layout option is used by the source data node to send
sections of the data file to the appropriate destination stripe.
The various StripeLayout parameters are to be implemented as follows:
@par Partitioned
A partitioned data layout is one where the data is distributed evenly
on the destination data nodes. Only one contiguous section of data
is stored on each data node. A data node is defined here a single
host-port mentioned in the SPOR command
@par Blocked
A blocked data layout is one where the data is distributed in
round-robin fashion over the destination data nodes. The data
distribution is ordered by the order of the host-port specifications
in the SPOR command. The @b block-size defines the size of blocks to
be distributed.
@par PLVL Parallelism Options
The parallelism option is used by the source data node to control how
many parallel data connections may be established to each destination
data node. This extension option provides for both a fixed level of
parallelism, and for adapting the parallelism to the host/network
connection, within a range. If the @b starting-parallelism option is
set, then the server-DTP will make @b starting-parallelism connections
to each destination data node. If the @b minimum-parallelism option is
set, then the server may reduce the number of parallel
connections per destination data node to this value. If the
@b maximum-parallelism option is set, then the server may
increase the number of parallel connections to per destination data
node to at most this value.
@section refs References
@anchor rfc959 [1]
Postel, J. and Reynolds, J., "
FILE TRANSFER PROTOCOL (FTP)", STD 9, RFC 959, October 1985.
@anchor rfc2389 [2]
Hethmon, P. and Elz, R., "
Feature negotiation mechanism for the File Transfer Protocol",
RFC 2389, August 1998.
@anchor rfc2228 [3]
Horowitz, M. and Lunt, S., "
FTP Security Extensions", RFC 2228, October 1997.
@anchor ietfftpext [4]
Elz, R. and Hethom, P., "
FTP Extensions", IETF Draft, May 2001.
@section appendix_i Appendix I: Implementation under GSI
There are several security components in this document which are extensions
to the behavior of RFC 2228. These appendix attempts to clarify the protocol
how these extensions map to the OpenSSL-based implementation of the GSSAPI
known as GSI (Grid Security Infrastructure).
A client implementation which communicates with a server which supports the
DCAU extension should delegate a limited credential set (using
the GSS_C_DELEG_FLAG and GSS_C_GLOBUS_LIMITED_DELEG_PROXY_FLAG flags to
gss_init_sec_context()). If delegation is not performed, the client MUST
request that DCAU be disable by requesting DCAU N, or the server will be
unable to perform the default of DCAU A as described by this document.
When DCAU mode "A" or "S" is used, a separate security context is established
on each data channel. The context is established by performing the GSSAPI
handshake with the active-DTP calling gss_init_sec_context() and the
passive-DTP calling gss_accept_sec_context(). No delegation need be done
on these data channels.
Data channel protection via the PROT command MUST always be used in conjunction
with the DCAU A or DCAU S commands. If a PROT level is set, then messages will
be wrapped according to RFC 2228 Appendix I using the contexts established on
each data channel. Tokens transferred over the data channels when either PROT
or DCAU is used are not framed in any way when using GSI. (When implementing
this specification with other GSSAPI mechanisms, a 4 byte, big endian, binary
token length should procede all tokens).
If the DCAU mode or the PROT mode is changed between file transfers when
caching data channels in extended block mode, all open data channels must be
closed. This is because the GSI implementation does not support changing levels
of protection on an existing connection.
*/
globus_ftp_control-4.7/globus_ftp_control.h 0000666 0000764 0000764 00000162353 12100141247 016304 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file globus_ftp_control.h
*
* GSIFTP Control Connection API (Data structures and types)
*
*/
#ifndef GLOBUS_INCLUDE_FTP_CONTROL_H
#define GLOBUS_INCLUDE_FTP_CONTROL_H 1
#ifndef EXTERN_C_BEGIN
#ifdef __cplusplus
#define EXTERN_C_BEGIN extern "C" {
#define EXTERN_C_END }
#else
#define EXTERN_C_BEGIN
#define EXTERN_C_END
#endif
#endif
#include "globus_common.h"
#include "globus_error_string.h"
#include "globus_io.h"
#include "globus_gss_assist.h"
#include "globus_handle_table.h"
EXTERN_C_BEGIN
/**
* @mainpage Globus GSIFTP Control Connection API
*
* The globus_ftp_control library provides low-level services
* needed to implement FTP client and servers. The API provided is
* protocol specific. See the GASS Transfer library for a
* protocol-independent transfer interface.
*
* This data transfer portion of this API provides support for the
* standard data methods described in the @ref rfc959 "FTP Specification"
* as well as @ref page_extensions "extensions" for parallel, striped, and
* partial data transfer.
*
* Any program that uses the GSIFTP Control Library must include
* "globus_ftp_control.h".
*
* @htmlonly
* View documentation without frames
* View documentation with frames
* @endhtmlonly
*/
/**
* control structure types. The enumeration values match the character
* value of the argument to TYPE.
*/
typedef enum globus_ftp_control_type_e
{
GLOBUS_FTP_CONTROL_TYPE_NONE,
GLOBUS_FTP_CONTROL_TYPE_ASCII = 'A',
GLOBUS_FTP_CONTROL_TYPE_EBCDIC = 'E',
GLOBUS_FTP_CONTROL_TYPE_IMAGE = 'I',
GLOBUS_FTP_CONTROL_TYPE_LOCAL = 'L'
} globus_ftp_control_type_t;
/**
* control structure mode
*/
typedef enum globus_ftp_control_mode_e
{
GLOBUS_FTP_CONTROL_MODE_NONE,
GLOBUS_FTP_CONTROL_MODE_STREAM = 'S',
GLOBUS_FTP_CONTROL_MODE_BLOCK = 'B',
GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK = 'E',
GLOBUS_FTP_CONTROL_MODE_COMPRESSED = 'C'
} globus_ftp_control_mode_t;
/**
* control dcau types
*/
typedef enum globus_ftp_control_dcau_mode_e
{
GLOBUS_FTP_CONTROL_DCAU_NONE = 'N',
GLOBUS_FTP_CONTROL_DCAU_SELF = 'A',
GLOBUS_FTP_CONTROL_DCAU_SUBJECT = 'S',
GLOBUS_FTP_CONTROL_DCAU_DEFAULT
} globus_ftp_control_dcau_mode_t;
/**
* control dcau subject authentication type
*/
typedef struct globus_ftp_control_dcau_subject_s
{
globus_ftp_control_dcau_mode_t mode;
char * subject;
} globus_ftp_control_dcau_subject_t;
/**
* control striping Types
*/
typedef enum globus_ftp_control_striping_mode_e
{
GLOBUS_FTP_CONTROL_STRIPING_NONE,
GLOBUS_FTP_CONTROL_STRIPING_PARTITIONED,
GLOBUS_FTP_CONTROL_STRIPING_BLOCKED_ROUND_ROBIN
} globus_ftp_control_striping_mode_t;
/**
* control striping round robin attribute structure
*/
typedef struct globus_ftp_control_round_robin_s
{
globus_ftp_control_striping_mode_t mode;
globus_size_t block_size;
} globus_ftp_control_round_robin_t;
typedef struct globus_ftp_control_partitioned_s
{
globus_ftp_control_striping_mode_t mode;
globus_size_t size;
} globus_ftp_control_partitioned_t;
/**
* control dcau union
*/
typedef union globus_ftp_control_dcau_u
{
globus_ftp_control_dcau_mode_t mode;
globus_ftp_control_dcau_subject_t subject;
} globus_ftp_control_dcau_t;
/**
* control protection levels
*/
typedef enum
{
GLOBUS_FTP_CONTROL_PROTECTION_CLEAR = 'C',
GLOBUS_FTP_CONTROL_PROTECTION_SAFE = 'S',
GLOBUS_FTP_CONTROL_PROTECTION_CONFIDENTIAL = 'E',
GLOBUS_FTP_CONTROL_PROTECTION_PRIVATE = 'P'
} globus_ftp_control_protection_t;
/**
* delayed passive flags
*/
typedef enum
{
GLOBUS_FTP_CONTROL_DELAYED_SINGLE_PASSIVE = 'S',
GLOBUS_FTP_CONTROL_DELAYED_STRIPED_PASSIVE = 'M',
GLOBUS_FTP_CONTROL_NORMAL_PASSIVE = 'N'
} globus_ftp_control_delay_passive_t;
/**
* control striping attribute union
*/
typedef union globus_ftp_control_layout_u
{
globus_ftp_control_striping_mode_t mode;
globus_ftp_control_round_robin_t round_robin;
globus_ftp_control_partitioned_t partitioned;
/*
* No data required for:
* GLOBUS_FTP_CONTROL_STRIPING_NONE
* GLOBUS_FTP_CONTROL_STRIPING_PARTITIONED
*/
} globus_ftp_control_layout_t;
/**
* control structure structure
*/
typedef enum globus_ftp_control_structure_e
{
GLOBUS_FTP_CONTROL_STRUCTURE_NONE,
GLOBUS_FTP_CONTROL_STRUCTURE_FILE,
GLOBUS_FTP_CONTROL_STRUCTURE_PAGE,
GLOBUS_FTP_CONTROL_STRUCTURE_RECORD
} globus_ftp_control_structure_t;
/**
* control parallelism Types
*/
typedef enum globus_ftp_control_parallelism_mode_e
{
GLOBUS_FTP_CONTROL_PARALLELISM_NONE,
GLOBUS_FTP_CONTROL_PARALLELISM_FIXED
} globus_ftp_control_parallelism_mode_t;
/*
* The base class for all parrallel types. Subtypes
* must first define all types in this structure.
*/
typedef struct globus_i_ftp_parallelism_base_s
{
globus_ftp_control_parallelism_mode_t mode;
globus_size_t size;
} globus_i_ftp_parallelism_base_t;
typedef struct globus_ftp_parallelism_fixed_s
{
globus_ftp_control_parallelism_mode_t mode;
globus_size_t size;
} globus_ftp_parallelism_fixed_t;
/**
* control parallelism attribute structure
*/
typedef union globus_ftp_control_parallelism_u
{
globus_ftp_control_parallelism_mode_t mode;
globus_i_ftp_parallelism_base_t base;
globus_ftp_parallelism_fixed_t fixed;
} globus_ftp_control_parallelism_t;
typedef struct globus_ftp_control_host_port_s
{
int host[16];
unsigned short port;
/*
* if ipv6 is not enabled, the following param will be assumed to be 4
* when passed as an in-paramater. otherwise it must indicate the correct
* len.
*
* for out-parameters, the following will _always_ be 4 unless ipv6 is
* allowed. then it will be either 4 or 16
*/
int hostlen;
} globus_ftp_control_host_port_t;
/** Module descriptor
*
* The Globus FTP Control library uses the standard module activation and
* deactivation API to initialize it's state. Before any GSIFTP
* functions are called, the module must be activated
*
* @code
* globus_module_activate(GLOBUS_GSIFTP_CONTROL_MODULE);
* @endcode
*
* This function returns GLOBUS_SUCCESS if the GSIFTP library was
* successfully initialized. This may be called multiple times.
*
* To deactivate the GSIFTP library, the following must be called
*
* @code
* globus_module_deactivate(GLOBUS_GSIFTP_CONTROL_MODULE);
* @endcode
*/
#define GLOBUS_FTP_CONTROL_MODULE (&globus_i_ftp_control_module)
extern globus_module_descriptor_t globus_i_ftp_control_module;
#define _FCSL(s) globus_common_i18n_get_string(GLOBUS_FTP_CONTROL_MODULE,s)
/*
* Module Specific Data Types
*/
typedef enum globus_ftp_control_response_class_e
{
GLOBUS_FTP_UNKNOWN_REPLY,
GLOBUS_FTP_POSITIVE_PRELIMINARY_REPLY,
GLOBUS_FTP_POSITIVE_COMPLETION_REPLY,
GLOBUS_FTP_POSITIVE_INTERMEDIATE_REPLY,
GLOBUS_FTP_TRANSIENT_NEGATIVE_COMPLETION_REPLY,
GLOBUS_FTP_PERMANENT_NEGATIVE_COMPLETION_REPLY
} globus_ftp_control_response_class_t;
typedef struct globus_ftp_control_response_s
{
int code;
globus_ftp_control_response_class_t response_class;
globus_byte_t * response_buffer;
globus_size_t response_length;
globus_size_t response_buffer_size;
} globus_ftp_control_response_t;
/** TCP Buffer Setting Modes */
typedef enum globus_ftp_control_tcpbuffer_mode_e
{
/** Don't change the TCP buffer/window size from the system default */
GLOBUS_FTP_CONTROL_TCPBUFFER_DEFAULT,
/** Set the TCP buffer/window size to a fixed value */
GLOBUS_FTP_CONTROL_TCPBUFFER_FIXED,
/** Automatically set the TCP buffer/window size */
GLOBUS_FTP_CONTROL_TCPBUFFER_AUTOMATIC
} globus_ftp_control_tcpbuffer_mode_t;
/** Don't change the TCP buffer/window size from the system default */
typedef struct
{
globus_ftp_control_tcpbuffer_mode_t mode;
}
globus_ftp_control_tcpbuffer_default_t;
/** Set the TCP buffer/window size to a fixed value */
typedef struct
{
globus_ftp_control_tcpbuffer_mode_t mode;
int size;
}
globus_ftp_control_tcpbuffer_fixed_t;
/** Automatically set the TCP buffer/window size */
typedef struct globus_ftp_control_tcpbuffer_automatic_s
{
globus_ftp_control_tcpbuffer_mode_t mode;
unsigned int initial_size;
unsigned int minimum_size;
unsigned int maximum_size;
} globus_ftp_control_tcpbuffer_automatic_t;
/** control tcpbuffer attribute structure */
typedef union globus_ftp_control_tcpbuffer_t
{
globus_ftp_control_tcpbuffer_mode_t mode;
globus_ftp_control_tcpbuffer_default_t default_tcpbuffer;
globus_ftp_control_tcpbuffer_fixed_t fixed;
globus_ftp_control_tcpbuffer_automatic_t automatic;
} globus_ftp_control_tcpbuffer_t;
/*
* each strip can have multiple paralell conections to
* the same host
*/
typedef enum globus_ftp_data_connection_state_e
{
GLOBUS_FTP_DATA_STATE_NONE, /* dc_handle has no references */
GLOBUS_FTP_DATA_STATE_PASV, /* in local pasv mode */
GLOBUS_FTP_DATA_STATE_PORT, /* in local port mode */
GLOBUS_FTP_DATA_STATE_SPOR, /* in local spor mode */
GLOBUS_FTP_DATA_STATE_CONNECT_READ, /* connected for reading */
GLOBUS_FTP_DATA_STATE_CONNECT_WRITE, /* connected for writing */
GLOBUS_FTP_DATA_STATE_CLOSING, /* closing all connections */
GLOBUS_FTP_DATA_STATE_EOF, /* user has received eof */
GLOBUS_FTP_DATA_STATE_SEND_EOF /* not used for state at all */
} globus_ftp_data_connection_state_t;
#define GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE 1000
#define GLOBUS_FTP_CONTROL_HOSTENT_BUFFER_SIZE 8192
typedef enum
{
GLOBUS_FTP_CONTROL_UNCONNECTED,
GLOBUS_FTP_CONTROL_CONNECTING,
GLOBUS_FTP_CONTROL_CONNECTED,
GLOBUS_FTP_CONTROL_CLOSING
}
globus_ftp_cc_state_t;
struct globus_ftp_control_handle_s;
struct globus_i_ftp_dc_transfer_handle_t;
union globus_ftp_control_command_u;
typedef enum globus_ftp_control_command_code_e
{
GLOBUS_FTP_CONTROL_COMMAND_OPTS,
GLOBUS_FTP_CONTROL_COMMAND_AUTH,
GLOBUS_FTP_CONTROL_COMMAND_ADAT,
GLOBUS_FTP_CONTROL_COMMAND_SPAS,
GLOBUS_FTP_CONTROL_COMMAND_SPOR,
GLOBUS_FTP_CONTROL_COMMAND_PORT,
GLOBUS_FTP_CONTROL_COMMAND_PASV,
GLOBUS_FTP_CONTROL_COMMAND_SITE,
GLOBUS_FTP_CONTROL_COMMAND_TYPE,
GLOBUS_FTP_CONTROL_COMMAND_DELE,
GLOBUS_FTP_CONTROL_COMMAND_FEAT,
GLOBUS_FTP_CONTROL_COMMAND_ERET,
GLOBUS_FTP_CONTROL_COMMAND_ESTO,
GLOBUS_FTP_CONTROL_COMMAND_RMD,
GLOBUS_FTP_CONTROL_COMMAND_MKD,
GLOBUS_FTP_CONTROL_COMMAND_PWD,
GLOBUS_FTP_CONTROL_COMMAND_CWD,
GLOBUS_FTP_CONTROL_COMMAND_CDUP,
GLOBUS_FTP_CONTROL_COMMAND_NLST,
GLOBUS_FTP_CONTROL_COMMAND_HELP,
GLOBUS_FTP_CONTROL_COMMAND_STAT,
GLOBUS_FTP_CONTROL_COMMAND_NOOP,
GLOBUS_FTP_CONTROL_COMMAND_SYST,
GLOBUS_FTP_CONTROL_COMMAND_STOU,
GLOBUS_FTP_CONTROL_COMMAND_QUIT,
GLOBUS_FTP_CONTROL_COMMAND_REIN,
GLOBUS_FTP_CONTROL_COMMAND_ABOR,
GLOBUS_FTP_CONTROL_COMMAND_ALLO,
GLOBUS_FTP_CONTROL_COMMAND_MODE,
GLOBUS_FTP_CONTROL_COMMAND_STRU,
GLOBUS_FTP_CONTROL_COMMAND_ACCT,
GLOBUS_FTP_CONTROL_COMMAND_PASS,
GLOBUS_FTP_CONTROL_COMMAND_USER,
GLOBUS_FTP_CONTROL_COMMAND_SMNT,
GLOBUS_FTP_CONTROL_COMMAND_LIST,
GLOBUS_FTP_CONTROL_COMMAND_RETR,
GLOBUS_FTP_CONTROL_COMMAND_REST,
GLOBUS_FTP_CONTROL_COMMAND_SBUF,
GLOBUS_FTP_CONTROL_COMMAND_SIZE,
GLOBUS_FTP_CONTROL_COMMAND_STOR,
GLOBUS_FTP_CONTROL_COMMAND_APPE,
GLOBUS_FTP_CONTROL_COMMAND_RNFR,
GLOBUS_FTP_CONTROL_COMMAND_RNTO,
GLOBUS_FTP_CONTROL_COMMAND_LANG,
GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN
} globus_ftp_control_command_code_t;
/**
* Authentication Values.
*
* This structure is populated and passed back to the user via
* the globus_ftp_control_auth_callback_t(). It contains the
* information needed to decide if a client may use the server.
*/
typedef struct globus_ftp_control_auth_info_s
{
globus_bool_t authenticated;
globus_ftp_control_command_code_t prev_cmd;
char * auth_gssapi_subject;
gss_ctx_id_t auth_gssapi_context;
gss_cred_id_t credential_handle;
globus_bool_t locally_acquired_credential;
gss_name_t target_name;
OM_uint32 req_flags;
char * user;
char * password;
char * account;
gss_cred_id_t delegated_credential_handle;
globus_bool_t encrypt;
}
globus_ftp_control_auth_info_t;
/**
* Asynchronous operation completion callback.
*
* This callback is called whenever a reply to command is received on
* the FTP control channel. It allows the user to handle the received
* reply or alternatively handle any errors that occurred during the
* interaction with the FTP server. This function will be called
* multiple times in the case when intermediate responses (1yz) are
* received.
*
* @param callback_arg
* User supplied argument to the callback function
* @param handle
* A pointer to the GSIFTP control handle. Used to identify
* which control connection the operation was applied to.
* @param error
* Pointer to a globus error object containing information
* about any errors that occurred processing the operation
* @param ftp_response
* Pointer to a response structure containing the FTP response to
* the command.
*/
typedef void (*globus_ftp_control_response_callback_t)(
void * callback_arg,
struct globus_ftp_control_handle_s * handle,
globus_object_t * error,
globus_ftp_control_response_t * ftp_response);
/**
* Asynchronous control callback.
*
* This callback is used as a generic control operation callback.
*
* @param callback_arg
* User supplied argument to the callback function
* @param handle
* A pointer to the GSIFTP control handle. Used to identify
* which control connection the operation was applied to.
* @param error
* Pointer to a globus error object containing information
* about any errors that occurred processing the operation
*/
typedef void (*globus_ftp_control_callback_t)(
void * callback_arg,
struct globus_ftp_control_handle_s * handle,
globus_object_t * error);
typedef void
(*globus_ftp_control_data_connect_callback_t)(
void * callback_arg,
struct globus_ftp_control_handle_s * handle,
unsigned int stripe_ndx,
globus_bool_t reused,
globus_object_t * error);
/**
* Server command callback.
*
* When a command from a client is received on the control channel
* a user callback with this signature is called.
*
* @param callback_arg
* The user argument passed to the callback function.
* @param handle
* The control handle that the command was issued on.
* @param error
* Indicates if a command was successful read or
* or if a failure occurred. This object will be freed once
* this callback returns. If the user wishes to have a copy
* of the error that persists past the life of this callback,
* they must make a copy using globus_object_copy(), and free
* it with globus_object_free().
* @param command
* The command structure indicates what type of command the
* client issued. Based on the 'type' further information
* can be extracted. This command structure will be freed once
* this callback returns. If the user wishes to have a copy
* of the error that persists past the life of this callback,
* they must make a copy using
* globus_ftp_control_command_copy(), and free
* it with globus_ftp_control_command_free().
*/
typedef void (*globus_ftp_control_command_callback_t)(
void * callback_arg,
struct globus_ftp_control_handle_s * handle,
globus_object_t * error,
union globus_ftp_control_command_u * command);
/**
* Server authentication complete callback.
*
* A function with this signature is registered by calling
* globus_ftp_control_accept(). It is called when the authentication
* protocal has completed. Based on the auth_result, the server
* implementor should determine authorization and then send the appropriate
* response using globus_ftp_control_send_response(), indicating
* to the client whether authorization was successful or not.
*
* @param handle
* This structure is populated when the callback is called and
* represents a control connection to the client.
* @param auth_result
* A globus_ftp_control_auth_result_t containing the
* values the client sent for gss authentication, user name,
* password and account. If any of the values were not sent by
* the client they will be NULL. Based on that information
* the user can decide if the client will be authorized for use
* of the server.
* @param callback_arg
* The user argument passed to the callback.
*/
typedef void
(*globus_ftp_control_auth_callback_t)(
void * callback_arg,
struct globus_ftp_control_handle_s * handle,
globus_object_t * error,
globus_ftp_control_auth_info_t * auth_result);
/**
* Authentication requirements.
*
* The value of this should be a bitwise or of
* - GLOBUS_FTP_CONTROL_AUTH_NONE
* - GLOBUS_FTP_CONTROL_AUTH_GSSAPI
* - GLOBUS_FTP_CONTROL_AUTH_USER
* - GLOBUS_FTP_CONTROL_AUTH_PASS
* - GLOBUS_FTP_CONTROL_AUTH_ACCT
*/
typedef unsigned long globus_ftp_control_auth_requirements_t;
#define GLOBUS_FTP_CONTROL_AUTH_REQ_NONE 1
#define GLOBUS_FTP_CONTROL_AUTH_REQ_GSSAPI 2
#define GLOBUS_FTP_CONTROL_AUTH_REQ_USER 4
#define GLOBUS_FTP_CONTROL_AUTH_REQ_PASS 8
#define GLOBUS_FTP_CONTROL_AUTH_REQ_ACCT 16
typedef struct globus_ftp_control_rw_queue_element_s
{
globus_ftp_control_response_callback_t callback;
globus_ftp_control_callback_t send_response_cb;
void * arg;
globus_byte_t * write_buf;
int write_flags;
globus_io_write_callback_t write_callback;
globus_io_read_callback_t read_callback;
globus_bool_t expect_response;
}
globus_ftp_control_rw_queue_element_t;
typedef struct globus_ftp_cc_handle_s
{
globus_io_attr_t io_attr;
globus_netlogger_handle_t nl_handle;
globus_bool_t nl_handle_set;
globus_fifo_t readers;
globus_fifo_t writers;
globus_ftp_control_command_callback_t command_cb;
void * command_cb_arg;
/* callback and arg for accept */
globus_ftp_control_callback_t accept_cb;
void * accept_cb_arg;
globus_ftp_control_auth_callback_t auth_cb;
void * auth_cb_arg;
globus_ftp_control_auth_requirements_t auth_requirements;
globus_ftp_control_response_t response;
globus_byte_t * read_buffer;
globus_size_t read_buffer_size;
globus_size_t bytes_read;
globus_ftp_control_auth_info_t auth_info;
globus_bool_t use_auth;
globus_io_handle_t io_handle;
globus_ftp_cc_state_t cc_state;
char serverhost[MAXHOSTNAMELEN];
struct hostent server;
char server_buffer[
GLOBUS_FTP_CONTROL_HOSTENT_BUFFER_SIZE];
globus_list_t * list_elem;
globus_mutex_t mutex;
globus_bool_t do_close;
int cb_count;
globus_ftp_control_response_callback_t close_cb;
void * close_cb_arg;
globus_object_t * close_result;
globus_ftp_control_response_t quit_response;
globus_bool_t signal_deactivate;
}
globus_ftp_cc_handle_t;
struct globus_ftp_control_data_write_info_s;
typedef globus_result_t (*globus_ftp_control_layout_func_t)(
struct globus_ftp_control_handle_s * handle,
struct globus_ftp_control_data_write_info_s * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
int stripe_count,
char * enqueue_str,
void * user_arg);
typedef globus_result_t (*globus_ftp_control_layout_verify_func_t)(
char * enqueue_str);
typedef struct globus_i_ftp_dc_handle_s
{
char magic[32];
globus_ftp_control_dcau_t dcau;
unsigned long pbsz;
globus_ftp_control_protection_t protection;
globus_ftp_data_connection_state_t state;
globus_ftp_control_mode_t mode;
globus_ftp_control_type_t type;
globus_ftp_control_structure_t structure;
int tcp_buffer_size;
int form_code;
globus_ftp_control_parallelism_t parallel;
globus_io_attr_t io_attr;
char * interface_addr;
struct globus_i_ftp_dc_transfer_handle_s * transfer_handle;
globus_list_t * transfer_list;
globus_bool_t send_eof;
globus_ftp_control_layout_func_t layout_func;
globus_ftp_control_layout_t layout;
char * layout_str;
void * layout_user_arg;
globus_bool_t initialized;
globus_mutex_t mutex;
globus_ftp_control_callback_t close_callback;
void * close_callback_arg;
globus_netlogger_handle_t nl_io_handle;
globus_bool_t nl_io_handle_set;
globus_netlogger_handle_t nl_ftp_handle;
globus_bool_t nl_ftp_handle_set;
globus_object_t * connect_error;
struct globus_ftp_control_handle_s * whos_my_daddy;
} globus_i_ftp_dc_handle_t;
typedef struct globus_ftp_control_handle_s
{
struct globus_i_ftp_dc_handle_s dc_handle;
struct globus_ftp_cc_handle_s cc_handle;
} globus_ftp_control_handle_t;
/**
* Asynchronous data transmission operation callback.
*
* This callback is called in functions that send or receive data on
* the data channel(s).
*
* In the case of a write, this function is invoked when the entire
* data buffer is sent. Depending on the data transfer properties set
* by the globus_ftp_control_local_*() functions, the data may
* actually be split into multiple buffers and sent to multiple data
* nodes.
*
* In the case of a read, this function will return a single extent of
* the data. The order of the data returned is not defined in an
* extended block mode data transfer. It is up to the user of the API
* to re-construct the file order.
*
* @param callback_arg
* User supplied argument to the callback function
* @param handle
* A pointer to the GSIFTP control handle. Used to identify
* which control connection the operation was applied to.
* @param error
* Pointer to a globus error object containing information
* about any errors that occurred processing the operation
* @param buffer
* The user buffer passed as a parameter to
* globus_ftp_control_data_read() or
* globus_ftp_control_data_write().
* @param length
* The amount of data in the buffer. In the case of an incoming
* data channel, this may be less than the
* buffer size.
* @param offset
* The file offset of the data which is contained in the buffer.
* @param eof
* This is set to GLOBUS_TRUE then all of the data associated
* with the transfer has arrived on the data connections
* associated with this handle. If multiple data callbacks are
* registered with this handle, there is no guaranteed order
* of the EOF callback with respect to other data
* callbacks. If multiple callbacks are registered when EOF is
* reached on the data connections, at least one callback
* function will be called with eof set to GLOBUS_TRUE.
*/
typedef void (*globus_ftp_control_data_callback_t)(
void * callback_arg,
globus_ftp_control_handle_t * handle,
globus_object_t * error,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof);
typedef struct globus_ftp_control_data_write_info_s
{
globus_ftp_control_data_callback_t cb;
void * cb_arg;
globus_handle_t callback_table_handle;
} globus_ftp_control_data_write_info_t;
globus_result_t
globus_ftp_control_layout_register_func(
char * name,
globus_ftp_control_layout_func_t enqueue_func,
globus_ftp_control_layout_verify_func_t verify_func);
globus_result_t
globus_X_ftp_control_local_layout(
globus_ftp_control_handle_t * handle,
char * enqueue_str,
void * user_arg);
globus_result_t
globus_ftp_control_local_layout(
globus_ftp_control_handle_t * handle,
globus_ftp_control_layout_t * layout,
globus_size_t data_size);
/*
* NET LOGGER STUFF
*/
globus_result_t
globus_ftp_control_set_netlogger(
globus_ftp_control_handle_t * handle,
globus_netlogger_handle_t * nl_handle,
globus_bool_t nl_ftp_control,
globus_bool_t nl_globus_io);
globus_result_t
globus_ftp_control_data_set_interface(
globus_ftp_control_handle_t * handle,
const char * interface_addr);
globus_result_t
globus_i_ftp_control_data_set_stack(
globus_ftp_control_handle_t * handle,
globus_xio_stack_t stack);
globus_result_t
globus_i_ftp_control_data_get_attr(
globus_ftp_control_handle_t * handle,
globus_xio_attr_t * attr);
globus_result_t
globus_i_ftp_control_client_get_attr(
globus_ftp_control_handle_t * handle,
globus_xio_attr_t * attr);
globus_result_t
globus_i_ftp_control_client_set_stack(
globus_ftp_control_handle_t * handle,
globus_xio_stack_t stack);
globus_result_t
globus_i_ftp_control_load_xio_drivers(
char * driver_string,
globus_list_t ** driver_list);
void
globus_i_ftp_control_unload_xio_drivers(
globus_list_t * driver_list);
globus_result_t
globus_i_ftp_control_create_stack(
globus_ftp_control_handle_t * handle,
globus_list_t * driver_list,
globus_xio_stack_t * stack);
/*****************************************************************
* standard layout functions
****************************************************************/
/*
* blocked functions
*/
globus_result_t
globus_ftp_control_layout_blocked_verify(
char * layout_str);
void *
globus_ftp_control_layout_blocked_user_arg_create();
void
globus_ftp_control_layout_blocked_user_arg_destroy(
void * user_arg);
globus_result_t
globus_ftp_control_layout_blocked(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t in_offset,
globus_bool_t eof,
int stripe_count,
char * enqueue_str,
void * user_arg);
/*
* partitioned functions
*/
globus_result_t
globus_ftp_control_layout_partitioned_verify(
char * layout_str);
void *
globus_ftp_control_layout_partitioned_user_arg_create(
globus_size_t file_size);
void
globus_ftp_control_layout_partitioned_user_arg_destroy(
void * user_arg);
globus_result_t
globus_ftp_control_layout_partitioned(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t in_offset,
globus_bool_t eof,
int stripe_count,
char * enqueue_str,
void * user_arg);
/*
* data registration functions
*/
globus_result_t
globus_ftp_control_create_data_info(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_release_data_info(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info);
globus_result_t
globus_ftp_control_data_write_stripe(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
int stripe_ndx,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
globus_result_t
globus_X_ftp_control_data_write_stripe(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
int stripe_ndx,
globus_ftp_control_data_write_info_t * data_info);
/*
* Server API callbacks
* ----------------------------------------------------------------
*/
struct globus_ftp_control_server_s;
/**
* Server callback
*
* A functions with this signature can be used as general callbacks for
* the GSIFTP server API.
*
* @param server_handle
* The server handle associated with callback.
* @param result
* Indicates if the operation completed successfully or
* if a failure occurred.
* @param callback_arg
* The user argument passed to the callback function.
*/
typedef void (*globus_ftp_control_server_callback_t)(
void * callback_arg,
struct globus_ftp_control_server_s * server_handle,
globus_object_t * error);
typedef enum globus_ftp_control_server_state_n
{
GLOBUS_FTP_CONTROL_SERVER_LISTENING,
GLOBUS_FTP_CONTROL_SERVER_DEAF
}
globus_ftp_control_server_state_t;
typedef struct globus_ftp_control_server_s
{
globus_io_handle_t io_handle;
globus_ftp_control_server_state_t state;
globus_ftp_control_server_callback_t callback;
void * callback_arg;
globus_list_t * list_elem;
globus_mutex_t mutex;
} globus_ftp_control_server_t;
typedef struct globus_ftp_control_command_str_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
char * string_arg;
} globus_ftp_control_command_str_t;
/*
* complex commands
*/
typedef struct globus_ftp_control_command_stru_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
globus_ftp_control_structure_t structure;
} globus_ftp_control_command_stru_t;
typedef struct globus_ftp_control_command_port_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
globus_ftp_control_host_port_t host_port;
} globus_ftp_control_command_port_t;
typedef struct globus_ftp_control_command_spor_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
int num_args;
globus_ftp_control_host_port_t * host_port;
} globus_ftp_control_command_spor_t;
typedef struct globus_ftp_control_command_mode_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
globus_ftp_control_mode_t mode;
} globus_ftp_control_command_mode_t;
typedef struct globus_ftp_control_command_allo_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
int size;
int record_size;
} globus_ftp_control_command_allo_t;
typedef struct globus_ftp_control_command_sbuf_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
int buffer_size;
} globus_ftp_control_command_sbuf_t;
/*
Can't parse marker unless I know state
typedef struct globus_ftp_control_command_rest_s
{
} globus_ftp_control_command_rest_t;
*/
typedef enum globus_ftp_control_type_option_e
{
GLOBUS_FTP_CONTROL_TYPE_NO_OPTION,
GLOBUS_FTP_CONTROL_TYPE_OPTION_N,
GLOBUS_FTP_CONTROL_TYPE_OPTION_T,
GLOBUS_FTP_CONTROL_TYPE_OPTION_C
} globus_ftp_control_type_option_t;
typedef struct globus_ftp_control_command_type_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
globus_ftp_control_type_t type;
globus_ftp_control_type_option_t option;
unsigned int bytesize;
} globus_ftp_control_command_type_t;
typedef enum globus_ftp_control_auth_type_e
{
GLOBUS_FTP_CONTROL_AUTH_GSSAPI,
GLOBUS_FTP_CONTROL_AUTH_UNKNOWN
} globus_ftp_control_auth_type_t;
typedef struct globus_ftp_control_command_auth_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
globus_ftp_control_auth_type_t type;
} globus_ftp_control_command_auth_t;
typedef struct globus_ftp_control_command_opts_s
{
globus_ftp_control_command_code_t code;
char * raw_command;
char * cmd_name;
char * cmd_opts;
} globus_ftp_control_command_opts_t;
/*
* single string commands
*/
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_site_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_acct_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_cwd_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_cdup_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_pass_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_user_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_smnt_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_list_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_retr_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_size_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_stor_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_appe_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_rnfr_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_rnto_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_feat_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_dele_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_rmd_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_mkd_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_nlst_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_help_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_stou_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_rest_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_eret_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_esto_t;
/*
* no string commands
*/
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_pasv_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_spas_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_stat_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_noop_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_syst_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_quit_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_rein_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_abor_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_pwd_t;
typedef globus_ftp_control_command_str_t
globus_ftp_control_command_adat_t;
typedef union globus_ftp_control_command_u
{
globus_ftp_control_command_code_t code;
globus_ftp_control_command_site_t site;
globus_ftp_control_command_sbuf_t sbuf;
globus_ftp_control_command_type_t type;
globus_ftp_control_command_rest_t rest;
globus_ftp_control_command_allo_t allo;
globus_ftp_control_command_eret_t eret;
globus_ftp_control_command_esto_t esto;
globus_ftp_control_command_mode_t mode;
globus_ftp_control_command_port_t port;
globus_ftp_control_command_spor_t spor;
globus_ftp_control_command_stru_t stru;
globus_ftp_control_command_auth_t auth;
globus_ftp_control_command_adat_t adat;
globus_ftp_control_command_acct_t acct;
globus_ftp_control_command_cwd_t cwd;
globus_ftp_control_command_cdup_t cdup;
globus_ftp_control_command_pass_t pass;
globus_ftp_control_command_user_t user;
globus_ftp_control_command_smnt_t smnt;
globus_ftp_control_command_opts_t opts;
globus_ftp_control_command_list_t list;
globus_ftp_control_command_retr_t retr;
globus_ftp_control_command_size_t size;
globus_ftp_control_command_stor_t stor;
globus_ftp_control_command_appe_t appe;
globus_ftp_control_command_rnfr_t rnfr;
globus_ftp_control_command_rnto_t rnto;
globus_ftp_control_command_dele_t dele;
globus_ftp_control_command_feat_t feat;
globus_ftp_control_command_rmd_t rmd;
globus_ftp_control_command_mkd_t mkd;
globus_ftp_control_command_nlst_t nlst;
globus_ftp_control_command_help_t help;
globus_ftp_control_command_pasv_t pasv;
globus_ftp_control_command_spas_t spas;
globus_ftp_control_command_stat_t stat;
globus_ftp_control_command_noop_t noop;
globus_ftp_control_command_syst_t syst;
globus_ftp_control_command_stou_t stou;
globus_ftp_control_command_quit_t quit;
globus_ftp_control_command_rein_t rein;
globus_ftp_control_command_abor_t abor;
globus_ftp_control_command_pwd_t pwd;
globus_ftp_control_command_str_t base;
} globus_ftp_control_command_t;
typedef struct globus_ftp_data_server_s
{
int bogus;
} globus_ftp_data_server_t;
/*
* API Functions -- Doxygen comments are included with the function
* implementation.
*/
#ifndef GLOBUS_SEPARATE_DOCS
/* globus_ftp_control_client.c */
globus_result_t
globus_ftp_control_auth_info_init(
globus_ftp_control_auth_info_t * auth_info,
gss_cred_id_t credential_handle,
globus_bool_t encrypt,
char * user,
char * password,
char * account,
char * subject);
int
globus_ftp_control_auth_info_compare(
globus_ftp_control_auth_info_t * auth_info_1,
globus_ftp_control_auth_info_t * auth_info_2);
globus_result_t
globus_ftp_control_handle_init(
globus_ftp_control_handle_t * handle);
globus_result_t
globus_ftp_control_handle_destroy(
globus_ftp_control_handle_t * handle);
globus_result_t
globus_ftp_control_server_handle_init(
globus_ftp_control_server_t * handle);
globus_result_t
globus_ftp_control_server_handle_destroy(
globus_ftp_control_server_t * handle);
globus_result_t
globus_ftp_control_response_destroy(
globus_ftp_control_response_t * response);
globus_result_t
globus_ftp_control_response_copy(
globus_ftp_control_response_t * src,
globus_ftp_control_response_t * dest);
globus_result_t
globus_ftp_control_connect(
globus_ftp_control_handle_t * handle,
char * host,
unsigned short port,
globus_ftp_control_response_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_authenticate(
globus_ftp_control_handle_t * handle,
globus_ftp_control_auth_info_t * auth_info,
globus_bool_t use_auth,
globus_ftp_control_response_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_authenticate_ex(
globus_ftp_control_handle_t * handle,
globus_ftp_control_auth_info_t * auth_info,
globus_bool_t use_auth,
globus_ftp_control_response_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_abort(
globus_ftp_control_handle_t * handle,
globus_ftp_control_response_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_quit(
globus_ftp_control_handle_t * handle,
globus_ftp_control_response_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_force_close(
globus_ftp_control_handle_t * handle,
globus_ftp_control_response_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_send_command(
globus_ftp_control_handle_t * handle,
const char * cmdspec,
globus_ftp_control_response_callback_t callback,
void * callback_arg,
...);
globus_result_t
globus_ftp_control_local_pbsz(
globus_ftp_control_handle_t * handle,
unsigned long bufsize);
globus_result_t
globus_ftp_control_get_pbsz(
globus_ftp_control_handle_t * handle,
unsigned long * bufsize);
/* globus_ftp_control_server.c */
globus_result_t
globus_ftp_control_server_listen(
globus_ftp_control_server_t * handle,
unsigned short * port,
globus_ftp_control_server_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_server_stop(
globus_ftp_control_server_t * listener,
globus_ftp_control_server_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_server_accept(
globus_ftp_control_server_t * listener,
globus_ftp_control_handle_t * handle,
globus_ftp_control_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_server_authenticate(
globus_ftp_control_handle_t * handle,
globus_ftp_control_auth_requirements_t auth_requirements,
globus_ftp_control_auth_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_read_commands(
globus_ftp_control_handle_t * handle,
globus_ftp_control_command_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_send_response(
globus_ftp_control_handle_t * handle,
const char * respspec,
globus_ftp_control_callback_t callback,
void * callback_arg,
...);
globus_result_t
globus_ftp_control_close(
globus_ftp_control_server_t * listener,
globus_ftp_control_server_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_data_close(
globus_ftp_data_server_t * listener,
globus_ftp_control_server_callback_t callback,
void * callback_arg);
int
globus_i_ftp_queue_size(
globus_ftp_control_handle_t * handle,
int stripe_ndx);
/* command object functions */
globus_result_t
globus_ftp_control_command_copy(
globus_ftp_control_command_t * dest,
globus_ftp_control_command_t * src);
globus_result_t
globus_ftp_control_command_init(
globus_ftp_control_command_t * command,
char * raw_command,
globus_ftp_control_auth_info_t * auth_info);
globus_result_t
globus_ftp_control_command_destroy(
globus_ftp_control_command_t * command);
/*globus_result_t
globus_ftp_i_control_create_command_(
globus_ftp_control_command_t * command);
*/
/* globus_ftp_control_data.c */
globus_result_t
globus_i_ftp_control_data_cc_init(
globus_ftp_control_handle_t * control_handle);
globus_result_t
globus_i_ftp_control_data_cc_destroy(
globus_ftp_control_handle_t * control_handle);
globus_result_t
globus_ftp_control_data_force_close(
globus_ftp_control_handle_t * control_handle,
globus_ftp_control_callback_t destroy_callback,
void * destroy_callback_arg);
globus_result_t
globus_ftp_control_local_send_eof(
globus_ftp_control_handle_t * handle,
globus_bool_t send_eof);
globus_result_t
globus_ftp_control_data_send_eof(
globus_ftp_control_handle_t * handle,
int count[],
int array_size,
globus_bool_t eof_message,
globus_ftp_control_callback_t cb,
void * user_arg);
globus_result_t
globus_ftp_control_get_stripe_count(
globus_ftp_control_handle_t * handle,
int * stripe_count);
globus_result_t
globus_ftp_control_data_connect_read(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg);
globus_result_t
globus_ftp_control_data_connect_write(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg);
globus_result_t
globus_ftp_control_data_add_channels(
globus_ftp_control_handle_t * handle,
unsigned int num_channels,
unsigned int stripe);
globus_result_t
globus_ftp_control_data_remove_channels(
globus_ftp_control_handle_t * handle,
unsigned int num_channels,
unsigned int stripe);
globus_result_t
globus_ftp_control_data_query_channels(
globus_ftp_control_handle_t * handle,
unsigned int * num_channels,
unsigned int stripe);
globus_result_t
globus_ftp_control_data_get_total_data_channels(
globus_ftp_control_handle_t * handle,
unsigned int * num_channels,
unsigned int stripe_ndx);
globus_result_t
globus_ftp_control_data_get_remote_hosts(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * address,
int * addr_count);
globus_result_t
globus_ftp_control_get_parallelism(
globus_ftp_control_handle_t * handle,
globus_ftp_control_parallelism_t * parallelism);
globus_result_t
globus_ftp_control_local_parallelism(
globus_ftp_control_handle_t * handle,
globus_ftp_control_parallelism_t * parallelism);
globus_result_t
globus_ftp_control_local_pasv(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * address);
globus_result_t
globus_ftp_control_local_spas(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t addresses[],
unsigned int num_addresses);
globus_result_t
globus_ftp_control_local_port(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * address);
globus_result_t
globus_ftp_control_local_spor(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t addresses[],
unsigned int num_addresses);
globus_result_t
globus_ftp_control_get_spor(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t addresses[],
unsigned int * num_addresses);
globus_result_t
globus_ftp_control_local_type(
globus_ftp_control_handle_t * handle,
globus_ftp_control_type_t type,
int form_code);
globus_result_t
globus_ftp_control_local_tcp_buffer(
globus_ftp_control_handle_t * handle,
globus_ftp_control_tcpbuffer_t * tcp_buffer);
globus_result_t
globus_ftp_control_local_mode(
globus_ftp_control_handle_t * handle,
globus_ftp_control_mode_t mode);
globus_result_t
globus_ftp_control_get_mode(
globus_ftp_control_handle_t * handle,
globus_ftp_control_mode_t * mode);
globus_result_t
globus_ftp_control_get_type(
globus_ftp_control_handle_t * handle,
globus_ftp_control_type_t * type);
globus_result_t
globus_ftp_control_local_dcau(
globus_ftp_control_handle_t * handle,
const globus_ftp_control_dcau_t * dcau,
gss_cred_id_t delegated_credential_handle);
globus_result_t
globus_ftp_control_get_dcau(
globus_ftp_control_handle_t * handle,
globus_ftp_control_dcau_t * dcau);
globus_result_t
globus_ftp_control_local_prot(
globus_ftp_control_handle_t * handle,
globus_ftp_control_protection_t protection);
globus_result_t
globus_ftp_control_get_prot(
globus_ftp_control_handle_t * handle,
globus_ftp_control_protection_t * protection);
globus_result_t
globus_ftp_control_local_stru(
globus_ftp_control_handle_t * handle,
globus_ftp_control_structure_t structure);
globus_result_t
globus_ftp_control_data_write(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_data_read(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t max_length,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
globus_result_t
globus_ftp_control_data_read_all(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
/* this has only been tested enough for the client library and gridftp server
* it is very likely to not work for general usage
*/
globus_result_t
globus_ftp_control_ipv6_allow(
globus_ftp_control_handle_t * handle,
globus_bool_t allow);
#endif /* GLOBUS_SEPARATE_DOCS */
/*
* internal function defintions
*/
globus_result_t
globus_i_ftp_parallelism_copy(
globus_ftp_control_parallelism_t * dest_parallelism,
globus_ftp_control_parallelism_t * src_parallelism);
int
globus_i_ftp_parallelism_get_size(
globus_ftp_control_parallelism_t * parallelism);
int
globus_i_ftp_parallelism_get_min_size(
globus_ftp_control_parallelism_t * parallelism);
int
globus_i_ftp_parallelism_get_max_size(
globus_ftp_control_parallelism_t * parallelism);
void
globus_ftp_control_host_port_init(
globus_ftp_control_host_port_t * host_port,
char * host,
unsigned short port);
void
globus_ftp_control_host_port_destroy(
globus_ftp_control_host_port_t * host_port);
void
globus_ftp_control_host_port_get_host(
globus_ftp_control_host_port_t * host_port,
char * host);
unsigned short
globus_ftp_control_host_port_get_port(
globus_ftp_control_host_port_t * host_port);
void
globus_ftp_control_host_port_copy(
globus_ftp_control_host_port_t * dest,
globus_ftp_control_host_port_t * src);
#define globus_i_ftp_control_client_get_connection_info \
globus_ftp_control_client_get_connection_info
globus_result_t
globus_ftp_control_client_get_connection_info(
globus_ftp_control_handle_t * handle,
int localhost[4],
unsigned short * localport,
int remotehost[4],
unsigned short * remoteport);
globus_result_t
globus_ftp_control_client_get_connection_info_ex(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * local_info,
globus_ftp_control_host_port_t * remote_info);
globus_result_t
globus_ftp_control_data_get_socket_buf(
globus_ftp_control_handle_t * handle,
int * rcvbuf,
int * sndbuf);
EXTERN_C_END
#endif /* GLOBUS_INCLUDE_GSIFTP_CONTROL_H */
globus_ftp_control-4.7/globus_ftp_control_layout.c 0000666 0000764 0000764 00000017330 11064627303 017700 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file globus_ftp_control_layout.c
*
*/
#include "globus_ftp_control.h"
#include
/*
*
* StripedLayout=Blocked;BlockSize=;
*/
globus_result_t
globus_ftp_control_layout_blocked_verify(
char * layout_str)
{
char * name;
char * tmp_ptr;
char * parm_name;
int block_size;
globus_result_t res = GLOBUS_SUCCESS;
if(layout_str == GLOBUS_NULL)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("layout string not in proper format.")));
goto error_exit;
}
name = (char *)globus_malloc(strlen(layout_str));
if(sscanf(layout_str, "StripedLayout=%s", name) < 1)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("layout string not in proper format.")));
goto exit;
}
tmp_ptr = strchr(name, ';');
if(tmp_ptr == GLOBUS_NULL)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("layout string not in proper format. must end with ';'")));
goto exit;
}
*tmp_ptr = '\0';
if(tmp_ptr == GLOBUS_NULL)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("layout string not in proper format. ';'")));
goto exit;
}
parm_name = tmp_ptr + 1;
if(strcmp(name, "Blocked") != 0)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("layout string not named \"Blocked\".")));
goto exit;
}
if(sscanf(parm_name, "BlockSize=%d;", &block_size) < 1)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("\"BlockSize\" argument not found.")));
goto exit;
}
exit:
globus_free(name);
error_exit:
return res;
}
void *
globus_ftp_control_layout_blocked_user_arg_create()
{
return GLOBUS_NULL;
}
void
globus_ftp_control_layout_blocked_user_arg_destroy(
void * user_arg)
{
return;
}
globus_result_t
globus_ftp_control_layout_blocked(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t in_offset,
globus_bool_t eof,
int stripe_count,
char * enqueue_str,
void * user_arg)
{
int chunk;
int stripe_ndx;
globus_off_t offset;
globus_size_t size;
globus_result_t res;
sscanf(enqueue_str, "StripedLayout=Blocked;BlockSize=%d;", &chunk);
for(offset = in_offset;
offset < in_offset + length;
offset += size)
{
stripe_ndx = (offset / chunk) % stripe_count;
size = chunk - (offset % chunk);
if(size > length - (offset - in_offset))
{
size = length - (offset - in_offset);
}
res = globus_X_ftp_control_data_write_stripe(
handle,
&buffer[(globus_size_t)(offset-in_offset)],
size,
offset,
eof,
stripe_ndx,
data_info);
if(res != GLOBUS_SUCCESS)
{
return res;
}
}
return GLOBUS_SUCCESS;
}
/*
*
* StripedLayout=Partitioned;
*/
globus_result_t
globus_ftp_control_layout_partitioned_verify(
char * layout_str)
{
if(layout_str == GLOBUS_NULL)
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("layout string not in proper format.")));
}
if(strcmp(layout_str, "StripedLayout=Partitioned;") != 0)
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("layout string not in proper format.")));
}
return GLOBUS_SUCCESS;
}
void *
globus_ftp_control_layout_partitioned_user_arg_create(
globus_size_t file_size)
{
globus_size_t * user_arg;
user_arg = (globus_size_t *) globus_malloc(sizeof(file_size));
*user_arg = file_size;
return user_arg;
}
void
globus_ftp_control_layout_partitioned_user_arg_destroy(
void * user_arg)
{
globus_free(user_arg);
return;
}
globus_result_t
globus_ftp_control_layout_partitioned(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t in_offset,
globus_bool_t eof,
int stripe_count,
char * enqueue_str,
void * user_arg)
{
int chunk;
int stripe_ndx;
globus_off_t offset;
globus_size_t size;
globus_size_t filesize;
globus_result_t res;
filesize = *((globus_size_t *)user_arg);
chunk = filesize / stripe_count;
for(offset = in_offset;
offset < in_offset + length;
offset += size)
{
stripe_ndx = (offset / chunk) % stripe_count;
size = chunk - (offset % chunk);
if(size > length - (offset - in_offset))
{
size = length - (offset - in_offset);
}
res = globus_X_ftp_control_data_write_stripe(
handle,
&buffer[(globus_size_t)(offset-in_offset)],
size,
offset,
eof,
stripe_ndx,
data_info);
if(res != GLOBUS_SUCCESS)
{
return res;
}
}
return GLOBUS_SUCCESS;
}
globus_ftp_control-4.7/install-sh 0000755 0000764 0000764 00000022021 12227171015 014220 0000000 0000000 #!/bin/sh
# install - install a program, script, or datafile
scriptversion=2005-05-14.22
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
# following copyright and license.
#
# Copyright (C) 1994 X Consortium
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name of the X Consortium shall not
# be used in advertising or otherwise to promote the sale, use or other deal-
# ings in this Software without prior written authorization from the X Consor-
# tium.
#
#
# FSF changes to this file are in the public domain.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
chmodcmd="$chmodprog 0755"
chowncmd=
chgrpcmd=
stripcmd=
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=
dst=
dir_arg=
dstarg=
no_target_directory=
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
or: $0 [OPTION]... SRCFILES... DIRECTORY
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
or: $0 [OPTION]... -d DIRECTORIES...
In the 1st form, copy SRCFILE to DSTFILE.
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
In the 4th, create DIRECTORIES.
Options:
-c (ignored)
-d create directories instead of installing files.
-g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER.
-s $stripprog installed files.
-t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory.
--help display this help and exit.
--version display version info and exit.
Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
"
while test -n "$1"; do
case $1 in
-c) shift
continue;;
-d) dir_arg=true
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
shift
shift
continue;;
--help) echo "$usage"; exit $?;;
-m) chmodcmd="$chmodprog $2"
shift
shift
continue;;
-o) chowncmd="$chownprog $2"
shift
shift
continue;;
-s) stripcmd=$stripprog
shift
continue;;
-t) dstarg=$2
shift
shift
continue;;
-T) no_target_directory=true
shift
continue;;
--version) echo "$0 $scriptversion"; exit $?;;
*) # When -d is used, all remaining arguments are directories to create.
# When -t is used, the destination is already specified.
test -n "$dir_arg$dstarg" && break
# Otherwise, the last argument is the destination. Remove it from $@.
for arg
do
if test -n "$dstarg"; then
# $@ is not empty: it contains at least $arg.
set fnord "$@" "$dstarg"
shift # fnord
fi
shift # arg
dstarg=$arg
done
break;;
esac
done
if test -z "$1"; then
if test -z "$dir_arg"; then
echo "$0: no input file specified." >&2
exit 1
fi
# It's OK to call `install-sh -d' without argument.
# This can happen when creating conditional directories.
exit 0
fi
for src
do
# Protect names starting with `-'.
case $src in
-*) src=./$src ;;
esac
if test -n "$dir_arg"; then
dst=$src
src=
if test -d "$dst"; then
mkdircmd=:
chmodcmd=
else
mkdircmd=$mkdirprog
fi
else
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if test ! -f "$src" && test ! -d "$src"; then
echo "$0: $src does not exist." >&2
exit 1
fi
if test -z "$dstarg"; then
echo "$0: no destination specified." >&2
exit 1
fi
dst=$dstarg
# Protect names starting with `-'.
case $dst in
-*) dst=./$dst ;;
esac
# If destination is a directory, append the input filename; won't work
# if double slashes aren't ignored.
if test -d "$dst"; then
if test -n "$no_target_directory"; then
echo "$0: $dstarg: Is a directory" >&2
exit 1
fi
dst=$dst/`basename "$src"`
fi
fi
# This sed command emulates the dirname command.
dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# Skip lots of stat calls in the usual case.
if test ! -d "$dstdir"; then
defaultIFS='
'
IFS="${IFS-$defaultIFS}"
oIFS=$IFS
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
shift
IFS=$oIFS
pathcomp=
while test $# -ne 0 ; do
pathcomp=$pathcomp$1
shift
if test ! -d "$pathcomp"; then
$mkdirprog "$pathcomp"
# mkdir can fail with a `File exist' error in case several
# install-sh are creating the directory concurrently. This
# is OK.
test -d "$pathcomp" || exit
fi
pathcomp=$pathcomp/
done
fi
if test -n "$dir_arg"; then
$doit $mkdircmd "$dst" \
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
else
dstfile=`basename "$dst"`
# Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_
rmtmp=$dstdir/_rm.$$_
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
trap '(exit $?); exit' 1 2 13 15
# Copy the file name to the temp name.
$doit $cpprog "$src" "$dsttmp" &&
# and set any options; do chmod last to preserve setuid bits.
#
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $cpprog $src $dsttmp" command.
#
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
# Now rename the file to the real destination.
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|| {
# The rename failed, perhaps because mv can't rename something else
# to itself, or perhaps because mv is so ancient that it does not
# support -f.
# Now remove or move aside any old file at destination location.
# We try this two ways since rm can't unlink itself on some
# systems and the destination file might be busy for other
# reasons. In this case, the final cleanup might fail but the new
# file should still install successfully.
{
if test -f "$dstdir/$dstfile"; then
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|| {
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
(exit 1); exit 1
}
else
:
fi
} &&
# Now rename the file to the real destination.
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
}
}
fi || { (exit 1); exit 1; }
done
# The final little trick to "correctly" pass the exit status to the exit trap.
{
(exit 0); exit 0
}
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:
globus_ftp_control-4.7/globus_automake_post 0000644 0000764 0000764 00000000000 12225575522 016367 0000000 0000000 globus_ftp_control-4.7/config.guess 0000755 0000764 0000764 00000124634 12227171016 014552 0000000 0000000 #! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
timestamp='2005-07-08'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Originally written by Per Bothner .
# Please send patches to . Submit a context
# diff and a properly formatted ChangeLog entry.
#
# This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and
# exits with 0. Otherwise, it exits with 1.
#
# The plan is that this can be called by configure scripts if you
# don't specify an explicit build system type.
me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
Usage: $0 [OPTION]
Output the configuration name of the system \`$me' is run on.
Operation modes:
-h, --help print this help, then exit
-t, --time-stamp print date of last modification, then exit
-v, --version print version number, then exit
Report bugs and patches to ."
version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
help="
Try \`$me --help' for more information."
# Parse command line
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
echo "$timestamp" ; exit ;;
--version | -v )
echo "$version" ; exit ;;
--help | --h* | -h )
echo "$usage"; exit ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
break ;;
-* )
echo "$me: invalid option $1$help" >&2
exit 1 ;;
* )
break ;;
esac
done
if test $# != 0; then
echo "$me: too many arguments$help" >&2
exit 1
fi
trap 'exit 1' 1 2 15
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
# compiler to aid in system detection is discouraged as it requires
# temporary files to be created and, as you can see below, it is a
# headache to deal with in a portable fashion.
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
# use `HOST_CC' if defined, but it is deprecated.
# Portable tmp directory creation inspired by the Autoconf team.
set_cc_for_build='
trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
: ${TMPDIR=/tmp} ;
{ tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
dummy=$tmp/dummy ;
tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
case $CC_FOR_BUILD,$HOST_CC,$CC in
,,) echo "int x;" > $dummy.c ;
for c in cc gcc c89 c99 ; do
if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
CC_FOR_BUILD="$c"; break ;
fi ;
done ;
if test x"$CC_FOR_BUILD" = x ; then
CC_FOR_BUILD=no_compiler_found ;
fi
;;
,,*) CC_FOR_BUILD=$CC ;;
,*,*) CC_FOR_BUILD=$HOST_CC ;;
esac ; set_cc_for_build= ;'
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 1994-08-24)
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
PATH=$PATH:/.attbin ; export PATH
fi
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
# Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:NetBSD:*:*)
# NetBSD (nbsd) targets should (where applicable) match one or
# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
# switched to ELF, *-*-netbsd* would select the old
# object file format. This provides both forward
# compatibility and a consistent mechanism for selecting the
# object file format.
#
# Note: NetBSD doesn't particularly care about the vendor
# portion of the name. We always set it to "unknown".
sysctl="sysctl -n hw.machine_arch"
UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
/usr/sbin/$sysctl 2>/dev/null || echo unknown)`
case "${UNAME_MACHINE_ARCH}" in
armeb) machine=armeb-unknown ;;
arm*) machine=arm-unknown ;;
sh3el) machine=shl-unknown ;;
sh3eb) machine=sh-unknown ;;
*) machine=${UNAME_MACHINE_ARCH}-unknown ;;
esac
# The Operating System including object format, if it has switched
# to ELF recently, or will in the future.
case "${UNAME_MACHINE_ARCH}" in
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
eval $set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep __ELF__ >/dev/null
then
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
# Return netbsd for either. FIX?
os=netbsd
else
os=netbsdelf
fi
;;
*)
os=netbsd
;;
esac
# The OS release
# Debian GNU/NetBSD machines have a different userland, and
# thus, need a distinct triplet. However, they do not need
# kernel version information, so it can be replaced with a
# suitable tag, in the style of linux-gnu.
case "${UNAME_VERSION}" in
Debian*)
release='-gnu'
;;
*)
release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
;;
esac
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
echo "${machine}-${os}${release}"
exit ;;
*:OpenBSD:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
exit ;;
*:ekkoBSD:*:*)
echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
exit ;;
macppc:MirBSD:*:*)
echo powerppc-unknown-mirbsd${UNAME_RELEASE}
exit ;;
*:MirBSD:*:*)
echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
exit ;;
alpha:OSF1:*:*)
case $UNAME_RELEASE in
*4.0)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
;;
*5.*)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
;;
esac
# According to Compaq, /usr/sbin/psrinfo has been available on
# OSF/1 and Tru64 systems produced since 1995. I hope that
# covers most systems running today. This code pipes the CPU
# types through head -n 1, so we only detect the type of CPU 0.
ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
case "$ALPHA_CPU_TYPE" in
"EV4 (21064)")
UNAME_MACHINE="alpha" ;;
"EV4.5 (21064)")
UNAME_MACHINE="alpha" ;;
"LCA4 (21066/21068)")
UNAME_MACHINE="alpha" ;;
"EV5 (21164)")
UNAME_MACHINE="alphaev5" ;;
"EV5.6 (21164A)")
UNAME_MACHINE="alphaev56" ;;
"EV5.6 (21164PC)")
UNAME_MACHINE="alphapca56" ;;
"EV5.7 (21164PC)")
UNAME_MACHINE="alphapca57" ;;
"EV6 (21264)")
UNAME_MACHINE="alphaev6" ;;
"EV6.7 (21264A)")
UNAME_MACHINE="alphaev67" ;;
"EV6.8CB (21264C)")
UNAME_MACHINE="alphaev68" ;;
"EV6.8AL (21264B)")
UNAME_MACHINE="alphaev68" ;;
"EV6.8CX (21264D)")
UNAME_MACHINE="alphaev68" ;;
"EV6.9A (21264/EV69A)")
UNAME_MACHINE="alphaev69" ;;
"EV7 (21364)")
UNAME_MACHINE="alphaev7" ;;
"EV7.9 (21364A)")
UNAME_MACHINE="alphaev79" ;;
esac
# A Pn.n version is a patched version.
# A Vn.n version is a released version.
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
exit ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead
# of the specific Alpha model?
echo alpha-pc-interix
exit ;;
21064:Windows_NT:50:3)
echo alpha-dec-winnt3.5
exit ;;
Amiga*:UNIX_System_V:4.0:*)
echo m68k-unknown-sysv4
exit ;;
*:[Aa]miga[Oo][Ss]:*:*)
echo ${UNAME_MACHINE}-unknown-amigaos
exit ;;
*:[Mm]orph[Oo][Ss]:*:*)
echo ${UNAME_MACHINE}-unknown-morphos
exit ;;
*:OS/390:*:*)
echo i370-ibm-openedition
exit ;;
*:z/VM:*:*)
echo s390-ibm-zvmoe
exit ;;
*:OS400:*:*)
echo powerpc-ibm-os400
exit ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
exit ;;
arm:riscos:*:*|arm:RISCOS:*:*)
echo arm-unknown-riscos
exit ;;
SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
echo hppa1.1-hitachi-hiuxmpp
exit ;;
Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
if test "`(/bin/universe) 2>/dev/null`" = att ; then
echo pyramid-pyramid-sysv3
else
echo pyramid-pyramid-bsd
fi
exit ;;
NILE*:*:*:dcosx)
echo pyramid-pyramid-svr4
exit ;;
DRS?6000:unix:4.0:6*)
echo sparc-icl-nx6
exit ;;
DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
case `/usr/bin/uname -p` in
sparc) echo sparc-icl-nx7; exit ;;
esac ;;
sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
i86pc:SunOS:5.*:*)
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
sun4*:SunOS:6*:*)
# According to config.sub, this is the proper way to canonicalize
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
# it's likely to be more like Solaris than SunOS4.
echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
sun4*:SunOS:*:*)
case "`/usr/bin/arch -k`" in
Series*|S4*)
UNAME_RELEASE=`uname -v`
;;
esac
# Japanese Language versions have a version number like `4.1.3-JL'.
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
exit ;;
sun3*:SunOS:*:*)
echo m68k-sun-sunos${UNAME_RELEASE}
exit ;;
sun*:*:4.2BSD:*)
UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
case "`/bin/arch`" in
sun3)
echo m68k-sun-sunos${UNAME_RELEASE}
;;
sun4)
echo sparc-sun-sunos${UNAME_RELEASE}
;;
esac
exit ;;
aushp:SunOS:*:*)
echo sparc-auspex-sunos${UNAME_RELEASE}
exit ;;
# The situation for MiNT is a little confusing. The machine name
# can be virtually everything (everything which is not
# "atarist" or "atariste" at least should have a processor
# > m68000). The system name ranges from "MiNT" over "FreeMiNT"
# to the lowercase version "mint" (or "freemint"). Finally
# the system name "TOS" denotes a system which is actually not
# MiNT. But MiNT is downward compatible to TOS, so this should
# be no problem.
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
exit ;;
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
exit ;;
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
exit ;;
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
echo m68k-milan-mint${UNAME_RELEASE}
exit ;;
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
echo m68k-hades-mint${UNAME_RELEASE}
exit ;;
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE}
exit ;;
m68k:machten:*:*)
echo m68k-apple-machten${UNAME_RELEASE}
exit ;;
powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE}
exit ;;
RISC*:Mach:*:*)
echo mips-dec-mach_bsd4.3
exit ;;
RISC*:ULTRIX:*:*)
echo mips-dec-ultrix${UNAME_RELEASE}
exit ;;
VAX*:ULTRIX*:*:*)
echo vax-dec-ultrix${UNAME_RELEASE}
exit ;;
2020:CLIX:*:* | 2430:CLIX:*:*)
echo clipper-intergraph-clix${UNAME_RELEASE}
exit ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#ifdef __cplusplus
#include /* for printf() prototype */
int main (int argc, char *argv[]) {
#else
int main (argc, argv) int argc; char *argv[]; {
#endif
#if defined (host_mips) && defined (MIPSEB)
#if defined (SYSTYPE_SYSV)
printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
#endif
#if defined (SYSTYPE_SVR4)
printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
#endif
#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
#endif
#endif
exit (-1);
}
EOF
$CC_FOR_BUILD -o $dummy $dummy.c &&
dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
SYSTEM_NAME=`$dummy $dummyarg` &&
{ echo "$SYSTEM_NAME"; exit; }
echo mips-mips-riscos${UNAME_RELEASE}
exit ;;
Motorola:PowerMAX_OS:*:*)
echo powerpc-motorola-powermax
exit ;;
Motorola:*:4.3:PL8-*)
echo powerpc-harris-powermax
exit ;;
Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
echo powerpc-harris-powermax
exit ;;
Night_Hawk:Power_UNIX:*:*)
echo powerpc-harris-powerunix
exit ;;
m88k:CX/UX:7*:*)
echo m88k-harris-cxux7
exit ;;
m88k:*:4*:R4*)
echo m88k-motorola-sysv4
exit ;;
m88k:*:3*:R3*)
echo m88k-motorola-sysv3
exit ;;
AViiON:dgux:*:*)
# DG/UX returns AViiON for all architectures
UNAME_PROCESSOR=`/usr/bin/uname -p`
if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
then
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
[ ${TARGET_BINARY_INTERFACE}x = x ]
then
echo m88k-dg-dgux${UNAME_RELEASE}
else
echo m88k-dg-dguxbcs${UNAME_RELEASE}
fi
else
echo i586-dg-dgux${UNAME_RELEASE}
fi
exit ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
exit ;;
M88*:*:R3*:*)
# Delta 88k system running SVR3
echo m88k-motorola-sysv3
exit ;;
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
echo m88k-tektronix-sysv3
exit ;;
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
echo m68k-tektronix-bsd
exit ;;
*:IRIX*:*:*)
echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
exit ;;
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
i*86:AIX:*:*)
echo i386-ibm-aix
exit ;;
ia64:AIX:*:*)
if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel`
else
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
exit ;;
*:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#include
main()
{
if (!__power_pc())
exit(1);
puts("powerpc-ibm-aix3.2.5");
exit(0);
}
EOF
if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
then
echo "$SYSTEM_NAME"
else
echo rs6000-ibm-aix3.2.5
fi
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4
else
echo rs6000-ibm-aix3.2
fi
exit ;;
*:AIX:*:[45])
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
IBM_ARCH=rs6000
else
IBM_ARCH=powerpc
fi
if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel`
else
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
exit ;;
*:AIX:*:*)
echo rs6000-ibm-aix
exit ;;
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
echo romp-ibm-bsd4.4
exit ;;
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
exit ;; # report: romp-ibm BSD 4.3
*:BOSX:*:*)
echo rs6000-bull-bosx
exit ;;
DPX/2?00:B.O.S.:*:*)
echo m68k-bull-sysv3
exit ;;
9000/[34]??:4.3bsd:1.*:*)
echo m68k-hp-bsd
exit ;;
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
echo m68k-hp-bsd4.4
exit ;;
9000/[34678]??:HP-UX:*:*)
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
case "${UNAME_MACHINE}" in
9000/31? ) HP_ARCH=m68000 ;;
9000/[34]?? ) HP_ARCH=m68k ;;
9000/[678][0-9][0-9])
if [ -x /usr/bin/getconf ]; then
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
case "${sc_cpu_version}" in
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
532) # CPU_PA_RISC2_0
case "${sc_kernel_bits}" in
32) HP_ARCH="hppa2.0n" ;;
64) HP_ARCH="hppa2.0w" ;;
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
esac ;;
esac
fi
if [ "${HP_ARCH}" = "" ]; then
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#define _HPUX_SOURCE
#include
#include
int main ()
{
#if defined(_SC_KERNEL_BITS)
long bits = sysconf(_SC_KERNEL_BITS);
#endif
long cpu = sysconf (_SC_CPU_VERSION);
switch (cpu)
{
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
case CPU_PA_RISC2_0:
#if defined(_SC_KERNEL_BITS)
switch (bits)
{
case 64: puts ("hppa2.0w"); break;
case 32: puts ("hppa2.0n"); break;
default: puts ("hppa2.0"); break;
} break;
#else /* !defined(_SC_KERNEL_BITS) */
puts ("hppa2.0"); break;
#endif
default: puts ("hppa1.0"); break;
}
exit (0);
}
EOF
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
test -z "$HP_ARCH" && HP_ARCH=hppa
fi ;;
esac
if [ ${HP_ARCH} = "hppa2.0w" ]
then
eval $set_cc_for_build
# hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
# 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
# generating 64-bit code. GNU and HP use different nomenclature:
#
# $ CC_FOR_BUILD=cc ./config.guess
# => hppa2.0w-hp-hpux11.23
# $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
# => hppa64-hp-hpux11.23
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
grep __LP64__ >/dev/null
then
HP_ARCH="hppa2.0w"
else
HP_ARCH="hppa64"
fi
fi
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit ;;
ia64:HP-UX:*:*)
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
echo ia64-hp-hpux${HPUX_REV}
exit ;;
3050*:HI-UX:*:*)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#include
int
main ()
{
long cpu = sysconf (_SC_CPU_VERSION);
/* The order matters, because CPU_IS_HP_MC68K erroneously returns
true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
results, however. */
if (CPU_IS_PA_RISC (cpu))
{
switch (cpu)
{
case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
default: puts ("hppa-hitachi-hiuxwe2"); break;
}
}
else if (CPU_IS_HP_MC68K (cpu))
puts ("m68k-hitachi-hiuxwe2");
else puts ("unknown-hitachi-hiuxwe2");
exit (0);
}
EOF
$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
{ echo "$SYSTEM_NAME"; exit; }
echo unknown-hitachi-hiuxwe2
exit ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
echo hppa1.1-hp-bsd
exit ;;
9000/8??:4.3bsd:*:*)
echo hppa1.0-hp-bsd
exit ;;
*9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
echo hppa1.0-hp-mpeix
exit ;;
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
echo hppa1.1-hp-osf
exit ;;
hp8??:OSF1:*:*)
echo hppa1.0-hp-osf
exit ;;
i*86:OSF1:*:*)
if [ -x /usr/sbin/sysversion ] ; then
echo ${UNAME_MACHINE}-unknown-osf1mk
else
echo ${UNAME_MACHINE}-unknown-osf1
fi
exit ;;
parisc*:Lites*:*:*)
echo hppa1.1-hp-lites
exit ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd
exit ;;
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
exit ;;
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
echo c34-convex-bsd
exit ;;
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
echo c38-convex-bsd
exit ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd
exit ;;
CRAY*Y-MP:*:*:*)
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
CRAY*[A-Z]90:*:*:*)
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-e 's/\.[^.]*$/.X/'
exit ;;
CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
CRAY*T3E:*:*:*)
echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
CRAY*SV1:*:*:*)
echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
*:UNICOS/mp:*:*)
echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
5000:UNIX_System_V:4.*:*)
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit ;;
sparc*:BSD/OS:*:*)
echo sparc-unknown-bsdi${UNAME_RELEASE}
exit ;;
*:BSD/OS:*:*)
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit ;;
*:FreeBSD:*:*)
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit ;;
i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin
exit ;;
i*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32
exit ;;
i*:windows32*:*)
# uname -m includes "-pc" on this system.
echo ${UNAME_MACHINE}-mingw32
exit ;;
i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32
exit ;;
x86:Interix*:[34]*)
echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
exit ;;
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
echo i${UNAME_MACHINE}-pc-mks
exit ;;
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
# UNAME_MACHINE based on the output of uname instead of i386?
echo i586-pc-interix
exit ;;
i*:UWIN*:*)
echo ${UNAME_MACHINE}-pc-uwin
exit ;;
amd64:CYGWIN*:*:*)
echo x86_64-unknown-cygwin
exit ;;
p*:CYGWIN*:*)
echo powerpcle-unknown-cygwin
exit ;;
prep*:SunOS:5.*:*)
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
*:GNU:*:*)
# the GNU system
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
exit ;;
i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
exit ;;
arm*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
cris:Linux:*:*)
echo cris-axis-linux-gnu
exit ;;
crisv32:Linux:*:*)
echo crisv32-axis-linux-gnu
exit ;;
frv:Linux:*:*)
echo frv-unknown-linux-gnu
exit ;;
ia64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
m32r*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
m68*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
mips:Linux:*:*)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#undef CPU
#undef mips
#undef mipsel
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
CPU=mipsel
#else
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
CPU=mips
#else
CPU=
#endif
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;;
mips64:Linux:*:*)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#undef CPU
#undef mips64
#undef mips64el
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
CPU=mips64el
#else
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
CPU=mips64
#else
CPU=
#endif
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;;
ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu
exit ;;
ppc64:Linux:*:*)
echo powerpc64-unknown-linux-gnu
exit ;;
alpha:Linux:*:*)
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
EV5) UNAME_MACHINE=alphaev5 ;;
EV56) UNAME_MACHINE=alphaev56 ;;
PCA56) UNAME_MACHINE=alphapca56 ;;
PCA57) UNAME_MACHINE=alphapca56 ;;
EV6) UNAME_MACHINE=alphaev6 ;;
EV67) UNAME_MACHINE=alphaev67 ;;
EV68*) UNAME_MACHINE=alphaev68 ;;
esac
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
exit ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
PA7*) echo hppa1.1-unknown-linux-gnu ;;
PA8*) echo hppa2.0-unknown-linux-gnu ;;
*) echo hppa-unknown-linux-gnu ;;
esac
exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
echo hppa64-unknown-linux-gnu
exit ;;
s390:Linux:*:* | s390x:Linux:*:*)
echo ${UNAME_MACHINE}-ibm-linux
exit ;;
sh64*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
sh*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
sparc:Linux:*:* | sparc64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
x86_64:Linux:*:*)
echo x86_64-unknown-linux-gnu
exit ;;
i*86:Linux:*:*)
# The BFD linker knows what the default object file format is, so
# first see if it will tell us. cd to the root directory to prevent
# problems with other programs or directories called `ld' in the path.
# Set LC_ALL=C to ensure ld outputs messages in English.
ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
| sed -ne '/supported targets:/!d
s/[ ][ ]*/ /g
s/.*supported targets: *//
s/ .*//
p'`
case "$ld_supported_targets" in
elf32-i386)
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
;;
a.out-i386-linux)
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
exit ;;
coff-i386)
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
exit ;;
"")
# Either a pre-BFD a.out linker (linux-gnuoldld) or
# one that does not give us useful --help.
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
exit ;;
esac
# Determine whether the default compiler is a.out or elf
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#include
#ifdef __ELF__
# ifdef __GLIBC__
# if __GLIBC__ >= 2
LIBC=gnu
# else
LIBC=gnulibc1
# endif
# else
LIBC=gnulibc1
# endif
#else
#ifdef __INTEL_COMPILER
LIBC=gnu
#else
LIBC=gnuaout
#endif
#endif
#ifdef __dietlibc__
LIBC=dietlibc
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
test x"${LIBC}" != x && {
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
exit
}
test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
;;
i*86:DYNIX/ptx:4*:*)
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
# earlier versions are messed up and put the nodename in both
# sysname and nodename.
echo i386-sequent-sysv4
exit ;;
i*86:UNIX_SV:4.2MP:2.*)
# Unixware is an offshoot of SVR4, but it has its own version
# number series starting with 2...
# I am not positive that other SVR4 systems won't match this,
# I just have to hope. -- rms.
# Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit ;;
i*86:OS/2:*:*)
# If we were able to find `uname', then EMX Unix compatibility
# is probably installed.
echo ${UNAME_MACHINE}-pc-os2-emx
exit ;;
i*86:XTS-300:*:STOP)
echo ${UNAME_MACHINE}-unknown-stop
exit ;;
i*86:atheos:*:*)
echo ${UNAME_MACHINE}-unknown-atheos
exit ;;
i*86:syllable:*:*)
echo ${UNAME_MACHINE}-pc-syllable
exit ;;
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
echo i386-unknown-lynxos${UNAME_RELEASE}
exit ;;
i*86:*DOS:*:*)
echo ${UNAME_MACHINE}-pc-msdosdjgpp
exit ;;
i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
else
echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
fi
exit ;;
i*86:*:5:[678]*)
# UnixWare 7.x, OpenUNIX and OpenServer 6.
case `/bin/uname -X | grep "^Machine"` in
*486*) UNAME_MACHINE=i486 ;;
*Pentium) UNAME_MACHINE=i586 ;;
*Pent*|*Celeron) UNAME_MACHINE=i686 ;;
esac
echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
exit ;;
i*86:*:3.2:*)
if test -f /usr/options/cb.name; then
UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then
UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
&& UNAME_MACHINE=i686
(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
&& UNAME_MACHINE=i686
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
else
echo ${UNAME_MACHINE}-pc-sysv32
fi
exit ;;
pc:*:*:*)
# Left here for compatibility:
# uname -m prints for DJGPP always 'pc', but it prints nothing about
# the processor, so we play safe by assuming i386.
echo i386-pc-msdosdjgpp
exit ;;
Intel:Mach:3*:*)
echo i386-pc-mach3
exit ;;
paragon:*:*:*)
echo i860-intel-osf1
exit ;;
i860:*:4.*:*) # i860-SVR4
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
else # Add other i860-SVR4 vendors below as they are discovered.
echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
fi
exit ;;
mini*:CTIX:SYS*5:*)
# "miniframe"
echo m68010-convergent-sysv
exit ;;
mc68k:UNIX:SYSTEM5:3.51m)
echo m68k-convergent-sysv
exit ;;
M680?0:D-NIX:5.3:*)
echo m68k-diab-dnix
exit ;;
M68*:*:R3V[5678]*:*)
test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
OS_REL=''
test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& { echo i486-ncr-sysv4.3${OS_REL}; exit; }
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& { echo i486-ncr-sysv4; exit; } ;;
m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
echo m68k-unknown-lynxos${UNAME_RELEASE}
exit ;;
mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4
exit ;;
TSUNAMI:LynxOS:2.*:*)
echo sparc-unknown-lynxos${UNAME_RELEASE}
exit ;;
rs6000:LynxOS:2.*:*)
echo rs6000-unknown-lynxos${UNAME_RELEASE}
exit ;;
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
echo powerpc-unknown-lynxos${UNAME_RELEASE}
exit ;;
SM[BE]S:UNIX_SV:*:*)
echo mips-dde-sysv${UNAME_RELEASE}
exit ;;
RM*:ReliantUNIX-*:*:*)
echo mips-sni-sysv4
exit ;;
RM*:SINIX-*:*:*)
echo mips-sni-sysv4
exit ;;
*:SINIX-*:*:*)
if uname -p 2>/dev/null >/dev/null ; then
UNAME_MACHINE=`(uname -p) 2>/dev/null`
echo ${UNAME_MACHINE}-sni-sysv4
else
echo ns32k-sni-sysv
fi
exit ;;
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
# says
echo i586-unisys-sysv4
exit ;;
*:UNIX_System_V:4*:FTX*)
# From Gerald Hewes .
# How about differentiating between stratus architectures? -djm
echo hppa1.1-stratus-sysv4
exit ;;
*:*:*:FTX*)
# From seanf@swdc.stratus.com.
echo i860-stratus-sysv4
exit ;;
i*86:VOS:*:*)
# From Paul.Green@stratus.com.
echo ${UNAME_MACHINE}-stratus-vos
exit ;;
*:VOS:*:*)
# From Paul.Green@stratus.com.
echo hppa1.1-stratus-vos
exit ;;
mc68*:A/UX:*:*)
echo m68k-apple-aux${UNAME_RELEASE}
exit ;;
news*:NEWS-OS:6*:*)
echo mips-sony-newsos6
exit ;;
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
if [ -d /usr/nec ]; then
echo mips-nec-sysv${UNAME_RELEASE}
else
echo mips-unknown-sysv${UNAME_RELEASE}
fi
exit ;;
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
echo powerpc-be-beos
exit ;;
BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
echo powerpc-apple-beos
exit ;;
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
echo i586-pc-beos
exit ;;
SX-4:SUPER-UX:*:*)
echo sx4-nec-superux${UNAME_RELEASE}
exit ;;
SX-5:SUPER-UX:*:*)
echo sx5-nec-superux${UNAME_RELEASE}
exit ;;
SX-6:SUPER-UX:*:*)
echo sx6-nec-superux${UNAME_RELEASE}
exit ;;
Power*:Rhapsody:*:*)
echo powerpc-apple-rhapsody${UNAME_RELEASE}
exit ;;
*:Rhapsody:*:*)
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
exit ;;
*:Darwin:*:*)
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
case $UNAME_PROCESSOR in
*86) UNAME_PROCESSOR=i686 ;;
unknown) UNAME_PROCESSOR=powerpc ;;
esac
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
exit ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
UNAME_PROCESSOR=`uname -p`
if test "$UNAME_PROCESSOR" = "x86"; then
UNAME_PROCESSOR=i386
UNAME_MACHINE=pc
fi
echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
exit ;;
*:QNX:*:4*)
echo i386-pc-qnx
exit ;;
NSE-?:NONSTOP_KERNEL:*:*)
echo nse-tandem-nsk${UNAME_RELEASE}
exit ;;
NSR-?:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE}
exit ;;
*:NonStop-UX:*:*)
echo mips-compaq-nonstopux
exit ;;
BS2000:POSIX*:*:*)
echo bs2000-siemens-sysv
exit ;;
DS/*:UNIX_System_V:*:*)
echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
exit ;;
*:Plan9:*:*)
# "uname -m" is not consistent, so use $cputype instead. 386
# is converted to i386 for consistency with other x86
# operating systems.
if test "$cputype" = "386"; then
UNAME_MACHINE=i386
else
UNAME_MACHINE="$cputype"
fi
echo ${UNAME_MACHINE}-unknown-plan9
exit ;;
*:TOPS-10:*:*)
echo pdp10-unknown-tops10
exit ;;
*:TENEX:*:*)
echo pdp10-unknown-tenex
exit ;;
KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
echo pdp10-dec-tops20
exit ;;
XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
echo pdp10-xkl-tops20
exit ;;
*:TOPS-20:*:*)
echo pdp10-unknown-tops20
exit ;;
*:ITS:*:*)
echo pdp10-unknown-its
exit ;;
SEI:*:*:SEIUX)
echo mips-sei-seiux${UNAME_RELEASE}
exit ;;
*:DragonFly:*:*)
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit ;;
*:*VMS:*:*)
UNAME_MACHINE=`(uname -p) 2>/dev/null`
case "${UNAME_MACHINE}" in
A*) echo alpha-dec-vms ; exit ;;
I*) echo ia64-dec-vms ; exit ;;
V*) echo vax-dec-vms ; exit ;;
esac ;;
*:XENIX:*:SysV)
echo i386-pc-xenix
exit ;;
i*86:skyos:*:*)
echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
exit ;;
esac
#echo '(No uname command or uname output not recognized.)' 1>&2
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
eval $set_cc_for_build
cat >$dummy.c <
# include
#endif
main ()
{
#if defined (sony)
#if defined (MIPSEB)
/* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
I don't know.... */
printf ("mips-sony-bsd\n"); exit (0);
#else
#include
printf ("m68k-sony-newsos%s\n",
#ifdef NEWSOS4
"4"
#else
""
#endif
); exit (0);
#endif
#endif
#if defined (__arm) && defined (__acorn) && defined (__unix)
printf ("arm-acorn-riscix\n"); exit (0);
#endif
#if defined (hp300) && !defined (hpux)
printf ("m68k-hp-bsd\n"); exit (0);
#endif
#if defined (NeXT)
#if !defined (__ARCHITECTURE__)
#define __ARCHITECTURE__ "m68k"
#endif
int version;
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
if (version < 4)
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
else
printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
exit (0);
#endif
#if defined (MULTIMAX) || defined (n16)
#if defined (UMAXV)
printf ("ns32k-encore-sysv\n"); exit (0);
#else
#if defined (CMU)
printf ("ns32k-encore-mach\n"); exit (0);
#else
printf ("ns32k-encore-bsd\n"); exit (0);
#endif
#endif
#endif
#if defined (__386BSD__)
printf ("i386-pc-bsd\n"); exit (0);
#endif
#if defined (sequent)
#if defined (i386)
printf ("i386-sequent-dynix\n"); exit (0);
#endif
#if defined (ns32000)
printf ("ns32k-sequent-dynix\n"); exit (0);
#endif
#endif
#if defined (_SEQUENT_)
struct utsname un;
uname(&un);
if (strncmp(un.version, "V2", 2) == 0) {
printf ("i386-sequent-ptx2\n"); exit (0);
}
if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
printf ("i386-sequent-ptx1\n"); exit (0);
}
printf ("i386-sequent-ptx\n"); exit (0);
#endif
#if defined (vax)
# if !defined (ultrix)
# include
# if defined (BSD)
# if BSD == 43
printf ("vax-dec-bsd4.3\n"); exit (0);
# else
# if BSD == 199006
printf ("vax-dec-bsd4.3reno\n"); exit (0);
# else
printf ("vax-dec-bsd\n"); exit (0);
# endif
# endif
# else
printf ("vax-dec-bsd\n"); exit (0);
# endif
# else
printf ("vax-dec-ultrix\n"); exit (0);
# endif
#endif
#if defined (alliant) && defined (i860)
printf ("i860-alliant-bsd\n"); exit (0);
#endif
exit (1);
}
EOF
$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
{ echo "$SYSTEM_NAME"; exit; }
# Apollos put the system type in the environment.
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
# Convex versions that predate uname can use getsysinfo(1)
if [ -x /usr/convex/getsysinfo ]
then
case `getsysinfo -f cpu_type` in
c1*)
echo c1-convex-bsd
exit ;;
c2*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
exit ;;
c34*)
echo c34-convex-bsd
exit ;;
c38*)
echo c38-convex-bsd
exit ;;
c4*)
echo c4-convex-bsd
exit ;;
esac
fi
cat >&2 < in order to provide the needed
information to handle your system.
config.guess timestamp = $timestamp
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`
/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
hostinfo = `(hostinfo) 2>/dev/null`
/bin/universe = `(/bin/universe) 2>/dev/null`
/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
/bin/arch = `(/bin/arch) 2>/dev/null`
/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
UNAME_MACHINE = ${UNAME_MACHINE}
UNAME_RELEASE = ${UNAME_RELEASE}
UNAME_SYSTEM = ${UNAME_SYSTEM}
UNAME_VERSION = ${UNAME_VERSION}
EOF
exit 1
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "timestamp='"
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "'"
# End:
globus_ftp_control-4.7/globus_ftp_control_client.c 0000666 0000764 0000764 00000446420 12113433136 017642 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file globus_ftp_control_client.c
*
* Client-side FTP Control API.
*/
#include "globus_ftp_control.h"
#include "globus_i_ftp_control.h"
#include "globus_error_gssapi.h"
#include
#include
#ifndef TARGET_ARCH_WIN32
#include
#endif
/* Global variable declarations */
FILE * globus_i_ftp_control_devnull;
/* Local variable declarations */
static globus_list_t * globus_l_ftp_cc_handle_list = GLOBUS_NULL;
static globus_mutex_t globus_l_ftp_cc_handle_list_mutex;
static globus_cond_t globus_l_ftp_cc_handle_list_cond;
static int globus_l_ftp_cc_handle_signal_count;
static int globus_l_ftp_cc_deactivated = GLOBUS_TRUE;
/* Local function declarations */
static void
globus_l_ftp_control_send_cmd_cb(
void * callback_arg,
globus_ftp_control_handle_t * handle,
globus_object_t * error,
globus_ftp_control_response_t * ftp_response);
static void
globus_l_ftp_control_data_close_cb(
void * arg,
struct globus_ftp_control_handle_s * handle,
globus_object_t * error);
static void
globus_l_ftp_control_close_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result);
static void
globus_l_ftp_control_connect_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result);
static void
globus_l_ftp_control_read_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
static void
globus_l_ftp_control_write_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
static globus_result_t
globus_l_ftp_control_response_init(
globus_ftp_control_response_t * response);
static int
globus_l_ftp_control_end_of_reply(
globus_ftp_cc_handle_t * cc_handle,
int hint,
globus_object_t ** err);
static void
globus_l_ftp_control_read_next(
globus_ftp_control_handle_t * handle);
static globus_result_t
globus_l_ftp_control_queue_element_init(
globus_ftp_control_rw_queue_element_t * element,
globus_ftp_control_response_callback_t callback,
void * arg,
globus_byte_t * write_buf,
int write_flags,
globus_io_write_callback_t write_callback,
globus_io_read_callback_t read_callback,
globus_bool_t expect_response,
globus_bool_t use_auth,
globus_ftp_control_handle_t * handle);
/**
* Initialize a globus ftp handle
*
* This function will set up (i.e. intialize all mutexes and
* variables) a globus ftp handle. It will also enter the handle in a
* list used by the module activation/deactivation functions.
*
* @param handle
* The handle to initialize.
* @return
* - GLOBUS_SUCCESS
* - error object
*/
globus_result_t
globus_ftp_control_handle_init(
globus_ftp_control_handle_t * handle)
{
globus_result_t rc;
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_handle_init: Handle argument is NULL")
);
}
/* control_client.c specific init */
handle->cc_handle.cc_state = GLOBUS_FTP_CONTROL_UNCONNECTED;
globus_fifo_init(&handle->cc_handle.readers);
globus_fifo_init(&handle->cc_handle.writers);
globus_l_ftp_control_response_init(
&(handle->cc_handle.response));
handle->cc_handle.use_auth = GLOBUS_FALSE;
handle->cc_handle.cc_state = GLOBUS_FTP_CONTROL_UNCONNECTED;
handle->cc_handle.command_cb = GLOBUS_NULL;
handle->cc_handle.command_cb_arg = GLOBUS_NULL;
handle->cc_handle.auth_cb = GLOBUS_NULL;
handle->cc_handle.auth_cb_arg = GLOBUS_NULL;
handle->cc_handle.cb_count = 0;
handle->cc_handle.close_cb = GLOBUS_NULL;
handle->cc_handle.close_cb_arg = GLOBUS_NULL;
handle->cc_handle.close_result = GLOBUS_NULL;
handle->cc_handle.quit_response.response_buffer = GLOBUS_NULL;
handle->cc_handle.nl_handle_set = GLOBUS_FALSE;
handle->cc_handle.signal_deactivate = GLOBUS_FALSE;
*handle->cc_handle.serverhost = '\0';
globus_io_tcpattr_init(&handle->cc_handle.io_attr);
globus_ftp_control_auth_info_init(&(handle->cc_handle.auth_info),
GSS_C_NO_CREDENTIAL,
GLOBUS_FALSE,
GLOBUS_NULL,
GLOBUS_NULL,
GLOBUS_NULL,
GLOBUS_NULL);
globus_mutex_init(&(handle->cc_handle.mutex), GLOBUS_NULL);
handle->cc_handle.read_buffer = (globus_byte_t *) globus_libc_malloc(
GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE);
if(handle->cc_handle.read_buffer == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_handle_init: malloc failed")
);
}
handle->cc_handle.read_buffer_size = GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE;
handle->cc_handle.bytes_read = 0;
globus_mutex_lock(&globus_l_ftp_cc_handle_list_mutex);
{
globus_list_insert(&globus_l_ftp_cc_handle_list, handle);
handle->cc_handle.list_elem = globus_l_ftp_cc_handle_list;
}
globus_mutex_unlock(&globus_l_ftp_cc_handle_list_mutex);
/* control_data.c specific init */
rc = globus_i_ftp_control_data_cc_init(handle);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(handle->cc_handle.read_buffer);
return rc;
}
return GLOBUS_SUCCESS;
}
/**
* Destroy a globus ftp handle
*
* This function will free up all dynamicly allocated memory
* associated with a given globus ftp handle. It will also remove the
* handle from a list used by the module activation/deactivation
* functions. This function should only be called after a call to
* either globus_ftp_control_force_close or globus_ftp_control_quit.
*
* @param handle
* The handle to destory.
* @return
* - success
* - invalid handle
* - handle is still in connected state
*/
globus_result_t
globus_ftp_control_handle_destroy(
globus_ftp_control_handle_t * handle)
{
void * result;
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_handle_destroy: Null handle argument")
);
}
if(handle->cc_handle.cc_state !=
GLOBUS_FTP_CONTROL_UNCONNECTED)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_handle_destroy: Handle still connected")
);
}
/* control_client.c specific destroy */
globus_mutex_lock(&globus_l_ftp_cc_handle_list_mutex);
{
result = globus_list_remove(&globus_l_ftp_cc_handle_list,
handle->cc_handle.list_elem);
}
globus_mutex_unlock(&globus_l_ftp_cc_handle_list_mutex);
if(result != GLOBUS_NULL)
{
globus_ftp_control_response_destroy(
&handle->cc_handle.response);
globus_ftp_control_response_destroy(
&handle->cc_handle.quit_response);
globus_mutex_destroy(&(handle->cc_handle.mutex));
globus_libc_free(handle->cc_handle.read_buffer);
globus_io_tcpattr_destroy(&handle->cc_handle.io_attr);
if(handle->cc_handle.nl_handle_set)
{
globus_netlogger_handle_destroy(&handle->cc_handle.nl_handle);
}
if(handle->cc_handle.close_result != GLOBUS_SUCCESS)
{
globus_object_free(handle->cc_handle.close_result);
}
globus_fifo_destroy(&handle->cc_handle.readers);
globus_fifo_destroy(&handle->cc_handle.writers);
/* control_data.c specific destroy */
return globus_i_ftp_control_data_cc_destroy(handle);
}
return GLOBUS_SUCCESS;
}
globus_result_t
globus_i_ftp_control_client_set_netlogger(
globus_ftp_control_handle_t * handle,
globus_netlogger_handle_t * nl_handle)
{
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_handle_destroy: Null handle argument")
);
}
if(nl_handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_handle_destroy: Null nl_handle argument")
);
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
globus_io_attr_netlogger_copy_handle(nl_handle,
&handle->cc_handle.nl_handle);
globus_netlogger_set_desc(
&handle->cc_handle.nl_handle,
"FTP_CONTROL");
globus_io_attr_netlogger_set_handle(
&handle->cc_handle.io_attr,
&handle->cc_handle.nl_handle);
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
return GLOBUS_SUCCESS;
}
globus_result_t
globus_i_ftp_control_client_set_stack(
globus_ftp_control_handle_t * handle,
globus_xio_stack_t stack)
{
globus_result_t result;
if(handle == NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_i_ftp_control_set_stack: Null handle argument")
);
}
if(stack == NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_i_ftp_control_set_stack: Null stack")
);
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
result = globus_io_attr_set_stack(
&handle->cc_handle.io_attr,
stack);
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
return result;
}
globus_result_t
globus_i_ftp_control_client_get_attr(
globus_ftp_control_handle_t * handle,
globus_xio_attr_t * attr)
{
globus_result_t result;
result = globus_io_attr_get_xio_attr(
&handle->cc_handle.io_attr, attr);
return result;
}
/**
* Create a new control connection to an FTP server.
*
* This function is used to initiate an FTP control connection. It
* creates the socket to the FTP server. When the connection is made
* to the server, and the server's identification string is received,
* the callback function will be invoked.
*
* @param handle
* A pointer to a initialized FTP control handle. This handle
* will be used for all subsequent FTP control operations.
* @param host
* The hostname of the FTP server.
* @param port
* The TCP port number of the FTP server.
* @param callback
* A function to be called once the connection to the server is
* established, and a response has been read.
* @param callback_arg
* Parameter to the callback function.
* @return
* - success
* - Null handle
* - Null host
* - Illegal port number
* - Null callback
* - Cannot resolve hostname
* - Cannot create socket
*
* @par Callback errors:
* - success
* - connection refused
* - protocol error
* - eof
*
* @par Expected callback response values:
* - 120 Service ready in nnn minutes.
* - 220 Service ready for new user.
* - 421 Service not available, closing control connection.
* - 500 Syntax error, command unrecognized.
*
* @note The server may send other responses.
*/
globus_result_t
globus_ftp_control_connect(
globus_ftp_control_handle_t * handle,
char * host,
unsigned short port,
globus_ftp_control_response_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_ftp_control_rw_queue_element_t * element;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_connect() entering\n"));
if(handle == GLOBUS_NULL)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_connect: NULL handle argument")
);
goto error_exit;
}
if(host == GLOBUS_NULL)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_connect: NULL host argument")
);
goto error_exit;
}
if(port > 65536)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_connect: Port argument greater than 64k")
);
goto error_exit;
}
if(callback == GLOBUS_NULL)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_connect: NULL callback argument")
);
goto error_exit;
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(!(globus_fifo_empty(&handle->cc_handle.readers) &&
globus_fifo_empty(&handle->cc_handle.writers) &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_UNCONNECTED &&
globus_l_ftp_cc_deactivated == GLOBUS_FALSE))
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_connect: Other operation already in progress")
);
goto unlock_exit;
}
element = (globus_ftp_control_rw_queue_element_t *)
globus_libc_malloc(sizeof(globus_ftp_control_rw_queue_element_t));
if(element == GLOBUS_NULL)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_connect: malloc failed")
);
goto unlock_exit;
}
element->callback = callback;
element->arg = callback_arg;
strncpy(handle->cc_handle.serverhost,
host, sizeof(handle->cc_handle.serverhost));
handle->cc_handle.serverhost[
sizeof(handle->cc_handle.serverhost) - 1] = 0;
globus_io_attr_set_tcp_nodelay(&handle->cc_handle.io_attr,
GLOBUS_TRUE);
rc=globus_io_tcp_register_connect(
host,
port,
&handle->cc_handle.io_attr,
globus_l_ftp_control_connect_cb,
(void *) handle,
&handle->cc_handle.io_handle);
if(rc == GLOBUS_SUCCESS)
{
handle->cc_handle.cc_state = GLOBUS_FTP_CONTROL_CONNECTING;
globus_fifo_enqueue(&handle->cc_handle.readers,
element);
handle->cc_handle.cb_count++;
}
else
{
globus_libc_free(element);
goto unlock_exit;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_connect() exiting\n"));
return GLOBUS_SUCCESS;
unlock_exit:
globus_mutex_unlock(&(handle->cc_handle.mutex));
error_exit:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_connect() exiting with error\n"));
return rc;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_tcp_register_connect function.
*
* This is a internal callback used with the
* globus_io_tcp_register_connect function which in this library is
* called in the globus_ftp_control_connect function. It checks that
* the connect completed successfully and registers a read on the
* connection.
*
* @param arg
* The callback argument, in this case the control handle for
* the connection.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the connect operation
*
* @return void
*
* @par If a error is detected in this function the user callback is
* called with an appropriate error object and the function
* returns.
*/
#endif
static void
globus_l_ftp_control_connect_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_object_t * error;
globus_result_t rc;
globus_ftp_control_rw_queue_element_t * element;
globus_bool_t call_close_cb = GLOBUS_FALSE;
globus_bool_t closing = GLOBUS_FALSE;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_connect_cb() entering\n"));
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle= &(c_handle->cc_handle);
globus_mutex_lock(&(cc_handle->mutex));
{
element= (globus_ftp_control_rw_queue_element_t *)
globus_fifo_peek(&cc_handle->readers);
if(result != GLOBUS_SUCCESS)
{
if(cc_handle->cc_state == GLOBUS_FTP_CONTROL_CONNECTING)
{
cc_handle->cc_state = GLOBUS_FTP_CONTROL_CLOSING;
}
error=globus_error_get(result);
globus_mutex_unlock(&(cc_handle->mutex));
goto return_error;
}
if(cc_handle->cc_state == GLOBUS_FTP_CONTROL_CONNECTING)
{
cc_handle->cc_state = GLOBUS_FTP_CONTROL_CONNECTED;
}
else if(cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
closing = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(closing)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_connect_cb: connection forced closed");
goto return_error;
}
rc=globus_io_register_read(handle,
cc_handle->read_buffer,
GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE,
1,
globus_l_ftp_control_read_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto return_error;
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_connect_cb() exiting\n"));
return;
return_error:
(element->callback)((element->arg),
c_handle,
error,
GLOBUS_NULL);
globus_mutex_lock(&(cc_handle->mutex));
{
globus_fifo_dequeue(&cc_handle->readers);
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
globus_libc_free(element);
globus_object_free(error);
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_connect_cb() exiting with error\n"));
return;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_tcp_register_read function.
*
* This is a internal callback used with the
* globus_io_tcp_register_read function which in this library is
* used for reading replies to any sent ftp commands. It checks that
* the read completed successfully, copies the bytes read to a
* response buffer, checks whether there is a complete response in the
* response buffer, decodes the reply if encryption/authentication is
* used. If the reply is not complete a new register_read is
* called. If the reply is complete, but preliminary the user callback
* is called with the intermediate reply and a new register read is
* called. If the reply is complete and is not preliminary the
* user/abort callback is called and no further action is taken.
*
* @param arg
* The callback argument, in this case the control handle for
* the connection.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the read operation
* @param buf
* The buffer in which the result of the read is stored
* @param nbytes
* The number of bytes read
*
* @return void
*
* @par If a error is detected in this function the user callback is
* called with an appropriate error object and the function
* returns.
*/
#endif
static void
globus_l_ftp_control_read_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_control_rw_queue_element_t * element;
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_object_t * error = NULL;
globus_byte_t * new_buf;
int end_of_reply;
globus_result_t rc;
globus_size_t response_length;
globus_bool_t queue_empty;
globus_bool_t call_close_cb = GLOBUS_FALSE;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_read_cb() entering\n"));
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle=&(c_handle->cc_handle);
queue_empty=GLOBUS_FALSE;
element= (globus_ftp_control_rw_queue_element_t *)
globus_fifo_peek(&cc_handle->readers);
/* check result */
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
goto return_error;
}
/* copy the result to a response_buffer; allocate more memory if
* needed
*/
if(nbytes < (cc_handle->response.response_buffer_size -
cc_handle->response.response_length))
{
response_length = cc_handle->response.response_length;
memcpy(&cc_handle->response.response_buffer[response_length],
buf, nbytes);
cc_handle->response.response_length+=nbytes;
}
else
{
/* Optimize our buffer growing for large MLSC replies. */
int current = cc_handle->response.response_length;
/* Need at least this much to satisfy current read */
int new_size = current + nbytes + 1;
if(current < 1000000)
{
/* double each time */
int new_size_extra = current * 2;
new_size = GLOBUS_MAX(new_size, new_size_extra);
}
else
{
/* add 100K */
int new_size_extra = current + 100000;
new_size = GLOBUS_MAX(new_size, new_size_extra);
}
new_buf = (globus_byte_t *)
globus_libc_malloc(sizeof(globus_byte_t) * new_size);
if(new_buf == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_read_cb: malloc failed");
goto return_error;
}
cc_handle->response.response_buffer_size = new_size;
memcpy(new_buf,
cc_handle->response.response_buffer,
cc_handle->response.response_length);
globus_libc_free(cc_handle->response.response_buffer);
cc_handle->response.response_buffer=new_buf;
memcpy(&(cc_handle->response.response_buffer[
cc_handle->response.response_length]),
buf,
nbytes);
cc_handle->response.response_length+=nbytes;
}
/* check whether there is a full reply in the
* response_buffer. Note that _end_of_reply() will also do any
* necessary decoding of protected replies.
*/
end_of_reply=globus_l_ftp_control_end_of_reply(
cc_handle, cc_handle->response.response_length - nbytes, &error);
if(end_of_reply == -1)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
error,
"globus_l_ftp_control_read_cb: Error while searching for end of reply");
goto return_error;
}
while (end_of_reply) /* got a full reply */
{
if(cc_handle->response.response_class ==
GLOBUS_FTP_POSITIVE_PRELIMINARY_REPLY)
{
/* if reply was preliminary, call the user cb with reply
* and continue to read
*/
(element->callback)(element->arg,
c_handle,
GLOBUS_NULL,
&(cc_handle->response));
response_length = cc_handle->response.response_length;
memcpy(cc_handle->response.response_buffer,
&cc_handle->read_buffer[
nbytes-(response_length-end_of_reply)],
response_length-end_of_reply);
cc_handle->response.response_length=response_length
-end_of_reply;
end_of_reply=globus_l_ftp_control_end_of_reply(cc_handle, 0, &error);
if(end_of_reply == -1)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
error,
"globus_l_ftp_control_read_cb: Error while searching for end of reply");
goto return_error;
}
}
else
{
/* reply was not preliminary so call user callback with
* reply and check if there are more entries in the read
* queue
*/
response_length=cc_handle->response.response_length;
cc_handle->response.response_length=end_of_reply;
(element->callback)(element->arg,
c_handle,
GLOBUS_NULL,
&(cc_handle->response));
memcpy(cc_handle->response.response_buffer,
&cc_handle->read_buffer[nbytes-(response_length-end_of_reply)],
response_length-end_of_reply);
cc_handle->response.response_length = response_length -
end_of_reply;
globus_mutex_lock(&cc_handle->mutex);
{
globus_fifo_dequeue(&cc_handle->readers);
cc_handle->cb_count--;
queue_empty=globus_fifo_empty(&cc_handle->readers);
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&cc_handle->mutex);
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
globus_libc_free(element);
if(queue_empty == GLOBUS_TRUE)
{
goto do_return;
}
else
{
element= (globus_ftp_control_rw_queue_element_t *)
globus_fifo_peek(&cc_handle->readers);
end_of_reply=globus_l_ftp_control_end_of_reply(cc_handle, 0, &error);
if(end_of_reply == -1)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
error,
"globus_l_ftp_control_read_cb: Error while searching for end of reply");
goto return_error;
}
}
}
}
/* call another register_read by default
*/
rc=globus_io_register_read(handle,
cc_handle->read_buffer,
GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE,
1,
globus_l_ftp_control_read_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto return_error;
}
do_return:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_read_cb() exiting\n"));
return;
return_error:
(element->callback)(element->arg,
c_handle,
error,
GLOBUS_NULL);
globus_mutex_lock(&cc_handle->mutex);
{
globus_fifo_dequeue(&cc_handle->readers);
cc_handle->cb_count--;
queue_empty=globus_fifo_empty(&cc_handle->readers);
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&cc_handle->mutex);
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
globus_libc_free(element);
globus_object_free(error);
if(queue_empty == GLOBUS_FALSE)
{
globus_l_ftp_control_read_next(c_handle);
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_read_cb() exiting with error\n"));
return;
}
/* search backward in @buff looking for "\r\n". If found, return
index of just past it. Otherwise, return 0.
*/
static
int
globus_l_ftp_control_get_current_line_start(
const char * buff,
int index)
{
while(index >= 2)
{
if(buff[index - 1] == '\n' && buff[index - 2] == '\r')
{
return index;
}
index--;
}
return 0;
}
/* @buff response buffer
@len length of response buffer
@hint length of response buffer in last call, to optimize scans
@return True if response buffer has a final ftp line (NNN...\r\n)
*/
static
int
globus_l_ftp_control_check_final_line_fast(
const char * buff,
int len,
int hint)
{
int line_start;
int i;
line_start = globus_l_ftp_control_get_current_line_start(buff, hint);
for(i = line_start; i < (len - 1); /* empty */)
{
if(buff[i] == '\r' && buff[i + 1] == '\n')
{
/* newline found */
int line_len = i - line_start;
if(line_len >= 4 && buff[line_start + 3] == ' ' &&
isdigit(buff[line_start]) &&
isdigit(buff[line_start + 1]) &&
isdigit(buff[line_start + 2]))
{
/* final line found */
return 1;
}
else
{
/* see if next line is a final */
line_start = i + 2;
i = line_start;
}
}
else
{
i++;
}
}
/* no newline found */
return 0;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which checks a buffer for a complete ftp
* reply.
*
* This is a internal helper function checks whether a given response
* struct contains a complete ftp reply. If so, it decodes the reply
* if necessary and fills in the reply_code and reply_class fields in
* the response struct.
*
* @param cc_handle
* A control connection handle, which is assumed to contain
* a pointer to the response struct to be processed and, if
* authentication is used, information about the security
* context of the control connection.
*
* @return
* - -1 if an error occured
* - 0 if no complete reply was found
* - a index into the response_buffer, indicating the end of
* the reply
*
*/
#endif
int
globus_l_ftp_control_end_of_reply(
globus_ftp_cc_handle_t * cc_handle,
int hint,
globus_object_t ** err)
{
int current;
int last;
int first;
int found;
int length;
int total_length;
char * out_buf;
gss_buffer_desc wrapped_token;
gss_buffer_desc unwrapped_token;
globus_ftp_control_response_t * response;
OM_uint32 maj_stat;
OM_uint32 min_stat;
int conf_state;
gss_qop_t qop_state;
globus_result_t rc;
/* To improve performance on large buffers, hint is used. We look at the
* first line beginning before hint and all lines thereafter.
*/
last=-1;
current=1;
found=0;
first=1;
response=&cc_handle->response;
if(hint && response->response_length > hint)
{
if(!globus_l_ftp_control_check_final_line_fast(
(const char *) response->response_buffer,
response->response_length,
hint))
{
return 0;
}
}
/* find the end of reply */
while(!found && current < response->response_length)
{
if(response->response_buffer[current - 1] == '\r' &&
response->response_buffer[current] == '\n')
{
/* check that we actually have a ftp reply */
if(first)
{
if((current < 5) ||
!(isdigit((response->response_buffer)[last+1]) &&
isdigit((response->response_buffer)[last+2]) &&
isdigit((response->response_buffer)[last+3]) &&
(((response->response_buffer)[last+4]==' ') ||
((response->response_buffer)[last+4]=='-'))))
{
return -1;
}
first=0;
}
if(((response->response_buffer)[last+4]==' ') &&
isdigit((response->response_buffer)[last+1]) &&
isdigit((response->response_buffer)[last+2]) &&
isdigit((response->response_buffer)[last+3]))
{
found=current+1;
}
else
{
last=current;
}
}
current++;
}
if(found)
{
/* need to unwrap reply if it is protected */
if((response->response_buffer)[last+1] == '6')
{
globus_size_t copy_len = response->response_length * 2;
last=-1;
current=0;
length=0;
total_length=0;
out_buf = globus_libc_malloc(copy_len);
if( out_buf == GLOBUS_NULL)
{
return -1;
}
while(currentresponse_buffer[current] == '\n')
{
/* Decode token */
response->response_buffer[current-1] = '\0';
rc=globus_i_ftp_control_radix_decode(
&(response->response_buffer[last+5]),
&(out_buf[total_length]),&length);
if(rc != GLOBUS_SUCCESS)
{
*err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_end_of_reply: base64 decode failure.");
return -1;
}
/* Unwrap token */
wrapped_token.value = &(out_buf[total_length]);
wrapped_token.length = length;
maj_stat = gss_unwrap(&min_stat,
cc_handle->auth_info.
auth_gssapi_context,
&wrapped_token,
&unwrapped_token,
&conf_state,
&qop_state);
if(maj_stat != GSS_S_COMPLETE)
{
globus_libc_free(out_buf);
return -1;
}
/* get rid of terminating NULL */
if(((char *) unwrapped_token.value)[unwrapped_token.length - 1] == '\0')
{
unwrapped_token.length--;
}
if(total_length+unwrapped_token.length >= copy_len)
{
copy_len = (total_length+unwrapped_token.length) * 4;
out_buf = globus_realloc(out_buf, copy_len);
}
memcpy(&(out_buf[total_length]),
unwrapped_token.value,
unwrapped_token.length);
length = unwrapped_token.length;
total_length += length;
gss_release_buffer(&min_stat, &unwrapped_token);
last=current;
}
current++;
}
total_length++;
memcpy(&(out_buf[total_length]),
&(response->response_buffer[found]),
response->response_length-found);
globus_libc_free(response->response_buffer);
response->response_buffer=out_buf;
response->response_buffer_size= response->response_length + 4;
response->response_length=
total_length+response->response_length-found;
found=total_length;
last=total_length-length-2;
}
else
{
response->response_length++;
found++;
if(response->response_buffer_size < response->response_length)
{
response->response_buffer_size = response->response_length;
out_buf = globus_libc_realloc(response->response_buffer,
response->response_length);
if( out_buf == GLOBUS_NULL)
{
return -1;
}
response->response_buffer = out_buf;
}
if(response->response_length-found)
{
memmove(&response->response_buffer[found],
&response->response_buffer[found - 1],
response->response_length-found);
}
}
/* get the ftp response code */
response->response_buffer[found - 1] = '\0';
if(sscanf(&(response->response_buffer[last+1]),
"%d", &response->code) < 1)
{
globus_assert(0);
}
/* determine the ftp response class */
switch(response->response_buffer[last+1])
{
case '1':
response->response_class=
GLOBUS_FTP_POSITIVE_PRELIMINARY_REPLY;
break;
case '2':
response->response_class=
GLOBUS_FTP_POSITIVE_COMPLETION_REPLY;
break;
case '3':
response->response_class=
GLOBUS_FTP_POSITIVE_INTERMEDIATE_REPLY;
break;
case '4':
response->response_class=
GLOBUS_FTP_TRANSIENT_NEGATIVE_COMPLETION_REPLY;
break;
case '5':
response->response_class=
GLOBUS_FTP_PERMANENT_NEGATIVE_COMPLETION_REPLY;
break;
default:
response->response_class=
GLOBUS_FTP_UNKNOWN_REPLY;
break;
}
}
return found;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which creates and initializes a response
* structure
*
* This is a internal helper function allocates memory for a reponse
* structure and a buffer contained within that structure. It also
* initializes other values in the structure to default values.
*
* @param response
* This parameter is used to return the new response struct.
*
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
#endif
static globus_result_t
globus_l_ftp_control_response_init(
globus_ftp_control_response_t * response)
{
response->code=0;
response->response_class=GLOBUS_FTP_UNKNOWN_REPLY;
response->response_length=0;
response->response_buffer_size=
GLOBUS_I_FTP_CONTROL_BUF_SIZE;
response->response_buffer=(globus_byte_t *)
globus_libc_malloc(sizeof(globus_byte_t)*
GLOBUS_I_FTP_CONTROL_BUF_SIZE);
if(response->response_buffer== GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_response_init: malloc failed")
);
}
return GLOBUS_SUCCESS;
}
/**
* Helper function which frees the memory associated with a response
* structure.
*
* This is a helper function which frees the memory associated with a
* response structure.
*
* @param response
* This parameter indicates the response structure to destroy
*
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
globus_result_t
globus_ftp_control_response_destroy(
globus_ftp_control_response_t * response)
{
if(response == GLOBUS_NULL)
{
return GLOBUS_SUCCESS;
}
if(response->response_buffer != GLOBUS_NULL)
{
globus_libc_free(response->response_buffer);
}
return GLOBUS_SUCCESS;
}
/**
* Helper function which copies one response structure to another
*
* This is a helper function which copies one response structure to
* another.
*
* @param src
* This parameter indicates the response structure to copy
* @param dest
* This parameter specifies the target response structure
*
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
globus_result_t
globus_ftp_control_response_copy(
globus_ftp_control_response_t * src,
globus_ftp_control_response_t * dest)
{
if(src == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_response_copy: Source argument is NULL")
);
}
if(dest == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_response_copy: Destination argument is NULL")
);
}
dest->code=src->code;
dest->response_class=src->response_class;
dest->response_length=src->response_length;
dest->response_buffer_size=src->response_buffer_size;
dest->response_buffer=(globus_byte_t *)
globus_libc_malloc(dest->response_buffer_size);
if(dest->response_buffer== GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_response_copy: malloc failed")
);
}
memcpy(dest->response_buffer,
src->response_buffer,
dest->response_length+1);
return GLOBUS_SUCCESS;
}
/**
* Authenticate the user to the FTP server.
*
* This will perform the authentication handshake with the FTP
* server. depending on which parameters are non-NULL, the
* authentication may involve GSSAPI credentials, a username, a
* password, and an account name.
*
* @note Do we want to add attribute arguments for:
* - specifying type of delegation
* - gsswrap control messages for integrity or confidentiality
*
* @param handle
* A pointer to a unauthenticated GSIFTP control handle. In the
* case of GSS authentication the GSS security context is stored in
* this structure.
* @param auth_info
* This structure is used to pass the following information:
* - user
* The user's name for login purposes. If this string is
* "anonymous", "ftp", GLOBUS_NULL or ":globus-mapping:" then
* the password argument is optional. If this string is
* GLOBUS_NULL or ":globus-mapping:" and gss_auth is true then
* the users login is looked by the FTP server host.
* - password
* The password for the above user argument. If the user
* argument is "anonymous" or "ftp" or if gss_auth is true this
* string may be GLOBUS_NULL.
* - account
* This parameter is optional. If not used it should be set to
* GLOBUS_NULL. It might be needed by firewalls.
* - auth_gssapi_subject
* The GSSAPI subject name of the server you are connecting
* to. If this is GLOBUS_NULL, and the gss_auth parameter is
* set to GLOBUS_TRUE, then the name will default to the host
* name.
* @param use_auth
* If set to GLOBUS_TRUE the above argument indicates that GSS
* authentication should be used, otherwise cleartext
* user/password authentication is used.
* @param callback
* The function to be called once the authentication process is
* complete or when an error occurs.
* @param callback_arg
* User supplied argument to the callback function
*
* @return
* - success
* - Null handle
* - Invalid handle
* - Handle already authenticated
*
* @par Callback errors:
* - success
* - authentication failed
* - protocol error
* - eof
*
* @par Expected callback response values:
* - 230 User logged in, proceed.
* - 232 User logged in, authorized by security data exchange.
* - 234 Security data exchange complete.
* - 331 User name okay, need password.
* - 332 Need account for login.
* - 336 Username okay, need password. Challenge is "...."
* - 431 Need some unavailable resource to process security.
* - 500 Syntax error, command unrecognized.
* - 530 Not logged in.
*
* @note The server may send other responses.
*
* @note The function globus_ftp_control_authenticate_ex() is identical except
* that the auth_info->req_flags is used. If delegation flags or any flags
* other than GSS_C_MUTUAL_FLAG and GSS_C_CONF_FLAG are desired, they must be
* set explicitly. It is the caller's responsibility to ensure that req_flags
* only contains valid flags.
*/
globus_result_t
globus_ftp_control_authenticate(
globus_ftp_control_handle_t * handle,
globus_ftp_control_auth_info_t * auth_info,
globus_bool_t use_auth,
globus_ftp_control_response_callback_t callback,
void * callback_arg)
{
globus_ftp_control_auth_info_t tmp_auth_info;
globus_result_t result;
if(auth_info == GLOBUS_NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_authenticate: auth_info argument is NULL")
);
goto error;
}
result = globus_i_ftp_control_auth_info_init(&tmp_auth_info, auth_info);
if(result != GLOBUS_SUCCESS)
{
goto error;
}
/* Do limited delegation */
tmp_auth_info.req_flags |=
GSS_C_GLOBUS_LIMITED_DELEG_PROXY_FLAG|GSS_C_DELEG_FLAG;
result = globus_ftp_control_authenticate_ex(
handle,
&tmp_auth_info,
use_auth,
callback,
callback_arg);
globus_i_ftp_control_auth_info_destroy(&tmp_auth_info);
return result;
error:
return result;
}
globus_result_t
globus_ftp_control_authenticate_ex(
globus_ftp_control_handle_t * handle,
globus_ftp_control_auth_info_t * auth_info,
globus_bool_t use_auth,
globus_ftp_control_response_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_result_t result;
globus_i_ftp_passthru_cb_arg_t * auth_cb_arg;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_authenticate() entering\n"));
if(handle == GLOBUS_NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_authenticate: handle argument is NULL")
);
goto error;
}
if(auth_info == GLOBUS_NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_authenticate: auth_info argument is NULL")
);
goto error;
}
if(handle->cc_handle.auth_info.auth_gssapi_context !=
GSS_C_NO_CONTEXT &&
use_auth == GLOBUS_TRUE)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_authenticate: Already authenticated")
);
goto error;
}
if(use_auth == GLOBUS_FALSE &&
auth_info->user == GLOBUS_NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_authenticate: No user supplied")
);
goto error;
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.cc_state != GLOBUS_FTP_CONTROL_CONNECTED)
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_authenticate: Handle not connected")
);
goto error;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
/* copy information into the control connection handle */
rc = globus_i_ftp_control_auth_info_init(
&(handle->cc_handle.auth_info),auth_info);
if(rc != GLOBUS_SUCCESS)
{
result=rc;
goto error;
}
handle->cc_handle.auth_info.req_flags = auth_info->req_flags;
handle->cc_handle.use_auth=use_auth;
auth_cb_arg = (globus_i_ftp_passthru_cb_arg_t *)
globus_libc_malloc(sizeof(globus_i_ftp_passthru_cb_arg_t));
if(auth_cb_arg == GLOBUS_NULL)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_authenticate: malloc failed")
);
goto error;
}
auth_cb_arg->user_cb=callback;
auth_cb_arg->user_cb_arg=callback_arg;
if(use_auth == GLOBUS_FALSE)
{
auth_cb_arg->cmd=GLOBUS_I_FTP_USER;
rc = globus_ftp_control_send_command(handle,"USER %s\r\n",
globus_l_ftp_control_send_cmd_cb,
(void *) auth_cb_arg,
auth_info->user);
}
else
{
auth_cb_arg->cmd=GLOBUS_I_FTP_AUTH;
rc = globus_ftp_control_send_command(handle,"AUTH GSSAPI\r\n",
globus_l_ftp_control_send_cmd_cb,
(void *) auth_cb_arg);
}
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(auth_cb_arg);
result=rc;
goto error;
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_authenticate() exiting\n"));
return GLOBUS_SUCCESS;
error:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_authenticate() exiting with error\n"));
return result;
}
/**
* Send an FTP protocol command to the FTP server and register a
* response handler.
*
* This function is used to send an FTP command, and register a handler
* to receive the FTP reply (or replies, if an intermediate one is sent).
* When the control channel is gss authenticated, the message and the reply
* will be automatically gss wrapped/unwrapped.
*
* @param handle
* A pointer to a GSIFTP control handle. The command described by
* the cmdspec is issued to the server over the control channel
* associated with this handle.
* @param cmdspec
* A printf-style format string containing the text of the command
* to send to the server. The optional parameters to the format string
* are passed after the callback_arg in the function invocation.
* @param callback
* The function to be called once the authentication process is
* complete or when an error occurs.
* @param callback_arg
* User supplied argument to the callback function
* @param ...
* Parameters which will be substituted into the % escapes in the
* cmdspec string.
*
* @return
* - Success
* - Null handle
* - Command already in progress
*
* @par Callback errors:
* - success
* - protocol error
* - eof
*
* @par Expected callback response values:
* Any defined in RFC 959, 2228, 2389, draft-ietf-ftpext-mlst-10,
* or the @ref extensions_intro "protocol extensions" document.
*/
globus_result_t
globus_ftp_control_send_command(
globus_ftp_control_handle_t * handle,
const char * cmdspec,
globus_ftp_control_response_callback_t callback,
void * callback_arg,
...)
{
globus_ftp_control_rw_queue_element_t * element;
globus_result_t rc;
globus_result_t result;
globus_bool_t queue_empty;
globus_bool_t authenticated;
globus_bool_t call_close_cb = GLOBUS_FALSE;
globus_byte_t * buf;
globus_byte_t * encode_buf;
va_list ap;
int arglength;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_send_command() entering\n"));
if(handle == GLOBUS_NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_send command: handle argument is NULL")
);
goto error;
}
#ifdef HAVE_STDARG_H
va_start(ap, callback_arg);
#else
va_start(ap);
#endif
arglength=globus_libc_vfprintf(globus_i_ftp_control_devnull,
cmdspec,
ap);
va_end(ap);
if(arglength < 1)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_send_command: Unable to determine total length of command string")
);
goto error;
}
buf=(globus_byte_t *) globus_libc_malloc(sizeof(globus_byte_t)*
(arglength+1));
if(buf == GLOBUS_NULL)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_send_command: malloc failed")
);
goto error;
}
#ifdef HAVE_STDARG_H
va_start(ap, callback_arg);
#else
va_start(ap);
#endif
if(globus_libc_vsprintf((char *) buf, cmdspec,ap) < arglength)
{
globus_libc_free(buf);
result= globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_send_command: Command string construction failed")
);
va_end(ap);
goto error;
}
va_end(ap);
globus_mutex_lock(&(handle->cc_handle.mutex));
{
authenticated = handle->cc_handle.auth_info.authenticated;
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(authenticated == GLOBUS_TRUE)
{
/* encode the command */
rc=globus_i_ftp_control_encode_command(&(handle->cc_handle),
buf,
(char **) (void *) &encode_buf);
globus_libc_free(buf);
if(rc != GLOBUS_SUCCESS)
{
result=rc;
goto error;
}
buf=encode_buf;
}
element = (globus_ftp_control_rw_queue_element_t *)
globus_libc_malloc(sizeof(globus_ftp_control_rw_queue_element_t));
if(element == GLOBUS_NULL)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_send_command: malloc failed")
);
globus_libc_free(buf);
goto error;
}
element->callback = callback;
element->arg = callback_arg;
element->write_flags = 0;
element->write_buf = buf;
element->write_callback = globus_l_ftp_control_write_cb;
element->read_callback = globus_l_ftp_control_read_cb;
element->expect_response = GLOBUS_TRUE;
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED)
{
queue_empty=globus_fifo_empty(&handle->cc_handle.writers);
globus_fifo_enqueue(&handle->cc_handle.writers,
element);
handle->cc_handle.cb_count++;
}
else
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_send_command: Handle not connected")
);
globus_libc_free(buf);
globus_libc_free(element);
goto error;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(queue_empty == GLOBUS_TRUE)
{
/* queue was empty, we need to do the write/send */
rc = globus_io_register_write(&handle->cc_handle.io_handle,
buf,
(globus_size_t) strlen(buf),
element->write_callback,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
globus_mutex_lock(&(handle->cc_handle.mutex));
{
globus_fifo_dequeue(&handle->cc_handle.writers);
handle->cc_handle.cb_count--;
queue_empty=globus_fifo_empty(&handle->cc_handle.writers);
if(!handle->cc_handle.cb_count &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
globus_libc_free(buf);
globus_libc_free(element);
if(queue_empty == GLOBUS_FALSE)
{
globus_i_ftp_control_write_next(handle);
}
result=rc;
goto error;
}
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_send_command() exiting\n"));
return GLOBUS_SUCCESS;
error:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_send_command() exiting with error\n"));
return result;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_tcp_register_write function.
*
* This is a internal callback used with the
* globus_io_tcp_register_write function which in this library is
* used for sending all ftp commands but ABOR. It checks that
* the write completed successfully and then calls
* globus_io_register_read to read the reply for the command that was
* sent.
*
* @param arg
* The callback argument.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the write operation
* @param buf
* The buffer in which the command was stored
* @param nbytes
* The number of bytes written
*
* @return void
*
* @par If a error is detected in this function the user callback is
* called with an appropriate error object and the function
* returns.
*/
#endif
static void
globus_l_ftp_control_write_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes){
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_object_t * error;
globus_result_t rc;
globus_ftp_control_rw_queue_element_t * element;
globus_bool_t write_queue_empty;
globus_bool_t read_queue_empty;
globus_bool_t call_close_cb = GLOBUS_FALSE;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_write_cb() entering\n"));
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle=&(c_handle->cc_handle);
globus_libc_free(buf);
globus_mutex_lock(&(cc_handle->mutex));
{
element = (globus_ftp_control_rw_queue_element_t *)
globus_fifo_dequeue(&cc_handle->writers);
cc_handle->cb_count--;
write_queue_empty=globus_fifo_empty(&cc_handle->writers);
if(element->expect_response == GLOBUS_TRUE &&
result == GLOBUS_SUCCESS)
{
read_queue_empty=globus_fifo_empty(&cc_handle->readers);
globus_fifo_enqueue(&cc_handle->readers,
element);
cc_handle->cb_count++;
}
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
if(write_queue_empty == GLOBUS_FALSE)
{
globus_i_ftp_control_write_next(c_handle);
}
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
goto return_error;
}
if(element->expect_response == GLOBUS_TRUE)
{
if(read_queue_empty == GLOBUS_TRUE)
{
rc=globus_io_register_read(&cc_handle->io_handle,
cc_handle->read_buffer,
GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE,
1,
element->read_callback,
arg);
if(rc != GLOBUS_SUCCESS)
{
globus_mutex_lock(&(cc_handle->mutex));
{
element = (globus_ftp_control_rw_queue_element_t *)
globus_fifo_dequeue(&cc_handle->readers);
cc_handle->cb_count--;
read_queue_empty=globus_fifo_empty(&cc_handle->readers);
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
if(read_queue_empty == GLOBUS_FALSE)
{
globus_l_ftp_control_read_next(c_handle);
}
error=globus_error_get(rc);
goto return_error;
}
}
}
else
{
globus_libc_free(element);
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_write_cb() exiting\n"));
return;
return_error:
if(element->expect_response == GLOBUS_TRUE)
{
(element->callback)((element->arg),
c_handle,
error,
GLOBUS_NULL);
}
globus_libc_free(element);
globus_object_free(error);
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_write_cb() exiting with error\n"));
return;
}
/**
* Send an ABORT to the FTP server and register a response handler.
*
* This function is used to send the ABORT message to the FTP server.
* The ABORT message is sent out-of-band, and terminates any current
* data transfer in progress.
*
* As a result of the ABORT, the data channels used by this control channel
* will be closed. The data command callback will be issued with either
* a completion reply, or a transfer aborted reply. The ABORT callback
* will also be invoked, with the server's response to the abort command.
*
* Any attempts to register buffers for read or write after an ABORT
* has been sent will fail with a "no transfer in progress" error.
*
* @param handle
* A pointer to a GSIFTP control handle. The ABORT command
* is issued to the server over the control channel
* associated with this handle.
* @param callback
* The function to be called once the authentication process is
* complete or when an error occurs.
* @param callback_arg
* User supplied argument to the callback function
*
* @return
* - Success
* - Null handle
* - No transfer in progress
*
* @par Callback errors:
* - success
* - protocol error
* - eof
*
* @par Expected callback response values:
* - 226 Abort successful.
* - 500 Syntax error, command unrecognized.
*
* @note The server may send other responses.
*/
globus_result_t
globus_ftp_control_abort(
globus_ftp_control_handle_t * handle,
globus_ftp_control_response_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_result_t result;
globus_ftp_control_rw_queue_element_t * element;
globus_ftp_control_rw_queue_element_t * element_ip;
globus_ftp_control_rw_queue_element_t * element_synch;
globus_ftp_control_rw_queue_element_t * element_abor;
globus_bool_t queue_empty;
globus_fifo_t abort_queue;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_abort() entering\n"));
globus_fifo_init(&abort_queue);
element_ip = (globus_ftp_control_rw_queue_element_t *)
globus_libc_malloc(sizeof(globus_ftp_control_rw_queue_element_t));
if(element_ip == GLOBUS_NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_abort: malloc failed")
);
goto return_error;
}
result = globus_l_ftp_control_queue_element_init(
element_ip,
callback,
callback_arg,
GLOBUS_I_TELNET_IP,
0,
globus_l_ftp_control_write_cb,
GLOBUS_NULL,
GLOBUS_FALSE,
GLOBUS_FALSE,
handle);
if(result != GLOBUS_SUCCESS)
{
globus_libc_free(element_ip);
goto return_error;
}
element_synch = (globus_ftp_control_rw_queue_element_t *)
globus_libc_malloc(sizeof(globus_ftp_control_rw_queue_element_t));
if(element_synch == GLOBUS_NULL)
{
globus_libc_free(element_ip->write_buf);
globus_libc_free(element_ip);
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_abort: malloc failed")
);
goto return_error;
}
result = globus_l_ftp_control_queue_element_init(
element_synch,
callback,
callback_arg,
GLOBUS_I_TELNET_SYNCH,
MSG_OOB,
globus_l_ftp_control_write_cb,
GLOBUS_NULL,
GLOBUS_FALSE,
GLOBUS_FALSE,
handle);
if(result != GLOBUS_SUCCESS)
{
globus_libc_free(element_ip->write_buf);
globus_libc_free(element_ip);
globus_libc_free(element_synch);
goto return_error;
}
element_abor = (globus_ftp_control_rw_queue_element_t *)
globus_libc_malloc(sizeof(globus_ftp_control_rw_queue_element_t));
if(element_abor == GLOBUS_NULL)
{
globus_libc_free(element_ip->write_buf);
globus_libc_free(element_ip);
globus_libc_free(element_synch->write_buf);
globus_libc_free(element_synch);
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_abort: malloc failed")
);
goto return_error;
}
result = globus_l_ftp_control_queue_element_init(
element_abor,
callback,
callback_arg,
"ABOR\r\n",
0,
globus_l_ftp_control_write_cb,
globus_l_ftp_control_read_cb,
GLOBUS_TRUE,
handle->cc_handle.use_auth,
handle);
if(result != GLOBUS_SUCCESS)
{
globus_libc_free(element_ip->write_buf);
globus_libc_free(element_ip);
globus_libc_free(element_synch->write_buf);
globus_libc_free(element_synch);
globus_libc_free(element_abor);
goto return_error;
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if( handle->cc_handle.cc_state !=
GLOBUS_FTP_CONTROL_CONNECTED)
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
globus_libc_free(element_ip->write_buf);
globus_libc_free(element_ip);
globus_libc_free(element_synch->write_buf);
globus_libc_free(element_synch);
globus_libc_free(element_abor->write_buf);
globus_libc_free(element_abor);
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_abort: Handle not connected")
);
goto return_error;
}
else
{
queue_empty=globus_fifo_empty(&handle->cc_handle.writers);
if(queue_empty == GLOBUS_FALSE)
{
globus_fifo_move(&abort_queue,
&handle->cc_handle.writers);
globus_fifo_enqueue(&handle->cc_handle.writers,
globus_fifo_dequeue(&abort_queue));
}
globus_fifo_enqueue(&handle->cc_handle.writers,
(void *) element_ip);
globus_fifo_enqueue(&handle->cc_handle.writers,
(void *) element_synch);
globus_fifo_enqueue(&handle->cc_handle.writers,
(void *) element_abor);
handle->cc_handle.cb_count -= globus_fifo_size(&abort_queue);
handle->cc_handle.cb_count += 3;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
while( (element=globus_fifo_dequeue(&abort_queue)) != GLOBUS_NULL)
{
(element->callback)((element->arg),
handle,
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"Command aborted"),
GLOBUS_NULL);
globus_libc_free(element);
}
if(queue_empty == GLOBUS_TRUE)
{
/* queue was empty, we need to do the write/send */
rc = globus_io_register_write(&handle->cc_handle.io_handle,
element_ip->write_buf,
(globus_size_t) strlen(
element_ip->write_buf),
element_ip->write_callback,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
globus_mutex_lock(&(handle->cc_handle.mutex));
{
globus_fifo_dequeue(&handle->cc_handle.writers);
globus_fifo_dequeue(&handle->cc_handle.writers);
globus_fifo_dequeue(&handle->cc_handle.writers);
handle->cc_handle.cb_count -= 3;
queue_empty=globus_fifo_empty(&handle->cc_handle.writers);
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
globus_libc_free(element_ip->write_buf);
globus_libc_free(element_ip);
globus_libc_free(element_synch->write_buf);
globus_libc_free(element_synch);
globus_libc_free(element_abor->write_buf);
globus_libc_free(element_abor);
if(queue_empty == GLOBUS_FALSE)
{
globus_i_ftp_control_write_next(handle);
}
result=rc;
goto return_error;
}
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_abort() exiting\n"));
return GLOBUS_SUCCESS;
return_error:
globus_fifo_destroy(&abort_queue);
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_abort() exiting with error\n"));
return result;
}
/**
* Send a QUIT message to the FTP server and register a response handler.
*
* This function is used to close the control channel to the FTP server.
* There should be no transfer commands in progress when this is called.
* Once the final response callback passed to this function is invoked,
* the control handle can no longer be used for any gsiftp control
* operations.
*
* @note Need to further define behavior for when a QUIT happens
* during a transfer or command is in progress.
*
* @note Since this function waits until all other callbacks are completed
* before calling it's own callback it may not be called in a blocking
* fashion from another callback.
*
* @param handle
* A pointer to a GSIFTP control handle. The quit message is
* issued to the server over the control channel
* associated with this handle.
* @param callback
* The function to be called once the authentication process is
* complete or when an error occurs.
* @param callback_arg
* User supplied argument to the callback function
* @return
* - Success
* - Null handle
* - Command in progress
*
* @par Callback errors:
* - success
* - protocol error
* - eof
*
* @par Expected callback response values:
* - 221 Service closing control connection.
* - 500 Syntax error, command unrecognized.
*
* @note The server may send other responses.
*/
globus_result_t
globus_ftp_control_quit(
globus_ftp_control_handle_t * handle,
globus_ftp_control_response_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_result_t result;
globus_i_ftp_passthru_cb_arg_t * quit_cb_arg;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_quit() entering\n"));
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.cc_state != GLOBUS_FTP_CONTROL_CONNECTED)
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_quit: Handle not connected")
);
goto return_error;
}
else
{
handle->cc_handle.close_cb = callback;
handle->cc_handle.close_cb_arg = callback_arg;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
quit_cb_arg = (globus_i_ftp_passthru_cb_arg_t *)
globus_libc_malloc(sizeof(globus_i_ftp_passthru_cb_arg_t));
if(quit_cb_arg == GLOBUS_NULL)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_ftp_control_quit: malloc failed")
);
goto return_error;
}
quit_cb_arg->user_cb = callback;
quit_cb_arg->user_cb_arg = callback_arg;
quit_cb_arg->cmd = GLOBUS_I_FTP_QUIT;
quit_cb_arg->handle = handle;
rc = globus_ftp_control_send_command(handle,"QUIT\r\n",
globus_l_ftp_control_send_cmd_cb,
(void *) quit_cb_arg);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(quit_cb_arg);
result=rc;
goto return_error;
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_quit() exiting\n"));
return GLOBUS_SUCCESS;
return_error:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_quit() exiting with error\n"));
return result;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_ftp_control_send_cmd function.
*
* This is a internal callback used with the
* globus_ftp_control_send_cmd function which in this library is
* used in the authentication process and for sending the QUIT
* command. It checks that the command was successfully sent and based
* upon the command that was executed and the ftp reply to that
* command calls other functions.
*
* @param arg
* The callback argument, which in this case is used to pass
* the original user callback and argument.
* @param handle
* The control handle associated with the session
* @param error
* A error object containing information about any errors that
* occured.
* @param ftp_response
* A struct containing information about the ftp reply to the
* command that was sent.
*
* @return void
*
* @par If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static gss_OID_desc gss_nt_host_ip_oid =
{ 10, "\x2b\x06\x01\x04\x01\x9b\x50\x01\x01\x02" };
static gss_OID_desc * GLOBUS_GSS_C_NT_HOST_IP = &gss_nt_host_ip_oid;
static void
globus_l_ftp_control_send_cmd_cb(
void * callback_arg,
globus_ftp_control_handle_t * handle,
globus_object_t * error,
globus_ftp_control_response_t * ftp_response)
{
globus_result_t rc;
globus_i_ftp_passthru_cb_arg_t * cb_arg;
globus_object_t * error_obj;
globus_bool_t call_close_cb = GLOBUS_FALSE;
int len;
OM_uint32 maj_stat;
OM_uint32 min_stat;
gss_buffer_desc send_tok;
gss_buffer_desc recv_tok;
gss_buffer_desc * token_ptr;
char * radix_buf;
OM_uint32 max_input_size[2];
OM_uint32 pbsz;
int tmp_host[16];
int tmp_hostlen;
unsigned short tmp_port;
char * serverhost = NULL;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_send_cmd_cb() entering\n"));
cb_arg = (globus_i_ftp_passthru_cb_arg_t *) callback_arg;
if(error != GLOBUS_NULL &&
cb_arg->cmd != GLOBUS_I_FTP_QUIT)
{
error_obj=globus_object_copy(error);
goto return_error;
}
switch(cb_arg->cmd)
{
case GLOBUS_I_FTP_AUTH:
switch(ftp_response->response_class)
{
case GLOBUS_FTP_POSITIVE_INTERMEDIATE_REPLY:
/* follow AUTH with ADAT and set authentication variables
* int the control connection handle
*/
cb_arg->cmd=GLOBUS_I_FTP_ADAT;
/* Do mutual authentication */
handle->cc_handle.auth_info.req_flags |= GSS_C_MUTUAL_FLAG;
if(handle->cc_handle.auth_info.encrypt)
{
handle->cc_handle.auth_info.req_flags |= GSS_C_CONF_FLAG;
}
/* use a target_name based on either a supplied subject
* string or the remote hostname
*/
/* get the actual host we connected to */
rc = globus_io_tcp_get_remote_address_ex(
&handle->cc_handle.io_handle,
tmp_host,
&tmp_hostlen,
&tmp_port);
if(rc == GLOBUS_SUCCESS)
{
serverhost = globus_libc_ints_to_contact_string(
tmp_host,
tmp_hostlen,
0);
}
if(handle->cc_handle.auth_info.auth_gssapi_subject == NULL)
{
if(serverhost == NULL)
{
error_obj = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"No possible GSI subject. If using a non TCP "
"protocol and GSI you must specifiy a subject.");
goto return_error;
}
send_tok.value = globus_common_create_string(
"%s/%s",
handle->cc_handle.serverhost,
serverhost);
send_tok.length = strlen(send_tok.value);
maj_stat = gss_import_name(
&min_stat,
&send_tok,
GLOBUS_GSS_C_NT_HOST_IP,
&(handle->cc_handle.auth_info.target_name));
if(maj_stat != GSS_S_COMPLETE)
{
error_obj = globus_error_wrap_gssapi_error(
GLOBUS_FTP_CONTROL_MODULE,
maj_stat,
min_stat,
0,
__FILE__,
"globus_l_ftp_control_send_cmd_cb",
__LINE__,
"gss_import_name failed");
goto return_error;
}
}
else
{
gss_OID name_type = GSS_C_NT_USER_NAME;
if(strstr(handle->cc_handle.auth_info.auth_gssapi_subject,
"host@") ||
strstr(handle->cc_handle.auth_info.auth_gssapi_subject,
"ftp@"))
{
name_type = GSS_C_NT_HOSTBASED_SERVICE;
}
send_tok.value=handle->cc_handle.auth_info.
auth_gssapi_subject;
send_tok.length=strlen(handle->cc_handle.auth_info.
auth_gssapi_subject) + 1;
maj_stat = gss_import_name(&min_stat,
&send_tok,
name_type,
&(handle->cc_handle.auth_info.
target_name));
if(maj_stat != GSS_S_COMPLETE)
{
error_obj = globus_error_wrap_gssapi_error(
GLOBUS_FTP_CONTROL_MODULE,
maj_stat,
min_stat,
0,
__FILE__,
"globus_l_ftp_control_send_cmd_cb",
__LINE__,
"gss_import_name failed");
goto return_error;
}
}
token_ptr=GSS_C_NO_BUFFER;
/* initialize security context
*/
maj_stat = gss_init_sec_context(
&min_stat,
handle->cc_handle.auth_info.credential_handle,
&(handle->cc_handle.auth_info.
auth_gssapi_context),
handle->cc_handle.auth_info.
target_name,
GSS_C_NULL_OID,
handle->cc_handle.auth_info.
req_flags,
0,
GSS_C_NO_CHANNEL_BINDINGS,
token_ptr,
NULL,
&send_tok,
NULL,
NULL);
if(maj_stat != GSS_S_COMPLETE &&
maj_stat != GSS_S_CONTINUE_NEEDED)
{
error_obj = globus_error_wrap_gssapi_error(
GLOBUS_FTP_CONTROL_MODULE,
maj_stat,
min_stat,
0,
__FILE__,
"globus_l_ftp_control_send_cmd_cb",
__LINE__,
"gss_init_sec_context failed");
goto return_error;
}
len = send_tok.length;
/* base64 encode the token that needs to be sent to the
* server
*/
radix_buf = globus_libc_malloc(send_tok.length * 8 / 6 + 4);
if(radix_buf == GLOBUS_NULL)
{
gss_release_buffer(&min_stat, &send_tok);
error_obj = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"globus_l_ftp_control_send_cmd_cb: malloc failed");
goto return_error;
}
rc = globus_i_ftp_control_radix_encode(send_tok.value,
radix_buf,
&len);
if(rc != GLOBUS_SUCCESS)
{
gss_release_buffer(&min_stat, &send_tok);
globus_libc_free(radix_buf);
error_obj = globus_error_get(rc);
goto return_error;
}
/* send the initial security token to the server */
rc = globus_ftp_control_send_command(
handle,"ADAT %s\r\n",
globus_l_ftp_control_send_cmd_cb,
callback_arg,radix_buf);
globus_libc_free(radix_buf);
gss_release_buffer(&min_stat, &send_tok);
if(rc != GLOBUS_SUCCESS)
{
error_obj = globus_error_get(rc);
goto return_error;
}
break;
case GLOBUS_FTP_UNKNOWN_REPLY:
case GLOBUS_FTP_POSITIVE_COMPLETION_REPLY:
case GLOBUS_FTP_POSITIVE_PRELIMINARY_REPLY:
case GLOBUS_FTP_TRANSIENT_NEGATIVE_COMPLETION_REPLY:
case GLOBUS_FTP_PERMANENT_NEGATIVE_COMPLETION_REPLY:
(cb_arg->user_cb)((cb_arg->user_cb_arg),
handle,
GLOBUS_NULL,
ftp_response);
globus_libc_free(cb_arg);
break;
}
break;
case GLOBUS_I_FTP_ADAT:
switch(ftp_response->response_class)
{
case GLOBUS_FTP_POSITIVE_INTERMEDIATE_REPLY:
/* base64 decode the reply */
ftp_response->response_buffer
[ftp_response->response_length-3]='\0';
len = strlen(ftp_response->response_buffer);
radix_buf = globus_libc_malloc((len + 1) * 6 / 8 + 1);
if(radix_buf == GLOBUS_NULL)
{
error_obj = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_send_cmd_cb: malloc failed"));
goto return_error;
}
rc = globus_i_ftp_control_radix_decode(
ftp_response->response_buffer + strlen("335 ADAT="),
radix_buf,
&len);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(radix_buf);
error_obj = globus_error_get(rc);
goto return_error;
}
recv_tok.value = radix_buf;
recv_tok.length = len;
token_ptr = &recv_tok;
maj_stat = gss_init_sec_context(
&min_stat,
handle->cc_handle.auth_info.credential_handle,
&(handle->cc_handle.auth_info.
auth_gssapi_context),
handle->cc_handle.auth_info.
target_name,
GSS_C_NULL_OID,
handle->cc_handle.auth_info.
req_flags,
0,
GSS_C_NO_CHANNEL_BINDINGS,
token_ptr,
NULL,
&send_tok,
NULL,
NULL);
if(maj_stat != GSS_S_COMPLETE &&
maj_stat != GSS_S_CONTINUE_NEEDED)
{
error_obj = globus_error_wrap_gssapi_error(
GLOBUS_FTP_CONTROL_MODULE,
maj_stat,
min_stat,
0,
__FILE__,
"globus_l_ftp_control_send_cmd_cb",
__LINE__,
"gss_init_sec_context failed");
gss_release_buffer(&min_stat, token_ptr);
goto return_error;
}
gss_release_buffer(&min_stat, token_ptr);
len = send_tok.length;
if(len != 0)
{
radix_buf = globus_libc_malloc(send_tok.length * 8 / 6 + 4);
if(radix_buf == GLOBUS_NULL)
{
gss_release_buffer(&min_stat, &send_tok);
error_obj = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_send_cmd_cb: malloc failed"));
goto return_error;
}
rc = globus_i_ftp_control_radix_encode(send_tok.value,
radix_buf,
&len);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(radix_buf);
gss_release_buffer(&min_stat, &send_tok);
error_obj = globus_error_get(rc);
goto return_error;
}
rc = globus_ftp_control_send_command(
handle,"ADAT %s\r\n",
globus_l_ftp_control_send_cmd_cb,
callback_arg,radix_buf);
globus_libc_free(radix_buf);
gss_release_buffer(&min_stat, &send_tok);
if(rc != GLOBUS_SUCCESS)
{
error_obj = globus_error_get(rc);
goto return_error;
}
}
else
{
error_obj = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_send_cmd_cb: gss_init_sec_context failed to generate output token\n"));
goto return_error;
}
break;
case GLOBUS_FTP_POSITIVE_COMPLETION_REPLY:
cb_arg->cmd=GLOBUS_I_FTP_USER;
/* base64 decode the reply */
if(!strncmp(ftp_response->response_buffer, "235 ADAT=", 8))
{
ftp_response->response_buffer
[ftp_response->response_length-3]='\0';
len = strlen(ftp_response->response_buffer);
radix_buf = globus_libc_malloc((len + 1) * 6 / 8 + 1);
if(radix_buf == GLOBUS_NULL)
{
error_obj = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_send_cmd_cb: malloc failed"));
goto return_error;
}
rc = globus_i_ftp_control_radix_decode(
ftp_response->response_buffer + strlen("235 ADAT="),
radix_buf,
&len);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(radix_buf);
error_obj = globus_error_get(rc);
goto return_error;
}
recv_tok.value = radix_buf;
recv_tok.length = len;
token_ptr = &recv_tok;
maj_stat = gss_init_sec_context(
&min_stat,
handle->cc_handle.auth_info.credential_handle,
&(handle->cc_handle.auth_info.
auth_gssapi_context),
handle->cc_handle.auth_info.
target_name,
GSS_C_NULL_OID,
handle->cc_handle.auth_info.
req_flags,
0,
GSS_C_NO_CHANNEL_BINDINGS,
token_ptr,
NULL,
&send_tok,
NULL,
NULL);
if(maj_stat != GSS_S_COMPLETE)
{
error_obj = globus_error_wrap_gssapi_error(
GLOBUS_FTP_CONTROL_MODULE,
maj_stat,
min_stat,
0,
__FILE__,
"globus_l_ftp_control_send_cmd_cb",
__LINE__,
_FCSL("gss_init_sec_context failed"));
gss_release_buffer(&min_stat, token_ptr);
goto return_error;
}
gss_release_buffer(&min_stat, token_ptr);
if(send_tok.length != 0)
{
error_obj = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_send_cmd_cb: gss_init_sec_context generated unexpected output token\n"));
gss_release_buffer(&min_stat, &send_tok);
goto return_error;
}
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
handle->cc_handle.auth_info.authenticated = GLOBUS_TRUE;
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
gss_wrap_size_limit(
&min_stat,
handle->cc_handle.auth_info.auth_gssapi_context,
0,
GSS_C_QOP_DEFAULT,
1<<30,
&max_input_size[0]);
gss_wrap_size_limit(
&min_stat,
handle->cc_handle.auth_info.auth_gssapi_context,
1,
GSS_C_QOP_DEFAULT,
1<<30,
&max_input_size[1]);
/* establish a max of 1M.. this is only necessary because some
* naive implementations will attempt to allocate this entire
* buffer all at once (read: wuftp)
*/
pbsz = 1024 *1024;
if(max_input_size[0] < pbsz)
{
pbsz = max_input_size[0];
}
if(max_input_size[1] && max_input_size[1] < pbsz)
{
pbsz = max_input_size[1];
}
globus_ftp_control_local_pbsz(handle, pbsz);
/* copy actual host into handle */
rc = globus_io_tcp_get_remote_address_ex(
&handle->cc_handle.io_handle,
tmp_host,
&tmp_hostlen,
&tmp_port);
if(rc == GLOBUS_SUCCESS)
{
serverhost = globus_libc_ints_to_contact_string(
tmp_host,
tmp_hostlen,
0);
if(serverhost)
{
strncpy(handle->cc_handle.serverhost,
serverhost, sizeof(handle->cc_handle.serverhost));
handle->cc_handle.serverhost[
sizeof(handle->cc_handle.serverhost) - 1] = 0;
}
}
if(handle->cc_handle.auth_info.user != GLOBUS_NULL)
{
rc = globus_ftp_control_send_command(
handle,
"USER %s\r\n",
globus_l_ftp_control_send_cmd_cb,
callback_arg,
handle->cc_handle.auth_info.user);
}
else
{
rc = globus_ftp_control_send_command(
handle,
"USER :globus-mapping:\r\n",
globus_l_ftp_control_send_cmd_cb,
callback_arg);
}
if(rc != GLOBUS_SUCCESS)
{
error_obj = globus_error_get(rc);
goto return_error;
}
break;
case GLOBUS_FTP_UNKNOWN_REPLY:
case GLOBUS_FTP_POSITIVE_PRELIMINARY_REPLY:
case GLOBUS_FTP_TRANSIENT_NEGATIVE_COMPLETION_REPLY:
case GLOBUS_FTP_PERMANENT_NEGATIVE_COMPLETION_REPLY:
(cb_arg->user_cb)((cb_arg->user_cb_arg),
handle,
GLOBUS_NULL,
ftp_response);
globus_libc_free(cb_arg);
break;
}
break;
case GLOBUS_I_FTP_USER:
switch(ftp_response->response_class)
{
case GLOBUS_FTP_POSITIVE_INTERMEDIATE_REPLY:
ugly_hack:
cb_arg->cmd=GLOBUS_I_FTP_PASS;
if(handle->cc_handle.auth_info.password != GLOBUS_NULL)
{
rc = globus_ftp_control_send_command(
handle,
"PASS %s\r\n",
globus_l_ftp_control_send_cmd_cb,
callback_arg,
handle->cc_handle.auth_info.password);
}
else
{
rc = globus_ftp_control_send_command(
handle,
"PASS dummy\r\n",
globus_l_ftp_control_send_cmd_cb,
callback_arg);
}
if(rc != GLOBUS_SUCCESS)
{
error_obj = globus_error_get(rc);
goto return_error;
}
break;
case GLOBUS_FTP_POSITIVE_COMPLETION_REPLY:
if(handle->cc_handle.auth_info.authenticated == GLOBUS_TRUE)
{
goto ugly_hack;
}
case GLOBUS_FTP_UNKNOWN_REPLY:
case GLOBUS_FTP_POSITIVE_PRELIMINARY_REPLY:
case GLOBUS_FTP_TRANSIENT_NEGATIVE_COMPLETION_REPLY:
case GLOBUS_FTP_PERMANENT_NEGATIVE_COMPLETION_REPLY:
(cb_arg->user_cb)((cb_arg->user_cb_arg),
handle,
GLOBUS_NULL,
ftp_response);
globus_libc_free(callback_arg);
break;
}
break;
case GLOBUS_I_FTP_PASS:
switch(ftp_response->response_class)
{
case GLOBUS_FTP_POSITIVE_INTERMEDIATE_REPLY:
cb_arg->cmd=GLOBUS_I_FTP_ACCT;
if(handle->cc_handle.auth_info.account != GLOBUS_NULL)
{
rc = globus_ftp_control_send_command(
handle,"ACCT %s\r\n",
globus_l_ftp_control_send_cmd_cb,
callback_arg,
handle->cc_handle.auth_info.account);
}
else
{
(cb_arg->user_cb)((cb_arg->user_cb_arg),
handle,
GLOBUS_NULL,
ftp_response);
globus_libc_free(callback_arg);
break;
}
if(rc != GLOBUS_SUCCESS)
{
error_obj = globus_error_get(rc);
goto return_error;
}
break;
case GLOBUS_FTP_UNKNOWN_REPLY:
case GLOBUS_FTP_POSITIVE_PRELIMINARY_REPLY:
case GLOBUS_FTP_POSITIVE_COMPLETION_REPLY:
case GLOBUS_FTP_TRANSIENT_NEGATIVE_COMPLETION_REPLY:
case GLOBUS_FTP_PERMANENT_NEGATIVE_COMPLETION_REPLY:
(cb_arg->user_cb)((cb_arg->user_cb_arg),
handle,
GLOBUS_NULL,
ftp_response);
globus_libc_free(callback_arg);
break;
}
break;
case GLOBUS_I_FTP_QUIT:
if(ftp_response != GLOBUS_NULL)
{
rc=globus_ftp_control_response_copy(
ftp_response,
&handle->cc_handle.quit_response);
if(rc != GLOBUS_SUCCESS){
error_obj = globus_error_get(rc);
goto return_error;
}
}
globus_mutex_lock(&(handle->cc_handle.mutex));
if(handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED)
{
handle->cc_handle.cc_state = GLOBUS_FTP_CONTROL_CLOSING;
handle->cc_handle.cb_count++;
globus_mutex_unlock(&(handle->cc_handle.mutex));
rc=globus_ftp_control_data_force_close(
handle,
globus_l_ftp_control_data_close_cb,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
rc=globus_io_register_close(&handle->cc_handle.io_handle,
globus_l_ftp_control_close_cb,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
globus_mutex_lock(&(handle->cc_handle.mutex));
{
handle->cc_handle.cb_count--;
handle->cc_handle.close_result =
globus_error_get(rc);
if(!handle->cc_handle.cb_count)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
}
}
}
else
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
(cb_arg->user_cb)((cb_arg->user_cb_arg),
handle,
GLOBUS_NULL,
ftp_response);
}
globus_libc_free(cb_arg);
break;
default:
break;
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_send_cmd_cb() exiting\n"));
return;
return_error:
(cb_arg->user_cb)((cb_arg->user_cb_arg),
handle,
error_obj,
GLOBUS_NULL);
globus_object_free(error_obj);
globus_libc_free(callback_arg);
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_send_cmd_cb() exiting with error\n"));
return;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_ftp_control_data[_force]_close
* function.
*
* This is an internal callback used as part of the
* globus_ftp_control[_force]_close function. It checks the result of
* the close and calls either globus_io_register_close on the control
* connection or the user callback if the connection is already closed.
*
* @param arg
* The callback argument, which in this case is used to pass
* the original user callback and argument.
* @param handle
* The handle for the ftp connection.
* @param error
* The result of the close operation
*
* @return void
*
* @par If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_data_close_cb(
void * arg,
globus_ftp_control_handle_t * handle,
globus_object_t * error)
{
globus_result_t rc;
globus_bool_t call_close_cb = GLOBUS_FALSE;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_data_close_cb() entering\n"));
rc=globus_io_register_close(&handle->cc_handle.io_handle,
globus_l_ftp_control_close_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
globus_mutex_lock(&(handle->cc_handle.mutex));
{
handle->cc_handle.cb_count--;
handle->cc_handle.close_result =
globus_error_get(rc);
if(!handle->cc_handle.cb_count)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_data_close_cb() exiting\n"));
return;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_register_close function.
*
* This is an internal callback used as part of the
* globus_ftp_control_quit function. It checks the result of the close
* and calls the user callback with the response of to the quit.
*
* @param arg
* The callback argument, which in this case is used to pass
* the original user callback and argument.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the close operation
*
* @return void
*
* @par If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_close_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_bool_t call_close_cb = GLOBUS_FALSE;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_close_cb() entering\n"));
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle=&(c_handle->cc_handle);
globus_mutex_lock(&cc_handle->mutex);
{
cc_handle->cb_count--;
if(!cc_handle->cb_count)
{
call_close_cb = GLOBUS_TRUE;
}
cc_handle->close_result = globus_error_get(result);
}
globus_mutex_unlock(&cc_handle->mutex);
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_close_cb() exiting\n"));
return;
}
/**
* Force a close of the control connection without waiting for
* outstanding commands to complete and without sending QUIT.
*
* This function is used to close the control channel to the FTP server.
* Once the final response callback passed to this function is invoked,
* the control handle can no longer be used for any gsiftp control
* operations.
*
* @note Since this function waits until all other callbacks are completed
* before calling it's own callback it may not be called in a blocking
* fashion from another callback.
*
* @param handle
* A pointer to a GSIFTP control handle. The quit message is
* issued to the server over the control channel
* associated with this handle.
* @param callback
* The function to be called once the authentication process is
* complete or when an error occurs.
* @param callback_arg
* User supplied argument to the callback function
* @return
* - Success
* - Null handle
*
* @par Callback errors:
* - success
* - failure
*
* @par Expected callback response values:
* - GLOBUS_NULL
*
*/
globus_result_t
globus_ftp_control_force_close(
globus_ftp_control_handle_t * handle,
globus_ftp_control_response_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_bool_t connected;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_force_close() entering\n"));
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.cc_state != GLOBUS_FTP_CONTROL_CONNECTED &&
handle->cc_handle.cc_state != GLOBUS_FTP_CONTROL_CONNECTING)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_force_close: Handle is not connected"))
);
goto return_error;
}
else
{
if(handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED)
{
connected = GLOBUS_TRUE;
}
else
{
connected = GLOBUS_FALSE;
}
handle->cc_handle.close_cb = callback;
handle->cc_handle.close_cb_arg = callback_arg;
handle->cc_handle.cc_state = GLOBUS_FTP_CONTROL_CLOSING;
handle->cc_handle.cb_count++;
}
if(connected)
{
rc=globus_ftp_control_data_force_close(
handle,
globus_l_ftp_control_data_close_cb,
(void *) handle);
}
if(!connected || rc != GLOBUS_SUCCESS)
{
rc=globus_io_register_close(&handle->cc_handle.io_handle,
globus_l_ftp_control_close_cb,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
globus_i_ftp_control_auth_info_destroy(
&(handle->cc_handle.auth_info));
handle->cc_handle.cb_count--;
handle->cc_handle.cc_state = GLOBUS_FTP_CONTROL_UNCONNECTED;
goto return_error;
}
}
if(globus_l_ftp_cc_deactivated)
{
handle->cc_handle.signal_deactivate = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_force_close() exiting\n"));
return GLOBUS_SUCCESS;
return_error:
globus_mutex_unlock(&(handle->cc_handle.mutex));
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_ftp_control_force_close() exiting with error\n"));
return rc;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which creates and initializes a
* authentication information structure
*
* This is internal helper function allocates memory for a
* auth_info_t structure and initializes it with the values contained
* in the second argument
*
* @param dest
* This parameter is used to return the new response struct.
* @param src
* A auth_info_t containing the values to initialize dest
* with.
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_auth_info_init(
globus_ftp_control_auth_info_t * dest,
globus_ftp_control_auth_info_t * src)
{
if(dest == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_auth_info_init: Destination argument is NULL"))
);
}
if(src == GLOBUS_NULL)
{
memset((void *) dest, 0, sizeof(globus_ftp_control_auth_info_t));
}
else
{
dest->credential_handle = src->credential_handle;
dest->locally_acquired_credential = GLOBUS_FALSE;
if(src->auth_gssapi_subject != GLOBUS_NULL)
{
dest->auth_gssapi_subject =
globus_libc_strdup(src->auth_gssapi_subject);
}
else
{
dest->auth_gssapi_subject = GLOBUS_NULL;
}
if(src->user != GLOBUS_NULL)
{
dest->user = globus_libc_strdup(src->user);
}
else
{
dest->user = GLOBUS_NULL;
}
if(src->password != GLOBUS_NULL)
{
dest->password = globus_libc_strdup(src->password);
}
else
{
dest->password = GLOBUS_NULL;
}
if(src->account != GLOBUS_NULL)
{
dest->account = globus_libc_strdup(src->account);
}
else
{
dest->account = GLOBUS_NULL;
}
dest->delegated_credential_handle = GSS_C_NO_CREDENTIAL;
dest->encrypt = src->encrypt;
}
dest->prev_cmd=GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
dest->auth_gssapi_context = GSS_C_NO_CONTEXT;
dest->req_flags = 0;
dest->target_name = GSS_C_NO_NAME;
dest->authenticated = GLOBUS_FALSE;
return GLOBUS_SUCCESS;
}
/**
* Helper function which initializes a authentication information
* structure.
*
* This is helper function initializes a authentication information
* structure with the values contained in the second to fifth arguments,
* which may be GLOBUS_NULL. No memory is allocated in this function.
*
* @param auth_info
* The authentication structure to initialize.
* @param credential_handle
* The credential to use for authentication. This may be
* GSS_C_NO_CREDENTIAL to use the user's default credential.
* @param encrypt
* Boolean whether or not to encrypt the control channel for this
* handle.
* @param user
* The user name
* @param password
* The password for the user name
* @param account
* The account for the user name/password
* @param subject
* The gss api subject name
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
globus_result_t
globus_ftp_control_auth_info_init(
globus_ftp_control_auth_info_t * auth_info,
gss_cred_id_t credential_handle,
globus_bool_t encrypt,
char * user,
char * password,
char * account,
char * subject)
{
if(auth_info == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_auth_info_init: auth_info argument is NULL"))
);
}
if(credential_handle != GLOBUS_NULL)
{
auth_info->credential_handle = credential_handle;
}
else
{
auth_info->credential_handle = GSS_C_NO_CREDENTIAL;
}
auth_info->auth_gssapi_subject = subject;
auth_info->user = user;
auth_info->password = password;
auth_info->account = account;
auth_info->prev_cmd=GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
auth_info->auth_gssapi_context = GSS_C_NO_CONTEXT;
auth_info->req_flags = 0;
auth_info->target_name = GSS_C_NO_NAME;
auth_info->authenticated = GLOBUS_FALSE;
auth_info->locally_acquired_credential = GLOBUS_FALSE;
auth_info->delegated_credential_handle = GSS_C_NO_CREDENTIAL;
auth_info->encrypt = encrypt;
return GLOBUS_SUCCESS;
}
/**
* Helper function which compares two authentication information
* structures.
*
* This is helper function compares two authentication information
* structures and return zero if the two structures are deemed equal
* and a non-zero value otherwise.
*
* @param auth_info_1
* The first authentication structure
* @param auth_info_2
* The second authentication structure
* @return
* - 0 if the structures are equal
* - !0 if the structures differ or an error occured
*
*/
int
globus_ftp_control_auth_info_compare(
globus_ftp_control_auth_info_t * auth_info_1,
globus_ftp_control_auth_info_t * auth_info_2)
{
if(auth_info_1 == GLOBUS_NULL)
{
return -1;
}
if(auth_info_2 == GLOBUS_NULL)
{
return -1;
}
if(auth_info_1->auth_gssapi_subject != GLOBUS_NULL &&
auth_info_2->auth_gssapi_subject != GLOBUS_NULL )
{
if(strcmp(auth_info_1->auth_gssapi_subject,
auth_info_2->auth_gssapi_subject))
{
return -1;
}
}
else if(auth_info_1->auth_gssapi_subject != GLOBUS_NULL ||
auth_info_2->auth_gssapi_subject != GLOBUS_NULL)
{
return -1;
}
if(auth_info_1->credential_handle != GSS_C_NO_CREDENTIAL &&
auth_info_2->credential_handle != GSS_C_NO_CREDENTIAL)
{
if(auth_info_1->credential_handle !=
auth_info_2->credential_handle)
{
return -1;
}
}
else if((auth_info_1->locally_acquired_credential != GLOBUS_TRUE &&
auth_info_1->credential_handle != GSS_C_NO_CREDENTIAL &&
auth_info_2->credential_handle == GSS_C_NO_CREDENTIAL) ||
(auth_info_1->credential_handle == GSS_C_NO_CREDENTIAL &&
auth_info_2->locally_acquired_credential != GLOBUS_TRUE &&
auth_info_2->credential_handle != GSS_C_NO_CREDENTIAL))
{
return -1;
}
if(auth_info_1->user != GLOBUS_NULL &&
auth_info_2->user != GLOBUS_NULL )
{
if(strcmp(auth_info_1->user,
auth_info_2->user))
{
return -1;
}
}
else if(auth_info_1->user != GLOBUS_NULL ||
auth_info_2->user != GLOBUS_NULL)
{
return -1;
}
if(auth_info_1->password != GLOBUS_NULL &&
auth_info_2->password != GLOBUS_NULL )
{
if(strcmp(auth_info_1->password,
auth_info_2->password))
{
return -1;
}
}
else if(auth_info_1->password != GLOBUS_NULL ||
auth_info_2->password != GLOBUS_NULL)
{
return -1;
}
if(auth_info_1->account != GLOBUS_NULL &&
auth_info_2->account != GLOBUS_NULL )
{
if(strcmp(auth_info_1->account,
auth_info_2->account))
{
return -1;
}
}
else if(auth_info_1->account != GLOBUS_NULL ||
auth_info_2->account != GLOBUS_NULL)
{
return -1;
}
return 0;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which frees the memory associated with a
* auth_info_t structure.
*
* This is a internal helper function frees the memory associated with
* a auth_info_t structure.
*
* @param auth_info
* This parameter indicates the auth_info structure to destroy
* and is used to set the pointer to the auth_info structure to
* GLOBUS_NULL
*
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_auth_info_destroy(
globus_ftp_control_auth_info_t * auth_info)
{
OM_uint32 major_status;
OM_uint32 minor_status;
if( auth_info != GLOBUS_NULL)
{
if(auth_info->auth_gssapi_subject != GLOBUS_NULL)
{
globus_libc_free(auth_info->auth_gssapi_subject);
auth_info->auth_gssapi_subject=GLOBUS_NULL;
}
if(auth_info->user != GLOBUS_NULL)
{
globus_libc_free(auth_info->user);
auth_info->user=GLOBUS_NULL;
}
if(auth_info->password != GLOBUS_NULL)
{
globus_libc_free(auth_info->password);
auth_info->password=GLOBUS_NULL;
}
if(auth_info->account != GLOBUS_NULL)
{
globus_libc_free(auth_info->account);
auth_info->account=GLOBUS_NULL;
}
if(auth_info->target_name != GSS_C_NO_NAME)
{
major_status=gss_release_name(&minor_status,
&(auth_info->target_name));
auth_info->target_name = GSS_C_NO_NAME;
if(major_status == GSS_S_FAILURE)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_auth_info_destroy: gss_release_name failed"))
);
}
}
if(auth_info->auth_gssapi_context != GSS_C_NO_CONTEXT)
{
major_status=gss_delete_sec_context(&minor_status,
&(auth_info->
auth_gssapi_context),
GLOBUS_NULL);
auth_info->auth_gssapi_context = GSS_C_NO_CONTEXT;
if(major_status == GSS_S_FAILURE)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_auth_info_destroy: Failed to delete security context"))
);
}
}
if(auth_info->credential_handle != GSS_C_NO_CREDENTIAL &&
auth_info->locally_acquired_credential)
{
major_status=gss_release_cred(&minor_status,
&(auth_info->credential_handle));
auth_info->credential_handle = GSS_C_NO_CREDENTIAL;
auth_info->locally_acquired_credential = GLOBUS_FALSE;
if(major_status == GSS_S_FAILURE)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_auth_info_destroy: gss_release_cred failed"))
);
}
}
if(auth_info->delegated_credential_handle != GSS_C_NO_CREDENTIAL)
{
major_status=gss_release_cred(&minor_status,
&(auth_info->delegated_credential_handle));
auth_info->delegated_credential_handle = GSS_C_NO_CREDENTIAL;
}
auth_info->authenticated = GLOBUS_FALSE;
}
return GLOBUS_SUCCESS;
}
static char *radixN =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static char pad = '=';
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which base64 encodes a given input
*
* This is a internal helper function base64 encodes the first
* "length" bytes of the given in-buffer and writes the result to the
* out-buffer . This function assumes that the out-buffer is large
* enough to contain the encoded in-buffer. The length of the encoded
* inbuffer is returned through the length parameter.
*
* @param inbuf
* The input buffer to encode
* @param outbuf
* The buffer in which the encoded input buffer is stored
* @param length
* Initially the length of the input. Used to return the lenght
* of the output.
*
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_radix_encode(
unsigned char * inbuf,
unsigned char * outbuf,
int * length)
{
int i;
int j;
unsigned char c;
for (i=0,j=0; i < *length; i++)
{
switch (i%3)
{
case 0:
outbuf[j++] = radixN[inbuf[i]>>2];
c = (inbuf[i]&3)<<4;
break;
case 1:
outbuf[j++] = radixN[c|inbuf[i]>>4];
c = (inbuf[i]&15)<<2;
break;
case 2:
outbuf[j++] = radixN[c|inbuf[i]>>6];
outbuf[j++] = radixN[inbuf[i]&63];
c = 0;
}
}
if (i%3)
{
outbuf[j++] = radixN[c];
}
switch (i%3)
{
case 1:
outbuf[j++] = pad;
case 2:
outbuf[j++] = pad;
}
outbuf[*length = j] = '\0';
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which base64 decodes a given input
*
* This is a internal helper function base64 decodes the given
* in-buffer and writes the result to the out-buffer . This function
* assumes that the out-buffer is large enough to contain the decoded
* in-buffer. The length of the decoded inbuffer is returned through
* the length parameter.
*
* @param inbuf
* The input buffer to decode
* @param outbuf
* The buffer in which the decoded input buffer is stored
* @param length
* Used to return the lenght of the output.
*
* @return
* - Error Object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_radix_decode(
unsigned char * inbuf,
unsigned char * outbuf,
int * length)
{
int i;
int j;
int D;
char * p;
for (i=0,j=0; inbuf[i] && inbuf[i] != pad; i++)
{
if ((p = strchr(radixN, inbuf[i])) == NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_radix_decode: Character not in charset"))
);
}
D = p - radixN;
switch (i&3)
{
case 0:
outbuf[j] = D<<2;
break;
case 1:
outbuf[j++] |= D>>4;
outbuf[j] = (D&15)<<4;
break;
case 2:
outbuf[j++] |= D>>2;
outbuf[j] = (D&3)<<6;
break;
case 3:
outbuf[j++] |= D;
}
}
switch (i&3)
{
case 1:
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_radix_decode: Padding error"))
);
case 2:
if (D&15)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_radix_decode: Padding error"))
);
}
if (strcmp((char *)&inbuf[i], "=="))
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_radix_decode: Padding error"))
);
}
break;
case 3:
if (D&3)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_radix_decode: Padding error"))
);
}
if (strcmp((char *)&inbuf[i], "="))
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_radix_decode: Padding error"))
);
}
}
*length = j;
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which gss wraps, base 64 encodes and puts
* a MIC in front of the encoded string
*
* Internal helper function which gss wraps, base 64 encodes and puts
* a MIC in front of the encoded string
*
* @param cc_handle
* A control connection handle.
* @param cmd
* A string representing the command to encode.
* @param encoded_cmd
* Used to return the encoded command. Memory for the encoded
* command is allocated in this function.
*
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_encode_command(
globus_ftp_cc_handle_t * cc_handle,
char * cmd,
char ** encoded_cmd)
{
gss_buffer_desc in_buf;
gss_buffer_desc out_buf;
OM_uint32 maj_stat;
OM_uint32 min_stat;
int conf_state;
int length;
if(cc_handle == GLOBUS_NULL ||
cmd == GLOBUS_NULL ||
encoded_cmd == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_encode_command: NULL argument detected"))
);
}
in_buf.value = cmd;
in_buf.length = strlen(cmd);
maj_stat = gss_wrap(&min_stat,
cc_handle->auth_info.auth_gssapi_context,
0,
GSS_C_QOP_DEFAULT,
&in_buf,
&conf_state,
&out_buf);
if(maj_stat != GSS_S_COMPLETE)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_encode_command: gss_wrap failed"))
);
}
*encoded_cmd = (char *) globus_libc_malloc((out_buf.length + 3) * 8 / 6 + 9);
if(*encoded_cmd == GLOBUS_NULL)
{
gss_release_buffer(&min_stat, &out_buf);
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_encode_command: malloc failed"))
);
}
if(conf_state == 0)
{
(*encoded_cmd)[0]='M';
(*encoded_cmd)[1]='I';
(*encoded_cmd)[2]='C';
(*encoded_cmd)[3]=' ';
}
else
{
(*encoded_cmd)[0]='E';
(*encoded_cmd)[1]='N';
(*encoded_cmd)[2]='C';
(*encoded_cmd)[3]=' ';
}
length = out_buf.length;
globus_i_ftp_control_radix_encode(out_buf.value,
&((*encoded_cmd)[4]),
&length);
(*encoded_cmd)[length+4]='\r';
(*encoded_cmd)[length+5]='\n';
(*encoded_cmd)[length+6]='\0';
gss_release_buffer(&min_stat, &out_buf);
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which sets up a list for keeping track of
* control connection handles and which opens /dev/null which is used
* for checking the length of commands and responses.
*
* Internal helper function which sets up a list for keeping track of
* control connection handles and which opens /dev/null which is used
* for checking the length of commands and responses.
*
*
* @return
* - Error object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_client_activate(void)
{
globus_result_t result;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_i_ftp_control_client_activate() entering\n"));
globus_module_activate(GLOBUS_GSI_GSS_ASSIST_MODULE);
globus_mutex_init(
&(globus_l_ftp_cc_handle_list_mutex), GLOBUS_NULL);
globus_cond_init(
&(globus_l_ftp_cc_handle_list_cond), GLOBUS_NULL);
globus_l_ftp_cc_handle_signal_count = 0;
#ifndef TARGET_ARCH_WIN32
globus_i_ftp_control_devnull=fopen("/dev/null","w");
#else
globus_i_ftp_control_devnull=fopen("NUL","w");
#endif
if (globus_i_ftp_control_devnull == NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_client_activate: Failed to open /dev/null"))
);
goto return_error;
}
globus_l_ftp_cc_deactivated = GLOBUS_FALSE;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_i_ftp_control_client_activate() exiting\n"));
return GLOBUS_SUCCESS;
return_error:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_i_ftp_control_client_activate() exiting with error\n"));
return result;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
*
* Internal helper function which deactivates any control connections
*
* Internal helper function which goes through a list of control
* connection handles, closes any open connections associated with the
* handles and deallocates any memory allocated to these handles. It
* also closes /dev/null
*
* @return
* - Error Object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_client_deactivate(void)
{
globus_ftp_control_handle_t * handle;
globus_list_t * tmp;
globus_result_t result;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_i_ftp_control_client_deactivate() entering\n"));
globus_l_ftp_cc_deactivated = GLOBUS_TRUE;
globus_mutex_lock(&globus_l_ftp_cc_handle_list_mutex);
{
tmp = globus_l_ftp_cc_handle_list;
while(!globus_list_empty(tmp))
{
handle = (globus_ftp_control_handle_t *) globus_list_first(tmp);
tmp = globus_list_rest(tmp);
result = globus_ftp_control_force_close(
handle, GLOBUS_NULL, GLOBUS_NULL);
if(result != GLOBUS_SUCCESS)
{
globus_mutex_lock(&handle->cc_handle.mutex);
{
switch(handle->cc_handle.cc_state)
{
case GLOBUS_FTP_CONTROL_UNCONNECTED:
/* handle ready to be destroyed */
break;
case GLOBUS_FTP_CONTROL_CLOSING:
/* close already in progress */
globus_l_ftp_cc_handle_signal_count++;
handle->cc_handle.signal_deactivate = GLOBUS_TRUE;
break;
case GLOBUS_FTP_CONTROL_CONNECTED:
case GLOBUS_FTP_CONTROL_CONNECTING:
handle->cc_handle.cc_state =
GLOBUS_FTP_CONTROL_CLOSING;
if(handle->cc_handle.cb_count)
{
globus_l_ftp_cc_handle_signal_count++;
handle->cc_handle.signal_deactivate = GLOBUS_TRUE;
}
break;
default:
break;
}
}
globus_mutex_unlock(&handle->cc_handle.mutex);
}
else
{
globus_l_ftp_cc_handle_signal_count++;
}
}
while(globus_l_ftp_cc_handle_signal_count > 0)
{
globus_cond_wait(
&globus_l_ftp_cc_handle_list_cond,
&globus_l_ftp_cc_handle_list_mutex);
}
while(!globus_list_empty(globus_l_ftp_cc_handle_list))
{
handle = (globus_ftp_control_handle_t *) globus_list_remove(
&globus_l_ftp_cc_handle_list, globus_l_ftp_cc_handle_list);
if(handle->cc_handle.cc_state != GLOBUS_FTP_CONTROL_UNCONNECTED)
{
globus_io_close(&handle->cc_handle.io_handle);
globus_i_ftp_control_auth_info_destroy(
&handle->cc_handle.auth_info);
}
if(handle->cc_handle.response.response_buffer)
{
globus_libc_free(handle->cc_handle.response.response_buffer);
}
globus_mutex_destroy(&handle->cc_handle.mutex);
globus_libc_free(handle->cc_handle.read_buffer);
globus_ftp_control_response_destroy(&handle->cc_handle.quit_response);
if(handle->cc_handle.close_result)
{
globus_object_free(handle->cc_handle.close_result);
}
}
}
globus_mutex_unlock(&globus_l_ftp_cc_handle_list_mutex);
globus_mutex_destroy(&globus_l_ftp_cc_handle_list_mutex);
globus_cond_destroy(&globus_l_ftp_cc_handle_list_cond);
fclose(globus_i_ftp_control_devnull);
globus_module_deactivate(GLOBUS_GSI_GSS_ASSIST_MODULE);
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_i_ftp_control_client_deactivate() exiting\n"));
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_client_get_connection_info(
globus_ftp_control_handle_t * handle,
int localhost[4],
unsigned short * localport,
int remotehost[4],
unsigned short * remoteport)
{
globus_result_t result =
globus_error_put(GLOBUS_ERROR_NO_INFO);
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED)
{
if(localhost != GLOBUS_NULL &&
localport != GLOBUS_NULL)
{
result = globus_io_tcp_get_local_address(
&handle->cc_handle.io_handle,
localhost,
localport);
}
if(remotehost != GLOBUS_NULL &&
remoteport != GLOBUS_NULL)
{
result = globus_io_tcp_get_remote_address(
&handle->cc_handle.io_handle,
remotehost,
remoteport);
}
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
return result;
}
globus_result_t
globus_ftp_control_client_get_connection_info_ex(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * local_info,
globus_ftp_control_host_port_t * remote_info)
{
globus_result_t result =
globus_error_put(GLOBUS_ERROR_NO_INFO);
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED)
{
if(local_info)
{
result = globus_io_tcp_get_local_address_ex(
&handle->cc_handle.io_handle,
local_info->host,
&local_info->hostlen,
&local_info->port);
}
if(remote_info)
{
result = globus_io_tcp_get_remote_address_ex(
&handle->cc_handle.io_handle,
remote_info->host,
&remote_info->hostlen,
&remote_info->port);
}
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
return result;
}
void
globus_i_ftp_control_write_next(
globus_ftp_control_handle_t * handle)
{
globus_object_t * error;
globus_result_t rc;
globus_ftp_control_rw_queue_element_t * element;
globus_bool_t queue_empty = GLOBUS_FALSE;
globus_bool_t call_close_cb = GLOBUS_FALSE;
rc = (globus_result_t) 1;
while(queue_empty == GLOBUS_FALSE &&
rc != GLOBUS_SUCCESS)
{
/* queue was not empty, we need to do the next write/send */
element = globus_fifo_peek(&handle->cc_handle.writers);
rc = globus_io_register_send(&handle->cc_handle.io_handle,
element->write_buf,
(globus_size_t) strlen(
element->write_buf),
element->write_flags,
element->write_callback,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);;
if(element->expect_response == GLOBUS_TRUE)
{
if(element->callback)
{
(element->callback)((element->arg),
handle,
error,
GLOBUS_NULL);
}
else
{
(element->send_response_cb)((element->arg),
handle,
error);
}
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
globus_fifo_dequeue(&handle->cc_handle.writers);
handle->cc_handle.cb_count--;
queue_empty=globus_fifo_empty(&handle->cc_handle.writers);
if(!handle->cc_handle.cb_count &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
globus_libc_free(element->write_buf);
globus_object_free(error);
globus_libc_free(element);
}
}
return;
}
static void
globus_l_ftp_control_read_next(
globus_ftp_control_handle_t * handle)
{
globus_object_t * error;
globus_result_t rc;
globus_ftp_control_rw_queue_element_t * element;
globus_bool_t queue_empty = GLOBUS_FALSE;
globus_bool_t call_close_cb = GLOBUS_FALSE;
do
{
/* queue was not empty, we need to do the next read */
element = globus_fifo_peek(&handle->cc_handle.readers);
rc=globus_io_register_read(&handle->cc_handle.io_handle,
handle->cc_handle.read_buffer,
GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE,
1, /* 0 or 1 here ? */
element->read_callback,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
(element->callback)((element->arg),
handle,
error,
GLOBUS_NULL);
globus_mutex_lock(&(handle->cc_handle.mutex));
{
globus_fifo_dequeue(&handle->cc_handle.readers);
handle->cc_handle.cb_count--;
queue_empty=globus_fifo_empty(&handle->cc_handle.readers);
if(!handle->cc_handle.cb_count &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
globus_libc_free(element);
globus_object_free(error);
}
}
while(queue_empty == GLOBUS_FALSE &&
rc != GLOBUS_SUCCESS);
return;
}
static globus_result_t
globus_l_ftp_control_queue_element_init(
globus_ftp_control_rw_queue_element_t * element,
globus_ftp_control_response_callback_t callback,
void * arg,
globus_byte_t * write_buf,
int write_flags,
globus_io_write_callback_t write_callback,
globus_io_read_callback_t read_callback,
globus_bool_t expect_response,
globus_bool_t use_auth,
globus_ftp_control_handle_t * handle)
{
globus_result_t result = GLOBUS_SUCCESS;
element->callback=callback;
element->arg=arg;
element->write_flags = write_flags;
if(use_auth == GLOBUS_TRUE)
{
result=globus_i_ftp_control_encode_command(
&handle->cc_handle,
write_buf,
(char **) (void *) &element->write_buf);
}
else
{
element->write_buf = globus_libc_strdup(write_buf);
if(element->write_buf == GLOBUS_NULL)
{
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_queue_element_init: strdup failed"))
);
}
}
element->write_callback = write_callback;
element->read_callback = read_callback;
element->expect_response = expect_response;
return result;
}
void
globus_i_ftp_control_call_close_cb(
globus_ftp_control_handle_t * handle)
{
globus_ftp_control_response_callback_t close_cb;
void * close_cb_arg;
globus_ftp_control_response_t response;
globus_object_t * result;
globus_bool_t signal_deactivate;
globus_mutex_lock(&handle->cc_handle.mutex);
{
globus_i_ftp_control_auth_info_destroy(
&(handle->cc_handle.auth_info));
handle->cc_handle.cc_state = GLOBUS_FTP_CONTROL_UNCONNECTED;
signal_deactivate = handle->cc_handle.signal_deactivate;
close_cb = handle->cc_handle.close_cb;
close_cb_arg = handle->cc_handle.close_cb_arg;
result = handle->cc_handle.close_result;
handle->cc_handle.close_result = GLOBUS_NULL;
response = handle->cc_handle.quit_response;
memset(
&handle->cc_handle.quit_response,
0,
sizeof(handle->cc_handle.quit_response));
}
globus_mutex_unlock(&handle->cc_handle.mutex);
if(close_cb)
{
close_cb(close_cb_arg, handle, result, &response);
}
if(result)
{
globus_object_free(result);
}
if(response.response_buffer)
{
globus_free(response.response_buffer);
}
if(signal_deactivate)
{
globus_mutex_lock(&globus_l_ftp_cc_handle_list_mutex);
{
if(globus_l_ftp_cc_handle_signal_count > 0)
{
if(--globus_l_ftp_cc_handle_signal_count == 0)
{
globus_cond_signal(&globus_l_ftp_cc_handle_list_cond);
}
}
}
globus_mutex_unlock(&globus_l_ftp_cc_handle_list_mutex);
}
}
globus_result_t
globus_ftp_control_ipv6_allow(
globus_ftp_control_handle_t * handle,
globus_bool_t allow)
{
globus_result_t result;
result = globus_io_attr_set_tcp_allow_ipv6(
&handle->cc_handle.io_attr, allow);
if(result == GLOBUS_SUCCESS)
{
result = globus_io_attr_set_tcp_allow_ipv6(
&handle->dc_handle.io_attr, allow);
}
return result;
}
globus_ftp_control-4.7/version.h.in 0000666 0000764 0000764 00000001356 10363624663 014506 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
static
globus_version_t local_version =
{
@GPT_MAJOR_VERSION@,
@GPT_MINOR_VERSION@,
@DIRT_TIMESTAMP@,
@DIRT_BRANCH_ID@
};
globus_ftp_control-4.7/missing 0000755 0000764 0000764 00000025406 12227171015 013625 0000000 0000000 #! /bin/sh
# Common stub for a few missing GNU programs while installing.
scriptversion=2005-06-08.21
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
# Originally by Fran,cois Pinard , 1996.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
if test $# -eq 0; then
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
fi
run=:
# In the cases where this matters, `missing' is being run in the
# srcdir already.
if test -f configure.ac; then
configure_ac=configure.ac
else
configure_ac=configure.in
fi
msg="missing on your system"
case "$1" in
--run)
# Try to run requested program, and just exit if it succeeds.
run=
shift
"$@" && exit 0
# Exit code 63 means version mismatch. This often happens
# when the user try to use an ancient version of a tool on
# a file that requires a minimum version. In this case we
# we should proceed has if the program had been absent, or
# if --run hadn't been passed.
if test $? = 63; then
run=:
msg="probably too old"
fi
;;
-h|--h|--he|--hel|--help)
echo "\
$0 [OPTION]... PROGRAM [ARGUMENT]...
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
error status if there is no known handling for PROGRAM.
Options:
-h, --help display this help and exit
-v, --version output version information and exit
--run try to run the given command, and emulate it if it fails
Supported PROGRAM values:
aclocal touch file \`aclocal.m4'
autoconf touch file \`configure'
autoheader touch file \`config.h.in'
automake touch all \`Makefile.in' files
bison create \`y.tab.[ch]', if possible, from existing .[ch]
flex create \`lex.yy.c', if possible, from existing .c
help2man touch the output file
lex create \`lex.yy.c', if possible, from existing .c
makeinfo touch the output file
tar try tar, gnutar, gtar, then tar without non-portable flags
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
Send bug reports to ."
exit $?
;;
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
echo "missing $scriptversion (GNU Automake)"
exit $?
;;
-*)
echo 1>&2 "$0: Unknown \`$1' option"
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
;;
esac
# Now exit if we have it, but it failed. Also exit now if we
# don't have it and --version was passed (most likely to detect
# the program).
case "$1" in
lex|yacc)
# Not GNU programs, they don't have --version.
;;
tar)
if test -n "$run"; then
echo 1>&2 "ERROR: \`tar' requires --run"
exit 1
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
exit 1
fi
;;
*)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
# Could not run --version or --help. This is probably someone
# running `$TOOL --version' or `$TOOL --help' to check whether
# $TOOL exists and not knowing $TOOL uses missing.
exit 1
fi
;;
esac
# If it does not exist, or fails to run (possibly an outdated version),
# try to emulate it.
case "$1" in
aclocal*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
to install the \`Automake' and \`Perl' packages. Grab them from
any GNU archive site."
touch aclocal.m4
;;
autoconf)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`${configure_ac}'. You might want to install the
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
archive site."
touch configure
;;
autoheader)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acconfig.h' or \`${configure_ac}'. You might want
to install the \`Autoconf' and \`GNU m4' packages. Grab them
from any GNU archive site."
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
test -z "$files" && files="config.h"
touch_files=
for f in $files; do
case "$f" in
*:*) touch_files="$touch_files "`echo "$f" |
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
*) touch_files="$touch_files $f.in";;
esac
done
touch $touch_files
;;
automake*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
You might want to install the \`Automake' and \`Perl' packages.
Grab them from any GNU archive site."
find . -type f -name Makefile.am -print |
sed 's/\.am$/.in/' |
while read f; do touch "$f"; done
;;
autom4te)
echo 1>&2 "\
WARNING: \`$1' is needed, but is $msg.
You might have modified some files without having the
proper tools for further handling them.
You can get \`$1' as part of \`Autoconf' from any GNU
archive site."
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
if test -f "$file"; then
touch $file
else
test -z "$file" || exec >$file
echo "#! /bin/sh"
echo "# Created by GNU Automake missing as a replacement of"
echo "# $ $@"
echo "exit 0"
chmod +x $file
exit 1
fi
;;
bison|yacc)
echo 1>&2 "\
WARNING: \`$1' $msg. You should only need it if
you modified a \`.y' file. You may need the \`Bison' package
in order for those modifications to take effect. You can get
\`Bison' from any GNU archive site."
rm -f y.tab.c y.tab.h
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.y)
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.c
fi
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.h
fi
;;
esac
fi
if [ ! -f y.tab.h ]; then
echo >y.tab.h
fi
if [ ! -f y.tab.c ]; then
echo 'main() { return 0; }' >y.tab.c
fi
;;
lex|flex)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.l' file. You may need the \`Flex' package
in order for those modifications to take effect. You can get
\`Flex' from any GNU archive site."
rm -f lex.yy.c
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.l)
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" lex.yy.c
fi
;;
esac
fi
if [ ! -f lex.yy.c ]; then
echo 'main() { return 0; }' >lex.yy.c
fi
;;
help2man)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a dependency of a manual page. You may need the
\`Help2man' package in order for those modifications to take
effect. You can get \`Help2man' from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
fi
if [ -f "$file" ]; then
touch $file
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
exit 1
fi
;;
makeinfo)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.texi' or \`.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy \`make' (AIX,
DU, IRIX). You might want to install the \`Texinfo' package or
the \`GNU make' package. Grab either from any GNU archive site."
# The file to touch is that specified with -o ...
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
# ... or it is the one specified with @setfilename ...
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
# ... or it is derived from the source name (dir/f.texi becomes f.info)
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
fi
# If the file does not exist, the user really needs makeinfo;
# let's fail without touching anything.
test -f $file || exit 1
touch $file
;;
tar)
shift
# We have already tried tar in the generic part.
# Look for gnutar/gtar before invocation to avoid ugly error
# messages.
if (gnutar --version > /dev/null 2>&1); then
gnutar "$@" && exit 0
fi
if (gtar --version > /dev/null 2>&1); then
gtar "$@" && exit 0
fi
firstarg="$1"
if shift; then
case "$firstarg" in
*o*)
firstarg=`echo "$firstarg" | sed s/o//`
tar "$firstarg" "$@" && exit 0
;;
esac
case "$firstarg" in
*h*)
firstarg=`echo "$firstarg" | sed s/h//`
tar "$firstarg" "$@" && exit 0
;;
esac
fi
echo 1>&2 "\
WARNING: I can't seem to be able to run \`tar' with the given arguments.
You may want to install GNU tar or Free paxutils, or check the
command line arguments."
exit 1
;;
*)
echo 1>&2 "\
WARNING: \`$1' is needed, and is $msg.
You might have modified some files without having the
proper tools for further handling them. Check the \`README' file,
it often tells you about the needed prerequisites for installing
this package. You may also peek at any GNU archive site, in case
some other package would contain this missing \`$1' program."
exit 1
;;
esac
exit 0
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:
globus_ftp_control-4.7/configure.in 0000666 0000764 0000764 00000000627 10112660356 014543 0000000 0000000 dnl
AC_REVISION($Revision: 1.6 $)
AC_INIT(Makefile.am)
GLOBUS_INIT
AM_PROG_LIBTOOL
dnl config header goes here
dnl Initialize the automake rules the last argument
AM_INIT_AUTOMAKE($GPT_NAME, $GPT_VERSION)
LAC_DOXYGEN("../", "*.doc")
GLOBUS_FINALIZE
AC_OUTPUT(
pkgdata/Makefile
pkgdata/pkg_data_src.gpt
Makefile
doxygen/Makefile
doxygen/Doxyfile
doxygen/Doxyfile-internal
version.h
)
globus_ftp_control-4.7/globus_automake_pre_top 0000644 0000764 0000764 00000000000 12225575522 017052 0000000 0000000 globus_ftp_control-4.7/gptdata.sh 0000664 0000764 0000764 00000000337 12227171017 014206 0000000 0000000 GPT_NAME='globus_ftp_control'
GPT_MAJOR_VERSION='4'
GPT_MINOR_VERSION='7'
GPT_AGE_VERSION='3'
GPT_CFLAGS='@GPT_PKG_CFLAGS@'
GPT_INCLUDES='@GPT_EXTERNAL_INCLUDES@'
GPT_LIBS='@GPT_EXTERNAL_LIBS@'
GPT_BUILD_WITH_FLAVORS='yes'
globus_ftp_control-4.7/pkgdata/ 0000775 0000764 0000764 00000000000 12227171044 013716 5 0000000 0000000 globus_ftp_control-4.7/pkgdata/pkg_data_src.gpt.in 0000666 0000764 0000764 00000005757 12227153327 017424 0000000 0000000
GridFTP Control Library
FileAccess
@GPT_PKG_CFLAGS@
@GPT_EXTERNAL_INCLUDES@
-lglobus_ftp_control
@GPT_EXTERNAL_LIBS@
globus_ftp_control-4.7/pkgdata/pkg_data_src.pc.in 0000664 0000764 0000764 00000001125 12227171013 017203 0000000 0000000 prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
GLOBUS_FLAVOR_NAME=@GLOBUS_FLAVOR_NAME@
flavorincludedir=@flavorincludedir@
Name: globus-ftp-control
Description: Globus Toolkit - GridFTP Control Library
Version: 4.7
Requires.private: globus-common >= 14 @GPT_PKGCONFIG_DEPENDENCIES@ globus-gssapi-error >= 4 globus-xio >= 3 globus-gss-assist >= 8 globus-io >= 8 globus-gssapi-gsi >= 9 globus-core >= 8
Libs: -L${libdir} -lglobus_ftp_control
Libs.private: @GPT_EXTERNAL_LIBS@
Cflags: @GPT_PKG_CFLAGS@ -I${includedir} -I${flavorincludedir} @GPT_EXTERNAL_INCLUDES@
globus_ftp_control-4.7/pkgdata/Makefile.am 0000644 0000764 0000764 00000004610 12225665715 015704 0000000 0000000 include $(top_srcdir)/globus_automake_pre
FILELIST_FILES = noflavor_data.filelist \
$(GLOBUS_FLAVOR_NAME)_dev.filelist \
noflavor_doc.filelist \
$(GLOBUS_FLAVOR_NAME)_pgm.filelist \
$(GLOBUS_FLAVOR_NAME)_pgm_static.filelist \
$(GLOBUS_FLAVOR_NAME)_rtl.filelist
METADATA_FILES = \
pkg_data_noflavor_data.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_dev.gpt \
pkg_data_noflavor_doc.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_pgm.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_pgm_static.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_rtl.gpt
pkg_DATA = $(FILELIST_FILES) $(METADATA_FILES)
pkgconfdir = @pkgconfdir@
## pkgconf = [ DATA ]
pkgconf_DATA = @pkgconffile@
filelist_file: $(MAKEFILE_AMS)
@for p in $(FILELIST_FILES); do \
if test -f "$$p"; then \
rm -f $$p; \
fi; \
done
$(pkg_DATA): all_filelists
all_filelists: filelist_file
@(cd .. && $(MAKE) $(AM_MAKEFLAGS) filelist) \
## This trick allows "-k" to keep its natural meaning when running a
## recursive rule.
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac;
#
# Override the normal install target to avoid dying when a given
# kind of metadata file is missing by calling "true"
install-pkgDATA: $(pkg_DATA)
@$(NORMAL_INSTALL)
test -z "$(pkgdir)" || $(mkinstalldirs) "$(DESTDIR)$(pkgdir)";
@list='$(pkg_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=`echo $$p | sed -e 's|^.*/||'`; \
echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pkgdir)/$$f'"; \
$(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pkgdir)/$$f"; \
done || true
@list='$(pkg_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=`echo $$p | sed -e 's|^.*/||'`; \
if expr $$p : '.*filelist$$' > /dev/null ; then \
if test `cat $$d$$p | wc -l` = 2; then \
listtype=`echo "$$p" | sed -e 's!\.filelist!!'`; \
rm "$(DESTDIR)$(pkgdir)/$$f" ; \
rm "$(DESTDIR)$(pkgdir)/pkg_data_$${listtype}.gpt"; \
fi ; \
fi; \
done || true
$(METADATA_FILES): pkg_data_src.gpt
@$(GPT_LOCATION)/sbin/gpt_generate_bin_pkg_data \
--flavor=$(GLOBUS_FLAVOR_NAME) pkg_data_src.gpt
EXTRA_DIST = $(pkgconffile_in)
distclean-local:
@if test -f master.filelist; then \
rm *.filelist; \
fi; \
if test -f pkg_data_noflavor_data.gpt; then \
rm pkg_data_*.gpt; \
fi
include $(top_srcdir)/globus_automake_post
globus_ftp_control-4.7/pkgdata/Makefile.in 0000664 0000764 0000764 00000051164 12227171016 015711 0000000 0000000 # Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/pkg_data_src.gpt.in $(srcdir)/pkg_data_src.pc.in \
$(top_srcdir)/globus_automake_post \
$(top_srcdir)/globus_automake_pre
subdir = pkgdata
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_CLEAN_FILES = $pkgconffile pkg_data_src.gpt
depcomp =
am__depfiles_maybe =
SOURCES =
DIST_SOURCES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
am__installdirs = "$(DESTDIR)$(pkgdir)" "$(DESTDIR)$(pkgconfdir)"
pkgDATA_INSTALL = $(INSTALL_DATA)
pkgconfDATA_INSTALL = $(INSTALL_DATA)
DATA = $(pkg_DATA) $(pkgconf_DATA)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
ARFLAGS = @ARFLAGS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CROSS = @CROSS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DIRT_BRANCH_ID = @DIRT_BRANCH_ID@
DIRT_TIMESTAMP = @DIRT_TIMESTAMP@
DOT = @DOT@
DOXYFILE = @DOXYFILE@
DOXYGEN = @DOXYGEN@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ENABLE_PROGRAMS_FALSE = @ENABLE_PROGRAMS_FALSE@
ENABLE_PROGRAMS_TRUE = @ENABLE_PROGRAMS_TRUE@
EXEEXT = @EXEEXT@
F77 = @F77@
F77FLAGS = @F77FLAGS@
F90 = @F90@
F90FLAGS = @F90FLAGS@
FFLAGS = @FFLAGS@
FILELIST_FILE = @FILELIST_FILE@
GLOBUS_FLAVOR_NAME = @GLOBUS_FLAVOR_NAME@
GPT_AGE_VERSION = @GPT_AGE_VERSION@
GPT_CFLAGS = @GPT_CFLAGS@
GPT_CONFIG_CFLAGS = @GPT_CONFIG_CFLAGS@
GPT_CONFIG_INCLUDES = @GPT_CONFIG_INCLUDES@
GPT_CONFIG_LIBS = @GPT_CONFIG_LIBS@
GPT_CONFIG_PKG_LIBS = @GPT_CONFIG_PKG_LIBS@
GPT_EXTERNAL_INCLUDES = @GPT_EXTERNAL_INCLUDES@
GPT_EXTERNAL_LIBS = @GPT_EXTERNAL_LIBS@
GPT_INCLUDES = @GPT_INCLUDES@
GPT_IS_2 = @GPT_IS_2@
GPT_LDFLAGS = @GPT_LDFLAGS@
GPT_LIBS = @GPT_LIBS@
GPT_LIB_LINKS = @GPT_LIB_LINKS@
GPT_LINKTYPE = @GPT_LINKTYPE@
GPT_LOCATION = @GPT_LOCATION@
GPT_MAJOR_VERSION = @GPT_MAJOR_VERSION@
GPT_MINOR_VERSION = @GPT_MINOR_VERSION@
GPT_PGM_LINKS = @GPT_PGM_LINKS@
GPT_PKGCONFIG_DEPENDENCIES = @GPT_PKGCONFIG_DEPENDENCIES@
GPT_PKG_CFLAGS = @GPT_PKG_CFLAGS@
HAVE_DOT = @HAVE_DOT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
INSURE = @INSURE@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
OBJECT_MODE = @OBJECT_MODE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
WITHOUT_FLAVORS_FALSE = @WITHOUT_FLAVORS_FALSE@
WITHOUT_FLAVORS_TRUE = @WITHOUT_FLAVORS_TRUE@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
aclocaldir = @aclocaldir@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
cross_compiling = @cross_compiling@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
doxygendir = @doxygendir@
exec_prefix = @exec_prefix@
flavorincludedir = @flavorincludedir@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
lac_doxygen_examples = @lac_doxygen_examples@
lac_doxygen_file_patterns = @lac_doxygen_file_patterns@
lac_doxygen_input_filter = @lac_doxygen_input_filter@
lac_doxygen_installdox = @lac_doxygen_installdox@
lac_doxygen_internal_tagfiles = @lac_doxygen_internal_tagfiles@
lac_doxygen_output_tagfile = @lac_doxygen_output_tagfile@
lac_doxygen_predefines = @lac_doxygen_predefines@
lac_doxygen_project = @lac_doxygen_project@
lac_doxygen_srcdirs = @lac_doxygen_srcdirs@
lac_doxygen_tagfiles = @lac_doxygen_tagfiles@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
perlmoduledir = @perlmoduledir@
pkgconfdir = @pkgconfdir@
pkgconffile = @pkgconffile@
pkgconffile_in = @pkgconffile_in@
pkgdir = @pkgdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
setupdir = @setupdir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
testdir = @testdir@
scriptsysconfdir = ${sysconfdir}
amdirdir = ${datadir}/globus_amdir
LINK_BAK = orig
AUTOMAKE_OPTIONS = no-dependencies
FILELIST_FILES = noflavor_data.filelist \
$(GLOBUS_FLAVOR_NAME)_dev.filelist \
noflavor_doc.filelist \
$(GLOBUS_FLAVOR_NAME)_pgm.filelist \
$(GLOBUS_FLAVOR_NAME)_pgm_static.filelist \
$(GLOBUS_FLAVOR_NAME)_rtl.filelist
METADATA_FILES = \
pkg_data_noflavor_data.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_dev.gpt \
pkg_data_noflavor_doc.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_pgm.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_pgm_static.gpt \
pkg_data_$(GLOBUS_FLAVOR_NAME)_rtl.gpt
pkg_DATA = $(FILELIST_FILES) $(METADATA_FILES)
pkgconf_DATA = @pkgconffile@
EXTRA_DIST = $(pkgconffile_in)
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/globus_automake_pre $(top_srcdir)/globus_automake_post $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign pkgdata/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign pkgdata/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*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);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$pkgconffile: $(top_builddir)/config.status $(srcdir)/pkg_data_src.pc.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
pkg_data_src.gpt: $(top_builddir)/config.status $(srcdir)/pkg_data_src.gpt.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
uninstall-pkgDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkg_DATA)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(pkgdir)/$$f'"; \
rm -f "$(DESTDIR)$(pkgdir)/$$f"; \
done
install-pkgconfDATA: $(pkgconf_DATA)
@$(NORMAL_INSTALL)
test -z "$(pkgconfdir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfdir)"
@list='$(pkgconf_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(pkgconfDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfdir)/$$f'"; \
$(pkgconfDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfdir)/$$f"; \
done
uninstall-pkgconfDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkgconf_DATA)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(pkgconfdir)/$$f'"; \
rm -f "$(DESTDIR)$(pkgconfdir)/$$f"; \
done
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
$(mkdir_p) $(distdir)/..
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(DATA)
installdirs:
for dir in "$(DESTDIR)$(pkgdir)" "$(DESTDIR)$(pkgconfdir)"; do \
test -z "$$dir" || $(mkdir_p) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-libtool \
distclean-local
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am: install-pkgDATA install-pkgconfDATA
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am uninstall-pkgDATA \
uninstall-pkgconfDATA
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
distclean distclean-generic distclean-libtool distclean-local \
distdir dvi dvi-am html html-am info info-am install \
install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am install-man \
install-pkgDATA install-pkgconfDATA install-strip installcheck \
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-info-am uninstall-pkgDATA uninstall-pkgconfDATA
filelist_file: $(MAKEFILE_AMS)
@for p in $(FILELIST_FILES); do \
if test -f "$$p"; then \
rm -f $$p; \
fi; \
done
$(pkg_DATA): all_filelists
all_filelists: filelist_file
@(cd .. && $(MAKE) $(AM_MAKEFLAGS) filelist) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac;
#
# Override the normal install target to avoid dying when a given
# kind of metadata file is missing by calling "true"
install-pkgDATA: $(pkg_DATA)
@$(NORMAL_INSTALL)
test -z "$(pkgdir)" || $(mkinstalldirs) "$(DESTDIR)$(pkgdir)";
@list='$(pkg_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=`echo $$p | sed -e 's|^.*/||'`; \
echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pkgdir)/$$f'"; \
$(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pkgdir)/$$f"; \
done || true
@list='$(pkg_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=`echo $$p | sed -e 's|^.*/||'`; \
if expr $$p : '.*filelist$$' > /dev/null ; then \
if test `cat $$d$$p | wc -l` = 2; then \
listtype=`echo "$$p" | sed -e 's!\.filelist!!'`; \
rm "$(DESTDIR)$(pkgdir)/$$f" ; \
rm "$(DESTDIR)$(pkgdir)/pkg_data_$${listtype}.gpt"; \
fi ; \
fi; \
done || true
$(METADATA_FILES): pkg_data_src.gpt
@$(GPT_LOCATION)/sbin/gpt_generate_bin_pkg_data \
--flavor=$(GLOBUS_FLAVOR_NAME) pkg_data_src.gpt
distclean-local:
@if test -f master.filelist; then \
rm *.filelist; \
fi; \
if test -f pkg_data_noflavor_data.gpt; then \
rm pkg_data_*.gpt; \
fi
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# BEGIN GPT AUTOMAKE RULES
link-am:
unlink-am:
filelist-am:
link: link-recursive link-pkgDATA link-pkgconfDATA
:
unlink: unlink-recursive unlink-pkgDATA unlink-pkgconfDATA
:
.PHONY: link unlink link-recursive unlink-recursive link-am unlink-am filelist-amlink-pkgDATA unlink-pkgDATA filelist-pkgDATA link-pkgconfDATA unlink-pkgconfDATA filelist-pkgconfDATA
filelist: filelist-recursive filelist-pkgDATA filelist-pkgconfDATA
:
link-pkgDATA: $(pkg_DATA)
@$(NORMAL_INSTALL)
@$(mkinstalldirs) $(DESTDIR)$(pkgdir)
@list='$(pkg_DATA)'; for p in $$list; do \
mydir=`pwd`; \
target_p=$(DESTDIR)$(pkgdir)/$$p; \
if test -f $(srcdir)/$$p; then \
cd $(srcdir); \
fullsrcdir=`pwd`; \
cd $$mydir; \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$fullsrcdir/$$p $$target_p"; \
ln -s $$fullsrcdir/$$p $$target_p; \
fi; \
else if test -f $$p; then \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$mydir/$$p $$target_p"; \
ln -s $$mydir/$$p $$target_p; \
fi; \
fi; fi; \
done
unlink-pkgDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkg_DATA)'; for p in $$list; do \
target_p=$(DESTDIR)$(pkgdir)/$$p; \
if test -h $$target_p; then \
echo "rm $$target_p"; \
rm $$target_p; \
fi; \
if test -f $$target_p.$(LINK_BAK); then \
echo "mv $$target_p.$(LINK_BAK) $$target_p"; \
mv $$target_p.$(LINK_BAK) $$target_p; \
fi; \
done
filelist-pkgDATA:
@list='$(pkg_DATA)'; for p in $$list; do \
filelistdir="`echo $(FILELIST_FILE) | sed -e 's!/[^/]*$$!!'`"; \
dirname='pkg'; \
origp="$$p" ; \
p="`echo $(pkgdir)/$$p | sed -e 's!^$(prefix)!!'`"; \
case "$$dirname-$$origp" in \
*-pkg_data_*.gpt) \
type=`echo $$origp | sed -e 's!^pkg_data_!!' -e 's!.gpt$$!!'`; \
echo "$$p" >> "$${filelistdir}/$${type}.filelist" ; \
;; \
*-*.filelist) \
echo "$$p" >> "$${filelistdir}/$${origp}" ; \
;; \
*-*.pc) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_dev.filelist"; \
;; \
*-flavor_*.gpt) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_dev.filelist"; \
;; \
*-*.pm) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_rtl.filelist"; \
;; \
*doc-*) \
echo "$$p" >> "$${filelistdir}/noflavor_doc.filelist"; \
;; \
*) \
echo "$$p" >> "$${filelistdir}/noflavor_data.filelist"; \
;; \
esac ; \
done
link-pkgconfDATA: $(pkgconf_DATA)
@$(NORMAL_INSTALL)
@$(mkinstalldirs) $(DESTDIR)$(pkgconfdir)
@list='$(pkgconf_DATA)'; for p in $$list; do \
mydir=`pwd`; \
target_p=$(DESTDIR)$(pkgconfdir)/$$p; \
if test -f $(srcdir)/$$p; then \
cd $(srcdir); \
fullsrcdir=`pwd`; \
cd $$mydir; \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$fullsrcdir/$$p $$target_p"; \
ln -s $$fullsrcdir/$$p $$target_p; \
fi; \
else if test -f $$p; then \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$mydir/$$p $$target_p"; \
ln -s $$mydir/$$p $$target_p; \
fi; \
fi; fi; \
done
unlink-pkgconfDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkgconf_DATA)'; for p in $$list; do \
target_p=$(DESTDIR)$(pkgconfdir)/$$p; \
if test -h $$target_p; then \
echo "rm $$target_p"; \
rm $$target_p; \
fi; \
if test -f $$target_p.$(LINK_BAK); then \
echo "mv $$target_p.$(LINK_BAK) $$target_p"; \
mv $$target_p.$(LINK_BAK) $$target_p; \
fi; \
done
filelist-pkgconfDATA:
@list='$(pkgconf_DATA)'; for p in $$list; do \
filelistdir="`echo $(FILELIST_FILE) | sed -e 's!/[^/]*$$!!'`"; \
dirname='pkgconf'; \
origp="$$p" ; \
p="`echo $(pkgconfdir)/$$p | sed -e 's!^$(prefix)!!'`"; \
case "$$dirname-$$origp" in \
*-pkg_data_*.gpt) \
type=`echo $$origp | sed -e 's!^pkg_data_!!' -e 's!.gpt$$!!'`; \
echo "$$p" >> "$${filelistdir}/$${type}.filelist" ; \
;; \
*-*.filelist) \
echo "$$p" >> "$${filelistdir}/$${origp}" ; \
;; \
*-*.pc) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_dev.filelist"; \
;; \
*-flavor_*.gpt) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_dev.filelist"; \
;; \
*-*.pm) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_rtl.filelist"; \
;; \
*doc-*) \
echo "$$p" >> "$${filelistdir}/noflavor_doc.filelist"; \
;; \
*) \
echo "$$p" >> "$${filelistdir}/noflavor_data.filelist"; \
;; \
esac ; \
done
link-recursive unlink-recursive filelist-recursive:
@set fnord $(MAKEFLAGS); amf=$$2; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
globus_ftp_control-4.7/dirt.sh 0000666 0000764 0000764 00000000054 12227153327 013526 0000000 0000000 DIRT_TIMESTAMP=1381816023
DIRT_BRANCH_ID=83
globus_ftp_control-4.7/bootstrap 0000777 0000764 0000764 00000001043 11522621134 014163 0000000 0000000 #! /bin/sh
# checking for the GLOBUS_LOCATION
if test "x$GLOBUS_LOCATION" = "x"; then
echo "Using default GLOBUS_LOCATION of /usr"
GLOBUS_LOCATION="/usr"
fi
if [ ! -f ${GLOBUS_LOCATION}/share/globus/globus-bootstrap.sh ]; then
echo "ERROR: Unable to locate \${GLOBUS_LOCATION}/share/globus/globus-bootstrap.sh"
echo " Please ensure that you have installed the globus-core package and"
echo " that GLOBUS_LOCATION is set to the proper directory"
exit
fi
. ${GLOBUS_LOCATION}/share/globus/globus-bootstrap.sh
globus_ftp_control-4.7/globus_ftp_control_data.c 0000666 0000764 0000764 00001265706 12227153325 017311 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file globus_ftp_control_data.c
*
* FTP Data Connection Configuration and Management
*
*/
#include "globus_ftp_control.h"
#include "globus_i_ftp_control.h"
#include
#ifndef TARGET_ARCH_WIN32
#include
#endif
/*
* logging messages
*/
#define GFTP_NL_EVENT_RECEIVED_DATA "GFTPC_DATA_RECEIVED"
#define GFTP_NL_EVENT_SENT_DATA "GFTPC_DATA_SENT"
#define GLOBUS_FTP_CONTROL_DATA_MAGIC "FTPControlData-1.0"
#define GlobusFTPControlSetMagic(dc_handle) \
{ \
strcpy(dc_handle->magic, GLOBUS_FTP_CONTROL_DATA_MAGIC); \
}
#define GlobusFTPControlDataTestMagic(dc_handle) \
{ \
globus_assert(dc_handle != GLOBUS_NULL && \
strcmp(dc_handle->magic, GLOBUS_FTP_CONTROL_DATA_MAGIC) == 0); \
}
#define DATA_CONN_MALLOC(data_conn, stripe, cb, ua) \
{ \
data_conn = (globus_ftp_data_connection_t *) \
globus_malloc( \
sizeof(globus_ftp_data_connection_t)); \
data_conn->whos_my_daddy = stripe; \
data_conn->offset = 0; \
data_conn->callback = cb; \
data_conn->user_arg = ua; \
data_conn->bytes_ready = 0; \
data_conn->eod = GLOBUS_FALSE; \
data_conn->close = GLOBUS_FALSE; \
data_conn->free_me = GLOBUS_FALSE; \
data_conn->reusing = GLOBUS_FALSE; \
\
}
#define CALLBACK_INFO_MALLOC(ci, dh, th, s, dc) \
{ \
ci = (globus_l_ftp_data_callback_info_t *) \
globus_malloc(sizeof(globus_l_ftp_data_callback_info_t)); \
ci->stripe = s; \
ci->dc_handle = dh; \
ci->transfer_handle = th; \
ci->data_conn = dc; \
}
#define TABLE_ENTRY_MALLOC(t_e, buf, len, off, _eof, cb, cb_a, dc_h) \
{ \
t_e = (globus_l_ftp_handle_table_entry_t *) \
globus_malloc(sizeof(globus_l_ftp_handle_table_entry_t)); \
t_e->buffer = buf; \
t_e->length = len; \
t_e->offset = off; \
t_e->error = GLOBUS_NULL; \
t_e->callback = cb; \
t_e->callback_arg = cb_a; \
t_e->direction = dc_h->transfer_handle->direction; \
t_e->dc_handle = dc_h; \
t_e->transfer_handle = dc_h->transfer_handle; \
t_e->type = dc_h->type; \
t_e->error = GLOBUS_NULL; \
t_e->whos_my_daddy = GLOBUS_NULL; \
t_e->ascii_buffer = GLOBUS_NULL; \
t_e->eof = _eof; \
}
/********************************************************************
* module data types
********************************************************************/
struct globus_ftp_data_stripe_s;
struct globus_l_ftp_handle_table_entry_s;
struct globus_i_ftp_dc_transfer_handle_s;
typedef struct globus_l_ftp_c_data_layout_s
{
globus_ftp_control_layout_func_t layout_func;
globus_ftp_control_layout_verify_func_t verify_func;
char * name;
} globus_l_ftp_c_data_layout_t;
/*
* individual data connection
* 1 to many relationship with a stripe
*/
typedef struct globus_ftp_data_connection_s
{
globus_io_handle_t io_handle;
globus_off_t offset;
struct globus_ftp_data_stripe_s * whos_my_daddy;
globus_ftp_control_data_connect_callback_t callback;
void * user_arg;
globus_size_t bytes_ready;
globus_bool_t eod;
globus_bool_t close;
globus_bool_t reusing;
/* need free_me for globus_io cancel issue */
globus_bool_t free_me;
} globus_ftp_data_connection_t;
/*
* each strip can have multiple paralell conections to
* the same host
*/
typedef struct globus_ftp_data_stripe_s
{
globus_fifo_t free_conn_q;
globus_list_t * free_cache_list;
globus_list_t * all_conn_list;
globus_list_t * outstanding_conn_list;
unsigned int stripe_ndx;
int outstanding_connections;
globus_bool_t listening;
globus_bool_t eof_sent;
globus_fifo_t command_q;
globus_io_handle_t listener_handle;
globus_ftp_control_parallelism_t parallel;
globus_ftp_control_host_port_t host_port;
struct globus_i_ftp_dc_transfer_handle_s * whos_my_daddy;
int connection_count;
int total_connection_count;
globus_bool_t eof;
globus_size_t eod_count;
globus_size_t eods_received;
} globus_ftp_data_stripe_t;
/* trasniant */
typedef struct globus_i_ftp_dc_transfer_handle_s
{
globus_ftp_data_stripe_t * stripes;
int stripe_count;
globus_handle_table_t handle_table;
globus_ftp_data_connection_state_t direction;
int ref;
globus_ftp_control_parallelism_t parallel;
globus_bool_t eof_registered;
globus_handle_t eof_table_handle;
struct globus_l_ftp_handle_table_entry_s * eof_cb_ent;
/* big buffer stuff */
globus_byte_t * big_buffer;
globus_size_t big_buffer_length;
globus_byte_t big_buffer_byte[1];
void * big_buffer_cb_arg;
globus_ftp_control_data_callback_t big_buffer_cb;
globus_bool_t x_state;
struct globus_l_ftp_send_eof_entry_s * send_eof_ent;
globus_mutex_t * mutex;
globus_i_ftp_dc_handle_t * whos_my_daddy;
struct globus_ftp_control_handle_s * control_handle;
} globus_i_ftp_dc_transfer_handle_t;
typedef struct globus_l_ftp_send_eof_entry_s
{
globus_ftp_data_connection_state_t direction;
globus_ftp_data_connection_t * whos_my_daddy;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
/* above must match first elements of globus_l_ftp_handle_table_entry_t */
globus_bool_t eof_message;
int * count;
int array_size;
globus_ftp_control_callback_t cb;
void * user_arg;
globus_ftp_data_connection_t * data_conn;
globus_handle_t callback_table_handle;
} globus_l_ftp_send_eof_entry_t;
typedef struct globus_l_ftp_handle_table_entry_s
{
globus_ftp_data_connection_state_t direction;
globus_ftp_data_connection_t * whos_my_daddy;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_byte_t * buffer;
globus_byte_t * ascii_buffer;
globus_size_t length;
globus_off_t offset;
globus_bool_t eof;
globus_ftp_control_data_callback_t callback;
void * callback_arg;
globus_object_t * error;
globus_handle_t callback_table_handle;
globus_ftp_control_type_t type;
} globus_l_ftp_handle_table_entry_t;
/*
* extended block mode header
*/
typedef struct globus_l_ftp_eb_header_s
{
globus_byte_t descriptor;
globus_byte_t count[8];
globus_byte_t offset[8];
} globus_l_ftp_eb_header_t;
/*
* this structure is passed around to the callbacks to
* allow references directly to the
*/
typedef struct globus_l_ftp_data_callback_info_s
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_l_ftp_eb_header_t * eb_header;
} globus_l_ftp_data_callback_info_t;
typedef struct globus_l_ftp_dc_connect_cb_info_s
{
int stripe_ndx;
globus_ftp_control_data_connect_callback_t callback;
void * user_arg;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
} globus_l_ftp_dc_connect_cb_info_t;
/********************************************************************
* internal function signatures
********************************************************************/
globus_result_t
globus_l_ftp_control_data_send_eof(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_data_connection_t * data_conn,
globus_l_ftp_send_eof_entry_t * eof_ent);
globus_result_t
globus_i_ftp_control_data_force_close(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_callback_t close_callback_func,
void * close_arg,
globus_object_t * err);
globus_result_t
globus_l_ftp_control_data_stream_connect_direction(
globus_i_ftp_dc_handle_t * handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg,
globus_ftp_data_connection_state_t direction);
globus_result_t
globus_l_ftp_data_stream_stripe_poll(
globus_ftp_data_stripe_t * stripe);
globus_result_t
globus_l_ftp_data_stripe_poll(
globus_i_ftp_dc_handle_t * dc_handle);
void
globus_l_ftp_control_stripes_create(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_host_port_t addresses[],
int stripe_count);
void
globus_l_ftp_stream_listen_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result);
void
globus_l_ftp_stream_write_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
void
globus_l_ftp_stream_read_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbyte);
void
globus_l_ftp_stream_accept_connect_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result);
void
globus_l_ftp_eb_listen_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result);
void
globus_l_ftp_eb_accept_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result);
void
globus_l_ftp_eb_connect_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result);
void
globus_l_ftp_eb_write_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
struct iovec * iov,
globus_size_t iovcnt,
globus_size_t nbytes);
void
globus_l_ftp_eb_read_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbyte);
globus_result_t
globus_l_ftp_control_data_stream_read_write(
globus_i_ftp_dc_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
globus_result_t
globus_l_ftp_control_data_eb_write(
globus_i_ftp_dc_handle_t * dc_handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
void
globus_l_ftp_eb_send_eof_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
void
globus_l_ftp_control_stripes_destroy(
globus_i_ftp_dc_handle_t * dc_handle,
globus_object_t * error);
void
globus_l_error_flush_command_q(
globus_ftp_data_stripe_t * stripe,
globus_object_t * error);
globus_byte_t *
globus_l_ftp_control_add_ascii(
globus_byte_t * in_buf,
int length,
globus_off_t * ascii_len);
int
globus_l_ftp_control_strip_ascii(
globus_byte_t * in_buf,
int length);
void
globus_l_ftp_io_close_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result);
static
void
globus_l_ftp_control_command_kickout(
void * user_args);
static
void
globus_l_ftp_control_send_data_kickout(
void * user_args);
static
void
globus_l_ftp_control_reuse_connect_callback(
void * user_args);
static
void
globus_l_ftp_control_close_kickout(
void * user_args);
void
globus_l_ftp_control_deactivate_quit_callback(
void * user_arg,
globus_ftp_control_handle_t * handle,
globus_object_t * error);
globus_result_t
globus_l_ftp_data_eb_poll(
globus_i_ftp_dc_handle_t * dc_handle);
globus_result_t
globus_l_ftp_control_data_extended_block_enqueue(
globus_i_ftp_dc_handle_t * dc_handle,
globus_l_ftp_handle_table_entry_t * entry,
int chunk);
globus_result_t
globus_l_ftp_control_data_register_connect(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_data_stripe_t * stripe,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg);
static
void
globus_l_ftp_control_data_encode(
globus_byte_t * buf,
globus_off_t x);
static
void
globus_l_ftp_control_data_decode(
globus_byte_t * buf,
globus_off_t * x);
void
globus_l_ftp_eb_read_header_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbyte);
globus_result_t
globus_l_ftp_control_data_eb_connect_write(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg);
globus_result_t
globus_l_ftp_control_data_eb_connect_read(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg);
globus_result_t
globus_l_ftp_control_data_adjust_connection(
globus_ftp_data_stripe_t * stripe);
globus_result_t
globus_l_ftp_control_data_register_eod(
globus_ftp_data_stripe_t * stripe,
globus_ftp_data_connection_t * data_conn);
globus_result_t
globus_l_ftp_control_data_register_eof(
globus_ftp_data_stripe_t * stripe,
globus_ftp_data_connection_t * data_conn);
void
globus_l_ftp_eb_eof_eod_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
void
globus_l_ftp_close_msg_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
globus_result_t
globus_l_ftp_control_register_close_msg(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_data_connection_t * data_conn);
globus_result_t
globus_i_ftp_control_data_write_stripe(
globus_i_ftp_dc_handle_t * dc_handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
int stripe_ndx,
globus_ftp_control_data_write_info_t * data_info);
globus_result_t
globus_i_ftp_control_create_data_info(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg);
globus_result_t
globus_i_ftp_control_release_data_info(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_write_info_t * data_info);
globus_bool_t
globus_l_ftp_control_dc_dec_ref(
globus_i_ftp_dc_transfer_handle_t * transfer_handle);
const char *
globus_l_ftp_control_state_to_string(
globus_ftp_data_connection_state_t state);
/******************************************************************
* module variables
******************************************************************/
static globus_mutex_t globus_l_ftp_control_data_mutex;
static globus_list_t * globus_l_ftp_control_data_dc_list
= GLOBUS_NULL;
static globus_bool_t globus_l_ftp_control_data_active
= GLOBUS_FALSE;
static globus_cond_t globus_l_ftp_control_data_cond;
static int globus_l_ftp_control_data_dc_count = 0;
static globus_hashtable_t globus_l_ftp_control_data_layout_table;
#define GFTPC_HASH_TABLE_SIZE 64
/******************************************************************
* header definitions
******************************************************************/
#define GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_CLOSE 0x04
#define GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOD 0x08
#define GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_RESTART 0x10
#define GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_ERRORS 0x20
#define GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOF 0x40
#define GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOR 0x80
/*
* NETLOGGER functions
*/
globus_result_t
globus_i_ftp_control_data_set_netlogger(
globus_ftp_control_handle_t * handle,
globus_netlogger_handle_t * nl_handle,
globus_bool_t nl_ftp_control,
globus_bool_t nl_globus_io)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_set_netlogger";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(nl_ftp_control)
{
globus_io_attr_netlogger_copy_handle(nl_handle,
&dc_handle->nl_ftp_handle);
dc_handle->nl_ftp_handle_set = GLOBUS_TRUE;
}
if(nl_globus_io)
{
globus_io_attr_netlogger_copy_handle(nl_handle,
&dc_handle->nl_io_handle);
globus_io_attr_netlogger_set_handle(
&dc_handle->io_attr,
&dc_handle->nl_io_handle);
globus_netlogger_set_desc(
&dc_handle->nl_io_handle,
"FTP_DATA");
dc_handle->nl_io_handle_set = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
typedef struct globus_i_ftp_control_stack_entry_s
{
globus_xio_driver_t driver;
char * driver_name;
char * opts;
} globus_i_ftp_control_stack_entry_t;
globus_result_t
globus_i_ftp_control_create_stack(
globus_ftp_control_handle_t * handle,
globus_list_t * driver_list,
globus_xio_stack_t * stack)
{
globus_result_t result;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
globus_xio_attr_t xio_attr;
globus_i_ftp_control_stack_entry_t * driver_ent;
globus_list_t * list;
static char * myname =
"globus_i_ftp_control_create_stack";
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(driver_list == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"driver_list",
2,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_xio_stack_init(stack, NULL);
globus_i_ftp_control_data_get_attr(
handle, &xio_attr);
for(list = driver_list;
!globus_list_empty(list);
list = globus_list_rest(list))
{
driver_ent =
(globus_i_ftp_control_stack_entry_t *) globus_list_first(list);
result = GLOBUS_SUCCESS;
if(dc_handle->dcau.mode == GLOBUS_FTP_CONTROL_DCAU_NONE &&
strcmp(driver_ent->driver_name, "gsi") == 0)
{
continue;
}
result = globus_xio_stack_push_driver(
*stack, driver_ent->driver);
if(result != GLOBUS_SUCCESS)
{
goto error;
}
if(driver_ent->opts != NULL)
{
/* ignore error */
globus_xio_attr_cntl(
xio_attr,
driver_ent->driver,
GLOBUS_XIO_SET_STRING_OPTIONS,
driver_ent->opts);
}
}
return GLOBUS_SUCCESS;
error:
globus_xio_stack_destroy(*stack);
return result;
}
void
globus_i_ftp_control_unload_xio_drivers(
globus_list_t * driver_list)
{
globus_i_ftp_control_stack_entry_t * driver_ent;
while(!globus_list_empty(driver_list))
{
driver_ent = (globus_i_ftp_control_stack_entry_t *)
globus_list_first(driver_list);
if(driver_ent->driver_name)
{
if(strcmp(driver_ent->driver_name, "tcp") != 0 &&
strcmp(driver_ent->driver_name, "gsi") != 0)
{
/* globus_xio_driver_unload(driver_ent->driver); */
}
globus_free(driver_ent->driver_name);
}
if(driver_ent->opts)
{
globus_free(driver_ent->opts);
}
globus_free(driver_ent);
globus_list_remove(&driver_list, driver_list);
}
}
globus_result_t
globus_i_ftp_control_load_xio_drivers(
char * driver_string,
globus_list_t ** driver_list)
{
globus_result_t result;
globus_bool_t done = GLOBUS_FALSE;
char * opts;
char * ptr;
char * driver_str;
char * driver_name;
char * tmp_str;
globus_xio_driver_t driver;
globus_list_t * list = NULL;
globus_i_ftp_control_stack_entry_t *stack_ent;
if(driver_string != NULL)
{
driver_str = globus_libc_strdup(driver_string);
tmp_str = driver_str;
while(!done)
{
driver_name = tmp_str;
ptr = strchr(driver_name, ',');
if(ptr != NULL)
{
*ptr = '\0';
tmp_str = ptr+1;
}
else
{
done = GLOBUS_TRUE;
}
opts = strchr(driver_name, ':');
if(opts != NULL)
{
*opts = '\0';
opts++;
}
if(strcmp(driver_name, "tcp") == 0)
{
driver = globus_io_compat_get_tcp_driver();
}
else if(strcmp(driver_name, "gsi") == 0)
{
driver = globus_io_compat_get_gsi_driver();
}
else
{
result = globus_xio_driver_load(driver_name, &driver);
if(result != GLOBUS_SUCCESS)
{
goto error_load;
}
}
stack_ent = (globus_i_ftp_control_stack_entry_t *)
globus_calloc(1, sizeof(globus_i_ftp_control_stack_entry_t));
stack_ent->opts = globus_libc_strdup(opts);
stack_ent->driver = driver;
stack_ent->driver_name = globus_libc_strdup(driver_name);
globus_list_insert(&list, stack_ent);
}
globus_free(driver_str);
}
else
{
stack_ent = (globus_i_ftp_control_stack_entry_t *)
globus_calloc(1, sizeof(globus_i_ftp_control_stack_entry_t));
stack_ent->opts = NULL;
stack_ent->driver = globus_io_compat_get_gsi_driver();
stack_ent->driver_name = globus_libc_strdup("gsi");
globus_list_insert(&list, stack_ent);
stack_ent = (globus_i_ftp_control_stack_entry_t *)
globus_calloc(1, sizeof(globus_i_ftp_control_stack_entry_t));
stack_ent->opts = NULL;
stack_ent->driver = globus_io_compat_get_tcp_driver();
stack_ent->driver_name = globus_libc_strdup("tcp");
globus_list_insert(&list, stack_ent);
}
/* reverse list */
while(!globus_list_empty(list))
{
globus_list_insert(driver_list, globus_list_first(list));
globus_list_remove(&list, list);
}
return GLOBUS_SUCCESS;
error_load:
globus_free(driver_str);
return result;
}
globus_result_t
globus_i_ftp_control_data_set_stack(
globus_ftp_control_handle_t * handle,
globus_xio_stack_t stack)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname =
"globus_i_ftp_control_data_set_stack";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(stack == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"stack",
2,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
globus_io_attr_set_stack(&dc_handle->io_attr, stack);
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_i_ftp_control_data_get_attr(
globus_ftp_control_handle_t * handle,
globus_xio_attr_t * attr)
{
globus_result_t result;
globus_i_ftp_dc_handle_t * dc_handle;
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
result = globus_io_attr_get_xio_attr(&dc_handle->io_attr, attr);
return result;
}
globus_bool_t
globus_list_remove_element(
globus_list_t * volatile * headp,
void * datum)
{
globus_list_t * list;
for(list = *headp;
!globus_list_empty(list);
list = globus_list_rest(list))
{
if(datum == globus_list_first(list))
{
globus_list_remove(headp, list);
return GLOBUS_TRUE;
}
}
return GLOBUS_FALSE;
}
/**
* Create an incoming FTP data connection.
*
* This function will register a globus_io_{accept, connect}. Further
* accepts/connects are done by registering a new accept/connect in
* the current accept/connect callback. A call to either
* globus_ftp_control_local_pasv() or
* globus_ftp_control_local_port() needs to precede this calling
* this function. This function may be followed by a
* globus_ftp_data_read.
*
* @param handle
* A pointer to a FTP control handle which is configured to
* create an incoming data connection.
*
* @param callback
* This callback is called when the connection occurs. This
* parameter may be NULL.
*
* @param user_arg
* The user argument passed to the connect callback.
*/
globus_result_t
globus_ftp_control_data_connect_read(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg)
{
globus_result_t result;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * my_name=
"globus_ftp_control_data_connect_read";
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s():transfer handle does not exist"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->connect_error)
{
globus_object_free(dc_handle->connect_error);
dc_handle->connect_error = GLOBUS_NULL;
}
if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
if(dc_handle->state != GLOBUS_FTP_DATA_STATE_PORT &&
dc_handle->state != GLOBUS_FTP_DATA_STATE_PASV)
{
globus_mutex_unlock(&dc_handle->mutex);
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s] Need to call local_pasv() or local_port() before calling connect_read/write()"),
GLOBUS_FTP_CONTROL_MODULE->module_name);
return globus_error_put(err);
}
result = globus_l_ftp_control_data_stream_connect_direction(
dc_handle,
callback,
user_arg,
GLOBUS_FTP_DATA_STATE_CONNECT_READ);
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
result = globus_l_ftp_control_data_eb_connect_read(
dc_handle,
callback,
user_arg);
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s(): invalid mode, possible memory corruption"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
result = globus_error_put(err);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return result;
}
/**
* Create an outgoing FTP data connection.
*
* This function sets the interface that will be used to send and
* receive information along the data channel.
*
* @param handle
* A pointer to a FTP control handle which is configured to
* create an outgoing data connection.
* @param interface_addr
*
*/
globus_result_t
globus_ftp_control_data_set_interface(
globus_ftp_control_handle_t * handle,
const char * interface_addr)
{
globus_result_t res;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * my_name=
"globus_ftp_control_data_set_interface";
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
if(interface_addr == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"interface_addr",
2,
my_name);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
res = globus_io_attr_set_tcp_interface(
&dc_handle->io_attr,
interface_addr);
if(res == GLOBUS_SUCCESS)
{
dc_handle->interface_addr = strdup(interface_addr);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Create an outgoing FTP data connection.
*
* This function will register a globus_io_{accept, connect}. Further
* accepts/connects are done by registering a new accept/connect in
* the current accept/connect callback. A call to either
* globus_ftp_control_local_pasv() or
* globus_ftp_control_local_port() needs to precede this calling
* this function. This function may be followed by a
* globus_ftp_data_write.
*
* @param handle
* A pointer to a FTP control handle which is configured to
* create an outgoing data connection.
*
* @param callback
* This callback is called when the connection occurs. This
* parameter may be NULL.
*
* @param user_arg
* The user argument passed to the connect callback.
*/
globus_result_t
globus_ftp_control_data_connect_write(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg)
{
globus_result_t result;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * my_name=
"globus_ftp_control_data_connect_write";
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->connect_error)
{
globus_object_free(dc_handle->connect_error);
dc_handle->connect_error = GLOBUS_NULL;
}
if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
if(dc_handle->state != GLOBUS_FTP_DATA_STATE_PORT &&
dc_handle->state != GLOBUS_FTP_DATA_STATE_SPOR &&
dc_handle->state != GLOBUS_FTP_DATA_STATE_PASV)
{
globus_mutex_unlock(&dc_handle->mutex);
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() Need to call local_pasv() or local_port() before calling connect_read/write()"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
result = globus_l_ftp_control_data_stream_connect_direction(
dc_handle,
callback,
user_arg,
GLOBUS_FTP_DATA_STATE_CONNECT_WRITE);
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
result = globus_l_ftp_control_data_eb_connect_write(
dc_handle,
callback,
user_arg);
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s(): Invalid mode, possible memory corruption"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
result = globus_error_put(err);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return result;
}
/*
* globus_l_ftp_control_data_eb_connect_write()
* --------------------------------------------
*
* valid state:
* SPOR:
* -- the handle is in spor mode, via a call to local_spor.
*
* using a cached connection:
* -- in extended block mode we cache data connections
* until the user calls local_pasv() or local_spor().
* So the user is allowed to call connect_read/write
* multiple times provided they are going in the same
* direction.
*/
globus_result_t
globus_l_ftp_control_data_eb_connect_write(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg)
{
globus_result_t result = GLOBUS_SUCCESS;
globus_ftp_data_stripe_t * stripe;
globus_ftp_data_connection_t * data_conn;
globus_bool_t reusing = GLOBUS_FALSE;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
int ctr;
globus_bool_t * connected;
globus_reltime_t reltime;
globus_l_ftp_dc_connect_cb_info_t * connect_cb_info;
static char * my_name =
"globus_l_ftp_control_data_eb_connect_write";
/*
* make sure that we still exist
*/
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s(): Handle not in transfer state proper state. Call local_port or local_spor before calling connect_write."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name));
}
transfer_handle = dc_handle->transfer_handle;
if(transfer_handle->direction != GLOBUS_FTP_DATA_STATE_CONNECT_WRITE &&
dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF)
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("eb_connect_write(): Cannot reuse a read connection for writing. Call local_port() or local_spor() to reset state.")));
}
else if(dc_handle->state != GLOBUS_FTP_DATA_STATE_SPOR &&
dc_handle->state != GLOBUS_FTP_DATA_STATE_PORT &&
!(dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF &&
transfer_handle->direction == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE))
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("eb_connect_write(): Handle not in the proper state. Call local_port or local_spor before calling connect_write.")));
}
connected = globus_malloc(
sizeof(globus_bool_t) * transfer_handle->stripe_count);
memset(connected, '\0',
sizeof(globus_bool_t) * transfer_handle->stripe_count);
/*
* if we are using cached connections
*/
if(transfer_handle->direction == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE &&
dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF)
{
reusing = GLOBUS_TRUE;
transfer_handle->eof_registered = GLOBUS_FALSE;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
transfer_handle->big_buffer = GLOBUS_NULL;
transfer_handle->big_buffer_cb = GLOBUS_NULL;
transfer_handle->send_eof_ent = GLOBUS_NULL;
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
stripe->eods_received = 0;
stripe->eof_sent = GLOBUS_FALSE;
stripe->eof = GLOBUS_FALSE;
stripe->eod_count = -1;
stripe->total_connection_count = 0;
while(!globus_list_empty(stripe->free_cache_list))
{
/* get first item and remove it from cache list */
data_conn = (globus_ftp_data_connection_t *)
globus_list_first(stripe->free_cache_list);
data_conn->eod = GLOBUS_FALSE;
globus_list_remove(
&stripe->free_cache_list,
stripe->free_cache_list);
if(stripe->connection_count <= stripe->parallel.base.size)
{
globus_fifo_enqueue(
&stripe->free_conn_q,
data_conn);
stripe->connection_count++;
stripe->total_connection_count++;
}
else
{
globus_list_remove_element(
&stripe->all_conn_list, data_conn);
data_conn->whos_my_daddy = NULL;
globus_l_ftp_control_register_close_msg(
dc_handle,
data_conn);
}
if(!connected[ctr] && callback != GLOBUS_NULL)
{
connected[ctr] = GLOBUS_TRUE;
transfer_handle->ref++;
connect_cb_info = (globus_l_ftp_dc_connect_cb_info_t *)
globus_malloc(sizeof(globus_l_ftp_dc_connect_cb_info_t));
connect_cb_info->callback = callback;
connect_cb_info->stripe_ndx = stripe->stripe_ndx;
connect_cb_info->dc_handle = dc_handle;
connect_cb_info->user_arg = user_arg;
connect_cb_info->transfer_handle = transfer_handle;
/* register a on shot for connection */
GlobusTimeReltimeSet(reltime, 0, 0);
globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_reuse_connect_callback,
(void *) connect_cb_info);
/* register callback */
}
}
}
}
/*
* if we are creating new data connections
*/
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_SPOR ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_PORT ||
reusing)
{
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
if(stripe->connection_count < stripe->parallel.base.size &&
!connected[ctr])
{
result = globus_l_ftp_control_data_register_connect(
dc_handle,
stripe,
callback,
user_arg);
if(result != GLOBUS_SUCCESS)
{
goto exit;
}
if(callback != GLOBUS_NULL)
{
transfer_handle->ref++;
}
}
}
dc_handle->state = GLOBUS_FTP_DATA_STATE_CONNECT_WRITE;
transfer_handle->direction = GLOBUS_FTP_DATA_STATE_CONNECT_WRITE;
}
else
{
result = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("eb_connect_write(): Handle not in the proper state")));
}
exit:
globus_free(connected);
return result;
}
globus_result_t
globus_l_ftp_control_data_eb_connect_read(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg)
{
globus_result_t result = GLOBUS_SUCCESS;
int ctr;
globus_ftp_data_stripe_t * stripe;
globus_ftp_data_connection_t * data_conn;
globus_object_t * err;
globus_l_ftp_eb_header_t * eb_header;
globus_result_t res;
globus_bool_t reusing = GLOBUS_FALSE;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_reltime_t reltime;
globus_l_ftp_dc_connect_cb_info_t * connect_cb_info;
static char * my_name =
"globus_l_ftp_control_data_eb_connect_read";
/*
* make sure that we still exist
*/
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s Handle not in transfer state proper state. Call local_port or local_spor before calling connect_write."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF &&
transfer_handle->direction != GLOBUS_FTP_DATA_STATE_CONNECT_READ)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("eb_connect_read(): Cannot reuse a write connection for reading. Call local_pasv() or local_spas() to reset state."));
return globus_error_put(err);
}
else if((dc_handle->state != GLOBUS_FTP_DATA_STATE_PASV) &&
!(dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF &&
transfer_handle->direction == GLOBUS_FTP_DATA_STATE_CONNECT_READ))
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("eb_connect_read(): Handle not in the proper state"));
return globus_error_put(err);
}
/*
* cached data connections
*/
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF &&
transfer_handle->direction == GLOBUS_FTP_DATA_STATE_CONNECT_READ)
{
globus_bool_t register_onshot;
reusing = GLOBUS_TRUE;
transfer_handle->eof_registered = GLOBUS_FALSE;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
transfer_handle->big_buffer = GLOBUS_NULL;
transfer_handle->big_buffer_cb = GLOBUS_NULL;
transfer_handle->send_eof_ent = GLOBUS_NULL;
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
stripe->eods_received = 0;
stripe->eof_sent = GLOBUS_FALSE;
stripe->eof = GLOBUS_FALSE;
stripe->eod_count = -1;
register_onshot = GLOBUS_TRUE;
while(!globus_list_empty(stripe->free_cache_list))
{
data_conn = (globus_ftp_data_connection_t *)
globus_list_first(stripe->free_cache_list);
globus_list_remove(
&stripe->free_cache_list,
stripe->free_cache_list);
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
data_conn->bytes_ready = 0;
data_conn->eod = GLOBUS_FALSE;
data_conn->reusing = GLOBUS_TRUE;
stripe->connection_count++;
/* register a header read */
res = globus_io_register_read(
&data_conn->io_handle,
(globus_byte_t *)eb_header,
sizeof(globus_l_ftp_eb_header_t),
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_eb_read_header_callback,
(void *)data_conn);
globus_assert(res == GLOBUS_SUCCESS);
if(callback != GLOBUS_NULL && register_onshot)
{
register_onshot = GLOBUS_FALSE;
transfer_handle->ref++;
connect_cb_info = (globus_l_ftp_dc_connect_cb_info_t *)
globus_malloc(sizeof(globus_l_ftp_dc_connect_cb_info_t));
connect_cb_info->callback = callback;
connect_cb_info->stripe_ndx = stripe->stripe_ndx;
connect_cb_info->dc_handle = dc_handle;
connect_cb_info->user_arg = user_arg;
connect_cb_info->transfer_handle = transfer_handle;
/* register a on shot for connection */
GlobusTimeReltimeSet(reltime, 0, 0);
globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_reuse_connect_callback,
(void *) connect_cb_info);
}
}
}
dc_handle->state = GLOBUS_FTP_DATA_STATE_CONNECT_READ;
}
/*
* if we are creating new data connections
*/
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_PASV ||
reusing)
{
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
/* add a reference for the listener */
transfer_handle->ref++;
DATA_CONN_MALLOC(data_conn, stripe, callback, user_arg);
if(callback != GLOBUS_NULL)
{
transfer_handle->ref++;
}
result = globus_io_tcp_register_listen(
&stripe->listener_handle,
globus_l_ftp_eb_listen_callback,
(void *)data_conn);
if(result != GLOBUS_SUCCESS)
{
globus_free(data_conn);
return result;
}
}
dc_handle->state = GLOBUS_FTP_DATA_STATE_CONNECT_READ;
transfer_handle->direction = GLOBUS_FTP_DATA_STATE_CONNECT_READ;
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s Handle not in the proper state"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
return result;
}
globus_result_t
globus_l_ftp_control_data_stream_connect_direction(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg,
globus_ftp_data_connection_state_t direction)
{
globus_result_t result = GLOBUS_SUCCESS;
int ctr;
globus_ftp_data_stripe_t * stripe;
globus_ftp_data_connection_t * data_conn;
globus_l_ftp_data_callback_info_t * callback_info;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_object_t * err;
static char * my_name =
"globus_l_ftp_control_data_stream_connect_direction";
/*
* make sure that we still exist
*/
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_NONE)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("stream_connect_direction(): Handle not in the proper state"));
globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
/*
* in stream mode there must be exactly 1 stripe
*/
if(transfer_handle->stripe_count != 1)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() stripe count does not equal 1."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
globus_error_put(err);
}
if(dc_handle->parallel.base.size != 1)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s(): requesting parrallelism in stream mode is not valid."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
globus_error_put(err);
}
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_PORT)
{
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
result = globus_l_ftp_control_data_register_connect(
dc_handle,
stripe,
callback,
user_arg);
if(result != GLOBUS_SUCCESS)
{
return result;
}
/*
* if there is a callback inc the reference
* count once per stripe
*/
if(callback != GLOBUS_NULL)
{
transfer_handle->ref++;
}
}
transfer_handle->direction = direction;
dc_handle->state = direction;
}
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_PASV)
{
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
/*
* inc the reference count for the listener callback
*/
transfer_handle->ref++;
DATA_CONN_MALLOC(data_conn, stripe, callback, user_arg);
CALLBACK_INFO_MALLOC(
callback_info,
dc_handle,
transfer_handle,
stripe,
data_conn);
result = globus_io_tcp_register_listen(
&stripe->listener_handle,
globus_l_ftp_stream_listen_callback,
(void *)callback_info);
if(result != GLOBUS_SUCCESS)
{
globus_free(callback_info);
return result;
}
/*
* if there is a callback inc the reference
* count once per stripe
*/
if(callback != GLOBUS_NULL)
{
transfer_handle->ref++;
}
}
dc_handle->state = direction;
transfer_handle->direction = direction;
}
else
{
result = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("stream_connect_direction(): must call local_pasv/port first.")));
}
return result;
}
/**
* Opens additional data channels (connections) to the host identified
* by the stripe parameter.
*
* @param handle
* A pointer to a FTP control handle. This handle is used to
* determine the host corresponding to the stripe number and to
* store information about any channels added by this function.
* @param num_channels
* The number of additional channels to add.
* @param stripe_ndx
* A integer identifying the stripe to add channels too. In the
* case of non-striped transfer this parameter will be ignored.
*/
globus_result_t
globus_ftp_control_data_add_channels(
globus_ftp_control_handle_t * handle,
unsigned int num_channels,
unsigned int stripe_ndx)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res = GLOBUS_SUCCESS;
globus_object_t * err;
static char * myname=
"globus_ftp_control_data_add_channels";
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : not yet implemented."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname));
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Sends an eof message to each stripe along an open data connection.
*
* @param handle
* A pointer to a FTP control handle. This handle contains the
* the state for a conneciton.
* @param count[]
* This array of integers should contain an integer that
* will be added to the current parallel data connection count on
* each stripe. The order of the integers corresponds to each
* stripe in the same order as what was returned from local_port().
*
* An eof message must be sent to all receiving hosts in a transfer.
* The message contains the total number of data connections used
* by each stripe. Many stripes may be sending to a single receiver
* but only one eof message may be sent. The count parameter allows
* the user to pass in the total number of data connections used by all
* other hosts. The local values are added to the passed in values
* and then sent to the receiver.
*
* @param array_size
* The number of elements in count[].
* @param eof_message
* @param cb
* The function to be called when the eof message has been called.
* @param user_arg
* A user pointer that is threaded through to the user callback.
*/
globus_result_t
globus_ftp_control_data_send_eof(
globus_ftp_control_handle_t * handle,
int count[],
int array_size,
globus_bool_t eof_message,
globus_ftp_control_callback_t cb,
void * user_arg)
{
globus_l_ftp_send_eof_entry_t * eof_ent;
globus_l_ftp_send_eof_entry_t * tmp_ent;
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_data_stripe_t * stripe;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
int ctr;
static char * myname=
"globus_ftp_control_data_send_eof";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(count == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"count",
2,
myname);
return globus_error_put(err);
}
if(cb == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"cb",
4,
myname);
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
err = GLOBUS_NULL;
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : Handle not in the proper state"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
}
else if(dc_handle->mode != GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_send_eof() can only be called when in extended block mode"));
}
else if(dc_handle->state != GLOBUS_FTP_DATA_STATE_SEND_EOF &&
dc_handle->state != GLOBUS_FTP_DATA_STATE_CONNECT_WRITE)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_send_eof() handle not in proper state %s"),
globus_l_ftp_control_state_to_string(dc_handle->state));
}
else if(!transfer_handle->eof_registered)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_send_eof() can only be sent after eof has been registered"));
}
else if(dc_handle->send_eof)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_send_eof() : The current handle is set to automatically send eof. Pass GLOBUS_FALSE to globus_ftp_control_local_send_eof()."));
}
if(err)
{
globus_mutex_unlock(&dc_handle->mutex);
return globus_error_put(err);
}
/*
* if we are not sending eof we still need to send an eod message
*/
if(!eof_message)
{
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
count[ctr] = stripe->total_connection_count;
}
}
eof_ent = (globus_l_ftp_send_eof_entry_t *)
globus_malloc(sizeof(globus_l_ftp_send_eof_entry_t));
eof_ent->count = (int *)globus_malloc(sizeof(int) * array_size);
memcpy(eof_ent->count, count, sizeof(int) * array_size);
eof_ent->array_size = array_size;
eof_ent->cb = cb;
eof_ent->user_arg = user_arg;
eof_ent->direction = GLOBUS_FTP_DATA_STATE_SEND_EOF;
eof_ent->dc_handle = &handle->dc_handle;
eof_ent->transfer_handle = transfer_handle;
/*
* 1 count for each stripe
*/
eof_ent->callback_table_handle = globus_handle_table_insert(
&transfer_handle->handle_table,
(void *)eof_ent,
transfer_handle->stripe_count);
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
if(stripe->eof_sent)
{
globus_mutex_unlock(&dc_handle->mutex);
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_send_eof() : eof has already been sent on a stripe."));
globus_mutex_unlock(&dc_handle->mutex);
return globus_error_put(err);
}
tmp_ent = (globus_l_ftp_send_eof_entry_t *)
globus_malloc(sizeof(globus_l_ftp_send_eof_entry_t));
tmp_ent->count = (int *)globus_malloc(sizeof(int) * array_size);
memcpy(tmp_ent->count, count, sizeof(int) * array_size);
tmp_ent->array_size = array_size;
tmp_ent->cb = cb;
tmp_ent->user_arg = user_arg;
tmp_ent->direction = GLOBUS_FTP_DATA_STATE_SEND_EOF;
tmp_ent->dc_handle = &handle->dc_handle;
tmp_ent->callback_table_handle = eof_ent->callback_table_handle;
tmp_ent->eof_message = eof_message;
tmp_ent->transfer_handle = transfer_handle;
globus_fifo_enqueue(&stripe->command_q,
(void *)tmp_ent);
}
globus_l_ftp_data_stripe_poll(dc_handle);
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_l_ftp_control_data_send_eof(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_data_connection_t * data_conn,
globus_l_ftp_send_eof_entry_t * eof_ent)
{
globus_l_ftp_eb_header_t * eb_header;
globus_ftp_data_stripe_t * stripe;
globus_result_t res;
int ctr;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
transfer_handle = dc_handle->transfer_handle;
stripe = data_conn->whos_my_daddy;
/*
* add our data connection count
*/
ctr = 0;
globus_assert(stripe->eof);
if(stripe->eof_sent)
{
return globus_error_put(GLOBUS_ERROR_NO_INFO);
}
stripe->eof_sent = GLOBUS_TRUE;
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
memset(eb_header, '\0', sizeof(globus_l_ftp_eb_header_t));
eb_header->descriptor =
GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOD;
if(eof_ent->eof_message)
{
eb_header->descriptor |= GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOF;
globus_l_ftp_control_data_encode(
eb_header->offset,
stripe->total_connection_count + eof_ent->count[ctr]);
}
stripe->connection_count--;
transfer_handle->ref++;
res = globus_io_register_write(
&data_conn->io_handle,
(globus_byte_t *)eb_header,
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_eb_send_eof_callback,
(void *)eof_ent);
return res;
}
/**
* Removes data channels (connections) to the host identified by the
* stripe parameter.
*
* @param handle
* A pointer to a FTP control handle. This handle is used to
* determine the host corresponding to the stripe number and to
* update information about any channels removed by this function.
* @param num_channels
* The number of channels to remove.
* @param stripe_ndx
* A integer identifying the stripe to remove channels from. In the
* case of non-striped transfer this parameter will be ignored.
*/
globus_result_t
globus_ftp_control_data_remove_channels(
globus_ftp_control_handle_t * handle,
unsigned int num_channels,
unsigned int stripe_ndx)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_data_stripe_t * stripe;
globus_result_t res = GLOBUS_SUCCESS;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_data_remove_channels";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(num_channels < 0)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("number of channels must be greater than zero."));
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
transfer_handle = dc_handle->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
if(stripe_ndx >= transfer_handle->stripe_count)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"Invalid Stripe index."));
}
else
{
stripe = &transfer_handle->stripes[stripe_ndx];
if(stripe->parallel.base.mode ==
GLOBUS_FTP_CONTROL_PARALLELISM_FIXED)
{
if(stripe->parallel.base.size < 2)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("It is invalid to set the number of data channels to zero.")));
}
else
{
stripe->parallel.base.size--;
}
}
else
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Cannot remove a channel on current parallel mode.")));
}
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Returns the number of currently open channels for the host
* identified by the stripe parameter. This number may be less then
* the level of parallelism specified in local_parallelism, due to
* the possibility that some channels have not yet connected.
*
* @param handle
* A pointer to a FTP control handle. This handle is used to
* determine the host corresponding to "stripe" and number of
* channels corresponding to that host.
* @param num_channels
* @param stripe_ndx
* A integer identifying the stripe for which to return the
* number of channels. In the case of non-striped transfer this
* parameter should be zero.
*/
globus_result_t
globus_ftp_control_data_query_channels(
globus_ftp_control_handle_t * handle,
unsigned int * num_channels,
unsigned int stripe_ndx)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_data_stripe_t * stripe;
globus_result_t res = GLOBUS_SUCCESS;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_data_query_channels";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(num_channels == GLOBUS_NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("number of channels must not ne a null pointer"));
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
if(stripe_ndx >= transfer_handle->stripe_count)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"Invalid Stripe index."));
}
else
{
stripe = &transfer_handle->stripes[stripe_ndx];
*num_channels = stripe->connection_count;
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Returns the total number of data channels used so far in the
* current transfer on the given stripe.
*
* @param handle
* A pointer to a FTP control handle. This handle is used to
* determine the host corresponding to "stripe" and number of
* channels corresponding to that host.
* @param num_channels
*
* @param stripe_ndx
* A integer identifying the stripe for which to return the
* number of channels. In the case of non-striped transfer this
* parameter should be zero.
*/
globus_result_t
globus_ftp_control_data_get_total_data_channels(
globus_ftp_control_handle_t * handle,
unsigned int * num_channels,
unsigned int stripe_ndx)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_data_stripe_t * stripe;
globus_result_t res = GLOBUS_SUCCESS;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_data_get_total_data_channels";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(num_channels == GLOBUS_NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("number of channels must not ne a null pointer"));
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
transfer_handle = dc_handle->transfer_handle;
if(transfer_handle == GLOBUS_NULL)
{
*num_channels = 0;
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("handle not in proper state.")));
}
else if(stripe_ndx >= transfer_handle->stripe_count)
{
*num_channels = 0;
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Invalid Stripe index.")));
}
else
{
stripe = &transfer_handle->stripes[stripe_ndx];
*num_channels = stripe->total_connection_count;
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
globus_result_t
globus_ftp_control_data_get_remote_hosts(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * address,
int * addr_count)
{
globus_object_t * err;
globus_result_t res = GLOBUS_SUCCESS;
globus_list_t * list;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_ftp_data_stripe_t * stripe;
globus_ftp_data_connection_t * data_conn;
int ctr;
int ndx;
int count;
static char * myname=
"globus_ftp_control_data_get_remote_hosts";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(address == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"address",
2,
myname);
return globus_error_put(err);
}
if(addr_count == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"addr_count",
3,
myname);
return globus_error_put(err);
}
if(*addr_count < 1)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("*addr_count is less than 1.")));
return res;
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
transfer_handle = dc_handle->transfer_handle;
if(transfer_handle == GLOBUS_NULL)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("handle not in proper state.")));
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/* count the total # of connections */
count = 0;
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
count += globus_list_size(transfer_handle->stripes[ctr].all_conn_list);
}
if(*addr_count < count)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Invalid Stripe index.")));
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
ndx = 0;
for(ctr = 0; ctr < transfer_handle->stripe_count &&
ndx < *addr_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
for(list = stripe->all_conn_list;
!globus_list_empty(list) && ndx < *addr_count;
list = globus_list_rest(list))
{
data_conn = (globus_ftp_data_connection_t *)
globus_list_first(list);
res = globus_io_tcp_get_remote_address_ex(
&data_conn->io_handle,
address[ndx].host,
&address[ndx].hostlen,
&address[ndx].port);
if(res != GLOBUS_SUCCESS)
{
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
ndx++;
}
}
*addr_count = ndx;
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Determines if the library will automatically send an EOF message in
* extended block mode, or if the user will have to explicitly do it
* by calling globus_ftp_control_data_send_eof().
*
* @param handle
* The ftp handle you wish to sent the send_eof attribute on.
*
* @param send_eof
* A boolean representing whether or not to automatically send an
* EOF message.
*/
globus_result_t
globus_ftp_control_local_send_eof(
globus_ftp_control_handle_t * handle,
globus_bool_t send_eof)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_send_eof";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->send_eof = send_eof;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_get_parallelism(
globus_ftp_control_handle_t * handle,
globus_ftp_control_parallelism_t * parallelism)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_get_parallelism";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(parallelism == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"parallelism",
2,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
globus_i_ftp_parallelism_copy(
parallelism,
&dc_handle->parallel);
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Set the parallelism information in a FTP control handle
*
* @param handle
* A pointer to the FTP control handle for which the
* parallelism information is to be updated
* @param parallelism
* A structure containing parallelism information
*
*/
globus_result_t
globus_ftp_control_local_parallelism(
globus_ftp_control_handle_t * handle,
globus_ftp_control_parallelism_t * parallelism)
{
int ctr;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
static char * myname=
"globus_ftp_control_local_parallelism";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(parallelism == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"parallelism",
2,
myname);
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
globus_i_ftp_parallelism_copy(
&dc_handle->parallel,
parallelism);
for(ctr = 0; transfer_handle != GLOBUS_NULL &&
ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
globus_i_ftp_parallelism_copy(
&stripe->parallel,
&dc_handle->parallel);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Create a local listening socket, bind it and return the address the
* socket is listening to. If there is a existing data connection it
* is closed.
*
* @param handle
* A pointer to a FTP control handle. Information about the
* listening socket is stored in the handle.
* @param address
* The host IP address and port is returned through this
* parameter.
*/
globus_result_t
globus_ftp_control_local_pasv(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * address)
{
globus_result_t result = GLOBUS_SUCCESS;
globus_result_t res = GLOBUS_SUCCESS;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_pasv";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(address == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"address",
2,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
/*
* this function cannot be called during transfer
*/
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_READ ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE)
{
globus_mutex_unlock(&dc_handle->mutex);
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pasv(): Handle not in the proper state %s."),
globus_l_ftp_control_state_to_string(dc_handle->state)));
}
/* close all open data connections */
globus_l_ftp_control_stripes_destroy(
dc_handle,
GLOBUS_NULL);
globus_l_ftp_control_stripes_create(
dc_handle,
address,
1);
stripe = &dc_handle->transfer_handle->stripes[0];
result = globus_io_tcp_create_listener(
&address->port,
-1,
&dc_handle->io_attr,
&stripe->listener_handle);
if(result == GLOBUS_SUCCESS)
{
dc_handle->transfer_handle->ref++;
stripe->listening = GLOBUS_TRUE;
address->hostlen = 4;
if(address->host[0] == 0 &&
address->host[1] == 0 &&
address->host[2] == 0 &&
address->host[3] == 0 &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED)
{
unsigned short p;
char * dataip;
if(dataip = globus_libc_getenv("GLOBUS_FTP_CLIENT_DATA_IP"))
{
result = globus_libc_contact_string_to_ints(
dataip, address->host, &address->hostlen, NULL);
if(result != GLOBUS_SUCCESS)
{
return result;
}
}
else
{
res = globus_io_tcp_get_local_address_ex(
&handle->cc_handle.io_handle,
address->host,
&address->hostlen,
&p);
if(res != GLOBUS_SUCCESS)
{
char * cs;
globus_sockaddr_t addr;
GlobusLibcSockaddrSetFamily(addr, AF_INET);
GlobusLibcSockaddrSetPort(addr, address->port);
result = globus_libc_addr_to_contact_string(
&addr,
GLOBUS_LIBC_ADDR_LOCAL |
GLOBUS_LIBC_ADDR_NUMERIC |
GLOBUS_LIBC_ADDR_IPV4,
&cs);
if(result != GLOBUS_SUCCESS)
{
return result;
}
result = globus_libc_contact_string_to_ints(
cs, address->host, &address->hostlen, NULL);
globus_free(cs);
if(result != GLOBUS_SUCCESS)
{
return result;
}
}
}
}
dc_handle->state = GLOBUS_FTP_DATA_STATE_PASV;
}
}
globus_mutex_unlock(&dc_handle->mutex);
return result;
}
/**
* Create num_addresses local listening sockets, bind them and return
* the addresses the sockets are listening to. If there is a existing
* data connection it is closed.
*
* @param handle
* A pointer to a FTP control handle. Information about the
* listening sockets is stored in the handle.
* @param addresses
* The host IP addresses and ports are returned through this
* parameter.
* @param num_addresses
* The number of listening sockets to create
*/
globus_result_t
globus_ftp_control_local_spas(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t addresses[],
unsigned int num_addresses)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_spas(): this function is not implemented")));
}
/**
* Insert the host/port information returned by a PASV on the remote
* host into the local FTP control handle. (close any outstanding data
* con)
*
* @param handle
* A pointer to the FTP control handle into which to insert the
* host/port information
* @param address
* The host IP address and port
*/
globus_result_t
globus_ftp_control_local_port(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t * address)
{
globus_result_t result = GLOBUS_SUCCESS;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_port";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(address == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"address",
2,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
/*
* this function cannot be called during transfer
*/
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_READ ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE)
{
globus_mutex_unlock(&dc_handle->mutex);
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_port(): Handle not in the proper state %s."),
globus_l_ftp_control_state_to_string(dc_handle->state)));
}
/* close all open data connections */
globus_l_ftp_control_stripes_destroy(
dc_handle,
GLOBUS_NULL);
globus_l_ftp_control_stripes_create(
dc_handle,
address,
1);
dc_handle->state = GLOBUS_FTP_DATA_STATE_PORT;
}
globus_mutex_unlock(&dc_handle->mutex);
return result;
}
globus_result_t
globus_ftp_control_get_spor(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t addresses[],
unsigned int * num_addresses)
{
globus_i_ftp_dc_handle_t * dc_handle;
int ctr;
globus_object_t * err;
static char * myname=
"globus_ftp_control_get_spor";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(addresses == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"addresses",
2,
myname);
return globus_error_put(err);
}
if(*num_addresses < 1)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pasv(): address count is less than 1."));
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
*num_addresses = 0;
}
else
{
for(ctr = 0;
ctr < *num_addresses &&
ctr < dc_handle->transfer_handle->stripe_count;
ctr++)
{
globus_ftp_control_host_port_copy(
&addresses[ctr],
&dc_handle->transfer_handle->stripes[ctr].host_port);
}
*num_addresses = ctr;
}
}
globus_mutex_lock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Insert the host/port addresses returned by a SPAS on the remote
* host into the local FTP control handle. If there are any
* outstanding data connections at this point, they are closed.
*
* @param handle
* A pointer to the FTP control handle into which to insert the
* host/port addresses
* @param addresses
* The host IP addresses and port numbers
* @param num_addresses
* The number of addresses
*/
globus_result_t
globus_ftp_control_local_spor(
globus_ftp_control_handle_t * handle,
globus_ftp_control_host_port_t addresses[],
unsigned int num_addresses)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_spor";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(addresses == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"addresses",
2,
myname);
return globus_error_put(err);
}
if(num_addresses < 1)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pasv(): address count is less than 1."));
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
/* close all open data connections */
globus_l_ftp_control_stripes_destroy(
dc_handle,
GLOBUS_NULL);
globus_l_ftp_control_stripes_create(
dc_handle,
addresses,
num_addresses);
dc_handle->state = GLOBUS_FTP_DATA_STATE_SPOR;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Update the FTP control handle with the given type information.
*
* @param handle
* A pointer to the FTP control handle to be updated
* @param type
* The type of the data connection. Possible values are: ASCII,
* EBCDIC, IMAGE and LOCAL. Currently only ASCII and IMAGE
* types are supported.
* @param form_code
* The logical byte size parameter for the LOCAL type.
*/
globus_result_t
globus_ftp_control_local_type(
globus_ftp_control_handle_t * handle,
globus_ftp_control_type_t type,
int form_code)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_spor";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(type != GLOBUS_FTP_CONTROL_TYPE_ASCII &&
type != GLOBUS_FTP_CONTROL_TYPE_IMAGE)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_type(): Type must be ascii or image."));
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->type = type;
dc_handle->form_code = form_code;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_get_type(
globus_ftp_control_handle_t * handle,
globus_ftp_control_type_t * type)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_get_type";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
*type = dc_handle->type;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_get_mode(
globus_ftp_control_handle_t * handle,
globus_ftp_control_mode_t * mode)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_get_mode";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
*mode = dc_handle->mode;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Update the FTP control handle with the given mode information.
*
* @param handle
* A pointer to the FTP control handle to be updated
* @param mode
* Specifies the mode of the data connection. Possible modes
* are STREAM, BLOCK, EXTENDED BLOCK and COMPRESSED. Out of
* these only STREAM and EXTENDED BLOCK are supported in this
* implementation. Also, EXTENDED BLOCK is only supported in
* combination with the IMAGE type.
*
*/
globus_result_t
globus_ftp_control_local_mode(
globus_ftp_control_handle_t * handle,
globus_ftp_control_mode_t mode)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_mode";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
/* only allowing STREAM and EBLOCK mode for now */
if(mode != GLOBUS_FTP_CONTROL_MODE_STREAM &&
mode != GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_mode(): mode must be stream or extended block."));
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->mode = mode;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Update the FTP control handle with the given socket buffer
* information.
*
* @param handle
* A pointer to the FTP control handle to be updated
* @param tcp_buffer
* A pointer to the socket buffer.
*
*/
globus_result_t
globus_ftp_control_local_tcp_buffer(
globus_ftp_control_handle_t * handle,
globus_ftp_control_tcpbuffer_t * tcp_buffer)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_tcp_buffer";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(tcp_buffer->mode != GLOBUS_FTP_CONTROL_TCPBUFFER_FIXED)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_tcp_buffer(): buffer setting mode not supported"));
return globus_error_put(err);
}
if( 0 > tcp_buffer->fixed.size )
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_tcp_buffer(): buffer size must be greater than 0"));
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->tcp_buffer_size = tcp_buffer->fixed.size;
if(dc_handle->tcp_buffer_size > 0)
{
globus_io_attr_set_socket_sndbuf(
&dc_handle->io_attr,
dc_handle->tcp_buffer_size);
globus_io_attr_set_socket_rcvbuf(
&dc_handle->io_attr,
dc_handle->tcp_buffer_size);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_data_get_socket_buf(
globus_ftp_control_handle_t * handle,
int * rcvbuf,
int * sndbuf)
{
globus_result_t res;
globus_object_t * err;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripes;
globus_i_ftp_dc_handle_t * dc_handle;
static char * my_name =
"globus_ftp_control_data_get_socket_buf";
if(handle == NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
my_name);
return globus_error_put(err);
}
if(dc_handle->transfer_handle == NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s():transfer handle does not exist"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
stripes = dc_handle->transfer_handle->stripes;
if(stripes == NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s():transfer handle has no stripes."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(globus_list_empty(stripes[0].all_conn_list))
{
globus_mutex_unlock(&dc_handle->mutex);
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s():no data connection."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
data_conn = (globus_ftp_data_connection_t *) globus_list_first(
stripes[0].all_conn_list);
if(data_conn == NULL)
{
globus_mutex_unlock(&dc_handle->mutex);
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s():no data connection."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
res = globus_io_handle_get_socket_buf(
&data_conn->io_handle,
rcvbuf,
sndbuf);
if(res != GLOBUS_SUCCESS)
{
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Update the FTP control handle with the given data channel
* authentication information.
*
* If authentication is set to GLOBUS_FTP_CONTROL_DCAU_NONE,
* then protection will also be disabled for this control handle.
*
* @param handle
* A pointer to the FTP control handle to be updated
* @param dcau
* A parameter specifying the data channel authentication
* mode. Possible values are No Authentication, Self
* Authentication and Subject-name authentication.
* @param delegated_credential_handle */
globus_result_t
globus_ftp_control_local_dcau(
globus_ftp_control_handle_t * handle,
const globus_ftp_control_dcau_t * dcau,
gss_cred_id_t delegated_credential_handle)
{
globus_i_ftp_dc_handle_t * dc_handle;
static char * myname=
"globus_ftp_control_local_dcau";
globus_object_t * err;
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
else if(dcau->mode != GLOBUS_FTP_CONTROL_DCAU_NONE &&
dcau->mode != GLOBUS_FTP_CONTROL_DCAU_SELF &&
dcau->mode != GLOBUS_FTP_CONTROL_DCAU_SUBJECT)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_dcau: invalid dcau mode"));
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->dcau.mode == GLOBUS_FTP_CONTROL_DCAU_SUBJECT &&
dc_handle->dcau.subject.subject != GLOBUS_NULL)
{
globus_libc_free(dc_handle->dcau.subject.subject);
dc_handle->dcau.subject.subject = GLOBUS_NULL;
}
dc_handle->dcau.mode = dcau->mode;
if(dcau->mode == GLOBUS_FTP_CONTROL_DCAU_SUBJECT)
{
dc_handle->dcau.subject.subject =
globus_libc_strdup(dcau->subject.subject);
}
if(dc_handle->dcau.mode != GLOBUS_FTP_CONTROL_DCAU_NONE)
{
globus_io_secure_authorization_data_t auth_data;
globus_io_secure_authorization_data_initialize(&auth_data);
globus_io_attr_set_secure_authentication_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_AUTHENTICATION_MODE_MUTUAL,
delegated_credential_handle);
globus_io_attr_set_secure_proxy_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_PROXY_MODE_MANY);
switch(dc_handle->dcau.mode)
{
case GLOBUS_FTP_CONTROL_DCAU_SELF:
globus_io_attr_set_secure_authorization_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_AUTHORIZATION_MODE_SELF,
&auth_data);
break;
case GLOBUS_FTP_CONTROL_DCAU_SUBJECT:
globus_io_secure_authorization_data_set_identity(
&auth_data,
dc_handle->dcau.subject.subject);
globus_io_attr_set_secure_authorization_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_AUTHORIZATION_MODE_IDENTITY,
&auth_data);
break;
default:
break;
}
globus_io_secure_authorization_data_destroy(&auth_data);
}
else
{
dc_handle->protection = GLOBUS_FTP_CONTROL_PROTECTION_CLEAR;
globus_io_attr_set_secure_channel_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_CHANNEL_MODE_CLEAR);
globus_io_attr_set_secure_authorization_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_AUTHORIZATION_MODE_NONE,
GLOBUS_NULL);
globus_io_attr_set_secure_authentication_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_AUTHENTICATION_MODE_NONE,
GLOBUS_NULL);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_get_dcau(
globus_ftp_control_handle_t * handle,
globus_ftp_control_dcau_t * dcau)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err = GLOBUS_SUCCESS;
static char * myname=
"globus_ftp_control_get_dcau";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
dcau->mode = dc_handle->dcau.mode;
if(dc_handle->dcau.mode == GLOBUS_FTP_CONTROL_DCAU_SUBJECT)
{
dcau->subject.subject =
globus_libc_strdup(dc_handle->dcau.subject.subject);
if(!dcau->subject.subject)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_get_dcau: malloc failed"));
}
}
}
globus_mutex_unlock(&dc_handle->mutex);
return err ? globus_error_put(err): GLOBUS_SUCCESS;
}
/* globus_ftp_control_get_dcau() */
globus_result_t
globus_ftp_control_local_prot(
globus_ftp_control_handle_t * handle,
globus_ftp_control_protection_t protection)
{
globus_i_ftp_dc_handle_t * dc_handle;
static char * myname=
"globus_ftp_control_local_prot";
globus_object_t * err;
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(dc_handle->dcau.mode == GLOBUS_FTP_CONTROL_DCAU_NONE)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Cannot set protection without using dcau"));
return globus_error_put(err);
}
if(dc_handle->protection == GLOBUS_FTP_CONTROL_PROTECTION_CONFIDENTIAL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("\"Confidential\" protection level not supported with GSSAPI"));
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->protection = protection;
switch(dc_handle->protection)
{
case GLOBUS_FTP_CONTROL_PROTECTION_CLEAR:
globus_io_attr_set_secure_channel_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_CHANNEL_MODE_CLEAR);
globus_io_attr_set_secure_protection_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_PROTECTION_MODE_NONE);
break;
case GLOBUS_FTP_CONTROL_PROTECTION_SAFE:
globus_io_attr_set_secure_channel_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_CHANNEL_MODE_SSL_WRAP);
globus_io_attr_set_secure_protection_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_PROTECTION_MODE_SAFE);
break;
case GLOBUS_FTP_CONTROL_PROTECTION_PRIVATE:
globus_io_attr_set_secure_channel_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_CHANNEL_MODE_SSL_WRAP);
globus_io_attr_set_secure_protection_mode(
&dc_handle->io_attr,
GLOBUS_IO_SECURE_PROTECTION_MODE_PRIVATE);
break;
default:
globus_assert(
dc_handle->protection
== GLOBUS_FTP_CONTROL_PROTECTION_CLEAR ||
dc_handle->protection
== GLOBUS_FTP_CONTROL_PROTECTION_SAFE ||
dc_handle->protection
== GLOBUS_FTP_CONTROL_PROTECTION_PRIVATE);
break;
}
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/* globus_ftp_control_local_prot() */
globus_result_t
globus_ftp_control_get_prot(
globus_ftp_control_handle_t * handle,
globus_ftp_control_protection_t * protection)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err = GLOBUS_SUCCESS;
static char * myname=
"globus_ftp_control_get_prot";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
*protection = dc_handle->protection;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/* globus_ftp_control_get_prot() */
/**
* Update the FTP control handle with the given protection buffer size
* information.
*
* This function sets protection buffer size to be used by this handle. This
* value is used to determine how much data will be sent in each packet
* during a protected data transfer.
*
* @param handle
* A pointer to the FTP control handle to be updated
* @param bufsize
* A parameter specifying the protection buffer size value.
*/
globus_result_t
globus_ftp_control_local_pbsz(
globus_ftp_control_handle_t * handle,
unsigned long bufsize)
{
globus_object_t * error = GLOBUS_NULL;
if(handle == GLOBUS_NULL)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pbsz: Handle argument is NULL"));
goto error_exit;
}
/* pbsz must be <= 32 bits */
if(bufsize != (bufsize & 0xffffffff))
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pbsz: Invalid buffer size"));
goto error_exit;
}
globus_mutex_lock(&(handle->dc_handle.mutex));
{
if(handle->dc_handle.pbsz != 0UL &&
handle->dc_handle.pbsz < bufsize)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pbsz: Invalid buffer size"));
goto unlock_exit;
}
handle->dc_handle.pbsz = bufsize;
}
unlock_exit:
globus_mutex_unlock(&handle->dc_handle.mutex);
error_exit:
return (error ? globus_error_put(error) : GLOBUS_SUCCESS);
}
/* globus_ftp_control_local_pbsz() */
/**
* Query the FTP control handle for the protection buffer size
* information.
*
* This function queries the handle to determine the protection buffer size
* which is used by this handle. This value is used to determine how much data
* will be sent in each packet during a protected data transfer.
*
* @param handle
* A pointer to the FTP control handle to be updated
* @param bufsize
* A pointer to a parameter to store the value of the protection buffer
* size.
*/
globus_result_t
globus_ftp_control_get_pbsz(
globus_ftp_control_handle_t * handle,
unsigned long * bufsize)
{
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pbsz: Handle argument is NULL")));
}
if(bufsize == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_pbsz: bufsize argument is NULL")));
}
globus_mutex_lock(&(handle->dc_handle.mutex));
{
*bufsize = handle->dc_handle.pbsz;
}
globus_mutex_unlock(&(handle->dc_handle.mutex));
return GLOBUS_SUCCESS;
}
/* globus_ftp_control_get_pbsz() */
/**
* Updates the handle with information on the structure of the data
* being sent on the data channel.
*
* This function updates the handle with the provided structure
* information. At this point the only structure type that is
* supported is the file type.
*
* @param handle
* A pointer to a FTP control handle. The handle contains
* information about the current state of the control and data
* connections.
* @param structure
* This parameter is used to pass the structure
* information. Possible values are file, record and page. Only
* the file type is supported
*
*/
globus_result_t
globus_ftp_control_local_stru(
globus_ftp_control_handle_t * handle,
globus_ftp_control_structure_t structure)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_stru";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
/* only file type allowed for now */
if(structure != GLOBUS_FTP_CONTROL_STRUCTURE_FILE)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_local_structure(): Only file structure is supported."));
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->structure = structure;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Writes data from the supplied buffer to data connection(s)
*
* This function writes contained in the buffer to the data
* channel(s).
*
* @param handle
* A pointer to a FTP control handle. The handle contains
* information about the current state of the control and data
* connections.
* @param buffer
* A user supplied buffer from which data will written to the
* data connection(s)
* @param length
* The length of the data contained in the buffer.
* @param offset
* The offset in the file at which the data in the buffer starts
* @param eof
* Indicates that the buffer is that last part of a file. In
* the striped case this will cause a EOF block to be send to
* every data node involved in the transfer.
* @param callback
* The function to be called once the data has been sent
* @param callback_arg
* User supplied argument to the callback function
*
*/
globus_result_t
globus_ftp_control_data_write(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t result = GLOBUS_SUCCESS;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
static char * myname=
"globus_ftp_control_data_write";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(buffer == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"buffer",
2,
myname);
return globus_error_put(err);
}
if(callback == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"callback",
6,
myname);
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
err = GLOBUS_NULL;
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Handle not in the proper state"));
}
else if(dc_handle->state != GLOBUS_FTP_DATA_STATE_CONNECT_WRITE)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_write(): Handle not in proper state. %s"),
globus_l_ftp_control_state_to_string(dc_handle->state));
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
result = globus_l_ftp_control_data_stream_read_write(
dc_handle,
buffer,
length,
offset,
eof,
callback,
callback_arg);
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
result = globus_l_ftp_control_data_eb_write(
dc_handle,
buffer,
length,
offset,
eof,
callback,
callback_arg);
}
else
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_write(): Handle not in proper state."));
}
if(err)
{
globus_mutex_unlock(&dc_handle->mutex);
return globus_error_put(err);
}
globus_l_ftp_data_stripe_poll(dc_handle);
}
globus_mutex_unlock(&dc_handle->mutex);
return result;
}
globus_result_t
globus_ftp_control_get_stripe_count(
globus_ftp_control_handle_t * handle,
int * stripe_count)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
static char * myname=
"globus_ftp_control_get_stripe_count";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Handle not in the proper state"));
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
*stripe_count = transfer_handle->stripe_count;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Reads data from data connection(s) and put them in the supplied
* buffer.
*
* This function takes the given buffer and will try to read data from
* the data connection(s).
*
* @param handle
* A pointer to a FTP control handle. The handle contains
* information about the current state of the control and data
* connections.
* @param buffer
* A user supplied buffer into which data from the data
* connection(s) will be written
* @param max_length
* The maximum length of the data that can be written to the buffer
* @param callback
* The function to be called once the data has been read
* @param callback_arg
* User supplied argument to the callback function
*
*/
globus_result_t
globus_ftp_control_data_read(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t max_length,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t result;
globus_object_t * err;
static char * myname=
"globus_ftp_control_data_read";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(buffer == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"buffer",
2,
myname);
return globus_error_put(err);
}
if(callback == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"callback",
4,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
err = GLOBUS_NULL;
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Handle not in the proper state:transfer handle == NULL"));
}
else if(dc_handle->state != GLOBUS_FTP_DATA_STATE_CONNECT_READ)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_read(): Handle not in proper state %s."),
globus_l_ftp_control_state_to_string(dc_handle->state));
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
result = globus_l_ftp_control_data_stream_read_write(
dc_handle,
buffer,
max_length,
0,
GLOBUS_FALSE,
callback,
callback_arg);
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
/* queue in the same manner as stream mode, single queue */
result = globus_l_ftp_control_data_stream_read_write(
dc_handle,
buffer,
max_length,
0,
GLOBUS_FALSE,
callback,
callback_arg);
}
else
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_read(): Handle not using correct mode. Possible memory corruption."));
}
if(err)
{
globus_mutex_unlock(&dc_handle->mutex);
return globus_error_put(err);
}
globus_l_ftp_data_stripe_poll(dc_handle);
}
globus_mutex_unlock(&dc_handle->mutex);
return result;
}
/*
* register a big buffer read
*/
globus_result_t
globus_ftp_control_data_read_all(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_data_stripe_t * stripe;
globus_ftp_data_connection_t * data_conn;
globus_result_t res;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
int ctr;
static char * myname=
"globus_ftp_control_data_read";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(buffer == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"buffer",
2,
myname);
return globus_error_put(err);
}
if(callback == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"callback",
4,
myname);
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
err = GLOBUS_NULL;
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Handle not in the proper state"));
}
else if(dc_handle->state != GLOBUS_FTP_DATA_STATE_CONNECT_READ)
{
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_read_all(): Handle not in proper state %s."),
globus_l_ftp_control_state_to_string(dc_handle->state));
}
else if(transfer_handle->big_buffer != GLOBUS_NULL)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_read_all(): Only one read_all can be registered at a time. You must wait for a callback with eof set to GLOBUS_TRUE before calling read all again."));
}
if(err)
{
globus_mutex_unlock(&dc_handle->mutex);
return globus_error_put(err);
}
transfer_handle->big_buffer = buffer;
transfer_handle->big_buffer_length = length;
transfer_handle->big_buffer_cb = callback;
transfer_handle->big_buffer_cb_arg = callback_arg;
if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
res = globus_l_ftp_control_data_stream_read_write(
dc_handle,
buffer,
length,
0,
GLOBUS_FALSE,
callback,
callback_arg);
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
res = GLOBUS_SUCCESS;
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
while(!globus_fifo_empty(&stripe->free_conn_q))
{
globus_off_t end_offset;
globus_off_t end_buffer;
data_conn = (globus_ftp_data_connection_t *)
globus_fifo_dequeue(&stripe->free_conn_q);
end_offset = ((globus_off_t) data_conn->bytes_ready) +
data_conn->offset;
end_buffer = ((globus_off_t)
transfer_handle->big_buffer_length);
/*
* if the sender sent more bytes than the users
* buffer can handle
*/
if(end_offset > end_buffer)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("too much data has been sent."));
globus_l_ftp_control_stripes_destroy(dc_handle, err);
return globus_error_put(err);
}
else
{
globus_l_ftp_handle_table_entry_t * t_e;
transfer_handle->ref++;
TABLE_ENTRY_MALLOC(
t_e,
&transfer_handle->big_buffer[data_conn->offset],
data_conn->bytes_ready,
data_conn->offset,
GLOBUS_FALSE,
transfer_handle->big_buffer_cb,
transfer_handle->big_buffer_cb_arg,
dc_handle);
t_e->whos_my_daddy = data_conn;
/*
* register a read into the users buffer at the
* correct offset.
*/
res = globus_io_register_read(
&data_conn->io_handle,
&transfer_handle->big_buffer[data_conn->offset],
data_conn->bytes_ready,
data_conn->bytes_ready,
globus_l_ftp_eb_read_callback,
(void *)t_e);
globus_assert(res == GLOBUS_SUCCESS);
}
}
}
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : Invalid mode. Shouldn't happen."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
res = globus_error_put(err);
}
globus_l_ftp_data_stripe_poll(dc_handle);
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
globus_result_t
globus_i_ftp_control_data_activate()
{
globus_mutex_init(&globus_l_ftp_control_data_mutex, GLOBUS_NULL);
globus_cond_init(&globus_l_ftp_control_data_cond, GLOBUS_NULL);
globus_l_ftp_control_data_dc_list = GLOBUS_NULL;
/* keep this last */
globus_l_ftp_control_data_active = GLOBUS_TRUE;
globus_hashtable_init(
&globus_l_ftp_control_data_layout_table,
GFTPC_HASH_TABLE_SIZE,
globus_hashtable_string_hash,
globus_hashtable_string_keyeq);
globus_ftp_control_layout_register_func(
"Blocked",
globus_ftp_control_layout_blocked,
globus_ftp_control_layout_blocked_verify);
globus_ftp_control_layout_register_func(
"Partitioned",
globus_ftp_control_layout_partitioned,
globus_ftp_control_layout_partitioned_verify);
return GLOBUS_SUCCESS;
}
/*===================================================*/
void
globus_l_ftp_control_deactivate_quit_callback(
void * user_arg,
globus_ftp_control_handle_t * handle,
globus_object_t * error)
{
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
transfer_handle = (globus_i_ftp_dc_transfer_handle_t *)user_arg;
globus_mutex_lock(&globus_l_ftp_control_data_mutex);
{
globus_l_ftp_control_data_dc_count--;
globus_cond_signal(&globus_l_ftp_control_data_cond);
}
globus_mutex_unlock(&globus_l_ftp_control_data_mutex);
}
static
void
globus_l_ftp_control_data_layout_clean(
void * arg)
{
globus_l_ftp_c_data_layout_t * layout_info;
layout_info = (globus_l_ftp_c_data_layout_t *) arg;
globus_free(layout_info->name);
globus_free(layout_info);
}
globus_result_t
globus_i_ftp_control_data_deactivate()
{
globus_hashtable_destroy_all(
&globus_l_ftp_control_data_layout_table,
globus_l_ftp_control_data_layout_clean);
globus_cond_destroy(&globus_l_ftp_control_data_cond);
globus_mutex_destroy(&globus_l_ftp_control_data_mutex);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_l_ftp_control_data_stream_read_write(
globus_i_ftp_dc_handle_t * dc_handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_l_ftp_handle_table_entry_t * table_entry;
globus_ftp_data_stripe_t * stripe;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
static char * my_name =
"globus_l_ftp_control_data_stream_read_write";
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : In closing state."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
transfer_handle = dc_handle->transfer_handle;
/*
* allocate and populate the entry structure
*/
TABLE_ENTRY_MALLOC(
table_entry,
buffer,
length,
offset,
eof,
callback,
callback_arg,
dc_handle);
stripe = &transfer_handle->stripes[0];
globus_fifo_enqueue(&stripe->command_q,
(void *)table_entry);
/* every callback gets a reference count */
transfer_handle->ref++;
return GLOBUS_SUCCESS;
}
globus_result_t
globus_l_ftp_control_data_eb_write(
globus_i_ftp_dc_handle_t * dc_handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_result_t res;
globus_l_ftp_handle_table_entry_t * tmp_ent;
globus_ftp_data_stripe_t * stripe;
int ctr;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_ftp_control_data_write_info_t data_info;
globus_ftp_control_layout_func_t layout_func;
static char * my_name =
"globus_l_ftp_control_data_eb_write";
transfer_handle = dc_handle->transfer_handle;
layout_func = dc_handle->layout_func;
/*
* if eof has been registered reject all future writes
*/
if(transfer_handle->eof_registered)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : eof has already been registered"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
/*
* only allow zero length messages if eof is true
*/
if(length <= 0 && !eof)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : cannot register a zero length message unless you are signifing eof."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
my_name);
return globus_error_put(err);
}
globus_i_ftp_control_create_data_info(
dc_handle,
&data_info,
buffer,
length,
offset,
eof,
callback,
callback_arg);
if(length > 0)
{
if(layout_func)
{
transfer_handle->x_state = GLOBUS_TRUE;
layout_func(
dc_handle->whos_my_daddy,
&data_info,
buffer,
length,
offset,
eof,
transfer_handle->stripe_count,
dc_handle->layout_str,
dc_handle->layout_user_arg);
transfer_handle->x_state = GLOBUS_FALSE;
}
else
{
res = globus_i_ftp_control_data_write_stripe(
dc_handle,
buffer,
length,
offset,
eof,
0,
&data_info);
if(res != GLOBUS_SUCCESS)
{
/* need to free what was created in:
globus_i_ftp_control_create_data_info*/
return res;
}
}
}
/*
* if eof has been registered we must add a final message to
* all stripe queues that eof has been hit. for effiency if the
* queue is not empty turn eof on in it last message.
*
* each callback has a reference for each stripe it was registered
* on. Add another reference for every stripe since they all
* will have a eof message put on them.
*/
if(eof)
{
transfer_handle->eof_registered = GLOBUS_TRUE;
transfer_handle->eof_table_handle = data_info.callback_table_handle;
transfer_handle->eof_cb_ent =
globus_handle_table_lookup(&transfer_handle->handle_table,
data_info.callback_table_handle);
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
/*
* only register a new EOF message if one has not already
* been registered
*/
tmp_ent = GLOBUS_NULL;
if(!globus_fifo_empty(&stripe->command_q))
{
tmp_ent = (globus_l_ftp_handle_table_entry_t *)
globus_fifo_tail_peek(&stripe->command_q);
}
/*
* if no eof message has been registered on this stripe yet.
*/
if(tmp_ent == GLOBUS_NULL || !tmp_ent->eof)
{
TABLE_ENTRY_MALLOC(
tmp_ent,
buffer,
0,
0,
GLOBUS_TRUE,
GLOBUS_NULL,
GLOBUS_NULL,
dc_handle);
tmp_ent->callback_table_handle =
data_info.callback_table_handle;
globus_fifo_enqueue(&stripe->command_q,
(void *)tmp_ent);
}
/*
* inc reference on eof callback, x for the number of stripes
* it was broken accross and 1 for eof
*/
globus_handle_table_increment_reference(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle);
}
}
globus_i_ftp_control_release_data_info(
dc_handle,
&data_info);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_l_ftp_control_data_extended_block_enqueue(
globus_i_ftp_dc_handle_t * dc_handle,
globus_l_ftp_handle_table_entry_t * entry,
int chunk)
{
int stripe_ndx;
globus_off_t offset;
globus_ftp_data_stripe_t * stripe;
globus_l_ftp_handle_table_entry_t * tmp_ent;
globus_size_t size;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
transfer_handle = dc_handle->transfer_handle;
/* determine what stripe to put things on */
for(offset = entry->offset;
offset < entry->offset + entry->length;
offset += size)
{
if(chunk > 0)
{
stripe_ndx = (offset / chunk) %
transfer_handle->stripe_count;
stripe = &transfer_handle->stripes[stripe_ndx];
size = chunk - (offset % chunk);
if(size > entry->length - (offset - entry->offset))
{
size = entry->length - (offset - entry->offset);
}
}
/* if we only have 1 stripe put it all on it */
else
{
stripe_ndx = 0;
size = entry->length;
stripe = &transfer_handle->stripes[stripe_ndx];
}
TABLE_ENTRY_MALLOC(
tmp_ent,
&entry->buffer[(globus_size_t)(offset-entry->offset)],
size,
offset,
entry->eof,
entry->callback,
entry->callback_arg,
entry->dc_handle);
tmp_ent->callback_table_handle = entry->callback_table_handle;
globus_handle_table_increment_reference(
&tmp_ent->dc_handle->transfer_handle->handle_table,
tmp_ent->callback_table_handle);
globus_fifo_enqueue(&stripe->command_q, (void *) tmp_ent);
}
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_layout_register_func(
char * name,
globus_ftp_control_layout_func_t layout_func,
globus_ftp_control_layout_verify_func_t verify_func)
{
globus_l_ftp_c_data_layout_t * layout_info;
globus_object_t * err;
static char * myname=
"globus_ftp_control_local_register_func";
if(name == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"name",
1,
myname);
return globus_error_put(err);
}
if(layout_func == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"layout_func",
2,
myname);
return globus_error_put(err);
}
if(verify_func == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"verify_func",
3,
myname);
return globus_error_put(err);
}
layout_info = (globus_l_ftp_c_data_layout_t *)
globus_malloc(sizeof(globus_l_ftp_c_data_layout_t));
layout_info->layout_func = layout_func;
layout_info->verify_func = verify_func;
layout_info->name = strdup(name);
globus_mutex_lock(&globus_l_ftp_control_data_mutex);
{
globus_hashtable_insert(
&globus_l_ftp_control_data_layout_table,
name,
layout_info);
}
globus_mutex_unlock(&globus_l_ftp_control_data_mutex);
return GLOBUS_SUCCESS;
}
/**
* Update the handle with the layout and the size of the data sent
* over the data channel.
*
* This function is deprecated. The interface will be the changed to
* that of globus_X_ftp_control_local_layout()
*
* @param handle
* A pointer to the FTP control handle into which to insert the
* layout information.
* @param layout
* A variable containing the layout information
* @param data_size
* The size of the data that is going to be sent. This may be
* needed to interpret the layout information.
*/
globus_result_t
globus_ftp_control_local_layout(
globus_ftp_control_handle_t * handle,
globus_ftp_control_layout_t * layout,
globus_size_t data_size)
{
globus_i_ftp_dc_handle_t * dc_handle;
char strmsg[512];
void * user_arg;
globus_object_t * err;
globus_result_t res;
static char * myname=
"globus_ftp_control_local_layout";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(layout == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"layout",
2,
myname);
return globus_error_put(err);
}
if(layout->mode == GLOBUS_FTP_CONTROL_STRIPING_BLOCKED_ROUND_ROBIN)
{
if(layout->round_robin.block_size <= 0)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : round robin block size must be greater than 0."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
return globus_error_put(err);
}
user_arg = GLOBUS_NULL;
sprintf(strmsg, "StripedLayout=Blocked;BlockSize=%ld;",
(long) layout->round_robin.block_size);
}
else if(layout->mode == GLOBUS_FTP_CONTROL_STRIPING_PARTITIONED)
{
if(layout->partitioned.size <= 0)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : partition block size must be greater than 0."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
return globus_error_put(err);
}
sprintf(strmsg, "StripedLayout=Partitioned;");
user_arg = globus_ftp_control_layout_partitioned_user_arg_create(
layout->partitioned.size);
}
else if(layout->mode == GLOBUS_FTP_CONTROL_STRIPING_NONE)
{
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->layout_func = GLOBUS_NULL;
dc_handle->layout_user_arg = GLOBUS_NULL;
if(dc_handle->layout_str != GLOBUS_NULL)
{
free(dc_handle->layout_str);
}
dc_handle->layout_str = GLOBUS_NULL;
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : unknown type."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
return globus_error_put(err);
}
res = globus_X_ftp_control_local_layout(
handle,
strmsg,
user_arg);
return res;
}
globus_result_t
globus_X_ftp_control_local_layout(
globus_ftp_control_handle_t * handle,
char * layout_str,
void * user_arg)
{
globus_l_ftp_c_data_layout_t * layout_info;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
char * name;
char * tmp_ptr;
globus_result_t res;
static char * myname=
"globus_ftp_control_local_layout";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(layout_str == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"layout_str",
2,
myname);
return globus_error_put(err);
}
name = (char *)globus_malloc(strlen(layout_str));
if(sscanf(layout_str, "StripedLayout=%s;", name) < 1)
{
globus_free(name);
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : Enqueue string has invalid format. Must be of the form: StripedLayout=;[parameteres]"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname));
}
tmp_ptr = strstr(name, ";");
if(tmp_ptr == GLOBUS_NULL)
{
globus_free(name);
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : Enqueue string has invalid format. Must be of the form: StripedLayout=;[parameteres]"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname));
}
*tmp_ptr = '\0';
globus_mutex_lock(&globus_l_ftp_control_data_mutex);
{
layout_info = globus_hashtable_lookup(
&globus_l_ftp_control_data_layout_table,
name);
}
globus_mutex_unlock(&globus_l_ftp_control_data_mutex);
globus_free(name);
if(layout_info == GLOBUS_NULL)
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : layout name has not be registered"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname));
}
res = layout_info->verify_func(layout_str);
if(res != GLOBUS_SUCCESS)
{
return res;
}
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->layout_func = layout_info->layout_func;
dc_handle->layout_user_arg = user_arg;
if(dc_handle->layout_str != GLOBUS_NULL)
{
free(dc_handle->layout_str);
}
dc_handle->layout_str = strdup(layout_str);
}
globus_mutex_unlock(&dc_handle->mutex);
return GLOBUS_SUCCESS;
}
/**
* Create a globus_ftp_control_data_write_info_t structure.
*
* This funciton populates a globus_ftp_control_data_callback_t
* structure with valid information. This structure provides the user
* a way to register several data writes with a single callback. This
* is quite useful to the writter of enqueue functions. It allows a
* single call to globus_ftp_control_data_write() to be broken up
* into many writes, potentially on different stripes, and for a single
* callback to be called when all are finished.
*
* @param handle
* A pointer to a FTP control handle. The handle contains
* information about the current state of the control and data
* connections.
* @param data_info
* The globus_ftp_control_data_write_info_t structure to be released.
* @param buffer
* The pointer to the user buffer that will be passed to the
* callback argument when there are zero references to data_info.
* This is intended to be the start of all the data the user intends
* to write using globus_ftp_control_data_write_stripe(), but it
* does not have to be.
* @param length
* The length of the memory segment pointed to by the argument buffer.
* @param offset
* The file offset of the data segment specified.
* @param eof
* This should be set to true if the user plans on registering eof
* on the data_info structure.
* @param callback
* The user function to be called when all references to data_info
* are released. This occurs after all data registered for write
* from globus_ftp_control_data_write_stripe have occured and the
* user calls globus_ftp_control_release_data_info(). The callback
* is passed all of the arguments passed to this function with the
* exception of data_info.
* @param callback_arg
* User supplied argument to the callback function
*/
globus_result_t
globus_ftp_control_create_data_info(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_object_t * err;
static char * myname=
"globus_ftp_control_create_data_info";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(data_info == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"data_info",
2,
myname);
return globus_error_put(err);
}
if(callback == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"callback",
3,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : Handle not in the proper state"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname));
}
else
{
res = globus_i_ftp_control_create_data_info(
dc_handle,
data_info,
buffer,
length,
offset,
eof,
callback,
callback_arg);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Release a data_info structure.
*
* This function releases all memory and references created when a call
* to globus_ftp_control_create_data_info() was made. For every call to
* globus_ftp_control_create_data_info() a call to this function must be
* made.
*
* @param handle
* A pointer to a FTP control handle. The handle contains
* information about the current state of the control and data
* connections.
* @param data_info
* The globus_ftp_control_data_write_info_t structure to be released.
*/
globus_result_t
globus_ftp_control_release_data_info(
globus_ftp_control_handle_t * handle,
globus_ftp_control_data_write_info_t * data_info)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_object_t * err;
static char * myname=
"globus_ftp_control_release_data_info";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(data_info == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"data_info",
2,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
res = globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : Handle not in the proper state"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname));
}
else
{
res = globus_i_ftp_control_release_data_info(
dc_handle,
data_info);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Write FTP data to a particular stripe.
*
* This function allows the user to write to a specified stripe. The stripe
* index relates to the order passsed into local_spor(). This function
* differs from globus_ftp_control_data_write() in that no enqueue function
* is needed since the user specifies the stripe on which data is written.
* In order to use this function the user must have a valid pointer to a
* globus_ftp_control_data_write_info_t structure. The data_info structure
* can be obtained by a call to globus_ftp_control_create_data_info().
* Many calls to this function can be made, but only a single user callback
* occurs per creation of a globus_ftp_control_data_write_info_t structure.
*
* @param handle
* A pointer to a FTP control handle. The handle contains
* information about the current state of the control and data
* connections.
* @param buffer
* a pointer to the data the user wishes to send along the FTP
* data channels.
* @param length
* the length of the data pointer to by the parameter buffer.
* @param offset
* the offset into the file of the data.
* @param eof
* A boolean stating that this will be the last chuck of data
* registered on the given stripe. In order to properly send an eof
* message the user must register an eof on every stripe.
* @param stripe_ndx
* The index of the stripe on which the data will be sent. The index
* of each stripe is determined by the call to local_spas or local_spor.
* @param callback
* The function to be called once the data has been sent
* @param callback_arg
* User supplied argument to the callback function
*/
globus_result_t
globus_ftp_control_data_write_stripe(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
int stripe_ndx,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_ftp_control_data_write_info_t data_info;
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_object_t * err;
static char * myname=
"globus_ftp_control_data_write_stripe";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(buffer == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"buffer",
2,
myname);
return globus_error_put(err);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->transfer_handle == GLOBUS_NULL)
{
globus_mutex_unlock(&dc_handle->mutex);
err = dc_handle->connect_error
? globus_object_copy(dc_handle->connect_error)
: globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Handle not in the proper state"));
return globus_error_put(err);
}
res = globus_i_ftp_control_create_data_info(
dc_handle,
&data_info,
buffer,
length,
offset,
eof,
callback,
callback_arg);
if(res != GLOBUS_SUCCESS)
{
globus_mutex_unlock(&dc_handle->mutex);
goto exit;
}
res = globus_i_ftp_control_data_write_stripe(
dc_handle,
buffer,
length,
offset,
eof,
stripe_ndx,
&data_info);
res = globus_i_ftp_control_release_data_info(
dc_handle,
&data_info);
exit:
globus_l_ftp_data_stripe_poll(dc_handle);
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Write data on a specific stripe from an enqueue callback function only.
*
* This function allows the user to register the write of ftp data on
* a specfic stripe. This function can only be called fromed an enqueue
* function callback. This function should be used only by the implementor
* of an enqueue funciton. It should be viewed as unstable and used used
* only by advanced users. This is the only function in the library that
* the enqueue function implemtor is allowed from the enqueue callback.
*
* @param handle
* A pointer to a FTP control handle. The handle contains
* information about the current state of the control and data
* connections.
* @param buffer
* a pointer to the data the user wishes to send along the FTP
* data channels.
* @param length
* the length of the data pointer to by the parameter buffer.
* @param offset
* the offset into the file of the data.
* @param eof
* a boolean stating that this is the last buffer to be registered.
* When using the _X_ version of this function the user does not
* need to register an eof on each stripe, the control library will take
* care of that internally.
* @param stripe_ndx
* The index of the stripe on which the data will be sent. The index
* of each stripe is determined by the call to local_spas or local_spor.
* @param data_info
* An opaque structure that is passed into the enqueue function and
* contains reference count and state information. The same data_info
* pointer that is passed into the enqueue function must be used for this
* parameter.
*
*/
globus_result_t
globus_X_ftp_control_data_write_stripe(
globus_ftp_control_handle_t * handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
int stripe_ndx,
globus_ftp_control_data_write_info_t * data_info)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_object_t * err;
static char * myname=
"globus_X_ftp_control_data_write_stripe";
/*
* error checking
*/
if(handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(buffer == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"buffer",
2,
myname);
return globus_error_put(err);
}
/* check to see if in special state */
if(dc_handle->transfer_handle == GLOBUS_NULL ||
!dc_handle->transfer_handle->x_state)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : not in X state"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
return globus_error_put(err);
}
res = globus_i_ftp_control_data_write_stripe(
dc_handle,
buffer,
length,
offset,
eof,
stripe_ndx,
data_info);
return res;
}
/*
* internal stripe write functions
*/
globus_result_t
globus_i_ftp_control_data_write_stripe(
globus_i_ftp_dc_handle_t * dc_handle,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
int stripe_ndx,
globus_ftp_control_data_write_info_t * data_info)
{
globus_l_ftp_handle_table_entry_t * tmp_ent;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_object_t * err;
static char * myname =
"globus_i_ftp_control_data_write_stripe";
transfer_handle = dc_handle->transfer_handle;
if(transfer_handle == GLOBUS_NULL)
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : Handle not in the proper state"),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname));
}
if(transfer_handle->eof_registered)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : eof has already been registered."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
return globus_error_put(err);
}
/*
* only allow zero length messages if eof is true
*/
if(length <= 0 && !eof)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("[%s]:%s() : cannot register a zero length message unless you are signifing eof."),
GLOBUS_FTP_CONTROL_MODULE->module_name,
myname);
return globus_error_put(err);
}
stripe = &transfer_handle->stripes[stripe_ndx];
TABLE_ENTRY_MALLOC(
tmp_ent,
buffer,
length,
offset,
eof,
data_info->cb,
data_info->cb_arg,
dc_handle);
tmp_ent->callback_table_handle = data_info->callback_table_handle;
globus_handle_table_increment_reference(
&tmp_ent->dc_handle->transfer_handle->handle_table,
tmp_ent->callback_table_handle);
globus_fifo_enqueue(&stripe->command_q, (void *) tmp_ent);
return GLOBUS_SUCCESS;
}
globus_result_t
globus_i_ftp_control_create_data_info(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_write_info_t * data_info,
globus_byte_t * buffer,
globus_size_t length,
globus_off_t offset,
globus_bool_t eof,
globus_ftp_control_data_callback_t callback,
void * callback_arg)
{
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_l_ftp_handle_table_entry_t * table_entry;
transfer_handle = dc_handle->transfer_handle;
transfer_handle->ref++;
TABLE_ENTRY_MALLOC(
table_entry,
buffer,
length,
offset,
eof,
callback,
callback_arg,
dc_handle);
/*
* insert main structure into the callback table
*/
table_entry->callback_table_handle = globus_handle_table_insert(
&transfer_handle->handle_table,
(void *)table_entry,
1);
data_info->callback_table_handle = table_entry->callback_table_handle;
data_info->cb = callback;
data_info->cb_arg = callback_arg;
return GLOBUS_SUCCESS;
}
static
void
globus_l_ftp_control_release_data_kickout(
void * user_args)
{
globus_l_ftp_handle_table_entry_t * cb_ent;
cb_ent = (globus_l_ftp_handle_table_entry_t *)user_args;
cb_ent->callback(
cb_ent->callback_arg,
cb_ent->dc_handle->whos_my_daddy,
GLOBUS_NULL,
cb_ent->buffer,
cb_ent->length,
cb_ent->offset,
cb_ent->eof);
globus_free(cb_ent);
}
globus_result_t
globus_i_ftp_control_release_data_info(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_data_write_info_t * data_info)
{
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_l_ftp_handle_table_entry_t * cb_ent;
globus_reltime_t reltime;
transfer_handle = dc_handle->transfer_handle;
cb_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
data_info->callback_table_handle);
/*
* if this was the last reference held we must register
* a oneshot for the users callback
*/
if(!globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
data_info->callback_table_handle))
{
GlobusTimeReltimeSet(reltime, 0, 0);
globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_release_data_kickout,
(void *) cb_ent);
}
return GLOBUS_SUCCESS;
}
/**********************************************************************
* poll functions
**********************************************************************/
/*
* poll all stripes
*/
globus_result_t
globus_l_ftp_data_stripe_poll(
globus_i_ftp_dc_handle_t * dc_handle)
{
globus_ftp_data_stripe_t * stripe;
globus_result_t result;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
transfer_handle = dc_handle->transfer_handle;
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
/*
* i can do this since this function is only called
* internally
*/
result = globus_error_put(GLOBUS_ERROR_NO_INFO);
}
else
{
if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
if(transfer_handle != GLOBUS_NULL)
{
stripe = &transfer_handle->stripes[0];
globus_l_ftp_data_stream_stripe_poll(stripe);
}
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
globus_l_ftp_data_eb_poll(dc_handle);
}
result = GLOBUS_SUCCESS;
}
return result;
}
/*
* poll a specific stripe
* ----------------------
* dequeue the next item in the queue an register it for read or write
* this should be called locked
*/
globus_result_t
globus_l_ftp_data_stream_stripe_poll(
globus_ftp_data_stripe_t * stripe)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_ftp_data_connection_t * data_conn;
globus_result_t result;
globus_assert(stripe->whos_my_daddy->whos_my_daddy->mode == GLOBUS_FTP_CONTROL_MODE_STREAM);
/*
* check to see that there is a connection
*/
while(!globus_fifo_empty(&stripe->free_conn_q) &&
!globus_fifo_empty(&stripe->command_q))
{
entry = (globus_l_ftp_handle_table_entry_t *)
globus_fifo_peek(&stripe->command_q);
data_conn = (globus_ftp_data_connection_t *)
globus_fifo_peek(&stripe->free_conn_q);
if(data_conn != GLOBUS_NULL)
{
entry->whos_my_daddy = data_conn;
if(entry->direction == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE)
{
globus_byte_t * tmp_buf = entry->buffer;
globus_off_t tmp_len;
tmp_len = entry->length;
if(stripe->whos_my_daddy->whos_my_daddy->type ==
GLOBUS_FTP_CONTROL_TYPE_ASCII)
{
entry->ascii_buffer = globus_l_ftp_control_add_ascii(
entry->buffer,
entry->length,
&tmp_len);
if(entry->ascii_buffer)
{
tmp_buf = entry->ascii_buffer;
}
}
/* remove from queue */
globus_fifo_dequeue(&stripe->command_q);
globus_fifo_dequeue(&stripe->free_conn_q);
result = globus_io_register_write(
&data_conn->io_handle,
tmp_buf,
tmp_len,
globus_l_ftp_stream_write_callback,
(void *)entry);
globus_assert(result == GLOBUS_SUCCESS);
}
else if(entry->direction == GLOBUS_FTP_DATA_STATE_CONNECT_READ)
{
/* remove from queue */
globus_fifo_dequeue(&stripe->command_q);
globus_fifo_dequeue(&stripe->free_conn_q);
result = globus_io_register_read(
&data_conn->io_handle,
entry->buffer,
entry->length,
entry->length,
globus_l_ftp_stream_read_callback,
(void *)entry);
globus_assert(result == GLOBUS_SUCCESS);
}
}
}
return GLOBUS_SUCCESS;
}
int
globus_i_ftp_queue_size(
globus_ftp_control_handle_t * handle,
int stripe_ndx)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
dc_handle = &handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
transfer_handle = dc_handle->transfer_handle;
stripe = &transfer_handle->stripes[stripe_ndx];;
return globus_fifo_size(&stripe->command_q);
}
globus_result_t
globus_l_ftp_data_eb_poll(
globus_i_ftp_dc_handle_t * dc_handle)
{
globus_ftp_data_stripe_t * stripe;
globus_l_ftp_handle_table_entry_t * entry;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_connection_t * data_conn2;
globus_l_ftp_eb_header_t * eb_header;
struct iovec * io_vec;
globus_result_t res;
globus_bool_t done = GLOBUS_FALSE;
globus_reltime_t reltime;
globus_off_t tmp_len;
globus_byte_t * tmp_buf;
int ctr;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
transfer_handle = dc_handle->transfer_handle;
if(transfer_handle == GLOBUS_NULL)
{
return GLOBUS_SUCCESS;
}
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
/* if entry is a write */
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_SEND_EOF)
{
if(!globus_fifo_empty(&stripe->command_q))
{
globus_l_ftp_control_data_adjust_connection(stripe);
}
while(!globus_fifo_empty(&stripe->free_conn_q) &&
!globus_fifo_empty(&stripe->command_q))
{
entry = (globus_l_ftp_handle_table_entry_t *)
globus_fifo_dequeue(&stripe->command_q);
data_conn = (globus_ftp_data_connection_t *)
globus_fifo_dequeue(&stripe->free_conn_q);
entry->whos_my_daddy = data_conn;
if(entry->direction == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE)
{
/*
* if an eof message
*/
if(entry->eof)
{
/*
* increment the callback reference to all
* current data connections
* stripe->connection_count
*/
globus_handle_table_increment_reference_by(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle,
stripe->connection_count +
stripe->outstanding_connections - 1);
/*
* if there is no payload use this data connection
* to send and EOF message if we are sending the
* EOF message
*/
if(entry->length == 0)
{
/* send eof message */
if(dc_handle->send_eof)
{
res = globus_l_ftp_control_data_register_eof(
stripe,
data_conn);
globus_assert(res == GLOBUS_SUCCESS);
globus_free(entry);
}
/* send eod message */
else
{
transfer_handle->ref++;
/* kick out a callback */
GlobusTimeReltimeSet(reltime, 0, 0);
globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_send_data_kickout,
(void *) entry);
}
}
/*
* if there is payload
*/
else
{
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
eb_header->descriptor = 0;
tmp_buf = entry->buffer;
tmp_len = entry->length;
if(stripe->whos_my_daddy->whos_my_daddy->type ==
GLOBUS_FTP_CONTROL_TYPE_ASCII)
{
entry->ascii_buffer =
globus_l_ftp_control_add_ascii(
entry->buffer,
entry->length,
&tmp_len);
tmp_buf = entry->ascii_buffer;
}
globus_l_ftp_control_data_encode(
eb_header->count,
tmp_len);
globus_l_ftp_control_data_encode(
eb_header->offset,
entry->offset);
io_vec = (struct iovec *)globus_malloc(
sizeof(struct iovec) * 2);
/* populate the header */
io_vec[0].iov_base = eb_header;
io_vec[0].iov_len =
sizeof(globus_l_ftp_eb_header_t);
io_vec[1].iov_base = tmp_buf;
io_vec[1].iov_len = tmp_len;
res = globus_io_register_writev(
&data_conn->io_handle,
io_vec,
2,
globus_l_ftp_eb_write_callback,
(void *)entry);
globus_assert(res == GLOBUS_SUCCESS);
}
/* this will stop adjusting connections */
stripe->eof = GLOBUS_TRUE;
/*
* register an empty EOD on all data connection
* except for the one that was just removed. We
* will need that connection open to send
* final EOF message.
*/
while(!globus_fifo_empty(&stripe->free_conn_q))
{
data_conn2 = (globus_ftp_data_connection_t *)
globus_fifo_dequeue(&stripe->free_conn_q);
res = globus_l_ftp_control_data_register_eod(
stripe,
data_conn2);
globus_assert(res == GLOBUS_SUCCESS);
}
}
/* not an eof message */
else
{
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
eb_header->descriptor = 0;
tmp_buf = entry->buffer;
tmp_len = entry->length;
if(stripe->whos_my_daddy->whos_my_daddy->type ==
GLOBUS_FTP_CONTROL_TYPE_ASCII)
{
entry->ascii_buffer =
globus_l_ftp_control_add_ascii(
entry->buffer,
entry->length,
&tmp_len);
tmp_buf = entry->ascii_buffer;
}
globus_l_ftp_control_data_encode(
eb_header->count,
tmp_len);
globus_l_ftp_control_data_encode(
eb_header->offset,
entry->offset);
io_vec = (struct iovec *)globus_malloc(
sizeof(struct iovec) * 2);
/* populate the header */
io_vec[0].iov_base = eb_header;
io_vec[0].iov_len = sizeof(globus_l_ftp_eb_header_t);
io_vec[1].iov_base = tmp_buf;
io_vec[1].iov_len = tmp_len;
res = globus_io_register_writev(
&data_conn->io_handle,
io_vec,
2,
globus_l_ftp_eb_write_callback,
(void *)entry);
globus_assert(res == GLOBUS_SUCCESS);
}
}
else if(entry->direction == GLOBUS_FTP_DATA_STATE_SEND_EOF)
{
globus_l_ftp_send_eof_entry_t * tmp_ent;
tmp_ent = (globus_l_ftp_send_eof_entry_t *)entry;
res = globus_l_ftp_control_data_send_eof(
dc_handle,
data_conn,
(globus_l_ftp_send_eof_entry_t *)tmp_ent);
globus_assert(res == GLOBUS_SUCCESS);
}
}/* end while */
}
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_READ
|| (dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF &&
transfer_handle->direction == GLOBUS_FTP_DATA_STATE_CONNECT_READ))
{
/*
* if we are reading a big buffer
*/
if(transfer_handle->big_buffer != GLOBUS_NULL)
{
if(stripe->eod_count == stripe->eods_received)
{
transfer_handle->ref++;
/* delay setting eof till command kickout */
/* dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF; */
TABLE_ENTRY_MALLOC(
entry,
transfer_handle->big_buffer,
0,
transfer_handle->big_buffer_length,
GLOBUS_TRUE,
transfer_handle->big_buffer_cb,
transfer_handle->big_buffer_cb_arg,
dc_handle);
transfer_handle->big_buffer = GLOBUS_NULL;
GlobusTimeReltimeSet(reltime, 0, 0);
globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_command_kickout,
(void *) entry);
}
}
/*
* in big buffer mode this should never be entered
*/
while(!globus_fifo_empty(&stripe->command_q) && !done)
{
globus_assert(transfer_handle->big_buffer == GLOBUS_NULL);
/*
* if we are at EOF we can not register a read,
* simply kick out the callback with eof set to true.
*/
if(stripe->eod_count == stripe->eods_received)
{
/* delay setting eof till command kickout */
/* dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF; */
entry = (globus_l_ftp_handle_table_entry_t *)
globus_fifo_dequeue(&stripe->command_q);
/*
* once EOF is set to true there should be no more
* data connections
*/
globus_assert(globus_fifo_empty(&stripe->free_conn_q));
GlobusTimeReltimeSet(reltime, 0, 0);
globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_command_kickout,
(void *) entry);
}
/*
* if we are not at eof and there is a free data connection
*/
else if(!globus_fifo_empty(&stripe->free_conn_q))
{
entry = (globus_l_ftp_handle_table_entry_t *)
globus_fifo_dequeue(&stripe->command_q);
data_conn = (globus_ftp_data_connection_t *)
globus_fifo_dequeue(&stripe->free_conn_q);
/*
* set the entries offset to the offset on the
* data_conn.
* If use is requesting more bytes than are availuable
* on this connection set the length to bytes_ready
*/
entry->whos_my_daddy = data_conn;
entry->offset = data_conn->offset;
if(entry->length > data_conn->bytes_ready)
{
entry->length = data_conn->bytes_ready;
}
/*
* register a read
*/
res = globus_io_register_read(
&data_conn->io_handle,
entry->buffer,
entry->length,
entry->length,
globus_l_ftp_eb_read_callback,
(void *)entry);
globus_assert(res == GLOBUS_SUCCESS);
}
/*
* if we have not hit EOF and there are no availuable data
* connections
*/
else
{
done = GLOBUS_TRUE;
}
}/* end while */
}
}
return GLOBUS_SUCCESS;
}
/*
* globus_l_ftp_control_data_register_eof()
* ----------------------------------------
* build and resister an eof message. decrement the number of
* connections on the current stripe.
*/
globus_result_t
globus_l_ftp_control_data_register_eof(
globus_ftp_data_stripe_t * stripe,
globus_ftp_data_connection_t * data_conn)
{
globus_l_ftp_eb_header_t * eb_header;
globus_result_t res;
globus_l_ftp_data_callback_info_t * cb_info;
globus_assert(stripe->eof_sent == GLOBUS_FALSE);
if(stripe->eof_sent)
{
/* i can do this because I only use this internally */
return globus_error_put(GLOBUS_ERROR_NO_INFO);
}
stripe->eof_sent = GLOBUS_TRUE;
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
memset(eb_header, '\0', sizeof(globus_l_ftp_eb_header_t));
eb_header->descriptor =
GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOF |
GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOD;
globus_l_ftp_control_data_encode(
eb_header->offset,
stripe->total_connection_count);
CALLBACK_INFO_MALLOC(
cb_info,
stripe->whos_my_daddy->whos_my_daddy,
stripe->whos_my_daddy,
stripe,
data_conn);
stripe->connection_count--;
stripe->whos_my_daddy->ref++;
res = globus_io_register_write(
&data_conn->io_handle,
(globus_byte_t *)eb_header,
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_eb_eof_eod_callback,
(void *)cb_info);
return res;
}
/*
* globus_l_ftp_control_data_register_eod()
* ----------------------------------------
* creates and registeres a empty EOD message on the
* given connection. decrements the connection count.
*/
globus_result_t
globus_l_ftp_control_data_register_eod(
globus_ftp_data_stripe_t * stripe,
globus_ftp_data_connection_t * data_conn)
{
globus_l_ftp_eb_header_t * eb_header;
globus_result_t res;
globus_l_ftp_data_callback_info_t * cb_info;
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
memset(eb_header, '\0', sizeof(globus_l_ftp_eb_header_t));
eb_header->descriptor =
GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOD;
stripe->whos_my_daddy->ref++;
stripe->connection_count--;
CALLBACK_INFO_MALLOC(
cb_info,
stripe->whos_my_daddy->whos_my_daddy,
stripe->whos_my_daddy,
stripe,
data_conn);
res = globus_io_register_write(
&data_conn->io_handle,
(globus_byte_t *)eb_header,
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_eb_eof_eod_callback,
(void *)cb_info);
globus_assert(res == GLOBUS_SUCCESS);
return res;
}
/*
* this function is kicked out when eof is not automatically sent.
* When not automatically sent we need to leave a final data connection
* open for sending the eof message. This function will call the users
* callback if all reference to the eof function are gone.
*
* This function works like a dummy _eod callback.
*/
static
void
globus_l_ftp_control_send_data_kickout(
void * user_args)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_control_data_callback_t eof_callback = GLOBUS_NULL;
globus_l_ftp_handle_table_entry_t * eof_cb_ent;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_l_ftp_handle_table_entry_t * entry;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_bool_t poll;
globus_l_ftp_send_eof_entry_t * send_eof_ent = GLOBUS_NULL;
entry = (globus_l_ftp_handle_table_entry_t *)user_args;
data_conn = entry->whos_my_daddy;
stripe = data_conn->whos_my_daddy;
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
transfer_handle = entry->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
eof_cb_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle);
if(eof_cb_ent && !globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle))
{
eof_callback = eof_cb_ent->callback;
send_eof_ent = transfer_handle->send_eof_ent;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
/*
* if the send_eof callback has already happened
* we call it, otherwise we set the state to SEND_EOF
*/
if(send_eof_ent == GLOBUS_NULL)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_SEND_EOF;
}
else
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
}
}
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
}
globus_mutex_unlock(&dc_handle->mutex);
if(eof_callback != GLOBUS_NULL)
{
eof_callback(
eof_cb_ent->callback_arg,
dc_handle->whos_my_daddy,
GLOBUS_NULL,
eof_cb_ent->buffer,
eof_cb_ent->length,
eof_cb_ent->offset,
GLOBUS_TRUE);
globus_free(eof_cb_ent);
}
/*
* call the send eof callback. This is done to insure that it
* is called after the eof callback
*/
if(send_eof_ent != GLOBUS_NULL)
{
send_eof_ent->cb(
send_eof_ent->user_arg,
dc_handle->whos_my_daddy,
GLOBUS_NULL);
}
globus_mutex_lock(&dc_handle->mutex);
{
/*
* decrement the reference the callbacks had
*/
if(eof_callback != GLOBUS_NULL)
{
globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
if(send_eof_ent != GLOBUS_NULL)
{
globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
/*
* decrement the reference this callback has
*/
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(entry);
}
/*
* this should be called with the control_handle mutex locked
*/
void
globus_l_ftp_control_stripes_create(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_host_port_t addresses[],
int stripe_count)
{
int ctr;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
dc_handle->transfer_handle = (globus_i_ftp_dc_transfer_handle_t *)
globus_malloc(sizeof(globus_i_ftp_dc_transfer_handle_t));
transfer_handle = dc_handle->transfer_handle;
transfer_handle->mutex = &dc_handle->mutex;
transfer_handle->eof_registered = GLOBUS_FALSE;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
transfer_handle->big_buffer = GLOBUS_NULL;
transfer_handle->big_buffer_cb = GLOBUS_NULL;
transfer_handle->big_buffer_cb_arg = GLOBUS_NULL;
transfer_handle->send_eof_ent = GLOBUS_NULL;
transfer_handle->x_state = GLOBUS_FALSE;
transfer_handle->direction = GLOBUS_FTP_DATA_STATE_NONE;
transfer_handle->whos_my_daddy = dc_handle;
transfer_handle->control_handle = dc_handle->whos_my_daddy;
transfer_handle->ref = 1;
globus_list_insert(&dc_handle->transfer_list, transfer_handle);
globus_handle_table_init(
&transfer_handle->handle_table,
GLOBUS_NULL);
/*
* Add new structure to list for destruction in case
* deactivate is called without properly destroying it.
*/
globus_list_insert(
&globus_l_ftp_control_data_dc_list,
(void *)transfer_handle);
transfer_handle->stripes =
(globus_ftp_data_stripe_t *)
globus_malloc(sizeof(globus_ftp_data_stripe_t) * stripe_count);
transfer_handle->stripe_count = stripe_count;
for(ctr = 0; ctr < stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
globus_i_ftp_parallelism_copy(&stripe->parallel,
&dc_handle->parallel);
stripe->stripe_ndx = ctr;
stripe->outstanding_connections = 0;
globus_fifo_init(&stripe->free_conn_q);
stripe->all_conn_list = GLOBUS_NULL;
stripe->outstanding_conn_list = GLOBUS_NULL;
stripe->free_cache_list = GLOBUS_NULL;
stripe->listening = GLOBUS_FALSE;
globus_fifo_init(&stripe->command_q);
stripe->total_connection_count = 0;
stripe->eods_received = 0;
stripe->eof_sent = GLOBUS_FALSE;
stripe->eof = GLOBUS_FALSE;
stripe->eod_count = -1;
stripe->whos_my_daddy = transfer_handle;
stripe->connection_count = 0;
globus_ftp_control_host_port_copy(&stripe->host_port, &addresses[ctr]);
transfer_handle->ref++;
}
}
globus_result_t
globus_l_ftp_control_register_close_msg(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_data_connection_t * data_conn)
{
globus_l_ftp_eb_header_t * eb_header;
globus_result_t res;
globus_l_ftp_data_callback_info_t * cb_info;
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
memset(eb_header, '\0', sizeof(globus_l_ftp_eb_header_t));
eb_header->descriptor |= GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_CLOSE;
if(data_conn->eod)
{
eb_header->descriptor |= GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOD;
}
CALLBACK_INFO_MALLOC(
cb_info,
dc_handle,
dc_handle->transfer_handle,
data_conn->whos_my_daddy,
data_conn);
res = globus_io_register_write(
&data_conn->io_handle,
(globus_byte_t *)eb_header,
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_close_msg_callback,
(void *)cb_info);
return res;
}
static
void
globus_l_ftp_control_io_close_kickout(
void * user_args)
{
globus_l_ftp_io_close_callback(user_args, GLOBUS_NULL, GLOBUS_SUCCESS);
}
/*
* globus_l_ftp_control_stripes_destroy()
* --------------------------------------
* destory all structures and connections associated with a stripe
* close all data connections on a given stripe
* this should be called locked
*/
void
globus_l_ftp_control_stripes_destroy(
globus_i_ftp_dc_handle_t * dc_handle,
globus_object_t * error)
{
globus_ftp_data_connection_t * data_conn;
int ctr;
globus_ftp_data_stripe_t * stripe;
globus_l_ftp_data_callback_info_t * callback_info;
globus_result_t res;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_list_t * list;
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING ||
dc_handle->transfer_handle == GLOBUS_NULL)
{
/* I can do this because i only use it internally */
return;
}
transfer_handle = dc_handle->transfer_handle;
dc_handle->state = GLOBUS_FTP_DATA_STATE_CLOSING;
/*
* orphine transfer handle
*/
dc_handle->transfer_handle = GLOBUS_NULL;
/*
* clean up all the stripes
*/
for(ctr = 0; transfer_handle != GLOBUS_NULL &&
ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
/*
* if there are outstanding commands to process call all the
* callbacks with errors
*/
globus_l_error_flush_command_q(stripe, error);
/*
* register close on all open data connections
*/
while(!globus_list_empty(stripe->all_conn_list))
{
data_conn = (globus_ftp_data_connection_t *)
globus_list_first(stripe->all_conn_list);
data_conn->free_me = GLOBUS_TRUE;
CALLBACK_INFO_MALLOC(
callback_info,
dc_handle,
transfer_handle,
stripe,
data_conn);
/*
* this will force out all remaining callbacks
*/
res = globus_io_register_close(
&data_conn->io_handle,
globus_l_ftp_io_close_callback,
(void *)callback_info);
if(res != GLOBUS_SUCCESS)
{
res = globus_callback_register_oneshot(
GLOBUS_NULL,
GLOBUS_NULL,
globus_l_ftp_control_io_close_kickout,
callback_info);
globus_assert(res == GLOBUS_SUCCESS);
}
globus_list_remove(
&stripe->all_conn_list,
stripe->all_conn_list);
}
for(list = stripe->outstanding_conn_list;
!globus_list_empty(list);
list = globus_list_rest(list))
{
data_conn = (globus_ftp_data_connection_t *)
globus_list_first(list);
data_conn->free_me = GLOBUS_FALSE;
CALLBACK_INFO_MALLOC(
callback_info,
dc_handle,
transfer_handle,
stripe,
data_conn);
res = globus_io_register_close(
&data_conn->io_handle,
globus_l_ftp_io_close_callback,
(void *)callback_info);
if(res != GLOBUS_SUCCESS)
{
res = globus_callback_register_oneshot(
GLOBUS_NULL,
GLOBUS_NULL,
globus_l_ftp_control_io_close_kickout,
callback_info);
globus_assert(res == GLOBUS_SUCCESS);
}
}
globus_list_free(stripe->free_cache_list);
if(stripe->listening)
{
stripe->listening = GLOBUS_FALSE;
CALLBACK_INFO_MALLOC(
callback_info,
dc_handle,
transfer_handle,
stripe,
GLOBUS_NULL);
res = globus_io_register_close(
&stripe->listener_handle,
globus_l_ftp_io_close_callback,
(void *)callback_info);
if(res != GLOBUS_SUCCESS)
{
res = globus_callback_register_oneshot(
GLOBUS_NULL,
GLOBUS_NULL,
globus_l_ftp_control_io_close_kickout,
callback_info);
globus_assert(res == GLOBUS_SUCCESS);
}
}
/* remove the reference the stripe had to it */
globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
/*
* remove reference the transfer handle has to itself
*/
globus_l_ftp_control_dc_dec_ref(transfer_handle);
return;
}
globus_result_t
globus_l_ftp_control_data_adjust_connection(
globus_ftp_data_stripe_t * stripe)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_data_connection_t * data_conn;
globus_result_t res = GLOBUS_SUCCESS;
int ctr;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
transfer_handle = stripe->whos_my_daddy;
dc_handle = transfer_handle->whos_my_daddy;
GlobusFTPControlDataTestMagic(dc_handle);
/*
* only the writer connects
* do not adjuest parrallel level if stripe set to eof
*/
if(dc_handle->state != GLOBUS_FTP_DATA_STATE_CONNECT_WRITE ||
stripe->eof)
{
return GLOBUS_SUCCESS;
}
/*
* if not enough connections register a new connection
*/
if(stripe->parallel.base.size > stripe->connection_count
+ stripe->outstanding_connections)
{
for(ctr = stripe->connection_count + stripe->outstanding_connections;
ctr < stripe->parallel.base.size;
ctr++)
{
res = globus_l_ftp_control_data_register_connect(
dc_handle,
stripe,
GLOBUS_NULL,
GLOBUS_NULL);
if(res != GLOBUS_SUCCESS)
{
return res;
}
}
}
else if(stripe->parallel.base.size < stripe->connection_count
+ stripe->outstanding_connections)
{
if(!globus_fifo_empty(&stripe->free_conn_q))
{
data_conn = (globus_ftp_data_connection_t *)
globus_fifo_dequeue(&stripe->free_conn_q);
globus_list_remove(&stripe->all_conn_list,
globus_list_search(stripe->all_conn_list, data_conn));
data_conn->eod = GLOBUS_TRUE;
stripe->connection_count--;
data_conn->whos_my_daddy = NULL;
res = globus_l_ftp_control_register_close_msg(
dc_handle,
data_conn);
}
}
/*
* TODO: remove a connection if the current count is too high.
*/
return res;
}
static
void
globus_l_ftp_control_command_flush_callback(
void * user_args)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_l_ftp_handle_table_entry_t * cb_ent;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_ftp_control_data_callback_t callback = GLOBUS_NULL;
entry = (globus_l_ftp_handle_table_entry_t *)user_args;
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
transfer_handle = entry->transfer_handle;
globus_mutex_lock(&dc_handle->mutex);
{
if(entry->direction == GLOBUS_FTP_DATA_STATE_CONNECT_READ ||
dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
cb_ent = entry;
callback = cb_ent->callback;
}
else
{
cb_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
entry->callback_table_handle);
globus_assert(cb_ent != GLOBUS_NULL);
if(!globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
entry->callback_table_handle))
{
callback = cb_ent->callback;
if(cb_ent->eof)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
}
}
if(entry->ascii_buffer != GLOBUS_NULL)
{
globus_free(entry->ascii_buffer);
}
}
}
globus_mutex_unlock(&dc_handle->mutex);
/*
* call any callbacks that are ready
*/
if(callback != GLOBUS_NULL)
{
callback(
cb_ent->callback_arg,
dc_handle->whos_my_daddy,
entry->error,
cb_ent->buffer,
0,
0,
GLOBUS_TRUE);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(callback != GLOBUS_NULL)
{
globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(entry->error)
{
globus_object_free(entry->error);
}
globus_free(entry);
}
/*
* on error flush out all user callbacks with errors
* this function is called locked
*/
void
globus_l_error_flush_command_q(
globus_ftp_data_stripe_t * stripe,
globus_object_t * error)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_reltime_t reltime;
while(!globus_fifo_empty(&stripe->command_q))
{
entry = (globus_l_ftp_handle_table_entry_t *)
globus_fifo_dequeue(&stripe->command_q);
if(error != GLOBUS_NULL)
{
entry->error = globus_object_copy(error);
}
else
{
entry->error = GLOBUS_NULL;
}
GlobusTimeReltimeSet(reltime, 0, 0);
globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_command_flush_callback,
(void *) entry);
}
}
static
void
globus_l_ftp_control_command_kickout(
void * user_args)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_bool_t poll;
entry = (globus_l_ftp_handle_table_entry_t *)user_args;
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
transfer_handle = entry->transfer_handle;
if(entry->callback)
{
entry->callback(
entry->callback_arg,
dc_handle->whos_my_daddy,
entry->error,
entry->buffer,
0,
0,
GLOBUS_TRUE);
}
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
/* purge any callbacks registered before eof was sent */
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(entry->error != GLOBUS_NULL)
{
globus_object_free(entry->error);
}
globus_free(entry);
}
static
void
globus_l_ftp_control_reuse_connect_callback(
void * user_args)
{
globus_l_ftp_dc_connect_cb_info_t * connect_cb_info;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
connect_cb_info = (globus_l_ftp_dc_connect_cb_info_t *)user_args;
dc_handle = connect_cb_info->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
transfer_handle = connect_cb_info->transfer_handle;
connect_cb_info->callback(
connect_cb_info->user_arg,
dc_handle->whos_my_daddy,
connect_cb_info->stripe_ndx,
GLOBUS_TRUE,
GLOBUS_NULL);
globus_mutex_lock(&dc_handle->mutex);
{
globus_l_ftp_control_dc_dec_ref(connect_cb_info->transfer_handle);
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(connect_cb_info);
}
globus_result_t
globus_ftp_control_data_add_closed_cb(
globus_ftp_control_handle_t * control_handle,
globus_ftp_control_callback_t close_callback_func,
void * close_arg)
{
globus_result_t result = GLOBUS_SUCCESS;
globus_i_ftp_dc_handle_t * dc_handle;
dc_handle = &control_handle->dc_handle;
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->close_callback = close_callback_func;
dc_handle->close_callback_arg = close_arg;
}
globus_mutex_unlock(&dc_handle->mutex);
return result;
}
/*
* globus_i_ftp_control_data_cc_init()
* -----------------------------------
* called when the user calls globus_ftp_control_handle_init()
* Initialized the dc_handle structure.
*/
globus_result_t
globus_i_ftp_control_data_cc_init(
globus_ftp_control_handle_t * control_handle)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_object_t * err;
globus_mutex_lock(&globus_l_ftp_control_data_mutex);
{
if(globus_l_ftp_control_data_active)
{
dc_handle = &control_handle->dc_handle;
GlobusFTPControlSetMagic(dc_handle);
dc_handle->initialized = GLOBUS_TRUE;
dc_handle->state = GLOBUS_FTP_DATA_STATE_NONE;
dc_handle->dcau.mode = GLOBUS_FTP_CONTROL_DCAU_NONE;
dc_handle->pbsz = 0UL;
dc_handle->protection = GLOBUS_FTP_CONTROL_PROTECTION_CLEAR;
dc_handle->mode = GLOBUS_FTP_CONTROL_MODE_STREAM;
dc_handle->type = GLOBUS_FTP_CONTROL_TYPE_ASCII;
dc_handle->structure = GLOBUS_FTP_CONTROL_STRUCTURE_FILE;
dc_handle->tcp_buffer_size = 0;
dc_handle->form_code = 0;
dc_handle->send_eof = GLOBUS_TRUE;
dc_handle->transfer_handle = GLOBUS_NULL;
dc_handle->whos_my_daddy = control_handle;
dc_handle->transfer_list = GLOBUS_NULL;
dc_handle->close_callback = GLOBUS_NULL;
dc_handle->close_callback_arg = GLOBUS_NULL;
dc_handle->nl_io_handle_set = GLOBUS_FALSE;
dc_handle->nl_ftp_handle_set = GLOBUS_FALSE;
dc_handle->interface_addr = NULL;
dc_handle->connect_error = GLOBUS_NULL;
globus_io_tcpattr_init(&dc_handle->io_attr);
globus_io_attr_set_tcp_nodelay(&dc_handle->io_attr,
GLOBUS_TRUE);
dc_handle->layout_func = GLOBUS_NULL;
dc_handle->layout_user_arg = GLOBUS_NULL;
dc_handle->layout_str = GLOBUS_NULL;
dc_handle->parallel.base.mode =
GLOBUS_FTP_CONTROL_PARALLELISM_FIXED;
dc_handle->parallel.base.size = 1;
globus_mutex_init(&dc_handle->mutex, GLOBUS_NULL);
res = GLOBUS_SUCCESS;
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_data_cc_init(): code not activated."));
res = globus_error_put(err);
}
}
globus_mutex_unlock(&globus_l_ftp_control_data_mutex);
return res;
}
/*
* this should be called locked
* this function handles all clean up except for freeing the memory
* and destroying the mutex;
*/
globus_bool_t
globus_l_ftp_control_dc_dec_ref(
globus_i_ftp_dc_transfer_handle_t * transfer_handle)
{
globus_bool_t rc = GLOBUS_FALSE;
globus_reltime_t reltime;
globus_i_ftp_dc_handle_t * dc_handle;
int ctr;
globus_ftp_data_stripe_t * stripe;
globus_assert(transfer_handle->ref > 0);
/*
if(transfer_handle->ref == 0)
{
return GLOBUS_FALSE;
}
*/
transfer_handle->ref--;
dc_handle = transfer_handle->whos_my_daddy;
globus_assert(transfer_handle->ref >= 0);
if(transfer_handle->ref == 0)
{
rc = GLOBUS_TRUE;
globus_list_remove_element(
&dc_handle->transfer_list, transfer_handle);
/*
* if the transfer handle close_callback is not null
* it means that stripes destroy was called from force_close
* and the user should still have a reference to there handle
* in memory. Therefore the transfer_handle->control_handle
* is still valid.
*/
if(dc_handle->close_callback != GLOBUS_NULL &&
globus_list_empty(dc_handle->transfer_list))
{
globus_result_t res;
GlobusTimeReltimeSet(reltime, 0, 0);
res = globus_callback_register_oneshot(
GLOBUS_NULL,
&reltime,
globus_l_ftp_control_close_kickout,
(void *)dc_handle);
globus_assert(res == GLOBUS_SUCCESS);
}
else if(globus_list_empty(dc_handle->transfer_list))
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_NONE;
}
/*
* destroy the transfer handle
*/
for(ctr = 0; ctr < transfer_handle->stripe_count; ctr++)
{
stripe = &transfer_handle->stripes[ctr];
globus_fifo_destroy(&stripe->free_conn_q);
globus_ftp_control_host_port_destroy(&stripe->host_port);
globus_fifo_destroy(&stripe->command_q);
}
globus_handle_table_destroy(&transfer_handle->handle_table);
globus_free(transfer_handle->stripes);
globus_assert(dc_handle->transfer_handle != transfer_handle &&
"Destroying a transfer_handle we still have a pointer to");
globus_free(transfer_handle);
globus_cond_signal(&globus_l_ftp_control_data_cond);
}
return rc;
}
static
void
globus_l_ftp_control_close_kickout(
void * user_args)
{
globus_ftp_control_handle_t * control_handle;
globus_ftp_control_callback_t cb;
void * cb_arg;
globus_i_ftp_dc_handle_t * dc_handle;
dc_handle = (globus_i_ftp_dc_handle_t *)user_args;
GlobusFTPControlDataTestMagic(dc_handle);
/*
* transfer_handle has been orphined at this point.
* However, since this function is a result of a call to force_close
* its reference to control_handle should still be valid.
*/
control_handle = dc_handle->whos_my_daddy;
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_NONE;
cb = dc_handle->close_callback;
cb_arg = dc_handle->close_callback_arg;
dc_handle->close_callback = GLOBUS_NULL;
dc_handle->close_callback_arg = GLOBUS_NULL;
}
globus_mutex_unlock(&dc_handle->mutex);
if(cb != GLOBUS_NULL)
{
cb(cb_arg, control_handle, GLOBUS_NULL);
}
}
/*
* globus_i_ftp_control_data_cc_destroy()
* --------------------------------------
* if the handle is in the proper state destory it. Otherwise return
* failure.
*/
globus_result_t
globus_i_ftp_control_data_cc_destroy(
globus_ftp_control_handle_t * control_handle)
{
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res = GLOBUS_SUCCESS;
globus_bool_t destroy_it = GLOBUS_FALSE;
globus_object_t * err;
dc_handle = &control_handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_NONE)
{
dc_handle->initialized = GLOBUS_FALSE;
destroy_it = GLOBUS_TRUE;
res = GLOBUS_SUCCESS;
globus_io_tcpattr_destroy(&dc_handle->io_attr);
if(dc_handle->nl_io_handle_set)
{
globus_netlogger_handle_destroy(&dc_handle->nl_io_handle);
}
if(dc_handle->nl_ftp_handle_set)
{
globus_netlogger_handle_destroy(&dc_handle->nl_ftp_handle);
}
if(dc_handle->interface_addr)
{
free(dc_handle->interface_addr);
}
if(dc_handle->dcau.mode == GLOBUS_FTP_CONTROL_DCAU_SUBJECT &&
dc_handle->dcau.subject.subject)
{
globus_libc_free(dc_handle->dcau.subject.subject);
}
if(dc_handle->connect_error)
{
globus_object_free(dc_handle->connect_error);
}
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_data_cc_destroy(): handle has oustanding references."));
res = globus_error_put(err);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
/**
* Forces an imediate close of all data connections.
*
* @param control_handle
* The globus_ftp_control_handle that is have its data
* connections closed.
* @param close_callback_func
* A user function that will be called when the data connections
* are closed.
* @param close_arg
* The user argument that will be threaded through to
* close_callback_func.
*/
globus_result_t
globus_ftp_control_data_force_close(
globus_ftp_control_handle_t * control_handle,
globus_ftp_control_callback_t close_callback_func,
void * close_arg)
{
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_result_t res;
globus_i_ftp_dc_handle_t * dc_handle;
globus_object_t * err;
static char * myname=
"globus_ftp_control_data_force_close";
/*
* error checking
*/
if(control_handle == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
dc_handle = &control_handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(!dc_handle->initialized)
{
err = globus_io_error_construct_not_initialized(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(close_callback_func == GLOBUS_NULL)
{
err = globus_io_error_construct_null_parameter(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
"handle",
1,
myname);
return globus_error_put(err);
}
if(control_handle->dc_handle.transfer_handle == GLOBUS_NULL)
{
return globus_error_put(globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Handle not in the proper state")));
}
transfer_handle = control_handle->dc_handle.transfer_handle;
dc_handle = &control_handle->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
/* already closed, or closing */
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING || dc_handle->state == GLOBUS_FTP_DATA_STATE_NONE)
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_data_force_close(): handle not connected."));
res = globus_error_put(err);
}
else
{
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Data connection has been closed due to a call to globus_ftp_control_data_force_close(), or by deactiviting the module."));
res = globus_i_ftp_control_data_force_close(
dc_handle,
close_callback_func,
close_arg,
err);
}
}
globus_mutex_unlock(&dc_handle->mutex);
return res;
}
globus_result_t
globus_i_ftp_control_data_force_close(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_control_callback_t close_callback_func,
void * close_arg,
globus_object_t * err)
{
globus_result_t result;
result = GLOBUS_SUCCESS;
if(close_callback_func != GLOBUS_NULL)
{
dc_handle->close_callback = close_callback_func;
dc_handle->close_callback_arg = close_arg;
}
globus_l_ftp_control_stripes_destroy(dc_handle, err);
globus_object_free(err);
return result;
}
int
globus_l_ftp_control_strip_ascii(
globus_byte_t * buf,
int length)
{
int ctr;
int count = 0;
if(length < 1)
{
return length;
}
#ifndef TARGET_ARCH_WIN32
for(ctr = 0; ctr < length - 1; ctr++)
{
if(buf[ctr] == '\r' &&
buf[ctr + 1] == '\n')
{
memmove(&buf[ctr], &buf[ctr+1], length - (ctr + 1));
count++;
}
}
#endif
return length - count;
}
globus_byte_t *
globus_l_ftp_control_add_ascii(
globus_byte_t * in_buf,
int length,
globus_off_t * ascii_len)
{
globus_byte_t * out_buf;
int ctr;
int out_ndx = 0;
if(length < 1)
{
*ascii_len = 0;
return GLOBUS_NULL;
}
#ifndef TARGET_ARCH_WIN32
/* allocating twice the memory may be a bad idea */
out_buf = (globus_byte_t *)globus_malloc(length*2);
for(ctr = 0; ctr < length; ctr++)
{
if(in_buf[ctr] == '\n')
{
out_buf[out_ndx] = '\r';
out_ndx++;
}
out_buf[out_ndx] = in_buf[ctr];
out_ndx++;
}
#else
out_buf = (globus_byte_t *)globus_malloc(length);
memcpy( out_buf, in_buf, length );
out_ndx= length;
#endif
*ascii_len = out_ndx;
return out_buf;
}
globus_result_t
globus_l_ftp_control_data_register_connect(
globus_i_ftp_dc_handle_t * dc_handle,
globus_ftp_data_stripe_t * stripe,
globus_ftp_control_data_connect_callback_t callback,
void * user_arg)
{
globus_ftp_data_connection_t * data_conn;
char remote_host[256];
unsigned int remote_port;
globus_result_t result;
globus_l_ftp_data_callback_info_t * callback_info;
globus_object_t * err;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
transfer_handle = stripe->whos_my_daddy;
stripe->outstanding_connections++;
stripe->total_connection_count++;
DATA_CONN_MALLOC(data_conn, stripe, callback, user_arg);
transfer_handle->ref++;
globus_list_insert(&stripe->outstanding_conn_list, (void*)data_conn);
CALLBACK_INFO_MALLOC(
callback_info,
dc_handle,
transfer_handle,
stripe,
data_conn);
transfer_handle->ref++;
globus_ftp_control_host_port_get_host(
&stripe->host_port,
remote_host);
remote_port = globus_ftp_control_host_port_get_port(
&stripe->host_port);
/* register the next connection */
if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM)
{
result = globus_io_tcp_register_connect(
remote_host,
remote_port,
&dc_handle->io_attr,
globus_l_ftp_stream_accept_connect_callback,
(void *)callback_info,
&data_conn->io_handle);
}
else if(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK)
{
result = globus_io_tcp_register_connect(
remote_host,
remote_port,
&dc_handle->io_attr,
globus_l_ftp_eb_connect_callback,
(void *)callback_info,
&data_conn->io_handle);
}
else
{
globus_free(callback_info);
err = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_data_register_connect(): invalid transfer mode."));
result = globus_error_put(err);
}
return result;
}
/**********************************************************************
* callbacks
**********************************************************************/
/*
* data connection cleanup
*/
void
globus_l_ftp_io_close_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_i_ftp_dc_handle_t * dc_handle;
globus_l_ftp_data_callback_info_t * callback_info;
globus_ftp_control_data_callback_t eof_callback = GLOBUS_NULL;
globus_l_ftp_handle_table_entry_t * eof_cb_ent;
globus_bool_t poll;
callback_info = (globus_l_ftp_data_callback_info_t *)arg;
data_conn = callback_info->data_conn;
stripe = callback_info->stripe;
transfer_handle = callback_info->transfer_handle;
dc_handle = callback_info->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
if(stripe && stripe->eof)
{
eof_cb_ent = transfer_handle->eof_cb_ent;
/* eof ent may not exist */
if(eof_cb_ent != GLOBUS_NULL &&
!globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle))
{
eof_callback = eof_cb_ent->callback;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
}
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(eof_callback != GLOBUS_NULL)
{
eof_callback(
eof_cb_ent->callback_arg,
dc_handle->whos_my_daddy,
eof_cb_ent->error,
eof_cb_ent->buffer,
eof_cb_ent->length,
eof_cb_ent->offset,
GLOBUS_TRUE);
if(eof_cb_ent->error)
{
globus_object_free(eof_cb_ent->error);
}
globus_free(eof_cb_ent);
}
globus_mutex_lock(&dc_handle->mutex);
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
/*
* decrement the reference the callbacks had
*/
if(eof_callback != GLOBUS_NULL)
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(callback_info);
if(data_conn != GLOBUS_NULL)
{
/*
* we only wait if callback comes from a cancel, not a close
*/
if(data_conn->free_me)
{
globus_free(data_conn);
}
else
{
data_conn->free_me = GLOBUS_TRUE;
}
}
/*
This is not needed and introduces a race
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
*/
}
/******************************************************************
* stream mode globus_io callbacks
*****************************************************************/
void
globus_l_ftp_stream_write_eof_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_object_t * error = GLOBUS_NULL;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_ftp_control_handle_t * control_handle;
globus_ftp_data_connection_t * data_conn;
globus_byte_t * buffer = GLOBUS_NULL;
void * big_buffer_cb_arg;
globus_ftp_control_data_callback_t big_buffer_cb = GLOBUS_NULL;
globus_byte_t * big_buffer = GLOBUS_NULL;
globus_bool_t poll;
entry = (globus_l_ftp_handle_table_entry_t *) arg;
data_conn = entry->whos_my_daddy;
transfer_handle = data_conn->whos_my_daddy->whos_my_daddy;
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
control_handle = dc_handle->whos_my_daddy;
buffer = entry->buffer;
globus_mutex_lock(&dc_handle->mutex);
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
big_buffer_cb_arg = transfer_handle->big_buffer_cb_arg;
big_buffer_cb = transfer_handle->big_buffer_cb;
big_buffer = transfer_handle->big_buffer;
transfer_handle->big_buffer = GLOBUS_NULL;
if(transfer_handle->big_buffer != GLOBUS_NULL)
{
buffer = transfer_handle->big_buffer;
transfer_handle->big_buffer = GLOBUS_NULL;
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
}
if(big_buffer_cb != GLOBUS_NULL)
{
big_buffer_cb(
big_buffer_cb_arg,
control_handle,
error,
big_buffer,
entry->length,
entry->offset,
GLOBUS_TRUE);
}
else
{
entry->callback(
entry->callback_arg,
control_handle,
error,
buffer,
entry->length,
entry->offset,
GLOBUS_TRUE);
}
globus_free(entry);
globus_mutex_lock(&dc_handle->mutex);
{
globus_l_ftp_control_stripes_destroy(dc_handle, GLOBUS_NULL);
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(data_conn);
if(error)
{
globus_object_free(error);
}
}
/*
* listen callback
*/
void
globus_l_ftp_stream_listen_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_data_stripe_t * stripe;
globus_ftp_data_connection_t * data_conn;
globus_object_t * error = GLOBUS_NULL;
globus_l_ftp_data_callback_info_t * callback_info;
globus_l_ftp_data_callback_info_t * cb_info;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_result_t res;
globus_ftp_control_data_connect_callback_t callback = GLOBUS_NULL;
void * user_arg;
unsigned int stripe_ndx;
globus_ftp_control_handle_t * control_handle;
const globus_object_type_t * type;
globus_bool_t poll;
callback_info = (globus_l_ftp_data_callback_info_t *)callback_arg;
data_conn = callback_info->data_conn;
stripe = callback_info->stripe;
transfer_handle = callback_info->transfer_handle;
dc_handle = callback_info->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
control_handle = dc_handle->whos_my_daddy;
globus_mutex_lock(&dc_handle->mutex);
{
globus_assert(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM);
/*
* result will be not be SUCCESS if the listen failed or
* if it was prematurly closed. ie, the user called force
* close before a the callback happened
*/
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
/*
* if not do to canceling the listen, then close
* the listener.
*/
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
callback = data_conn->callback;
user_arg = data_conn->user_arg;
stripe_ndx = stripe->stripe_ndx;
globus_free(callback_info);
}
/*
* if all is well register an accept
*/
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_READ ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE)
{
data_conn = callback_info->data_conn;
transfer_handle->ref++;
globus_list_insert(
&stripe->outstanding_conn_list,
(void *)data_conn);
/*
* inc reference count for accept
* and for the connection
*/
transfer_handle->ref++;
stripe->outstanding_connections++;
res = globus_io_tcp_register_accept(
handle,
&dc_handle->io_attr,
&data_conn->io_handle,
globus_l_ftp_stream_accept_connect_callback,
(void *) callback_info);
if(res != GLOBUS_SUCCESS)
{
globus_free(callback_info);
error = globus_error_get(res);
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
else
{
stripe->listening = GLOBUS_FALSE;
CALLBACK_INFO_MALLOC(
cb_info,
dc_handle,
transfer_handle,
stripe,
GLOBUS_NULL);
res = globus_io_register_close(
handle,
globus_l_ftp_io_close_callback,
(void *)cb_info);
if(res != GLOBUS_SUCCESS)
{
res = globus_callback_register_oneshot(
GLOBUS_NULL,
GLOBUS_NULL,
globus_l_ftp_control_io_close_kickout,
cb_info);
globus_assert(res == GLOBUS_SUCCESS);
}
}
}
/* this will happen if we got a force_close after the connect_read but
* before this callback. just continue with an error */
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection closed before accept"));
callback = data_conn->callback;
user_arg = data_conn->user_arg;
stripe_ndx = stripe->stripe_ndx;
globus_free(callback_info);
}
/*
* remove reference for listener callback
*/
if(error && !dc_handle->connect_error)
{
dc_handle->connect_error = globus_object_copy(error);
}
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
/* if there was an error call the connect callback */
if(callback != GLOBUS_NULL)
{
callback(user_arg, control_handle, stripe_ndx, GLOBUS_FALSE, error);
/*
* if the user wanted a callback we must dec the reference
* it had after we call it.
*/
globus_mutex_lock(&dc_handle->mutex);
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
}
if(error)
{
globus_free(data_conn);
globus_object_free(error);
}
}
/*
* globus_l_ftp_stream_accept_connect_callback()
* ---------------------------------------------
* accept the connection.
*
* references:
* entry
* -----
* 1 for the accept callback
* 1 for the user callback (if there is one)
*
* exit
* ----
* decrement callback reference (if it exists)
* use accept reference as data connection reference
* (it will de decremented on close)
*/
void
globus_l_ftp_stream_accept_connect_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_ftp_control_handle_t * control_handle;
globus_object_t * error = GLOBUS_NULL;
globus_l_ftp_data_callback_info_t * callback_info;
globus_i_ftp_dc_handle_t * dc_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_ftp_control_data_connect_callback_t callback = GLOBUS_NULL;
void * user_arg;
unsigned int stripe_ndx;
const globus_object_type_t * type;
globus_bool_t poll;
callback_info = (globus_l_ftp_data_callback_info_t *)callback_arg;
dc_handle = callback_info->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
/* should always be in stream mode here */
globus_assert(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM);
data_conn = callback_info->data_conn;
stripe = callback_info->stripe;
transfer_handle = stripe->whos_my_daddy;
control_handle = dc_handle->whos_my_daddy;
callback = data_conn->callback;
user_arg = data_conn->user_arg;
stripe_ndx = stripe->stripe_ndx;
/*
* remove from the outstanding connection list
*/
stripe->outstanding_connections--;
globus_list_remove(
&stripe->outstanding_conn_list,
globus_list_search(stripe->outstanding_conn_list,(void*)data_conn));
/*
* if an error occured the accept was either canceld or
* failed.
*/
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
/*
* if not do to canceling the accept, then close
* the connection.
*/
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_list_remove_element(
&stripe->all_conn_list,
data_conn);
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
}
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection closed before a data connection request was made"));
/*
* since globus io makes no guarentee on order of
* cancel callbacks we free this structure here.
*/
if(data_conn->free_me)
{
globus_free(data_conn);
}
else
{
data_conn->free_me = GLOBUS_TRUE;
}
}
/*
* if all is well add to the free_conn_q
*/
else
{
globus_assert(dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_READ ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE);
globus_list_insert(&stripe->all_conn_list, (void*)data_conn);
stripe->total_connection_count++;
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
stripe->connection_count++;
}
if(error && !dc_handle->connect_error)
{
dc_handle->connect_error = globus_object_copy(error);
}
}
globus_mutex_unlock(&dc_handle->mutex);
/* call the conenct callback */
if(callback != GLOBUS_NULL)
{
callback(user_arg, control_handle, stripe_ndx, GLOBUS_FALSE, error);
}
if(error)
{
globus_object_free(error);
}
globus_mutex_lock(&dc_handle->mutex);
{
if(callback != GLOBUS_NULL)
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
/*
* since conncet came back dec ref
*/
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
/*
* poll the command_q on all stripes
*/
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(callback_info);
}
/*
* globus_l_ftp_stream_write_callback()
* ------------------------------------
*
* reference:
* entry
* -----
* 1 for the user callback
* 1 for the data connection
*
* exit
* ----
* decrement the user callback reference
*/
void
globus_l_ftp_stream_write_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_object_t * error = GLOBUS_NULL;
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_control_handle_t * control_handle;
globus_off_t offset;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_bool_t eof = GLOBUS_FALSE;
const globus_object_type_t * type;
globus_bool_t fire_callback = GLOBUS_TRUE;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_size_t nl_nbytes;
globus_bool_t poll;
nl_nbytes = nbytes;
entry = (globus_l_ftp_handle_table_entry_t *) arg;
globus_assert(entry != GLOBUS_NULL);
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
control_handle = dc_handle->whos_my_daddy;
globus_mutex_lock(&dc_handle->mutex);
{
/* should always be in stream mode here */
globus_assert(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM);
data_conn = entry->whos_my_daddy;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
offset = data_conn->offset;
data_conn->offset += entry->length;
/* if an error occured get it and set eof to true */
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
/*
* if not do to canceling the accept, then close
* the connection.
*/
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
eof = GLOBUS_TRUE;
}
else if(entry->eof)
{
entry->offset = offset;
globus_list_remove_element(
&stripe->all_conn_list,
data_conn);
result = globus_io_register_close(
&data_conn->io_handle,
globus_l_ftp_stream_write_eof_callback,
(void *)entry);
fire_callback = GLOBUS_FALSE;
eof = GLOBUS_TRUE;
}
else
{
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
}
if(dc_handle->nl_ftp_handle_set)
{
/* faking memory allocation */
char tag_str[128];
sprintf(tag_str, "MODE=S TYPE=%c NBYTES=%ld",
dc_handle->type, (long) nl_nbytes);
globus_netlogger_write(
&dc_handle->nl_ftp_handle,
GFTP_NL_EVENT_SENT_DATA,
"GFTPC",
"Important",
tag_str);
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(entry->ascii_buffer != GLOBUS_NULL)
{
globus_free(entry->ascii_buffer);
}
if(fire_callback)
{
entry->callback(
entry->callback_arg,
control_handle,
error,
entry->buffer,
entry->length,
offset,
eof);
globus_free(entry);
}
globus_mutex_lock(&dc_handle->mutex);
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
/*
* poll the command_q on all stripes
*/
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(error != GLOBUS_NULL)
{
globus_object_free(error);
}
}
/*
* globus_l_ftp_stream_read_callback()
* -----------------------------------
*
* reference:
* entry
* -----
* 1 for the user callback
* 1 for the data connection
*
* exit
* ----
* decrement the user callback reference
*/
void
globus_l_ftp_stream_read_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbyte)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_object_t * error = GLOBUS_NULL;
globus_bool_t eof = GLOBUS_FALSE;
globus_ftp_data_connection_t * data_conn;
globus_off_t offset;
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_control_handle_t * control_handle;
globus_ftp_data_stripe_t * stripe;
globus_byte_t * buffer = GLOBUS_NULL;
const globus_object_type_t * type;
globus_result_t res;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_bool_t fire_callback = GLOBUS_TRUE;
globus_bool_t poll;
globus_size_t nl_nbytes;
nl_nbytes = nbyte;
entry = (globus_l_ftp_handle_table_entry_t *) arg;
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
if(entry->type == GLOBUS_FTP_CONTROL_TYPE_ASCII)
{
nbyte = globus_l_ftp_control_strip_ascii(buf, nbyte);
}
globus_mutex_lock(&dc_handle->mutex);
{
globus_assert(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_STREAM);
data_conn = entry->whos_my_daddy;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
control_handle = dc_handle->whos_my_daddy;
buffer = entry->buffer;
/*
* result will not be SUCCESS when the callback is canceled
* or an error occurs.
*/
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
}
else if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
/* if it is eof do not pas the user back an error */
if(globus_io_eof(error))
{
globus_object_free(error);
result = GLOBUS_SUCCESS;
error = GLOBUS_NULL;
eof = GLOBUS_TRUE;
if(transfer_handle->big_buffer != GLOBUS_NULL)
{
buffer = transfer_handle->big_buffer;
if(nbyte + data_conn->offset <
transfer_handle->big_buffer_length)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Buffer given to read_all was not completely filled."));
}
}
fire_callback = GLOBUS_FALSE;
globus_list_remove_element(
&stripe->all_conn_list,
data_conn);
result = globus_io_register_close(
&data_conn->io_handle,
globus_l_ftp_stream_write_eof_callback,
(void *)entry);
globus_assert(result == GLOBUS_SUCCESS);
entry->length = nbyte;
entry->offset = data_conn->offset;
}
else if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
eof = GLOBUS_TRUE;
}
else
{
if(transfer_handle->big_buffer != GLOBUS_NULL)
{
buffer = transfer_handle->big_buffer;
if(data_conn->offset + nbyte > transfer_handle->big_buffer_length)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("Buffer given to read_all is not large enough to hold data sent."));
eof = GLOBUS_TRUE;
nbyte = 0;
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
else
{
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
/*
* register a read of 1 byte over to prompt eof
*/
res = globus_l_ftp_control_data_stream_read_write(
dc_handle,
transfer_handle->big_buffer_byte,
1,
data_conn->offset + nbyte,
GLOBUS_FALSE,
transfer_handle->big_buffer_cb,
transfer_handle->big_buffer_cb_arg);
globus_assert(res == GLOBUS_SUCCESS);
}
}
else
{
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
}
if(dc_handle->nl_ftp_handle_set)
{
char tag_str[128];
sprintf(tag_str, "MODE=S TYPE=%c NBYTES=%ld",
dc_handle->type, (long) nl_nbytes);
globus_netlogger_write(
&dc_handle->nl_ftp_handle,
GFTP_NL_EVENT_RECEIVED_DATA,
"GFTPC",
"Important",
tag_str);
}
}
offset = data_conn->offset;
data_conn->offset += nbyte;
}
globus_mutex_unlock(&dc_handle->mutex);
if(entry->callback && fire_callback)
{
entry->callback(
entry->callback_arg,
control_handle,
error,
buffer,
nbyte,
offset,
eof);
globus_free(entry);
}
globus_mutex_lock(&dc_handle->mutex);
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
/*
* poll the command_q on all stripes
*/
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(error != GLOBUS_NULL)
{
globus_object_free(error);
}
}
/******************************************************************
* extended block mode globus_io callbacks
*****************************************************************/
/*
* listen callback
*
* called when a connection request is made, or when the listener
* is closed
*
* reregister the listener unless CLOSING or an error occured
*
* QUESTION:
* do we want the connect callback called everytime there is a
* connection made or only the first time. If it is every time
* we need to not set the callback areg of the reregistered data
* conn to GLOBUS_NULL and find a way to deal with the CLOSING state
*/
void
globus_l_ftp_eb_listen_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_data_stripe_t * stripe;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_connection_t * data_conn2;
globus_object_t * error = GLOBUS_NULL;
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_ftp_control_data_connect_callback_t callback = GLOBUS_NULL;
void * user_arg;
unsigned int stripe_ndx;
globus_ftp_control_handle_t * control_handle;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_bool_t poll;
data_conn = (globus_ftp_data_connection_t *)callback_arg;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
dc_handle = transfer_handle->whos_my_daddy;
GlobusFTPControlDataTestMagic(dc_handle);
control_handle = transfer_handle->control_handle;
globus_mutex_lock(&dc_handle->mutex);
{
/*
* if in closing state the result should say the callback
* was canceled via a call to close so we do not need to close it
*/
if(result != GLOBUS_SUCCESS)
{
const globus_object_type_t * type;
type = globus_object_get_type(globus_error_peek(result));
if(globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection closed before a data connection request was made"));
}
else
{
error = globus_error_get(result);
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
callback = data_conn->callback;
user_arg = data_conn->user_arg;
stripe_ndx = stripe->stripe_ndx;
/*
* TODO: ?: if a big buffer is registered kick out its callback
*/
}
/*
* if all is well, do not call the callback (it will be called
* once the connection is accepted), register an accept, and
* re-register the listener.
*/
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_READ)
{
/*
* inc reference count for accept
*/
transfer_handle->ref++;
/*
* inc count for data_conn
*/
stripe->total_connection_count++;
transfer_handle->ref++;
stripe->outstanding_connections++;
globus_list_insert(
&stripe->outstanding_conn_list,
(void *)data_conn);
res = globus_io_tcp_register_accept(
handle,
&dc_handle->io_attr,
&data_conn->io_handle,
globus_l_ftp_eb_accept_callback,
(void *)data_conn);
if(res != GLOBUS_SUCCESS)
{
error = globus_error_get(res);
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
else
{
/*
* re-register the listen
* see QUESTION above about conncetion callbacks
*/
transfer_handle->ref++;
DATA_CONN_MALLOC(data_conn2, stripe, GLOBUS_NULL, GLOBUS_NULL);
res = globus_io_tcp_register_listen(
&stripe->listener_handle,
globus_l_ftp_eb_listen_callback,
(void *)data_conn2);
if(res != GLOBUS_SUCCESS)
{
error = globus_error_get(res);
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
}
}
/* this will happen if we got a force_close after the connect_read but
* before this callback. just continue with an error */
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection closed before accept"));
callback = data_conn->callback;
user_arg = data_conn->user_arg;
stripe_ndx = stripe->stripe_ndx;
}
/*
* remove reference for listener callback
*/
if(error && !dc_handle->connect_error)
{
dc_handle->connect_error = globus_object_copy(error);
}
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
/*
* if there was an error call the connect callback and decrement
* the refernce count that the callback had.
*/
if(callback != GLOBUS_NULL)
{
callback(user_arg, control_handle, stripe_ndx, GLOBUS_FALSE, error);
/*
* if the user wanted a callback we must dec the reference
* it had after we call it.
*/
globus_mutex_lock(&dc_handle->mutex);
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
}
if(error !=GLOBUS_NULL)
{
globus_free(data_conn);
globus_object_free(error);
}
}
/*
* globus_l_ftp_eb_accept_callback()
* ---------------------------------
*/
void
globus_l_ftp_eb_accept_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_ftp_control_handle_t * control_handle;
globus_object_t * error = GLOBUS_NULL;
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_control_data_connect_callback_t callback = GLOBUS_NULL;
void * user_arg;
unsigned int stripe_ndx;
globus_result_t res;
globus_l_ftp_eb_header_t * eb_header;
const globus_object_type_t * type;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_bool_t poll;
data_conn = (globus_ftp_data_connection_t *) callback_arg;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
dc_handle = transfer_handle->whos_my_daddy;
GlobusFTPControlDataTestMagic(dc_handle);
control_handle = dc_handle->whos_my_daddy;
globus_mutex_lock(&dc_handle->mutex);
{
globus_assert(
dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK);
callback = data_conn->callback;
user_arg = data_conn->user_arg;
stripe_ndx = stripe->stripe_ndx;
stripe->outstanding_connections--;
globus_list_remove(
&stripe->outstanding_conn_list,
globus_list_search(stripe->outstanding_conn_list, data_conn));
/*
* The result may be != SUCCESS for 1 of 2 reasons.
* connection was closed resulting in a cancel callbcak
* call the user callback with an error
* accept failed
* tear down the stripe and call the user callback
* with an error.
*/
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
/*
* TODO: ?: if a big buffer ois registered kickout its callback
*/
}
/*
* This *MUST* only happen if the callback occurs via a
* call to globus_io_register_cancel()
*/
else if(
dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection closed before a data connection request was made"));
/*
* since globus io makes no guarentee on order of
* cancel callbacks we free this structure here.
*/
if(data_conn->free_me)
{
globus_free(data_conn);
}
else
{
data_conn->free_me = GLOBUS_TRUE;
}
}
/*
* if all is well register a read of the first header
*/
else
{
/*
* ok to increment connection_count because register_eod will
* decrement it
*/
stripe->connection_count++;
globus_list_insert(&stripe->all_conn_list, data_conn);
globus_assert(
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_READ ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_EOF);
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(sizeof(globus_l_ftp_eb_header_t));
/* count activae connections and total connections */
data_conn->bytes_ready = 0;
res = globus_io_register_read(
&data_conn->io_handle,
(globus_byte_t *)eb_header,
sizeof(globus_l_ftp_eb_header_t),
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_eb_read_header_callback,
(void *)data_conn);
if(res != GLOBUS_SUCCESS)
{
error = globus_error_get(res);
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
}
/*
* since the accept came back, dec ref
*/
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
/*
* notify the user that a connection has been esstablished,
* then decerement the reference that the callback had.
*/
if(callback != GLOBUS_NULL)
{
callback(user_arg, control_handle, stripe_ndx, GLOBUS_FALSE, error);
/*
* lock and decrement the reference the callback had
*/
globus_mutex_lock(&dc_handle->mutex);
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
}
if(error)
{
globus_object_free(error);
}
}
/*
* globus_l_ftp_eb_read_header_callback()
* --------------------------------------
*/
void
globus_l_ftp_eb_read_header_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbyte)
{
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_handle_t * dc_handle;
globus_l_ftp_eb_header_t * eb_header;
globus_l_ftp_eb_header_t * eb_header2;
globus_l_ftp_data_callback_info_t * cb_info;
globus_object_t * error = GLOBUS_NULL;
globus_result_t res;
const globus_object_type_t * type;
globus_off_t offset;
globus_off_t tmp;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_bool_t eod = GLOBUS_FALSE;
data_conn = (globus_ftp_data_connection_t *)arg;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
dc_handle = transfer_handle->whos_my_daddy;
GlobusFTPControlDataTestMagic(dc_handle);
eb_header = (globus_l_ftp_eb_header_t *)buf;
globus_mutex_lock(&dc_handle->mutex);
{
/*
* If the result is not success we either canceled it
* or the connection broke. If the connection broke tear
* down all connections.
*/
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
}
else
{
if(eb_header->descriptor & GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOD)
{
/* set connection state eod and local state eod */
data_conn->eod = GLOBUS_TRUE;
eod = GLOBUS_TRUE;
}
if(eb_header->descriptor & GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_CLOSE)
{
data_conn->close = GLOBUS_TRUE;
}
/*
* if EOF get the data connection close count
*/
if(eb_header->descriptor & GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_EOF)
{
data_conn->offset = 0;
data_conn->bytes_ready = 0;
globus_l_ftp_control_data_decode(
eb_header->offset,
&tmp);
stripe->eod_count = tmp;
}
else
{
globus_l_ftp_control_data_decode(
eb_header->count,
&tmp);
data_conn->bytes_ready = tmp;
globus_l_ftp_control_data_decode(
eb_header->offset,
&data_conn->offset);
}
/*
* message without payload
*/
if(data_conn->bytes_ready == 0)
{
/*
* if end of data and close, close the connection.
*/
if(data_conn->close)
{
/*
* next assertion happens if the writter breaks
* the protocol and sends a CLOSE prior to
* an EOD.
*
* TODO: stop transfer and return error to user
*/
globus_assert(data_conn->reusing || data_conn->eod);
/*
* if local eod state is true it means we have not
* already preformed the following needed steps so
* do them now.
*/
if(eod)
{
stripe->eods_received++;
stripe->connection_count--;
}
/*
* if not local eod but conn state eod, it means that
* that we have added the connection to the free_cache
* list and must remove it
*/
else if(data_conn->eod)
{
globus_list_remove(
&stripe->free_cache_list,
globus_list_search(
stripe->free_cache_list, data_conn));
}
/*
* remove from all list before closing
*/
globus_list_remove_element(
&stripe->all_conn_list,
(void *)data_conn);
CALLBACK_INFO_MALLOC(
cb_info,
dc_handle,
transfer_handle,
stripe,
data_conn);
res = globus_io_register_close(
&data_conn->io_handle,
globus_l_ftp_io_close_callback,
(void *)cb_info);
if(res != GLOBUS_SUCCESS)
{
res = globus_callback_register_oneshot(
GLOBUS_NULL,
GLOBUS_NULL,
globus_l_ftp_control_io_close_kickout,
cb_info);
globus_assert(res == GLOBUS_SUCCESS);
}
}
/*
* if we got EOD without a close message
* cache the current connection
*/
else if(data_conn->eod)
{
stripe->eods_received++;
stripe->connection_count--;
globus_list_insert(
&stripe->free_cache_list,
(void*) data_conn);
}
/*
* we end up in this part of the branch if we got an EOF
* without an EOD or if the sender sent a header with
* length equal to zero (which they shouldn't do).
*/
else
{
eb_header2 = (globus_l_ftp_eb_header_t *)globus_malloc(
sizeof(globus_l_ftp_eb_header_t));
res = globus_io_register_read(
&data_conn->io_handle,
(globus_byte_t*)eb_header2,
sizeof(globus_l_ftp_eb_header_t),
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_eb_read_header_callback,
(void *)data_conn);
globus_assert(res == GLOBUS_SUCCESS);
}
}
else
{
/*
* if not a big buffer read place connection in
* free connection list
*/
if(transfer_handle->big_buffer == GLOBUS_NULL)
{
globus_fifo_enqueue(
&stripe->free_conn_q,
(void *)data_conn);
}
/*
* if it is a big buffer read, read directly into the
* buffer.
*/
else
{
globus_off_t end_offset;
globus_off_t end_buffer;
end_offset = ((globus_off_t) data_conn->bytes_ready) +
data_conn->offset;
end_buffer = ((globus_off_t)
transfer_handle->big_buffer_length);
/*
* if the sender sent more bytes than the users
* buffer can handle
*/
if(end_offset > end_buffer)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("too much data has been sent."));
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
else
{
globus_l_ftp_handle_table_entry_t * t_e;
offset = data_conn->offset;
transfer_handle->ref++;
TABLE_ENTRY_MALLOC(
t_e,
&transfer_handle->big_buffer[data_conn->offset],
data_conn->bytes_ready,
data_conn->offset,
GLOBUS_FALSE,
transfer_handle->big_buffer_cb,
transfer_handle->big_buffer_cb_arg,
dc_handle);
t_e->whos_my_daddy = data_conn;
/*
* register a read into the users buffer at the
* correct offset.
*/
res = globus_io_register_read(
&data_conn->io_handle,
&transfer_handle->big_buffer[offset],
data_conn->bytes_ready,
data_conn->bytes_ready,
globus_l_ftp_eb_read_callback,
(void *)t_e);
globus_assert(res == GLOBUS_SUCCESS);
}
}
}
data_conn->reusing = GLOBUS_FALSE;
}
globus_l_ftp_data_stripe_poll(dc_handle);
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(eb_header);
if(error != GLOBUS_NULL)
{
globus_object_free(error);
}
}
void
globus_l_ftp_eb_read_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbyte)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_handle_t * dc_handle;
globus_l_ftp_eb_header_t * eb_header;
globus_l_ftp_data_callback_info_t * cb_info;
globus_ftp_control_handle_t * control_handle;
globus_object_t * error = GLOBUS_NULL;
globus_off_t offset = 0;
globus_bool_t eof = GLOBUS_FALSE;
globus_result_t res;
globus_byte_t * buffer = GLOBUS_NULL;
const globus_object_type_t * type;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_size_t nl_bytes;
globus_bool_t poll;
nl_bytes = nbyte;
entry = (globus_l_ftp_handle_table_entry_t *)arg;
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
data_conn = entry->whos_my_daddy;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
control_handle = dc_handle->whos_my_daddy;
globus_mutex_lock(&dc_handle->mutex);
{
buffer = entry->buffer;
if(transfer_handle->big_buffer != GLOBUS_NULL)
{
buffer = transfer_handle->big_buffer;
}
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
eof = GLOBUS_TRUE;
type = globus_object_get_type(error);
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
}
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
eof = GLOBUS_TRUE;
}
else
{
/*
* add the number of bytes read to data_conn->offset and
* subtract from bytes_ready
*/
offset = data_conn->offset;
data_conn->offset += nbyte;
data_conn->bytes_ready -= nbyte;
if(entry->type == GLOBUS_FTP_CONTROL_TYPE_ASCII)
{
nbyte = globus_l_ftp_control_strip_ascii(
entry->buffer, nbyte);
}
if(data_conn->bytes_ready == 0)
{
/*
* if eod and close, close the connection
*/
if(data_conn->eod)
{
stripe->eods_received++;
if(stripe->eod_count == stripe->eods_received)
{
eof = GLOBUS_TRUE;
transfer_handle->big_buffer = GLOBUS_NULL;
}
stripe->connection_count--;
/*
* if we are closing the connection
*/
if(data_conn->close)
{
globus_list_remove_element(
&stripe->all_conn_list,
(void *)data_conn);
CALLBACK_INFO_MALLOC(
cb_info,
dc_handle,
transfer_handle,
stripe,
data_conn);
res = globus_io_register_close(
&data_conn->io_handle,
globus_l_ftp_io_close_callback,
(void *)cb_info);
if(res != GLOBUS_SUCCESS)
{
res = globus_callback_register_oneshot(
GLOBUS_NULL,
GLOBUS_NULL,
globus_l_ftp_control_io_close_kickout,
cb_info);
globus_assert(res == GLOBUS_SUCCESS);
}
}
/*
* if we are caching the data connection
*/
else
{
globus_list_insert(
&stripe->free_cache_list,
(void*) data_conn);
}
}
/* register the next header read */
else
{
eb_header = (globus_l_ftp_eb_header_t *)
globus_malloc(
sizeof(globus_l_ftp_eb_header_t));
res = globus_io_register_read(
&data_conn->io_handle,
(globus_byte_t *)eb_header,
sizeof(globus_l_ftp_eb_header_t),
sizeof(globus_l_ftp_eb_header_t),
globus_l_ftp_eb_read_header_callback,
(void *)data_conn);
if(res != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
eof = GLOBUS_TRUE;
}
}
}
else
{
globus_fifo_enqueue(&stripe->free_conn_q, (void *)data_conn);
}
if(dc_handle->nl_ftp_handle_set)
{
char tag_str[128];
sprintf(tag_str, "MODE=E TYPE=%c NBYTES=%ld",
dc_handle->type, (long) nl_bytes);
globus_netlogger_write(
&dc_handle->nl_ftp_handle,
GFTP_NL_EVENT_RECEIVED_DATA,
"GFTPC",
"Important",
tag_str);
}
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(entry->ascii_buffer != GLOBUS_NULL)
{
globus_free(entry->ascii_buffer);
}
if(entry->callback != GLOBUS_NULL)
{
entry->callback(
entry->callback_arg,
control_handle,
error,
buffer,
nbyte,
offset,
eof);
}
globus_free(entry);
globus_mutex_lock(&dc_handle->mutex);
{
if(eof && !error)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
}
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
/*
* poll the command_q on all stripes
*/
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(error != GLOBUS_NULL)
{
globus_object_free(error);
}
}
/*
* globus_l_ftp_eb_connect_callback()
* ----------------------------------
*/
void
globus_l_ftp_eb_connect_callback(
void * callback_arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_ftp_control_handle_t * control_handle;
globus_object_t * error = GLOBUS_NULL;
globus_l_ftp_data_callback_info_t * callback_info;
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_ftp_control_data_connect_callback_t callback = GLOBUS_NULL;
void * user_arg;
unsigned int stripe_ndx;
const globus_object_type_t * type;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_ftp_control_data_callback_t eof_callback = GLOBUS_NULL;
globus_l_ftp_handle_table_entry_t * eof_cb_ent;
globus_bool_t poll = GLOBUS_TRUE;
callback_info = (globus_l_ftp_data_callback_info_t *)callback_arg;
dc_handle = callback_info->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
data_conn = callback_info->data_conn;
stripe = callback_info->stripe;
transfer_handle = stripe->whos_my_daddy;
globus_mutex_lock(&dc_handle->mutex);
{
globus_assert(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK);
callback = data_conn->callback;
control_handle = dc_handle->whos_my_daddy;
user_arg = data_conn->user_arg;
stripe_ndx = stripe->stripe_ndx;
stripe->outstanding_connections--;
globus_list_remove(
&stripe->outstanding_conn_list,
globus_list_search(stripe->outstanding_conn_list, data_conn));
/*
* if closing at this point we call the user callback with
* an error indicationg that the connection ack was never read
*/
if(result != GLOBUS_SUCCESS)
{
/*
* if we are closing do to an error tear down all of the stripes
* and pass the user the error pointed to by result
*/
error = globus_error_get(result);
type = globus_object_get_type(error);
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
/*
* if the user requested the close the stripes had
* already been registered for tearn down.
*/
else
{
if(error)
{
globus_object_free(error);
}
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("closed before connection could be established"));
}
/*
* if eof has already be registered we must kick out the
* eof write callback with an error
*/
if(stripe->eof)
{
/*
* get the eof entry struture and decrement its reference.
* If it is the final refernce call the uses callback.
*/
eof_cb_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle);
if(eof_cb_ent != GLOBUS_NULL)
{
if(!globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle))
{
eof_callback = eof_cb_ent->callback;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
}
}
}
}
else if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection closed before a data connection request was made"));
/*
* since globus io makes no guarentee on order of
* cancel callbacks we free this structure here.
*/
if(data_conn->free_me)
{
globus_free(data_conn);
}
else
{
data_conn->free_me = GLOBUS_TRUE;
}
}
/*
* if we connected succesfully
*/
else
{
globus_assert(
dc_handle->state == GLOBUS_FTP_DATA_STATE_CONNECT_WRITE ||
dc_handle->state == GLOBUS_FTP_DATA_STATE_SEND_EOF);
stripe->connection_count++;
globus_list_insert(&stripe->all_conn_list, data_conn);
/*
* it is possible that we had an outstanding connection
* when we sent the EOF message, therefore if the stripe
* has been set to eof send an eod message
*/
if(stripe->eof)
{
res = globus_l_ftp_control_data_register_eod(
stripe,
data_conn);
globus_assert(res == GLOBUS_SUCCESS);
}
else
{
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
}
}
if(error && !dc_handle->connect_error)
{
dc_handle->connect_error = globus_object_copy(error);
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(callback != GLOBUS_NULL)
{
callback(user_arg, control_handle, stripe_ndx, GLOBUS_FALSE, error);
}
/* this should only happen when there is an error */
if(eof_callback != GLOBUS_NULL)
{
eof_callback(
eof_cb_ent->callback_arg,
control_handle,
error,
eof_cb_ent->buffer,
eof_cb_ent->length,
eof_cb_ent->offset,
GLOBUS_TRUE);
globus_free(eof_cb_ent);
}
if(error)
{
globus_object_free(error);
}
globus_mutex_lock(&dc_handle->mutex);
{
/*
* since conncet came back dec ref
*/
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
globus_assert(poll || (callback == NULL && eof_callback == NULL));
/*
* decrement the reference the callbacks had
*/
if(eof_callback != GLOBUS_NULL)
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
if(callback != GLOBUS_NULL)
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(callback_info);
}
/*
*
*/
void
globus_l_ftp_eb_write_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
struct iovec * iov,
globus_size_t iovcnt,
globus_size_t nbytes)
{
globus_l_ftp_handle_table_entry_t * entry;
globus_l_ftp_handle_table_entry_t * eof_cb_ent;
globus_l_ftp_handle_table_entry_t * cb_ent;
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_handle_t * dc_handle;
globus_ftp_control_data_callback_t callback = GLOBUS_NULL;
globus_ftp_control_data_callback_t eof_callback = GLOBUS_NULL;
globus_ftp_control_handle_t * control_handle;
globus_object_t * error = GLOBUS_NULL;
globus_l_ftp_eb_header_t * eb_header;
globus_result_t res;
const globus_object_type_t * type;
globus_bool_t eof = GLOBUS_FALSE;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_l_ftp_send_eof_entry_t * send_eof_ent = GLOBUS_NULL;
globus_size_t nl_bytes;
globus_bool_t poll = GLOBUS_TRUE;
nl_bytes = nbytes;
entry = (globus_l_ftp_handle_table_entry_t *)arg;
eb_header = (globus_l_ftp_eb_header_t *)iov[0].iov_base;
dc_handle = entry->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
data_conn = entry->whos_my_daddy;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
control_handle = dc_handle->whos_my_daddy;
globus_mutex_lock(&dc_handle->mutex);
{
globus_assert(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK);
globus_assert(eb_header->descriptor == 0);
/*
* if there was error or we have been prematurly closed
* just rip the sucker down.
*/
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
else
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
error,
_FCSL("connection prematurly closed"));
}
eof = GLOBUS_TRUE;
}
else
{
/*
* if the stripe is trying to
* close so we need to register an EOD or an EOF
*/
if(stripe->eof)
{
/*
* If we are sending eof and we have not yet
* done so then use this open data connection.
* Create EOF with EOD on and send it
*/
if(dc_handle->send_eof)
{
if(!stripe->eof_sent)
{
res = globus_l_ftp_control_data_register_eof(
stripe,
data_conn);
globus_assert(res == GLOBUS_SUCCESS);
}
else
{
res = globus_l_ftp_control_data_register_eod(
stripe,
data_conn);
globus_assert(res == GLOBUS_SUCCESS);
}
}
/*
* if we are not sending eof automatically then
* send eod on all but the last connection.
* the last connection is needed for sending
* the EOF message accross.
*/
else
{
if(stripe->connection_count > 1 || stripe->eof_sent)
{
res = globus_l_ftp_control_data_register_eod(
stripe,
data_conn);
globus_assert(res == GLOBUS_SUCCESS);
}
else
{
eof_cb_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle);
globus_assert(eof_cb_ent != GLOBUS_NULL);
if(!globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle))
{
eof_callback = eof_cb_ent->callback;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
/*
* if we are not automatically sending eof
* this bit of code ensures that the send
* eof callback will happen after the
* data write eof callback
*/
if(transfer_handle->send_eof_ent != GLOBUS_NULL)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
send_eof_ent = transfer_handle->send_eof_ent;
}
else
{
dc_handle->state =
GLOBUS_FTP_DATA_STATE_SEND_EOF;
}
}
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
}
}
}
else
{
globus_fifo_enqueue(&stripe->free_conn_q, data_conn);
}
eof = entry->eof;
}
cb_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
entry->callback_table_handle);
globus_assert(cb_ent != GLOBUS_NULL);
if(!globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
entry->callback_table_handle))
{
callback = cb_ent->callback;
if(eof)
{
/*
* if we are not automatically sending eof
* this bit of code ensures that the send
* eof callback will happen after the
* data write eof callback
*/
if(dc_handle->send_eof)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
}
else
{
if(transfer_handle->send_eof_ent != GLOBUS_NULL)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
send_eof_ent = transfer_handle->send_eof_ent;
}
else
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_SEND_EOF;
}
}
}
}
/*
* we can free the entry structure
*/
if(entry->ascii_buffer != GLOBUS_NULL)
{
globus_free(entry->ascii_buffer);
}
if(dc_handle->nl_ftp_handle_set)
{
/* faking memory allocation */
char tag_str[128];
sprintf(tag_str, "MODE=E TYPE=%c NBYTES=%ld",
dc_handle->type, (long) nl_bytes);
globus_netlogger_write(
&dc_handle->nl_ftp_handle,
GFTP_NL_EVENT_SENT_DATA,
"GFTPC",
"Important",
tag_str);
}
}
globus_mutex_unlock(&dc_handle->mutex);
/*
* call any callbacks that are ready
*/
if(callback != GLOBUS_NULL)
{
callback(
cb_ent->callback_arg,
control_handle,
error,
cb_ent->buffer,
cb_ent->length,
cb_ent->offset,
eof);
}
/*
* if the eof callback is the same as the callback we
* want to avoid calling it twice
*/
if(eof_callback != GLOBUS_NULL && !cb_ent->eof)
{
eof_callback(
eof_cb_ent->callback_arg,
control_handle,
error,
eof_cb_ent->buffer,
eof_cb_ent->length,
eof_cb_ent->offset,
GLOBUS_TRUE);
globus_free(eof_cb_ent);
transfer_handle->eof_cb_ent = GLOBUS_NULL;
}
/*
* for nonautomatic eof sends
*/
if(send_eof_ent != GLOBUS_NULL)
{
send_eof_ent->cb(
send_eof_ent->user_arg,
dc_handle->whos_my_daddy,
GLOBUS_NULL);
}
globus_mutex_lock(&dc_handle->mutex);
{
/*
* decrement the reference the callbacks had
*/
if(callback != GLOBUS_NULL)
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(entry->eof)
{
transfer_handle->eof_cb_ent = GLOBUS_NULL;
}
globus_free(cb_ent);
}
if(eof_callback != GLOBUS_NULL && !entry->eof)
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
if(send_eof_ent != GLOBUS_NULL)
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(entry);
globus_free(iov);
globus_free(eb_header);
if(error)
{
globus_object_free(error);
}
}
void
globus_l_ftp_close_msg_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_data_connection_t * data_conn;
globus_i_ftp_dc_handle_t * dc_handle;
globus_result_t res;
globus_l_ftp_data_callback_info_t * cb_info;
cb_info = (globus_l_ftp_data_callback_info_t *)arg;
data_conn = cb_info->data_conn;
dc_handle = cb_info->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
res = globus_io_register_close(
&data_conn->io_handle,
globus_l_ftp_io_close_callback,
(void *)cb_info);
if(res != GLOBUS_SUCCESS)
{
res = globus_callback_register_oneshot(
GLOBUS_NULL,
GLOBUS_NULL,
globus_l_ftp_control_io_close_kickout,
cb_info);
globus_assert(res == GLOBUS_SUCCESS);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(buf);
}
void
globus_l_ftp_eb_send_eof_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_handle_t * dc_handle;
globus_l_ftp_send_eof_entry_t * eof_ent;
globus_l_ftp_send_eof_entry_t * tmp_ent;
globus_object_t * error = GLOBUS_NULL;
globus_bool_t fire_cb = GLOBUS_FALSE;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
const globus_object_type_t * type;
globus_bool_t poll;
globus_ftp_data_connection_state_t initial_state;
eof_ent = (globus_l_ftp_send_eof_entry_t *)arg;
data_conn = eof_ent->whos_my_daddy;
stripe = data_conn->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
dc_handle = transfer_handle->whos_my_daddy;
GlobusFTPControlDataTestMagic(dc_handle);
globus_mutex_lock(&dc_handle->mutex);
{
/* in case of error we ended up never calling the user cb, since
* we destroy right after this -- save original error now so
* we can check later if we should fire_cb */
initial_state = dc_handle->state;
globus_assert(eof_ent->dc_handle->transfer_handle != NULL);
if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
else
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection prematurly closed"));
}
}
else
{
globus_list_insert(
&stripe->free_cache_list,
(void*)data_conn);
}
tmp_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
eof_ent->callback_table_handle);
globus_assert(tmp_ent != NULL);
if(!globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
tmp_ent->callback_table_handle))
{
/*
* if data_write(eof = 1) callback has happened we
* can kick out this callback other wise we cache the
* send_eof_ent and call its callback after the data_write
* eof has occured.
*/
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_SEND_EOF)
{
fire_cb = GLOBUS_TRUE;
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
globus_free(tmp_ent->count);
globus_free(tmp_ent);
}
else if(initial_state == GLOBUS_FTP_DATA_STATE_SEND_EOF && error)
{
fire_cb = GLOBUS_TRUE;
globus_free(tmp_ent->count);
globus_free(tmp_ent);
}
else
{
transfer_handle->send_eof_ent = tmp_ent;
}
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(fire_cb)
{
eof_ent->cb(
eof_ent->user_arg,
eof_ent->dc_handle->whos_my_daddy,
error);
}
globus_mutex_lock(&dc_handle->mutex);
{
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(eof_ent->count);
globus_free(eof_ent);
globus_free(buf);
if(error)
{
globus_object_free(error);
}
}
/*
* this message is called when there is a zero length
* payload sent with an EOD or an EOF is sent.
*/
void
globus_l_ftp_eb_eof_eod_callback(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_data_connection_t * data_conn;
globus_ftp_data_stripe_t * stripe;
globus_i_ftp_dc_handle_t * dc_handle;
globus_l_ftp_eb_header_t * eb_header;
globus_ftp_control_handle_t * control_handle;
globus_ftp_control_data_callback_t eof_callback = GLOBUS_NULL;
globus_l_ftp_handle_table_entry_t * eof_cb_ent;
globus_l_ftp_data_callback_info_t * callback_info;
globus_object_t * error = GLOBUS_NULL;
const globus_object_type_t * type;
globus_i_ftp_dc_transfer_handle_t * transfer_handle;
globus_l_ftp_send_eof_entry_t * send_eof_ent = GLOBUS_NULL;
globus_bool_t poll;
callback_info = ( globus_l_ftp_data_callback_info_t *)arg;
stripe = callback_info->stripe;
dc_handle = callback_info->dc_handle;
GlobusFTPControlDataTestMagic(dc_handle);
data_conn = callback_info->data_conn;
control_handle = dc_handle->whos_my_daddy;
transfer_handle = stripe->whos_my_daddy;
eb_header = (globus_l_ftp_eb_header_t *)buf;
globus_mutex_lock(&dc_handle->mutex);
{
globus_assert(dc_handle->mode == GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK);
/* if stripes destroy was called */
if(dc_handle->state == GLOBUS_FTP_DATA_STATE_CLOSING)
{
}
/* if an error occured */
else if(result != GLOBUS_SUCCESS)
{
error = globus_error_get(result);
type = globus_object_get_type(error);
if(!globus_object_type_match(
type,
GLOBUS_IO_ERROR_TYPE_IO_CANCELLED))
{
globus_l_ftp_control_stripes_destroy(dc_handle, error);
}
else
{
error = globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("connection prematurly closed"));
}
}
else
{
/* this will be either EOD, or EOD and EOF */
/*
* if a close message was sent
*/
if(eb_header->descriptor & GLOBUS_FTP_CONTROL_DATA_DESCRIPTOR_CLOSE) {
globus_list_remove_element(
&stripe->all_conn_list,
(void *)data_conn);
data_conn->eod = GLOBUS_FALSE;
globus_l_ftp_control_register_close_msg(dc_handle, data_conn);
}
/*
* otherwise cache the connection
*/
else
{
globus_list_insert(
&stripe->free_cache_list,
(void*)data_conn);
}
}
/*
* get the eof entry struture and decrement its reference.
* If it is the final refernce call the uses callback.
*/
eof_cb_ent = globus_handle_table_lookup(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle);
if(eof_cb_ent && !globus_handle_table_decrement_reference(
&transfer_handle->handle_table,
transfer_handle->eof_table_handle))
{
eof_callback = eof_cb_ent->callback;
transfer_handle->eof_cb_ent = GLOBUS_NULL;
if(dc_handle->send_eof)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
}
else
{
if(transfer_handle->send_eof_ent == GLOBUS_NULL)
{
dc_handle->state = GLOBUS_FTP_DATA_STATE_SEND_EOF;
}
else
{
send_eof_ent = transfer_handle->send_eof_ent;
dc_handle->state = GLOBUS_FTP_DATA_STATE_EOF;
}
}
}
}
globus_mutex_unlock(&dc_handle->mutex);
if(eof_callback != GLOBUS_NULL)
{
eof_callback(
eof_cb_ent->callback_arg,
control_handle,
error,
eof_cb_ent->buffer,
eof_cb_ent->length,
eof_cb_ent->offset,
GLOBUS_TRUE);
globus_free(eof_cb_ent);
}
if(send_eof_ent != GLOBUS_NULL)
{
send_eof_ent->cb(
send_eof_ent->user_arg,
dc_handle->whos_my_daddy,
GLOBUS_NULL);
}
globus_mutex_lock(&dc_handle->mutex);
{
/*
* decrement the reference the callbacks had
*/
if(eof_callback != GLOBUS_NULL)
{
globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
if(send_eof_ent != GLOBUS_NULL)
{
globus_l_ftp_control_dc_dec_ref(transfer_handle);
}
/*
* decrement the reference this callback has
*/
poll = !globus_l_ftp_control_dc_dec_ref(transfer_handle);
if(poll)
{
globus_l_ftp_data_stripe_poll(dc_handle);
}
}
globus_mutex_unlock(&dc_handle->mutex);
globus_free(callback_info);
globus_free(eb_header);
if(error)
{
globus_object_free(error);
}
}
/*********************************************************************
* other functions
*********************************************************************/
static
void
globus_l_ftp_control_data_encode(
globus_byte_t * buf,
globus_off_t in_size)
{
globus_off_t x;
int ind;
x = (globus_off_t) in_size;
ind = 0;
if(sizeof(globus_off_t) < 8)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x >> 56) & 0xff;
}
if(sizeof(globus_off_t) < 7)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x >> 48) & 0xff;
}
if(sizeof(globus_off_t) < 6)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x >> 40) & 0xff;
}
if(sizeof(globus_off_t) < 5)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x >> 32) & 0xff;
}
if(sizeof(globus_off_t) < 4)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x >> 24) & 0xff;
}
if(sizeof(globus_off_t) < 3)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x >> 16) & 0xff;
}
if(sizeof(globus_off_t) < 2)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x >> 8) & 0xff;
}
if(sizeof(globus_off_t) < 1)
{
buf[ind++] = 0;
}
else
{
buf[ind++] = (x) & 0xff;
}
}
/* globus_l_ftp_control_data_encode() */
static
void
globus_l_ftp_control_data_decode(
globus_byte_t * buf,
globus_off_t * out_size)
{
globus_off_t x;
globus_bool_t overflow;
x = 0;
overflow = GLOBUS_FALSE;
if(sizeof(globus_off_t) >= 8)
{
x += ((globus_off_t) buf[0]) << 56;
}
else
{
if(buf[0] != 0)
{
overflow = GLOBUS_TRUE;
}
}
if(sizeof(globus_off_t) >= 7)
{
x += ((globus_off_t) buf[1]) << 48;
}
else
{
if(buf[1] != 0)
{
overflow = GLOBUS_TRUE;
}
}
if(sizeof(globus_off_t) >= 6)
{
x += ((globus_off_t) buf[2]) << 40;
}
else
{
if(buf[2] != 0)
{
overflow = GLOBUS_TRUE;
}
}
if(sizeof(globus_off_t) >= 5)
{
x += ((globus_off_t) buf[3]) << 32;
}
else
{
if(buf[3] != 0)
{
overflow = GLOBUS_TRUE;
}
}
if(sizeof(globus_off_t) >= 4)
{
x += ((globus_off_t) buf[4]) << 24;
}
else
{
if(buf[4] != 0)
{
overflow = GLOBUS_TRUE;
}
}
if(sizeof(globus_off_t) >= 3)
{
x += ((globus_off_t) buf[5]) << 16;
}
else
{
if(buf[5] != 0)
{
overflow = GLOBUS_TRUE;
}
}
if(sizeof(globus_off_t) >= 2)
{
x += ((globus_off_t) buf[6]) << 8;
}
else
{
if(buf[6] != 0)
{
overflow = GLOBUS_TRUE;
}
}
if(sizeof(globus_off_t) >= 1)
{
x += ((globus_off_t) buf[7]);
}
else
{
if(buf[7] != 0)
{
overflow = GLOBUS_TRUE;
}
}
/* should do something with overflow? */
*out_size = (globus_off_t)x;
}
/* globus_l_ftp_control_data_decode() */
const char *
globus_l_ftp_control_state_to_string(
globus_ftp_data_connection_state_t state)
{
static const char * none = "NONE";
static const char * pasv = "PASV";
static const char * port = "PORT";
static const char * spor = "SPOR";
static const char * connect_read = "CONNECT_READ";
static const char * connect_write = "CONNECT_WRITE";
static const char * closing = "CLOSING";
static const char * eof = "EOF";
static const char * send_eof = "SEND_EOF";
static const char * unknown = "UNKNOWN";
switch(state)
{
case GLOBUS_FTP_DATA_STATE_NONE:
return none;
break;
case GLOBUS_FTP_DATA_STATE_PASV:
return pasv;
break;
case GLOBUS_FTP_DATA_STATE_PORT:
return port;
break;
case GLOBUS_FTP_DATA_STATE_SPOR:
return spor;
break;
case GLOBUS_FTP_DATA_STATE_CONNECT_READ:
return connect_read;
break;
case GLOBUS_FTP_DATA_STATE_CONNECT_WRITE:
return connect_write;
break;
case GLOBUS_FTP_DATA_STATE_CLOSING:
return closing;
break;
case GLOBUS_FTP_DATA_STATE_EOF:
return eof;
break;
case GLOBUS_FTP_DATA_STATE_SEND_EOF:
return send_eof;
break;
default:
return unknown;
break;
}
}
globus_ftp_control-4.7/aclocal.m4 0000664 0000764 0000764 00001036067 12227171013 014074 0000000 0000000 # generated automatically by aclocal 1.9.6 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
# serial 48 AC_PROG_LIBTOOL
# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
# -----------------------------------------------------------
# If this macro is not defined by Autoconf, define it here.
m4_ifdef([AC_PROVIDE_IFELSE],
[],
[m4_define([AC_PROVIDE_IFELSE],
[m4_ifdef([AC_PROVIDE_$1],
[$2], [$3])])])
# AC_PROG_LIBTOOL
# ---------------
AC_DEFUN([AC_PROG_LIBTOOL],
[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
AC_PROVIDE_IFELSE([AC_PROG_CXX],
[AC_LIBTOOL_CXX],
[define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
])])
dnl And a similar setup for Fortran 77 support
AC_PROVIDE_IFELSE([AC_PROG_F77],
[AC_LIBTOOL_F77],
[define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
])])
dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
AC_PROVIDE_IFELSE([AC_PROG_GCJ],
[AC_LIBTOOL_GCJ],
[AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
[AC_LIBTOOL_GCJ],
[AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
[AC_LIBTOOL_GCJ],
[ifdef([AC_PROG_GCJ],
[define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
ifdef([A][M_PROG_GCJ],
[define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
ifdef([LT_AC_PROG_GCJ],
[define([LT_AC_PROG_GCJ],
defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
])])# AC_PROG_LIBTOOL
# _AC_PROG_LIBTOOL
# ----------------
AC_DEFUN([_AC_PROG_LIBTOOL],
[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
# This can be used to rebuild libtool when needed
LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
AC_SUBST(LIBTOOL)dnl
# Prevent multiple expansion
define([AC_PROG_LIBTOOL], [])
])# _AC_PROG_LIBTOOL
# AC_LIBTOOL_SETUP
# ----------------
AC_DEFUN([AC_LIBTOOL_SETUP],
[AC_PREREQ(2.50)dnl
AC_REQUIRE([AC_ENABLE_SHARED])dnl
AC_REQUIRE([AC_ENABLE_STATIC])dnl
AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_CANONICAL_BUILD])dnl
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_PROG_LD])dnl
AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
AC_REQUIRE([AC_PROG_NM])dnl
AC_REQUIRE([AC_PROG_LN_S])dnl
AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
AC_REQUIRE([AC_OBJEXT])dnl
AC_REQUIRE([AC_EXEEXT])dnl
dnl
AC_LIBTOOL_SYS_MAX_CMD_LEN
AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
AC_LIBTOOL_OBJDIR
AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
_LT_AC_PROG_ECHO_BACKSLASH
case $host_os in
aix3*)
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test "X${COLLECT_NAMES+set}" != Xset; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
;;
esac
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
Xsed='sed -e 1s/^X//'
[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
# Same as above, but do not quote variable references.
[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
# Sed substitution to delay expansion of an escaped shell variable in a
# double_quote_subst'ed string.
delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
# Sed substitution to avoid accidental globbing in evaled expressions
no_glob_subst='s/\*/\\\*/g'
# Constants:
rm="rm -f"
# Global variables:
default_ofile=libtool
can_build_shared=yes
# All known linkers require a `.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a
ltmain="$ac_aux_dir/ltmain.sh"
ofile="$default_ofile"
with_gnu_ld="$lt_cv_prog_gnu_ld"
AC_CHECK_TOOL(AR, ar, false)
AC_CHECK_TOOL(RANLIB, ranlib, :)
AC_CHECK_TOOL(STRIP, strip, :)
old_CC="$CC"
old_CFLAGS="$CFLAGS"
# Set sane defaults for various variables
test -z "$AR" && AR=ar
test -z "$AR_FLAGS" && AR_FLAGS=cru
test -z "$AS" && AS=as
test -z "$CC" && CC=cc
test -z "$LTCC" && LTCC=$CC
test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
test -z "$DLLTOOL" && DLLTOOL=dlltool
test -z "$LD" && LD=ld
test -z "$LN_S" && LN_S="ln -s"
test -z "$MAGIC_CMD" && MAGIC_CMD=file
test -z "$NM" && NM=nm
test -z "$SED" && SED=sed
test -z "$OBJDUMP" && OBJDUMP=objdump
test -z "$RANLIB" && RANLIB=:
test -z "$STRIP" && STRIP=:
test -z "$ac_objext" && ac_objext=o
# Determine commands to create old-style static archives.
old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=
if test -n "$RANLIB"; then
case $host_os in
openbsd*)
old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
;;
*)
old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
;;
esac
old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
fi
_LT_CC_BASENAME([$compiler])
# Only perform the check for file, if the check method requires it
case $deplibs_check_method in
file_magic*)
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
AC_PATH_MAGIC
fi
;;
esac
AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
enable_win32_dll=yes, enable_win32_dll=no)
AC_ARG_ENABLE([libtool-lock],
[AC_HELP_STRING([--disable-libtool-lock],
[avoid locking (might break parallel builds)])])
test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
AC_ARG_WITH([pic],
[AC_HELP_STRING([--with-pic],
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
[pic_mode="$withval"],
[pic_mode=default])
test -z "$pic_mode" && pic_mode=default
# Use C for the default configuration in the libtool script
tagname=
AC_LIBTOOL_LANG_C_CONFIG
_LT_AC_TAGCONFIG
])# AC_LIBTOOL_SETUP
# _LT_AC_SYS_COMPILER
# -------------------
AC_DEFUN([_LT_AC_SYS_COMPILER],
[AC_REQUIRE([AC_PROG_CC])dnl
# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}
# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
# Allow CC to be a program name with arguments.
compiler=$CC
])# _LT_AC_SYS_COMPILER
# _LT_CC_BASENAME(CC)
# -------------------
# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
AC_DEFUN([_LT_CC_BASENAME],
[for cc_temp in $1""; do
case $cc_temp in
compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
\-*) ;;
*) break;;
esac
done
cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
])
# _LT_COMPILER_BOILERPLATE
# ------------------------
# Check for compiler boilerplate output or warnings with
# the simple compiler test code.
AC_DEFUN([_LT_COMPILER_BOILERPLATE],
[ac_outfile=conftest.$ac_objext
printf "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$rm conftest*
])# _LT_COMPILER_BOILERPLATE
# _LT_LINKER_BOILERPLATE
# ----------------------
# Check for linker boilerplate output or warnings with
# the simple link test code.
AC_DEFUN([_LT_LINKER_BOILERPLATE],
[ac_outfile=conftest.$ac_objext
printf "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$rm conftest*
])# _LT_LINKER_BOILERPLATE
# _LT_AC_SYS_LIBPATH_AIX
# ----------------------
# Links a minimal program and checks the executable
# for the system default hardcoded library path. In most cases,
# this is /usr/lib:/lib, but when the MPI compilers are used
# the location of the communication and MPI libs are included too.
# If we don't find anything, use the default library path according
# to the aix ld manual.
AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`; fi],[])
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
])# _LT_AC_SYS_LIBPATH_AIX
# _LT_AC_SHELL_INIT(ARG)
# ----------------------
AC_DEFUN([_LT_AC_SHELL_INIT],
[ifdef([AC_DIVERSION_NOTICE],
[AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
[AC_DIVERT_PUSH(NOTICE)])
$1
AC_DIVERT_POP
])# _LT_AC_SHELL_INIT
# _LT_AC_PROG_ECHO_BACKSLASH
# --------------------------
# Add some code to the start of the generated configure script which
# will find an echo command which doesn't interpret backslashes.
AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
[_LT_AC_SHELL_INIT([
# Check that we are running under the correct shell.
SHELL=${CONFIG_SHELL-/bin/sh}
case X$ECHO in
X*--fallback-echo)
# Remove one level of quotation (which was required for Make).
ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
;;
esac
echo=${ECHO-echo}
if test "X[$]1" = X--no-reexec; then
# Discard the --no-reexec flag, and continue.
shift
elif test "X[$]1" = X--fallback-echo; then
# Avoid inline document here, it may be left over
:
elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
# Yippee, $echo works!
:
else
# Restart under the correct shell.
exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
fi
if test "X[$]1" = X--fallback-echo; then
# used as fallback echo
shift
cat </dev/null 2>&1 && unset CDPATH
if test -z "$ECHO"; then
if test "X${echo_test_string+set}" != Xset; then
# find a string as large as possible, as long as the shell can cope with it
for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
# expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
if (echo_test_string=`eval $cmd`) 2>/dev/null &&
echo_test_string=`eval $cmd` &&
(test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
then
break
fi
done
fi
if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
:
else
# The Solaris, AIX, and Digital Unix default echo programs unquote
# backslashes. This makes it impossible to quote backslashes using
# echo "$something" | sed 's/\\/\\\\/g'
#
# So, first we look for a working echo in the user's PATH.
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for dir in $PATH /usr/ucb; do
IFS="$lt_save_ifs"
if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
echo="$dir/echo"
break
fi
done
IFS="$lt_save_ifs"
if test "X$echo" = Xecho; then
# We didn't find a better echo, so look for alternatives.
if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
# This shell has a builtin print -r that does the trick.
echo='print -r'
elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
test "X$CONFIG_SHELL" != X/bin/ksh; then
# If we have ksh, try running configure again with it.
ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
export ORIGINAL_CONFIG_SHELL
CONFIG_SHELL=/bin/ksh
export CONFIG_SHELL
exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
else
# Try using printf.
echo='printf %s\n'
if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
# Cool, printf works
:
elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
test "X$echo_testing_string" = 'X\t' &&
echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
export CONFIG_SHELL
SHELL="$CONFIG_SHELL"
export SHELL
echo="$CONFIG_SHELL [$]0 --fallback-echo"
elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
test "X$echo_testing_string" = 'X\t' &&
echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
echo="$CONFIG_SHELL [$]0 --fallback-echo"
else
# maybe with a smaller string...
prev=:
for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
then
break
fi
prev="$cmd"
done
if test "$prev" != 'sed 50q "[$]0"'; then
echo_test_string=`eval $prev`
export echo_test_string
exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
else
# Oops. We lost completely, so just stick with echo.
echo=echo
fi
fi
fi
fi
fi
fi
# Copy echo and quote the copy suitably for passing to libtool from
# the Makefile, instead of quoting the original, which is used later.
ECHO=$echo
if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
fi
AC_SUBST(ECHO)
])])# _LT_AC_PROG_ECHO_BACKSLASH
# _LT_AC_LOCK
# -----------
AC_DEFUN([_LT_AC_LOCK],
[AC_ARG_ENABLE([libtool-lock],
[AC_HELP_STRING([--disable-libtool-lock],
[avoid locking (might break parallel builds)])])
test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.$ac_objext` in
*ELF-32*)
HPUX_IA64_MODE="32"
;;
*ELF-64*)
HPUX_IA64_MODE="64"
;;
esac
fi
rm -rf conftest*
;;
*-*-irix6*)
# Find out which ABI we are using.
echo '[#]line __oline__ "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
if test "$lt_cv_prog_gnu_ld" = yes; then
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
;;
*N32*)
LD="${LD-ld} -melf32bmipn32"
;;
*64-bit*)
LD="${LD-ld} -melf64bmip"
;;
esac
else
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
;;
*N32*)
LD="${LD-ld} -n32"
;;
*64-bit*)
LD="${LD-ld} -64"
;;
esac
fi
fi
rm -rf conftest*
;;
x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.o` in
*32-bit*)
case $host in
x86_64-*linux*)
LD="${LD-ld} -m elf_i386"
;;
ppc64-*linux*|powerpc64-*linux*)
LD="${LD-ld} -m elf32ppclinux"
;;
s390x-*linux*)
LD="${LD-ld} -m elf_s390"
;;
sparc64-*linux*)
LD="${LD-ld} -m elf32_sparc"
;;
esac
;;
*64-bit*)
case $host in
x86_64-*linux*)
LD="${LD-ld} -m elf_x86_64"
;;
ppc*-*linux*|powerpc*-*linux*)
LD="${LD-ld} -m elf64ppc"
;;
s390*-*linux*)
LD="${LD-ld} -m elf64_s390"
;;
sparc*-*linux*)
LD="${LD-ld} -m elf64_sparc"
;;
esac
;;
esac
fi
rm -rf conftest*
;;
*-*-sco3.2v5*)
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -belf"
AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
[AC_LANG_PUSH(C)
AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
AC_LANG_POP])
if test x"$lt_cv_cc_needs_belf" != x"yes"; then
# this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
CFLAGS="$SAVE_CFLAGS"
fi
;;
sparc*-*solaris*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
yes*) LD="${LD-ld} -m elf64_sparc" ;;
*) LD="${LD-ld} -64" ;;
esac
;;
esac
fi
rm -rf conftest*
;;
AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
AC_CHECK_TOOL(AS, as, false)
AC_CHECK_TOOL(OBJDUMP, objdump, false)
;;
])
esac
need_locks="$enable_libtool_lock"
])# _LT_AC_LOCK
# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
# ----------------------------------------------------------------
# Check whether the given compiler option works
AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
[AC_REQUIRE([LT_AC_PROG_SED])
AC_CACHE_CHECK([$1], [$2],
[$2=no
ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
printf "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="$3"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
# The option is referenced via a variable to avoid confusing sed.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&AS_MESSAGE_LOG_FD
echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
$echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
$2=yes
fi
fi
$rm conftest*
])
if test x"[$]$2" = xyes; then
ifelse([$5], , :, [$5])
else
ifelse([$6], , :, [$6])
fi
])# AC_LIBTOOL_COMPILER_OPTION
# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
# [ACTION-SUCCESS], [ACTION-FAILURE])
# ------------------------------------------------------------
# Check whether the given compiler option works
AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
[AC_CACHE_CHECK([$1], [$2],
[$2=no
save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS $3"
printf "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
# The linker can only warn and ignore the option if not recognized
# So say no if there are warnings
if test -s conftest.err; then
# Append any errors to the config.log.
cat conftest.err 1>&AS_MESSAGE_LOG_FD
$echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if diff conftest.exp conftest.er2 >/dev/null; then
$2=yes
fi
else
$2=yes
fi
fi
$rm conftest*
LDFLAGS="$save_LDFLAGS"
])
if test x"[$]$2" = xyes; then
ifelse([$4], , :, [$4])
else
ifelse([$5], , :, [$5])
fi
])# AC_LIBTOOL_LINKER_OPTION
# AC_LIBTOOL_SYS_MAX_CMD_LEN
# --------------------------
AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
[# find the maximum length of command line arguments
AC_MSG_CHECKING([the maximum length of command line arguments])
AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
i=0
teststring="ABCD"
case $build_os in
msdosdjgpp*)
# On DJGPP, this test can blow up pretty badly due to problems in libc
# (any single argument exceeding 2000 bytes causes a buffer overrun
# during glob expansion). Even if it were fixed, the result of this
# check would be larger than it should be.
lt_cv_sys_max_cmd_len=12288; # 12K is about right
;;
gnu*)
# Under GNU Hurd, this test is not required because there is
# no limit to the length of command line arguments.
# Libtool will interpret -1 as no limit whatsoever
lt_cv_sys_max_cmd_len=-1;
;;
cygwin* | mingw*)
# On Win9x/ME, this test blows up -- it succeeds, but takes
# about 5 minutes as the teststring grows exponentially.
# Worse, since 9x/ME are not pre-emptively multitasking,
# you end up with a "frozen" computer, even though with patience
# the test eventually succeeds (with a max line length of 256k).
# Instead, let's just punt: use the minimum linelength reported by
# all of the supported platforms: 8192 (on NT/2K/XP).
lt_cv_sys_max_cmd_len=8192;
;;
amigaos*)
# On AmigaOS with pdksh, this test takes hours, literally.
# So we just punt and use a minimum line length of 8192.
lt_cv_sys_max_cmd_len=8192;
;;
netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
elif test -x /usr/sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
else
lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
fi
# And add a safety zone
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
;;
interix*)
# We know the value 262144 and hardcode it with a safety zone (like BSD)
lt_cv_sys_max_cmd_len=196608
;;
osf*)
# Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
# due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
# nice to cause kernel panics so lets avoid the loop below.
# First set a reasonable default.
lt_cv_sys_max_cmd_len=16384
#
if test -x /sbin/sysconfig; then
case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
*1*) lt_cv_sys_max_cmd_len=-1 ;;
esac
fi
;;
sco3.2v5*)
lt_cv_sys_max_cmd_len=102400
;;
sysv5* | sco5v6* | sysv4.2uw2*)
kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
if test -n "$kargmax"; then
lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
else
lt_cv_sys_max_cmd_len=32768
fi
;;
*)
# If test is not a shell built-in, we'll probably end up computing a
# maximum length that is only half of the actual maximum length, but
# we can't tell.
SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
= "XX$teststring") >/dev/null 2>&1 &&
new_result=`expr "X$teststring" : ".*" 2>&1` &&
lt_cv_sys_max_cmd_len=$new_result &&
test $i != 17 # 1/2 MB should be enough
do
i=`expr $i + 1`
teststring=$teststring$teststring
done
teststring=
# Add a significant safety factor because C++ compilers can tack on massive
# amounts of additional arguments before passing them to the linker.
# It appears as though 1/2 is a usable value.
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
;;
esac
])
if test -n $lt_cv_sys_max_cmd_len ; then
AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
else
AC_MSG_RESULT(none)
fi
])# AC_LIBTOOL_SYS_MAX_CMD_LEN
# _LT_AC_CHECK_DLFCN
# ------------------
AC_DEFUN([_LT_AC_CHECK_DLFCN],
[AC_CHECK_HEADERS(dlfcn.h)dnl
])# _LT_AC_CHECK_DLFCN
# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
# ---------------------------------------------------------------------
AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
if test "$cross_compiling" = yes; then :
[$4]
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <
#endif
#include
#ifdef RTLD_GLOBAL
# define LT_DLGLOBAL RTLD_GLOBAL
#else
# ifdef DL_GLOBAL
# define LT_DLGLOBAL DL_GLOBAL
# else
# define LT_DLGLOBAL 0
# endif
#endif
/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
# ifdef RTLD_LAZY
# define LT_DLLAZY_OR_NOW RTLD_LAZY
# else
# ifdef DL_LAZY
# define LT_DLLAZY_OR_NOW DL_LAZY
# else
# ifdef RTLD_NOW
# define LT_DLLAZY_OR_NOW RTLD_NOW
# else
# ifdef DL_NOW
# define LT_DLLAZY_OR_NOW DL_NOW
# else
# define LT_DLLAZY_OR_NOW 0
# endif
# endif
# endif
# endif
#endif
#ifdef __cplusplus
extern "C" void exit (int);
#endif
void fnord() { int i=42;}
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
/* dlclose (self); */
}
else
puts (dlerror ());
exit (status);
}]
EOF
if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
(./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
lt_status=$?
case x$lt_status in
x$lt_dlno_uscore) $1 ;;
x$lt_dlneed_uscore) $2 ;;
x$lt_dlunknown|x*) $3 ;;
esac
else :
# compilation failed
$3
fi
fi
rm -fr conftest*
])# _LT_AC_TRY_DLOPEN_SELF
# AC_LIBTOOL_DLOPEN_SELF
# ----------------------
AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
if test "x$enable_dlopen" != xyes; then
enable_dlopen=unknown
enable_dlopen_self=unknown
enable_dlopen_self_static=unknown
else
lt_cv_dlopen=no
lt_cv_dlopen_libs=
case $host_os in
beos*)
lt_cv_dlopen="load_add_on"
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
;;
mingw* | pw32*)
lt_cv_dlopen="LoadLibrary"
lt_cv_dlopen_libs=
;;
cygwin*)
lt_cv_dlopen="dlopen"
lt_cv_dlopen_libs=
;;
darwin*)
# if libdl is installed we need to link against it
AC_CHECK_LIB([dl], [dlopen],
[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
lt_cv_dlopen="dyld"
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
])
;;
*)
AC_CHECK_FUNC([shl_load],
[lt_cv_dlopen="shl_load"],
[AC_CHECK_LIB([dld], [shl_load],
[lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
[AC_CHECK_FUNC([dlopen],
[lt_cv_dlopen="dlopen"],
[AC_CHECK_LIB([dl], [dlopen],
[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
[AC_CHECK_LIB([svld], [dlopen],
[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
[AC_CHECK_LIB([dld], [dld_link],
[lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
])
])
])
])
])
;;
esac
if test "x$lt_cv_dlopen" != xno; then
enable_dlopen=yes
else
enable_dlopen=no
fi
case $lt_cv_dlopen in
dlopen)
save_CPPFLAGS="$CPPFLAGS"
test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
save_LDFLAGS="$LDFLAGS"
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
save_LIBS="$LIBS"
LIBS="$lt_cv_dlopen_libs $LIBS"
AC_CACHE_CHECK([whether a program can dlopen itself],
lt_cv_dlopen_self, [dnl
_LT_AC_TRY_DLOPEN_SELF(
lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
])
if test "x$lt_cv_dlopen_self" = xyes; then
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
lt_cv_dlopen_self_static, [dnl
_LT_AC_TRY_DLOPEN_SELF(
lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
])
fi
CPPFLAGS="$save_CPPFLAGS"
LDFLAGS="$save_LDFLAGS"
LIBS="$save_LIBS"
;;
esac
case $lt_cv_dlopen_self in
yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
*) enable_dlopen_self=unknown ;;
esac
case $lt_cv_dlopen_self_static in
yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
*) enable_dlopen_self_static=unknown ;;
esac
fi
])# AC_LIBTOOL_DLOPEN_SELF
# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
# ---------------------------------
# Check to see if options -c and -o are simultaneously supported by compiler
AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
[_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
[_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
$rm -r conftest 2>/dev/null
mkdir conftest
cd conftest
mkdir out
printf "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-o out/conftest2.$ac_objext"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&AS_MESSAGE_LOG_FD
echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
$echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
fi
fi
chmod u+w . 2>&AS_MESSAGE_LOG_FD
$rm conftest*
# SGI C++ compiler will create directory out/ii_files/ for
# template instantiation
test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
$rm out/* && rmdir out
cd ..
rmdir conftest
$rm conftest*
])
])# AC_LIBTOOL_PROG_CC_C_O
# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
# -----------------------------------------
# Check to see if we can do hard links to lock some files if needed
AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
[AC_REQUIRE([_LT_AC_LOCK])dnl
hard_links="nottested"
if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
# do not overwrite the value of need_locks provided by the user
AC_MSG_CHECKING([if we can lock with hard links])
hard_links=yes
$rm conftest*
ln conftest.a conftest.b 2>/dev/null && hard_links=no
touch conftest.a
ln conftest.a conftest.b 2>&5 || hard_links=no
ln conftest.a conftest.b 2>/dev/null && hard_links=no
AC_MSG_RESULT([$hard_links])
if test "$hard_links" = no; then
AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
need_locks=warn
fi
else
need_locks=no
fi
])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
# AC_LIBTOOL_OBJDIR
# -----------------
AC_DEFUN([AC_LIBTOOL_OBJDIR],
[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
[rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
lt_cv_objdir=.libs
else
# MS-DOS does not allow filenames that begin with a dot.
lt_cv_objdir=_libs
fi
rmdir .libs 2>/dev/null])
objdir=$lt_cv_objdir
])# AC_LIBTOOL_OBJDIR
# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
# ----------------------------------------------
# Check hardcoding attributes.
AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
[AC_MSG_CHECKING([how to hardcode library paths into programs])
_LT_AC_TAGVAR(hardcode_action, $1)=
if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
# We can hardcode non-existant directories.
if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
# If the only mechanism to avoid hardcoding is shlibpath_var, we
# have to relink, otherwise we might link with an installed library
# when we should be linking with a yet-to-be-installed one
## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
# Linking always hardcodes the temporary library directory.
_LT_AC_TAGVAR(hardcode_action, $1)=relink
else
# We can link without hardcoding, and we can hardcode nonexisting dirs.
_LT_AC_TAGVAR(hardcode_action, $1)=immediate
fi
else
# We cannot hardcode anything, or else we can only hardcode existing
# directories.
_LT_AC_TAGVAR(hardcode_action, $1)=unsupported
fi
AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
# Fast installation is not supported
enable_fast_install=no
elif test "$shlibpath_overrides_runpath" = yes ||
test "$enable_shared" = no; then
# Fast installation is not necessary
enable_fast_install=needless
fi
])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
# AC_LIBTOOL_SYS_LIB_STRIP
# ------------------------
AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
[striplib=
old_striplib=
AC_MSG_CHECKING([whether stripping libraries is possible])
if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
test -z "$striplib" && striplib="$STRIP --strip-unneeded"
AC_MSG_RESULT([yes])
else
# FIXME - insert some real tests, host_os isn't really good enough
case $host_os in
darwin*)
if test -n "$STRIP" ; then
striplib="$STRIP -x"
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
;;
*)
AC_MSG_RESULT([no])
;;
esac
fi
])# AC_LIBTOOL_SYS_LIB_STRIP
# AC_LIBTOOL_SYS_DYNAMIC_LINKER
# -----------------------------
# PORTME Fill in your ld.so characteristics
AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
[AC_MSG_CHECKING([dynamic linker characteristics])
library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=".so"
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
if test "$GCC" = yes; then
sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
# if the path contains ";" then we assume it to be the separator
# otherwise default to the standard path separator (i.e. ":") - it is
# assumed that no part of a normal pathname contains ";" but that should
# okay in the real world where ";" in dirpaths is itself problematic.
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
else
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
fi
else
sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi
need_lib_prefix=unknown
hardcode_into_libs=no
# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown
case $host_os in
aix3*)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
shlibpath_var=LIBPATH
# AIX 3 has no versioning support, so we append a major version to the name.
soname_spec='${libname}${release}${shared_ext}$major'
;;
aix4* | aix5*)
version_type=linux
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
if test "$host_cpu" = ia64; then
# AIX 5 supports IA64
library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
else
# With GCC up to 2.95.x, collect2 would create an import file
# for dependence libraries. The import file would start with
# the line `#! .'. This would cause the generated library to
# depend on `.', always an invalid library. This was fixed in
# development snapshots of GCC prior to 3.0.
case $host_os in
aix4 | aix4.[[01]] | aix4.[[01]].*)
if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
echo ' yes '
echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
:
else
can_build_shared=no
fi
;;
esac
# AIX (on Power*) has no versioning support, so currently we can not hardcode correct
# soname into executable. Probably we can add versioning support to
# collect2, so additional links can be useful in future.
if test "$aix_use_runtimelinking" = yes; then
# If using run time linking (on AIX 4.2 or later) use lib.so
# instead of lib.a to let people know that these are not
# typical AIX shared libraries.
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
else
# We preserve .a as extension for shared libraries through AIX4.2
# and later when we are not doing run time linking.
library_names_spec='${libname}${release}.a $libname.a'
soname_spec='${libname}${release}${shared_ext}$major'
fi
shlibpath_var=LIBPATH
fi
;;
amigaos*)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
beos*)
library_names_spec='${libname}${shared_ext}'
dynamic_linker="$host_os ld.so"
shlibpath_var=LIBRARY_PATH
;;
bsdi[[45]]*)
version_type=linux
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
# the default ld.so.conf also contains /usr/contrib/lib and
# /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
# libtool to hard-code these into programs
;;
cygwin* | mingw* | pw32*)
version_type=windows
shrext_cmds=".dll"
need_version=no
need_lib_prefix=no
case $GCC,$host_os in
yes,cygwin* | yes,mingw* | yes,pw32*)
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \${file}`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
chmod a+x \$dldir/$dlname'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$rm \$dlpath'
shlibpath_overrides_runpath=yes
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
;;
mingw*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
# It is most probably a Windows format PATH printed by
# mingw gcc, but we are running on Cygwin. Gcc prints its search
# path with ; separators, and with drive letters. We can handle the
# drive letters (cygwin fileutils understands them), so leave them,
# especially as we might pass files found there to a mingw objdump,
# which wouldn't understand a cygwinified path. Ahh.
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
else
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
fi
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
;;
esac
;;
*)
library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
;;
esac
dynamic_linker='Win32 ld.exe'
# FIXME: first we should search . and the directory the executable is in
shlibpath_var=PATH
;;
darwin* | rhapsody*)
dynamic_linker="$host_os dyld"
version_type=darwin
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
soname_spec='${libname}${release}${major}$shared_ext'
shlibpath_overrides_runpath=yes
shlibpath_var=DYLD_LIBRARY_PATH
shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
# Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
if test "$GCC" = yes; then
sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
else
sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
fi
sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
;;
dgux*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
;;
freebsd1*)
dynamic_linker=no
;;
kfreebsd*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='GNU ld.so'
;;
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
objformat=`/usr/bin/objformat`
else
case $host_os in
freebsd[[123]]*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
version_type=freebsd-$objformat
case $version_type in
freebsd-elf*)
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
need_version=no
need_lib_prefix=no
;;
freebsd-*)
library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
need_version=yes
;;
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
freebsd2*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[[01]]* | freebsdelf3.[[01]]*)
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
freebsd*) # from 4.6 on
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
esac
;;
gnu*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
hardcode_into_libs=yes
;;
hpux9* | hpux10* | hpux11*)
# Give a soname corresponding to the major version so that dld.sl refuses to
# link against other versions.
version_type=sunos
need_lib_prefix=no
need_version=no
case $host_cpu in
ia64*)
shrext_cmds='.so'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.so"
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
if test "X$HPUX_IA64_MODE" = X32; then
sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
else
sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
fi
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
hppa*64*)
shrext_cmds='.sl'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.sl"
shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
*)
shrext_cmds='.sl'
dynamic_linker="$host_os dld.sl"
shlibpath_var=SHLIB_PATH
shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
;;
esac
# HP-UX runs *really* slowly unless shared libraries are mode 555.
postinstall_cmds='chmod 555 $lib'
;;
interix3*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
irix5* | irix6* | nonstopux*)
case $host_os in
nonstopux*) version_type=nonstopux ;;
*)
if test "$lt_cv_prog_gnu_ld" = yes; then
version_type=linux
else
version_type=irix
fi ;;
esac
need_lib_prefix=no
need_version=no
soname_spec='${libname}${release}${shared_ext}$major'
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
case $host_os in
irix5* | nonstopux*)
libsuff= shlibsuff=
;;
*)
case $LD in # libtool.m4 will add one of these switches to LD
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
libsuff= shlibsuff= libmagic=32-bit;;
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
libsuff=32 shlibsuff=N32 libmagic=N32;;
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
libsuff=64 shlibsuff=64 libmagic=64-bit;;
*) libsuff= shlibsuff= libmagic=never-match;;
esac
;;
esac
shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
shlibpath_overrides_runpath=no
sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
hardcode_into_libs=yes
;;
# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
# This must be Linux ELF.
linux*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
# find out which ABI we are using
libsuff=
case "$host_cpu" in
x86_64*|s390x*|powerpc64*)
echo '[#]line __oline__ "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.$ac_objext` in
*64-bit*)
libsuff=64
sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
;;
esac
fi
rm -rf conftest*
;;
esac
# Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
fi
# We used to test for /lib/ld.so.1 and disable shared libraries on
# powerpc, because MkLinux only supported shared libraries with the
# GNU dynamic linker. Since this was broken with cross compilers,
# most powerpc-linux boxes support dynamic linking these days and
# people can always --disable-shared, the test was removed, and we
# assume the GNU/Linux dynamic linker is in use.
dynamic_linker='GNU/Linux ld.so'
;;
knetbsd*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='GNU ld.so'
;;
netbsd*)
version_type=sunos
need_lib_prefix=no
need_version=no
if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
dynamic_linker='NetBSD (a.out) ld.so'
else
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
dynamic_linker='NetBSD ld.elf_so'
fi
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
newsos6)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
nto-qnx*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
openbsd*)
version_type=sunos
sys_lib_dlsearch_path_spec="/usr/lib"
need_lib_prefix=no
# Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
case $host_os in
openbsd3.3 | openbsd3.3.*) need_version=yes ;;
*) need_version=no ;;
esac
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
shlibpath_var=LD_LIBRARY_PATH
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
case $host_os in
openbsd2.[[89]] | openbsd2.[[89]].*)
shlibpath_overrides_runpath=no
;;
*)
shlibpath_overrides_runpath=yes
;;
esac
else
shlibpath_overrides_runpath=yes
fi
;;
os2*)
libname_spec='$name'
shrext_cmds=".dll"
need_lib_prefix=no
library_names_spec='$libname${shared_ext} $libname.a'
dynamic_linker='OS/2 ld.exe'
shlibpath_var=LIBPATH
;;
osf3* | osf4* | osf5*)
version_type=osf
need_lib_prefix=no
need_version=no
soname_spec='${libname}${release}${shared_ext}$major'
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
;;
solaris*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
# ldd complains unless libraries are executable
postinstall_cmds='chmod +x $lib'
;;
sunos4*)
version_type=sunos
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
if test "$with_gnu_ld" = yes; then
need_lib_prefix=no
fi
need_version=yes
;;
sysv4 | sysv4.3*)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
case $host_vendor in
sni)
shlibpath_overrides_runpath=no
need_lib_prefix=no
export_dynamic_flag_spec='${wl}-Blargedynsym'
runpath_var=LD_RUN_PATH
;;
siemens)
need_lib_prefix=no
;;
motorola)
need_lib_prefix=no
need_version=no
shlibpath_overrides_runpath=no
sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
;;
esac
;;
sysv4*MP*)
if test -d /usr/nec ;then
version_type=linux
library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
soname_spec='$libname${shared_ext}.$major'
shlibpath_var=LD_LIBRARY_PATH
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
version_type=freebsd-elf
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
hardcode_into_libs=yes
if test "$with_gnu_ld" = yes; then
sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
shlibpath_overrides_runpath=no
else
sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
shlibpath_overrides_runpath=yes
case $host_os in
sco3.2v5*)
sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
;;
esac
fi
sys_lib_dlsearch_path_spec='/usr/lib'
;;
uts4*)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
;;
*)
dynamic_linker=no
;;
esac
AC_MSG_RESULT([$dynamic_linker])
test "$dynamic_linker" = no && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test "$GCC" = yes; then
variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi
])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
# _LT_AC_TAGCONFIG
# ----------------
AC_DEFUN([_LT_AC_TAGCONFIG],
[AC_ARG_WITH([tags],
[AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
[include additional configurations @<:@automatic@:>@])],
[tagnames="$withval"])
if test -f "$ltmain" && test -n "$tagnames"; then
if test ! -f "${ofile}"; then
AC_MSG_WARN([output file `$ofile' does not exist])
fi
if test -z "$LTCC"; then
eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
if test -z "$LTCC"; then
AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
else
AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
fi
fi
if test -z "$LTCFLAGS"; then
eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
fi
# Extract list of available tagged configurations in $ofile.
# Note that this assumes the entire list is on one line.
available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for tagname in $tagnames; do
IFS="$lt_save_ifs"
# Check whether tagname contains only valid characters
case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
"") ;;
*) AC_MSG_ERROR([invalid tag name: $tagname])
;;
esac
if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
then
AC_MSG_ERROR([tag name \"$tagname\" already exists])
fi
# Update the list of available tags.
if test -n "$tagname"; then
echo appending configuration tag \"$tagname\" to $ofile
case $tagname in
CXX)
if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
(test "X$CXX" != "Xg++"))) ; then
AC_LIBTOOL_LANG_CXX_CONFIG
else
tagname=""
fi
;;
F77)
if test -n "$F77" && test "X$F77" != "Xno"; then
AC_LIBTOOL_LANG_F77_CONFIG
else
tagname=""
fi
;;
GCJ)
if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
AC_LIBTOOL_LANG_GCJ_CONFIG
else
tagname=""
fi
;;
RC)
AC_LIBTOOL_LANG_RC_CONFIG
;;
*)
AC_MSG_ERROR([Unsupported tag name: $tagname])
;;
esac
# Append the new tag name to the list of available tags.
if test -n "$tagname" ; then
available_tags="$available_tags $tagname"
fi
fi
done
IFS="$lt_save_ifs"
# Now substitute the updated list of available tags.
if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
mv "${ofile}T" "$ofile"
chmod +x "$ofile"
else
rm -f "${ofile}T"
AC_MSG_ERROR([unable to update list of available tagged configurations.])
fi
fi
])# _LT_AC_TAGCONFIG
# AC_LIBTOOL_DLOPEN
# -----------------
# enable checks for dlopen support
AC_DEFUN([AC_LIBTOOL_DLOPEN],
[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
])# AC_LIBTOOL_DLOPEN
# AC_LIBTOOL_WIN32_DLL
# --------------------
# declare package support for building win32 DLLs
AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
])# AC_LIBTOOL_WIN32_DLL
# AC_ENABLE_SHARED([DEFAULT])
# ---------------------------
# implement the --enable-shared flag
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
AC_DEFUN([AC_ENABLE_SHARED],
[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
AC_ARG_ENABLE([shared],
[AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
[build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
[p=${PACKAGE-default}
case $enableval in
yes) enable_shared=yes ;;
no) enable_shared=no ;;
*)
enable_shared=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for pkg in $enableval; do
IFS="$lt_save_ifs"
if test "X$pkg" = "X$p"; then
enable_shared=yes
fi
done
IFS="$lt_save_ifs"
;;
esac],
[enable_shared=]AC_ENABLE_SHARED_DEFAULT)
])# AC_ENABLE_SHARED
# AC_DISABLE_SHARED
# -----------------
# set the default shared flag to --disable-shared
AC_DEFUN([AC_DISABLE_SHARED],
[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
AC_ENABLE_SHARED(no)
])# AC_DISABLE_SHARED
# AC_ENABLE_STATIC([DEFAULT])
# ---------------------------
# implement the --enable-static flag
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
AC_DEFUN([AC_ENABLE_STATIC],
[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
AC_ARG_ENABLE([static],
[AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
[build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
[p=${PACKAGE-default}
case $enableval in
yes) enable_static=yes ;;
no) enable_static=no ;;
*)
enable_static=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for pkg in $enableval; do
IFS="$lt_save_ifs"
if test "X$pkg" = "X$p"; then
enable_static=yes
fi
done
IFS="$lt_save_ifs"
;;
esac],
[enable_static=]AC_ENABLE_STATIC_DEFAULT)
])# AC_ENABLE_STATIC
# AC_DISABLE_STATIC
# -----------------
# set the default static flag to --disable-static
AC_DEFUN([AC_DISABLE_STATIC],
[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
AC_ENABLE_STATIC(no)
])# AC_DISABLE_STATIC
# AC_ENABLE_FAST_INSTALL([DEFAULT])
# ---------------------------------
# implement the --enable-fast-install flag
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
AC_DEFUN([AC_ENABLE_FAST_INSTALL],
[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
AC_ARG_ENABLE([fast-install],
[AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
[optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
[p=${PACKAGE-default}
case $enableval in
yes) enable_fast_install=yes ;;
no) enable_fast_install=no ;;
*)
enable_fast_install=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for pkg in $enableval; do
IFS="$lt_save_ifs"
if test "X$pkg" = "X$p"; then
enable_fast_install=yes
fi
done
IFS="$lt_save_ifs"
;;
esac],
[enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
])# AC_ENABLE_FAST_INSTALL
# AC_DISABLE_FAST_INSTALL
# -----------------------
# set the default to --disable-fast-install
AC_DEFUN([AC_DISABLE_FAST_INSTALL],
[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
AC_ENABLE_FAST_INSTALL(no)
])# AC_DISABLE_FAST_INSTALL
# AC_LIBTOOL_PICMODE([MODE])
# --------------------------
# implement the --with-pic flag
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
AC_DEFUN([AC_LIBTOOL_PICMODE],
[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
pic_mode=ifelse($#,1,$1,default)
])# AC_LIBTOOL_PICMODE
# AC_PROG_EGREP
# -------------
# This is predefined starting with Autoconf 2.54, so this conditional
# definition can be removed once we require Autoconf 2.54 or later.
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
[if echo a | (grep -E '(a|b)') >/dev/null 2>&1
then ac_cv_prog_egrep='grep -E'
else ac_cv_prog_egrep='egrep'
fi])
EGREP=$ac_cv_prog_egrep
AC_SUBST([EGREP])
])])
# AC_PATH_TOOL_PREFIX
# -------------------
# find a file program which can recognise shared library
AC_DEFUN([AC_PATH_TOOL_PREFIX],
[AC_REQUIRE([AC_PROG_EGREP])dnl
AC_MSG_CHECKING([for $1])
AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
[case $MAGIC_CMD in
[[\\/*] | ?:[\\/]*])
lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
;;
*)
lt_save_MAGIC_CMD="$MAGIC_CMD"
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
dnl $ac_dummy forces splitting on constant user-supplied paths.
dnl POSIX.2 word splitting is done only on the output of word expansions,
dnl not every word. This closes a longstanding sh security hole.
ac_dummy="ifelse([$2], , $PATH, [$2])"
for ac_dir in $ac_dummy; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$1; then
lt_cv_path_MAGIC_CMD="$ac_dir/$1"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
else
cat <&2
*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such. This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem. Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org
EOF
fi ;;
esac
fi
break
fi
done
IFS="$lt_save_ifs"
MAGIC_CMD="$lt_save_MAGIC_CMD"
;;
esac])
MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if test -n "$MAGIC_CMD"; then
AC_MSG_RESULT($MAGIC_CMD)
else
AC_MSG_RESULT(no)
fi
])# AC_PATH_TOOL_PREFIX
# AC_PATH_MAGIC
# -------------
# find a file program which can recognise a shared library
AC_DEFUN([AC_PATH_MAGIC],
[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
if test -z "$lt_cv_path_MAGIC_CMD"; then
if test -n "$ac_tool_prefix"; then
AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
else
MAGIC_CMD=:
fi
fi
])# AC_PATH_MAGIC
# AC_PROG_LD
# ----------
# find the pathname to the GNU or non-GNU linker
AC_DEFUN([AC_PROG_LD],
[AC_ARG_WITH([gnu-ld],
[AC_HELP_STRING([--with-gnu-ld],
[assume the C compiler uses GNU ld @<:@default=no@:>@])],
[test "$withval" = no || with_gnu_ld=yes],
[with_gnu_ld=no])
AC_REQUIRE([LT_AC_PROG_SED])dnl
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_CANONICAL_BUILD])dnl
ac_prog=ld
if test "$GCC" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
AC_MSG_CHECKING([for ld used by $CC])
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
esac
case $ac_prog in
# Accept absolute paths.
[[\\/]]* | ?:[[\\/]]*)
re_direlt='/[[^/]][[^/]]*/\.\./'
# Canonicalize the pathname of ld
ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
done
test -z "$LD" && LD="$ac_prog"
;;
"")
# If it fails, then pretend we aren't using GCC.
ac_prog=ld
;;
*)
# If it is relative, then search for the first ld in PATH.
with_gnu_ld=unknown
;;
esac
elif test "$with_gnu_ld" = yes; then
AC_MSG_CHECKING([for GNU ld])
else
AC_MSG_CHECKING([for non-GNU ld])
fi
AC_CACHE_VAL(lt_cv_path_LD,
[if test -z "$LD"; then
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
lt_cv_path_LD="$ac_dir/$ac_prog"
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then
case $host_cpu in
i*86 )
# Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up.
lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;;
esac
else
lt_cv_deplibs_check_method=pass_all
fi
;;
gnu*)
lt_cv_deplibs_check_method=pass_all
;;
hpux10.20* | hpux11*)
lt_cv_file_magic_cmd=/usr/bin/file
case $host_cpu in
ia64*)
lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
;;
hppa*64*)
[lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
;;
*)
lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
lt_cv_file_magic_test_file=/usr/lib/libc.sl
;;
esac
;;
interix3*)
# PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
;;
irix5* | irix6* | nonstopux*)
case $LD in
*-32|*"-32 ") libmagic=32-bit;;
*-n32|*"-n32 ") libmagic=N32;;
*-64|*"-64 ") libmagic=64-bit;;
*) libmagic=never-match;;
esac
lt_cv_deplibs_check_method=pass_all
;;
# This must be Linux ELF.
linux*)
lt_cv_deplibs_check_method=pass_all
;;
netbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
fi
;;
newos6*)
lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=/usr/lib/libnls.so
;;
nto-qnx*)
lt_cv_deplibs_check_method=unknown
;;
openbsd*)
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
fi
;;
osf3* | osf4* | osf5*)
lt_cv_deplibs_check_method=pass_all
;;
solaris*)
lt_cv_deplibs_check_method=pass_all
;;
sysv4 | sysv4.3*)
case $host_vendor in
motorola)
lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
;;
ncr)
lt_cv_deplibs_check_method=pass_all
;;
sequent)
lt_cv_file_magic_cmd='/bin/file'
lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
;;
sni)
lt_cv_file_magic_cmd='/bin/file'
lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
lt_cv_file_magic_test_file=/lib/libc.so
;;
siemens)
lt_cv_deplibs_check_method=pass_all
;;
pc)
lt_cv_deplibs_check_method=pass_all
;;
esac
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
lt_cv_deplibs_check_method=pass_all
;;
esac
])
file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
test -z "$deplibs_check_method" && deplibs_check_method=unknown
])# AC_DEPLIBS_CHECK_METHOD
# AC_PROG_NM
# ----------
# find the pathname to a BSD-compatible name lister
AC_DEFUN([AC_PROG_NM],
[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
[if test -n "$NM"; then
# Let the user override the test.
lt_cv_path_NM="$NM"
else
lt_nm_to_check="${ac_tool_prefix}nm"
if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
lt_nm_to_check="$lt_nm_to_check nm"
fi
for lt_tmp_nm in $lt_nm_to_check; do
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
tmp_nm="$ac_dir/$lt_tmp_nm"
if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
# Check to see if the nm accepts a BSD-compat flag.
# Adding the `sed 1q' prevents false positives on HP-UX, which says:
# nm: unknown option "B" ignored
# Tru64's nm complains that /dev/null is an invalid object file
case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
*/dev/null* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
break
;;
*)
case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
break
;;
*)
lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
continue # so that we can try to find one that supports BSD flags
;;
esac
;;
esac
fi
done
IFS="$lt_save_ifs"
done
test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
fi])
NM="$lt_cv_path_NM"
])# AC_PROG_NM
# AC_CHECK_LIBM
# -------------
# check for math library
AC_DEFUN([AC_CHECK_LIBM],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
LIBM=
case $host in
*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
# These system don't have libm, or don't need it
;;
*-ncr-sysv4.3*)
AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
;;
*)
AC_CHECK_LIB(m, cos, LIBM="-lm")
;;
esac
])# AC_CHECK_LIBM
# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
# -----------------------------------
# sets LIBLTDL to the link flags for the libltdl convenience library and
# LTDLINCL to the include flags for the libltdl header and adds
# --enable-ltdl-convenience to the configure arguments. Note that
# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
# it is assumed to be `libltdl'. LIBLTDL will be prefixed with
# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
# (note the single quotes!). If your package is not flat and you're not
# using automake, define top_builddir and top_srcdir appropriately in
# the Makefiles.
AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
case $enable_ltdl_convenience in
no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
"") enable_ltdl_convenience=yes
ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
esac
LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
# For backwards non-gettext consistent compatibility...
INCLTDL="$LTDLINCL"
])# AC_LIBLTDL_CONVENIENCE
# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
# -----------------------------------
# sets LIBLTDL to the link flags for the libltdl installable library and
# LTDLINCL to the include flags for the libltdl header and adds
# --enable-ltdl-install to the configure arguments. Note that
# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
# and an installed libltdl is not found, it is assumed to be `libltdl'.
# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
# '${top_srcdir}/' (note the single quotes!). If your package is not
# flat and you're not using automake, define top_builddir and top_srcdir
# appropriately in the Makefiles.
# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
AC_CHECK_LIB(ltdl, lt_dlinit,
[test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
[if test x"$enable_ltdl_install" = xno; then
AC_MSG_WARN([libltdl not installed, but installation disabled])
else
enable_ltdl_install=yes
fi
])
if test x"$enable_ltdl_install" = x"yes"; then
ac_configure_args="$ac_configure_args --enable-ltdl-install"
LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
else
ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
LIBLTDL="-lltdl"
LTDLINCL=
fi
# For backwards non-gettext consistent compatibility...
INCLTDL="$LTDLINCL"
])# AC_LIBLTDL_INSTALLABLE
# AC_LIBTOOL_CXX
# --------------
# enable support for C++ libraries
AC_DEFUN([AC_LIBTOOL_CXX],
[AC_REQUIRE([_LT_AC_LANG_CXX])
])# AC_LIBTOOL_CXX
# _LT_AC_LANG_CXX
# ---------------
AC_DEFUN([_LT_AC_LANG_CXX],
[AC_REQUIRE([AC_PROG_CXX])
AC_REQUIRE([_LT_AC_PROG_CXXCPP])
_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
])# _LT_AC_LANG_CXX
# _LT_AC_PROG_CXXCPP
# ------------------
AC_DEFUN([_LT_AC_PROG_CXXCPP],
[
AC_REQUIRE([AC_PROG_CXX])
if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
(test "X$CXX" != "Xg++"))) ; then
AC_PROG_CXXCPP
fi
])# _LT_AC_PROG_CXXCPP
# AC_LIBTOOL_F77
# --------------
# enable support for Fortran 77 libraries
AC_DEFUN([AC_LIBTOOL_F77],
[AC_REQUIRE([_LT_AC_LANG_F77])
])# AC_LIBTOOL_F77
# _LT_AC_LANG_F77
# ---------------
AC_DEFUN([_LT_AC_LANG_F77],
[AC_REQUIRE([AC_PROG_F77])
_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
])# _LT_AC_LANG_F77
# AC_LIBTOOL_GCJ
# --------------
# enable support for GCJ libraries
AC_DEFUN([AC_LIBTOOL_GCJ],
[AC_REQUIRE([_LT_AC_LANG_GCJ])
])# AC_LIBTOOL_GCJ
# _LT_AC_LANG_GCJ
# ---------------
AC_DEFUN([_LT_AC_LANG_GCJ],
[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
[AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
[AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
[ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
[ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
[AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
])# _LT_AC_LANG_GCJ
# AC_LIBTOOL_RC
# -------------
# enable support for Windows resource files
AC_DEFUN([AC_LIBTOOL_RC],
[AC_REQUIRE([LT_AC_PROG_RC])
_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
])# AC_LIBTOOL_RC
# AC_LIBTOOL_LANG_C_CONFIG
# ------------------------
# Ensure that the configuration vars for the C compiler are
# suitably defined. Those variables are subsequently used by
# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
AC_DEFUN([_LT_AC_LANG_C_CONFIG],
[lt_save_CC="$CC"
AC_LANG_PUSH(C)
# Source file extension for C test sources.
ac_ext=c
# Object file extension for compiled C test sources.
objext=o
_LT_AC_TAGVAR(objext, $1)=$objext
# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;\n"
# Code to be used in simple link tests
lt_simple_link_test_code='int main(){return(0);}\n'
_LT_AC_SYS_COMPILER
# save warnings/boilerplate of simple test code
_LT_COMPILER_BOILERPLATE
_LT_LINKER_BOILERPLATE
AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
AC_LIBTOOL_PROG_COMPILER_PIC($1)
AC_LIBTOOL_PROG_CC_C_O($1)
AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
AC_LIBTOOL_PROG_LD_SHLIBS($1)
AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
AC_LIBTOOL_SYS_LIB_STRIP
AC_LIBTOOL_DLOPEN_SELF
# Report which library types will actually be built
AC_MSG_CHECKING([if libtool supports shared libraries])
AC_MSG_RESULT([$can_build_shared])
AC_MSG_CHECKING([whether to build shared libraries])
test "$can_build_shared" = "no" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
# are all built from PIC.
case $host_os in
aix3*)
test "$enable_shared" = yes && enable_static=no
if test -n "$RANLIB"; then
archive_cmds="$archive_cmds~\$RANLIB \$lib"
postinstall_cmds='$RANLIB $lib'
fi
;;
aix4* | aix5*)
if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
test "$enable_shared" = yes && enable_static=no
fi
;;
esac
AC_MSG_RESULT([$enable_shared])
AC_MSG_CHECKING([whether to build static libraries])
# Make sure either enable_shared or enable_static is yes.
test "$enable_shared" = yes || enable_static=yes
AC_MSG_RESULT([$enable_static])
AC_LIBTOOL_CONFIG($1)
AC_LANG_POP
CC="$lt_save_CC"
])# AC_LIBTOOL_LANG_C_CONFIG
# AC_LIBTOOL_LANG_CXX_CONFIG
# --------------------------
# Ensure that the configuration vars for the C compiler are
# suitably defined. Those variables are subsequently used by
# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
[AC_LANG_PUSH(C++)
AC_REQUIRE([AC_PROG_CXX])
AC_REQUIRE([_LT_AC_PROG_CXXCPP])
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(allow_undefined_flag, $1)=
_LT_AC_TAGVAR(always_export_symbols, $1)=no
_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
_LT_AC_TAGVAR(hardcode_automatic, $1)=no
_LT_AC_TAGVAR(module_cmds, $1)=
_LT_AC_TAGVAR(module_expsym_cmds, $1)=
_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
_LT_AC_TAGVAR(no_undefined_flag, $1)=
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
# Dependencies to place before and after the object being linked:
_LT_AC_TAGVAR(predep_objects, $1)=
_LT_AC_TAGVAR(postdep_objects, $1)=
_LT_AC_TAGVAR(predeps, $1)=
_LT_AC_TAGVAR(postdeps, $1)=
_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
# Source file extension for C++ test sources.
ac_ext=cpp
# Object file extension for compiled C++ test sources.
objext=o
_LT_AC_TAGVAR(objext, $1)=$objext
# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;\n"
# Code to be used in simple link tests
lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
# ltmain only uses $CC for tagged configurations so make sure $CC is set.
_LT_AC_SYS_COMPILER
# save warnings/boilerplate of simple test code
_LT_COMPILER_BOILERPLATE
_LT_LINKER_BOILERPLATE
# Allow CC to be a program name with arguments.
lt_save_CC=$CC
lt_save_LD=$LD
lt_save_GCC=$GCC
GCC=$GXX
lt_save_with_gnu_ld=$with_gnu_ld
lt_save_path_LD=$lt_cv_path_LD
if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
else
$as_unset lt_cv_prog_gnu_ld
fi
if test -n "${lt_cv_path_LDCXX+set}"; then
lt_cv_path_LD=$lt_cv_path_LDCXX
else
$as_unset lt_cv_path_LD
fi
test -z "${LDCXX+set}" || LD=$LDCXX
CC=${CXX-"c++"}
compiler=$CC
_LT_AC_TAGVAR(compiler, $1)=$CC
_LT_CC_BASENAME([$compiler])
# We don't want -fno-exception wen compiling C++ code, so set the
# no_builtin_flag separately
if test "$GXX" = yes; then
_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
else
_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
fi
if test "$GXX" = yes; then
# Set up default GNU C++ configuration
AC_PROG_LD
# Check if GNU C++ uses GNU ld as the underlying linker, since the
# archiving commands below assume that GNU ld is being used.
if test "$with_gnu_ld" = yes; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
# If archive_cmds runs LD, not CC, wlarc should be empty
# XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
# investigate it a little bit more. (MM)
wlarc='${wl}'
# ancient GNU ld didn't support --whole-archive et. al.
if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
grep 'no-whole-archive' > /dev/null; then
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
else
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
fi
else
with_gnu_ld=no
wlarc=
# A generic and very simple default shared library creation
# command for GNU C++ for the case where it uses the native
# linker, instead of GNU ld. If possible, this setting should
# overridden to take advantage of the native linker features on
# the platform it is being used on.
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
fi
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
else
GXX=no
with_gnu_ld=no
wlarc=
fi
# PORTME: fill in a description of your system's C++ link characteristics
AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
_LT_AC_TAGVAR(ld_shlibs, $1)=yes
case $host_os in
aix3*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
aix4* | aix5*)
if test "$host_cpu" = ia64; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
no_entry_flag=""
else
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# need to do runtime linking.
case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
for ld_flag in $LDFLAGS; do
case $ld_flag in
*-brtl*)
aix_use_runtimelinking=yes
break
;;
esac
done
;;
esac
exp_sym_flag='-bexport'
no_entry_flag='-bnoentry'
fi
# When large executables or shared objects are built, AIX ld can
# have problems creating the table of contents. If linking a library
# or program results in "error TOC overflow" add -mminimal-toc to
# CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
# enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
_LT_AC_TAGVAR(archive_cmds, $1)=''
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
if test "$GXX" = yes; then
case $host_os in aix4.[[012]]|aix4.[[012]].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
collect2name=`${CC} -print-prog-name=collect2`
if test -f "$collect2name" && \
strings "$collect2name" | grep resolve_lib_name >/dev/null
then
# We have reworked collect2
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
else
# We have old collect2
_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
# It fails to find uninstalled libraries when the uninstalled
# path is not listed in the libpath. Setting hardcode_minus_L
# to unsupported forces relinking
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
fi
;;
esac
shared_flag='-shared'
if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G'
fi
else
# not using gcc
if test "$host_cpu" = ia64; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
if test "$aix_use_runtimelinking" = yes; then
shared_flag='${wl}-G'
else
shared_flag='${wl}-bM:SRE'
fi
fi
fi
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to export.
_LT_AC_TAGVAR(always_export_symbols, $1)=yes
if test "$aix_use_runtimelinking" = yes; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
# Determine the default libpath from the value encoded in an empty executable.
_LT_AC_SYS_LIBPATH_AIX
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
else
if test "$host_cpu" = ia64; then
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an empty executable.
_LT_AC_SYS_LIBPATH_AIX
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
# Exported symbols can be pulled into shared objects from archives
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
# This is similar to how AIX traditionally builds its shared libraries.
_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
fi
fi
;;
beos*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
# Joseph Beckenbach says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
chorus*)
case $cc_basename in
*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
;;
cygwin* | mingw* | pw32*)
# _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
# as there is no search path for DLLs.
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_AC_TAGVAR(always_export_symbols, $1)=no
_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
# If the export-symbols file already is a .def file (1st line
# is EXPORTS), use it as is; otherwise, prepend...
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
cp $export_symbols $output_objdir/$soname.def;
else
echo EXPORTS > $output_objdir/$soname.def;
cat $export_symbols >> $output_objdir/$soname.def;
fi~
$CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
darwin* | rhapsody*)
case $host_os in
rhapsody* | darwin1.[[012]])
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
;;
*) # Darwin 1.3 on
if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
else
case ${MACOSX_DEPLOYMENT_TARGET} in
10.[[012]])
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
;;
10.*)
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
;;
esac
fi
;;
esac
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_automatic, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
if test "$GXX" = yes ; then
lt_int_apple_cc_single_mod=no
output_verbose_link_cmd='echo'
if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
lt_int_apple_cc_single_mod=yes
fi
if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
fi
_LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
# Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
else
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
fi
_LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
else
case $cc_basename in
xlc*)
output_verbose_link_cmd='echo'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
_LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
# Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
_LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
;;
*)
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
fi
;;
dgux*)
case $cc_basename in
ec++*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
ghcx*)
# Green Hills C++ Compiler
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
;;
freebsd[[12]]*)
# C++ shared libraries reported to be fairly broken before switch to ELF
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
freebsd-elf*)
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
;;
freebsd* | kfreebsd*-gnu | dragonfly*)
# FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
# conventions
_LT_AC_TAGVAR(ld_shlibs, $1)=yes
;;
gnu*)
;;
hpux9*)
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
# but as the default
# location of the library.
case $cc_basename in
CC*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
aCC*)
_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
;;
*)
if test "$GXX" = yes; then
_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
else
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
esac
;;
hpux10*|hpux11*)
if test $with_gnu_ld = no; then
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
case $host_cpu in
hppa*64*|ia64*)
_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
;;
*)
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
;;
esac
fi
case $host_cpu in
hppa*64*|ia64*)
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
*)
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
# but as the default
# location of the library.
;;
esac
case $cc_basename in
CC*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
aCC*)
case $host_cpu in
hppa*64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
ia64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
esac
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
;;
*)
if test "$GXX" = yes; then
if test $with_gnu_ld = no; then
case $host_cpu in
hppa*64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
ia64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
esac
fi
else
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
esac
;;
interix3*)
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
irix5* | irix6*)
case $cc_basename in
CC*)
# SGI C++
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
# Archives containing C++ object files must be created using
# "CC -ar", where "CC" is the IRIX C++ compiler. This is
# necessary to make sure instantiated templates are included
# in the archive.
_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
;;
*)
if test "$GXX" = yes; then
if test "$with_gnu_ld" = no; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
fi
fi
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
;;
esac
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
;;
linux*)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
# Archives containing C++ object files must be created using
# "CC -Bstatic", where "CC" is the KAI C++ compiler.
_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
;;
icpc*)
# Intel C++
with_gnu_ld=yes
# version 8.0 and above of icpc choke on multiply defined symbols
# if we add $predep_objects and $postdep_objects, however 7.1 and
# earlier do not add the objects themselves.
case `$CC -V 2>&1` in
*"Version 7."*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
;;
*) # Version 8.0 or newer
tmp_idyn=
case $host_cpu in
ia64*) tmp_idyn=' -i_dynamic';;
esac
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
;;
esac
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
;;
pgCC*)
# Portland Group C++ compiler
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
;;
cxx*)
# Compaq C++
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
runpath_var=LD_RUN_PATH
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
;;
esac
;;
lynxos*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
m88k*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
mvs*)
case $cc_basename in
cxx*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
;;
netbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
wlarc=
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
fi
# Workaround some broken pre-1.5 toolchains
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
;;
openbsd2*)
# C++ shared libraries are fairly broken
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
openbsd*)
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
fi
output_verbose_link_cmd='echo'
;;
osf3*)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
# Archives containing C++ object files must be created using
# "CC -Bstatic", where "CC" is the KAI C++ compiler.
_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
;;
RCC*)
# Rational C++ 2.4.1
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
cxx*)
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
;;
*)
if test "$GXX" = yes && test "$with_gnu_ld" = no; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
else
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
esac
;;
osf4* | osf5*)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
# Archives containing C++ object files must be created using
# the KAI C++ compiler.
_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
;;
RCC*)
# Rational C++ 2.4.1
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
cxx*)
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
echo "-hidden">> $lib.exp~
$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~
$rm $lib.exp'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
#
# There doesn't appear to be a way to prevent this compiler from
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
;;
*)
if test "$GXX" = yes && test "$with_gnu_ld" = no; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
else
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
esac
;;
psos*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
sunos4*)
case $cc_basename in
CC*)
# Sun C++ 4.x
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
lcc*)
# Lucid
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
;;
solaris*)
case $cc_basename in
CC*)
# Sun C++ 4.2, 5.x and Centerline C++
_LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
_LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
$CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
case $host_os in
solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
*)
# The C++ compiler is used as linker so we must use $wl
# flag to pass the commands to the underlying system
# linker. We must also pass each convience library through
# to the system linker between allextract/defaultextract.
# The C++ compiler will combine linker options so we
# cannot just pass the convience library names through
# without $wl.
# Supported since Solaris 2.6 (maybe 2.5.1?)
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
;;
esac
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
output_verbose_link_cmd='echo'
# Archives containing C++ object files must be created using
# "CC -xar", where "CC" is the Sun C++ compiler. This is
# necessary to make sure instantiated templates are included
# in the archive.
_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
;;
gcx*)
# Green Hills C++ Compiler
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
# The C++ compiler must be used to create the archive.
_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
;;
*)
# GNU C++ compiler with Solaris linker
if test "$GXX" = yes && test "$with_gnu_ld" = no; then
_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
if $CC --version | grep -v '^2\.7' > /dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
else
# g++ 2.7 appears to require `-G' NOT `-shared' on this
# platform.
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
fi
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
fi
;;
esac
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
_LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
runpath_var='LD_RUN_PATH'
case $cc_basename in
CC*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
;;
sysv5* | sco3.2v5* | sco5v6*)
# Note: We can NOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
# For security reasons, it is highly recommended that you always
# use absolute paths for naming shared libraries, and exclude the
# DT_RUNPATH tag from executables and libraries. But doing so
# requires that you compile everything twice, which is a pain.
# So that behaviour is only enabled if SCOABSPATH is set to a
# non-empty value in the environment. Most likely only useful for
# creating official distributions of packages.
# This is a hack until libtool officially supports absolute path
# names for shared libraries.
_LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
runpath_var='LD_RUN_PATH'
case $cc_basename in
CC*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
;;
tandem*)
case $cc_basename in
NCC*)
# NonStop-UX NCC 3.20
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
;;
vxworks*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
*)
# FIXME: insert proper C++ library support
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
_LT_AC_TAGVAR(GCC, $1)="$GXX"
_LT_AC_TAGVAR(LD, $1)="$LD"
AC_LIBTOOL_POSTDEP_PREDEP($1)
AC_LIBTOOL_PROG_COMPILER_PIC($1)
AC_LIBTOOL_PROG_CC_C_O($1)
AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
AC_LIBTOOL_PROG_LD_SHLIBS($1)
AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
AC_LIBTOOL_CONFIG($1)
AC_LANG_POP
CC=$lt_save_CC
LDCXX=$LD
LD=$lt_save_LD
GCC=$lt_save_GCC
with_gnu_ldcxx=$with_gnu_ld
with_gnu_ld=$lt_save_with_gnu_ld
lt_cv_path_LDCXX=$lt_cv_path_LD
lt_cv_path_LD=$lt_save_path_LD
lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
])# AC_LIBTOOL_LANG_CXX_CONFIG
# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
# ------------------------------------
# Figure out "hidden" library dependencies from verbose
# compiler output when linking a shared library.
# Parse the compiler output and extract the necessary
# objects, libraries and library flags.
AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
dnl we can't use the lt_simple_compile_test_code here,
dnl because it contains code intended for an executable,
dnl not a library. It's possible we should let each
dnl tag define a new lt_????_link_test_code variable,
dnl but it's only used here...
ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile"
ifelse([$1], [],
[#! $SHELL
# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
#
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
#
# This file is part of GNU Libtool:
# Originally by Gordon Matzigkeit , 1996
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# A sed program that does not truncate output.
SED=$lt_SED
# Sed that helps us avoid accidentally triggering echo(1) options like -n.
Xsed="$SED -e 1s/^X//"
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# The names of the tagged configurations supported by this script.
available_tags=
# ### BEGIN LIBTOOL CONFIG],
[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# Shell to use when invoking shell scripts.
SHELL=$lt_SHELL
# Whether or not to build shared libraries.
build_libtool_libs=$enable_shared
# Whether or not to build static libraries.
build_old_libs=$enable_static
# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
# Whether or not to disallow shared libs when runtime libs are static
allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
# Whether or not to optimize for fast installation.
fast_install=$enable_fast_install
# The host system.
host_alias=$host_alias
host=$host
host_os=$host_os
# The build system.
build_alias=$build_alias
build=$build
build_os=$build_os
# An echo program that does not interpret backslashes.
echo=$lt_echo
# The archiver.
AR=$lt_AR
AR_FLAGS=$lt_AR_FLAGS
# A C compiler.
LTCC=$lt_LTCC
# LTCC compiler flags.
LTCFLAGS=$lt_LTCFLAGS
# A language-specific compiler.
CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
# Is the compiler the GNU C compiler?
with_gcc=$_LT_AC_TAGVAR(GCC, $1)
gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\`
gcc_ver=\`gcc -dumpversion\`
# An ERE matcher.
EGREP=$lt_EGREP
# The linker used to build libraries.
LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
# Whether we need hard or soft links.
LN_S=$lt_LN_S
# A BSD-compatible nm program.
NM=$lt_NM
# A symbol stripping program
STRIP=$lt_STRIP
# Used to examine libraries when file_magic_cmd begins "file"
MAGIC_CMD=$MAGIC_CMD
# Used on cygwin: DLL creation program.
DLLTOOL="$DLLTOOL"
# Used on cygwin: object dumper.
OBJDUMP="$OBJDUMP"
# Used on cygwin: assembler.
AS="$AS"
# The name of the directory that contains temporary libtool files.
objdir=$objdir
# How to create reloadable object files.
reload_flag=$lt_reload_flag
reload_cmds=$lt_reload_cmds
# How to pass a linker flag through the compiler.
wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
# Object file suffix (normally "o").
objext="$ac_objext"
# Old archive suffix (normally "a").
libext="$libext"
# Shared library suffix (normally ".so").
shrext_cmds='$shrext_cmds'
# Executable file suffix (normally "").
exeext="$exeext"
# Additional compiler flags for building library objects.
pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
pic_mode=$pic_mode
# What is the maximum length of a command?
max_cmd_len=$lt_cv_sys_max_cmd_len
# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
# Must we lock files when doing compilation?
need_locks=$lt_need_locks
# Do we need the lib prefix for modules?
need_lib_prefix=$need_lib_prefix
# Do we need a version for libraries?
need_version=$need_version
# Whether dlopen is supported.
dlopen_support=$enable_dlopen
# Whether dlopen of programs is supported.
dlopen_self=$enable_dlopen_self
# Whether dlopen of statically linked programs is supported.
dlopen_self_static=$enable_dlopen_self_static
# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
# Compiler flag to generate thread-safe objects.
thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
# Library versioning type.
version_type=$version_type
# Format of library name prefix.
libname_spec=$lt_libname_spec
# List of archive names. First name is the real one, the rest are links.
# The last name is the one that the linker finds with -lNAME.
library_names_spec=$lt_library_names_spec
# The coded name of the library, if different from the real name.
soname_spec=$lt_soname_spec
# Commands used to build and install an old-style archive.
RANLIB=$lt_RANLIB
old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
old_postinstall_cmds=$lt_old_postinstall_cmds
old_postuninstall_cmds=$lt_old_postuninstall_cmds
# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
# Commands used to build and install a shared archive.
archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
postinstall_cmds=$lt_postinstall_cmds
postuninstall_cmds=$lt_postuninstall_cmds
# Commands used to build a loadable module (assumed same as above if empty)
module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
# Commands to strip libraries.
old_striplib=$lt_old_striplib
striplib=$lt_striplib
# Dependencies to place before the objects being linked to create a
# shared library.
predep_objects=\`echo $lt_[]_LT_AC_TAGVAR(predep_objects, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Dependencies to place after the objects being linked to create a
# shared library.
postdep_objects=\`echo $lt_[]_LT_AC_TAGVAR(postdep_objects, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Dependencies to place before the objects being linked to create a
# shared library.
predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
# Dependencies to place after the objects being linked to create a
# shared library.
postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=\`echo $lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Method to check whether dependent libraries are shared objects.
deplibs_check_method=$lt_deplibs_check_method
# Command to use when deplibs_check_method == file_magic.
file_magic_cmd=$lt_file_magic_cmd
# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
# Flag that forces no undefined symbols.
no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
# Commands used to finish a libtool library installation in a directory.
finish_cmds=$lt_finish_cmds
# Same as above, but a single script fragment to be evaled but not shown.
finish_eval=$lt_finish_eval
# Take the output of nm and produce a listing of raw symbols and C names.
global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
# Transform the output of nm in a proper C declaration
global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
# Transform the output of nm in a C name address pair
global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
# This is the shared library runtime path variable.
runpath_var=$runpath_var
# This is the shared library path variable.
shlibpath_var=$shlibpath_var
# Is shlibpath searched before the hard-coded library search path?
shlibpath_overrides_runpath=$shlibpath_overrides_runpath
# How to hardcode a shared library path into an executable.
hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
# Whether we should hardcode library paths into libraries.
hardcode_into_libs=$hardcode_into_libs
# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist.
hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
# If ld is used when linking, flag to hardcode \$libdir into
# a binary during linking. This must work even if \$libdir does
# not exist.
hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
# Whether we need a single -rpath flag with a separated argument.
hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
# resulting binary.
hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
# resulting binary.
hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
# the resulting binary.
hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
# Set to yes if building a shared library automatically hardcodes DIR into the library
# and all subsequent libraries and executables linked against it.
hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
# Variables whose values should be saved in libtool wrapper scripts and
# restored at relink time.
variables_saved_for_relink="$variables_saved_for_relink"
# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
# Compile-time system search path for libraries
sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Run-time system search path for libraries
sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
# Fix the shell variable \$srcfile for the compiler.
fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
# Set to yes if exported symbols are required.
always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
# The commands to list exported symbols.
export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
# The commands to extract the exported symbol list from a shared archive.
extract_expsyms_cmds=$lt_extract_expsyms_cmds
# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
# Symbols that must always be exported.
include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
ifelse([$1],[],
[# ### END LIBTOOL CONFIG],
[# ### END LIBTOOL TAG CONFIG: $tagname])
__EOF__
ifelse([$1],[], [
case $host_os in
aix3*)
cat <<\EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test "X${COLLECT_NAMES+set}" != Xset; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
EOF
;;
esac
# We use sed instead of cat because bash on DJGPP gets confused if
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
mv -f "$cfgfile" "$ofile" || \
(rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
chmod +x "$ofile"
])
else
# If there is no Makefile yet, we rely on a make rule to execute
# `config.status --recheck' to rerun these tests and create the
# libtool script then.
ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
if test -f "$ltmain_in"; then
test -f Makefile && make "$ltmain"
fi
fi
])# AC_LIBTOOL_CONFIG
# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
# -------------------------------------------
AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
if test "$GCC" = yes; then
_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
lt_cv_prog_compiler_rtti_exceptions,
[-fno-rtti -fno-exceptions], [],
[_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
fi
])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
# ---------------------------------
AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
[AC_REQUIRE([AC_CANONICAL_HOST])
AC_REQUIRE([AC_PROG_NM])
AC_REQUIRE([AC_OBJEXT])
# Check for command to grab the raw symbol name followed by C symbol from nm.
AC_MSG_CHECKING([command to parse $NM output from $compiler object])
AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
[
# These are sane defaults that work on at least a few old systems.
# [They come from Ultrix. What could be older than Ultrix?!! ;)]
# Character class describing NM global symbol codes.
symcode='[[BCDEGRST]]'
# Regexp to match symbols that can be accessed directly from C.
sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
# Transform an extracted symbol line into a proper C declaration
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
# Define system-specific variables.
case $host_os in
aix*)
symcode='[[BCDT]]'
;;
cygwin* | mingw* | pw32*)
symcode='[[ABCDGISTW]]'
;;
hpux*) # Its linker distinguishes data from code symbols
if test "$host_cpu" = ia64; then
symcode='[[ABCDEGRST]]'
fi
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
;;
linux*)
if test "$host_cpu" = ia64; then
symcode='[[ABCDGIRSTW]]'
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
fi
;;
irix* | nonstopux*)
symcode='[[BCDEGRST]]'
;;
osf*)
symcode='[[BCDEGQRST]]'
;;
solaris*)
symcode='[[BDRT]]'
;;
sco3.2v5*)
symcode='[[DT]]'
;;
sysv4.2uw2*)
symcode='[[DT]]'
;;
sysv5* | sco5v6* | unixware* | OpenUNIX*)
symcode='[[ABDT]]'
;;
sysv4)
symcode='[[DFNSTU]]'
;;
esac
# Handle CRLF in mingw tool chain
opt_cr=
case $build_os in
mingw*)
opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
;;
esac
# If we're using GNU nm, then use its standard symbol codes.
case `$NM -V 2>&1` in
*GNU* | *'with BFD'*)
symcode='[[ABCDGIRSTW]]' ;;
esac
# Try without a prefix undercore, then with it.
for ac_symprfx in "" "_"; do
# Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
symxfrm="\\1 $ac_symprfx\\2 \\2"
# Write the raw and C identifiers.
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
# Check to see that the pipe works correctly.
pipe_works=no
rm -f conftest*
cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
else
rm -f "$nlist"T
fi
# Make sure that we snagged all the symbols we need.
if grep ' nm_test_var$' "$nlist" >/dev/null; then
if grep ' nm_test_func$' "$nlist" >/dev/null; then
cat < conftest.$ac_ext
#ifdef __cplusplus
extern "C" {
#endif
EOF
# Now generate the symbol file.
eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
cat <> conftest.$ac_ext
#if defined (__STDC__) && __STDC__
# define lt_ptr_t void *
#else
# define lt_ptr_t char *
# define const
#endif
/* The mapping between symbol names and symbols. */
const struct {
const char *name;
lt_ptr_t address;
}
lt_preloaded_symbols[[]] =
{
EOF
$SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
cat <<\EOF >> conftest.$ac_ext
{0, (lt_ptr_t) 0}
};
#ifdef __cplusplus
}
#endif
EOF
# Now try linking the two files.
mv conftest.$ac_objext conftstm.$ac_objext
lt_save_LIBS="$LIBS"
lt_save_CFLAGS="$CFLAGS"
LIBS="conftstm.$ac_objext"
CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
pipe_works=yes
fi
LIBS="$lt_save_LIBS"
CFLAGS="$lt_save_CFLAGS"
else
echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
fi
else
echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
fi
else
echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
fi
else
echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
cat conftest.$ac_ext >&5
fi
rm -f conftest* conftst*
# Do not use the global_symbol_pipe unless it works.
if test "$pipe_works" = yes; then
break
else
lt_cv_sys_global_symbol_pipe=
fi
done
])
if test -z "$lt_cv_sys_global_symbol_pipe"; then
lt_cv_sys_global_symbol_to_cdecl=
fi
if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
AC_MSG_RESULT(failed)
else
AC_MSG_RESULT(ok)
fi
]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
# ---------------------------------------
AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
AC_MSG_CHECKING([for $compiler option to produce PIC])
ifelse([$1],[CXX],[
# C++ specific cases for pic, static, wl, etc.
if test "$GXX" = yes; then
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
case $host_os in
aix*)
# All AIX code is PIC.
if test "$host_cpu" = ia64; then
# AIX 5 now supports IA64 processor
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
;;
amigaos*)
# FIXME: we need at least 68020 code to build shared libraries, but
# adding the `-m68020' flag to GCC prevents building anything better,
# like `-m68040'.
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
;;
beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
mingw* | os2* | pw32*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
;;
darwin* | rhapsody*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
;;
*djgpp*)
# DJGPP does not support shared libraries at all
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
;;
interix3*)
# Interix 3.x gcc -fpic/-fPIC options generate broken code.
# Instead, we relocate shared libraries at runtime.
;;
sysv4*MP*)
if test -d /usr/nec; then
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
fi
;;
hpux*)
# PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
# not for PA HP-UX.
case $host_cpu in
hppa*64*|ia64*)
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
esac
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
esac
else
case $host_os in
aix4* | aix5*)
# All AIX code is PIC.
if test "$host_cpu" = ia64; then
# AIX 5 now supports IA64 processor
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
else
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
fi
;;
chorus*)
case $cc_basename in
cxch68*)
# Green Hills C++ Compiler
# _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
;;
esac
;;
darwin*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
case $cc_basename in
xlc*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
;;
esac
;;
dgux*)
case $cc_basename in
ec++*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
;;
ghcx*)
# Green Hills C++ Compiler
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
;;
*)
;;
esac
;;
freebsd* | kfreebsd*-gnu | dragonfly*)
# FreeBSD uses GNU C++
;;
hpux9* | hpux10* | hpux11*)
case $cc_basename in
CC*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
if test "$host_cpu" != ia64; then
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
fi
;;
aCC*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
;;
esac
;;
*)
;;
esac
;;
interix*)
# This is c89, which is MS Visual C++ (no shared libs)
# Anyone wants to do a port?
;;
irix5* | irix6* | nonstopux*)
case $cc_basename in
CC*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
# CC pic flag -KPIC is the default.
;;
*)
;;
esac
;;
linux*)
case $cc_basename in
KCC*)
# KAI C++ Compiler
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
icpc* | ecpc*)
# Intel C++
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
;;
pgCC*)
# Portland Group C++ compiler.
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
cxx*)
# Compaq C++
# Make sure the PIC flag is empty. It appears that all Alpha
# Linux and Compaq Tru64 Unix objects are PIC.
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
*)
;;
esac
;;
lynxos*)
;;
m88k*)
;;
mvs*)
case $cc_basename in
cxx*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
;;
*)
;;
esac
;;
netbsd*)
;;
osf3* | osf4* | osf5*)
case $cc_basename in
KCC*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
;;
RCC*)
# Rational C++ 2.4.1
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
;;
cxx*)
# Digital/Compaq C++
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
# Make sure the PIC flag is empty. It appears that all Alpha
# Linux and Compaq Tru64 Unix objects are PIC.
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
*)
;;
esac
;;
psos*)
;;
solaris*)
case $cc_basename in
CC*)
# Sun C++ 4.2, 5.x and Centerline C++
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
;;
gcx*)
# Green Hills C++ Compiler
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
;;
*)
;;
esac
;;
sunos4*)
case $cc_basename in
CC*)
# Sun C++ 4.x
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
lcc*)
# Lucid
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
;;
*)
;;
esac
;;
tandem*)
case $cc_basename in
NCC*)
# NonStop-UX NCC 3.20
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
;;
*)
;;
esac
;;
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
case $cc_basename in
CC*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
esac
;;
vxworks*)
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
;;
esac
fi
],
[
if test "$GCC" = yes; then
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
case $host_os in
aix*)
# All AIX code is PIC.
if test "$host_cpu" = ia64; then
# AIX 5 now supports IA64 processor
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
;;
amigaos*)
# FIXME: we need at least 68020 code to build shared libraries, but
# adding the `-m68020' flag to GCC prevents building anything better,
# like `-m68040'.
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
;;
beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
mingw* | pw32* | os2*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
;;
darwin* | rhapsody*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
;;
interix3*)
# Interix 3.x gcc -fpic/-fPIC options generate broken code.
# Instead, we relocate shared libraries at runtime.
;;
msdosdjgpp*)
# Just because we use GCC doesn't mean we suddenly get shared libraries
# on systems that don't support them.
_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
enable_shared=no
;;
sysv4*MP*)
if test -d /usr/nec; then
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
fi
;;
hpux*)
# PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
# not for PA HP-UX.
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
esac
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
esac
else
# PORTME Check for flag to pass linker flags through the system compiler.
case $host_os in
aix*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
if test "$host_cpu" = ia64; then
# AIX 5 now supports IA64 processor
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
else
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
fi
;;
darwin*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
case $cc_basename in
xlc*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
;;
esac
;;
mingw* | pw32* | os2*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
;;
hpux9* | hpux10* | hpux11*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
# PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
# not for PA HP-UX.
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
;;
esac
# Is there a better lt_prog_compiler_static that works with the bundled CC?
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
;;
irix5* | irix6* | nonstopux*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
# PIC (with -KPIC) is the default.
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
newsos6)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
linux*)
case $cc_basename in
icc* | ecc*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
;;
pgcc* | pgf77* | pgf90* | pgf95*)
# Portland Group compilers (*not* the Pentium gcc compiler,
# which looks to be a dead project)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
ccc*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
# All Alpha code is PIC.
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
esac
;;
osf3* | osf4* | osf5*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
# All OSF/1 code is PIC.
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
solaris*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
case $cc_basename in
f77* | f90* | f95*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
esac
;;
sunos4*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
sysv4 | sysv4.2uw2* | sysv4.3*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
sysv4*MP*)
if test -d /usr/nec ;then
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
;;
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
unicos*)
_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
;;
uts4*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
;;
esac
fi
])
AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
#
# Check to make sure the PIC flag actually works.
#
if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
_LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
[$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
[case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
"" | " "*) ;;
*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
esac],
[_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
fi
case $host_os in
# For platforms which do not support PIC, -DPIC is meaningless:
*djgpp*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
;;
*)
_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
;;
esac
#
# Check to make sure the static flag actually works.
#
wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
_LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
$lt_tmp_static_flag,
[],
[_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
])
# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
# ------------------------------------
# See if the linker supports building shared libraries.
AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
ifelse([$1],[CXX],[
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
case $host_os in
aix4* | aix5*)
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to AIX nm, but means don't demangle with GNU nm
if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
else
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
fi
;;
pw32*)
_LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
;;
cygwin* | mingw*)
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
;;
*)
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
;;
esac
],[
runpath_var=
_LT_AC_TAGVAR(allow_undefined_flag, $1)=
_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
_LT_AC_TAGVAR(archive_cmds, $1)=
_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
_LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
_LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
_LT_AC_TAGVAR(hardcode_automatic, $1)=no
_LT_AC_TAGVAR(module_cmds, $1)=
_LT_AC_TAGVAR(module_expsym_cmds, $1)=
_LT_AC_TAGVAR(always_export_symbols, $1)=no
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
# include_expsyms should be a list of space-separated symbols to be *always*
# included in the symbol list
_LT_AC_TAGVAR(include_expsyms, $1)=
# exclude_expsyms can be an extended regexp of symbols to exclude
# it will be wrapped by ` (' and `)$', so one must not match beginning or
# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
# as well as any symbol that contains `d'.
_LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
# platforms (ab)use it in PIC code, but their linkers get confused if
# the symbol is explicitly referenced. Since portable code cannot
# rely on this symbol name, it's probably fine to never include it in
# preloaded symbol tables.
extract_expsyms_cmds=
# Just being paranoid about ensuring that cc_basename is set.
_LT_CC_BASENAME([$compiler])
case $host_os in
cygwin* | mingw* | pw32*)
# FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
if test "$GCC" != yes; then
with_gnu_ld=no
fi
;;
interix*)
# we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
openbsd*)
with_gnu_ld=no
;;
esac
_LT_AC_TAGVAR(ld_shlibs, $1)=yes
if test "$with_gnu_ld" = yes; then
# If archive_cmds runs LD, not CC, wlarc should be empty
wlarc='${wl}'
# Set some defaults for GNU ld with shared library support. These
# are reset later if shared libraries are not supported. Putting them
# here allows them to be overridden if necessary.
runpath_var=LD_RUN_PATH
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
# ancient GNU ld didn't support --whole-archive et. al.
if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
else
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
fi
supports_anon_versioning=no
case `$LD -v 2>/dev/null` in
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
*\ 2.11.*) ;; # other 2.11 versions
*) supports_anon_versioning=yes ;;
esac
# See if GNU ld supports shared libraries.
case $host_os in
aix3* | aix4* | aix5*)
# On AIX/PPC, the GNU linker is very broken
if test "$host_cpu" != ia64; then
_LT_AC_TAGVAR(ld_shlibs, $1)=no
cat <&2
*** Warning: the GNU linker, at least up to release 2.9.1, is reported
*** to be unable to reliably create shared libraries on AIX.
*** Therefore, libtool is disabling shared libraries support. If you
*** really care for shared libraries, you may want to modify your PATH
*** so that a non-GNU linker is found, and then restart.
EOF
fi
;;
amigaos*)
_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
# Samuel A. Falvo II reports
# that the semantics of dynamic libraries on AmigaOS, at least up
# to version 4, is to share data among multiple programs linked
# with the same dynamic library. Since this doesn't match the
# behavior of shared libraries on other platforms, we can't use
# them.
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
beos*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
# Joseph Beckenbach says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
cygwin* | mingw* | pw32*)
# _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
# as there is no search path for DLLs.
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_AC_TAGVAR(always_export_symbols, $1)=no
_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
# If the export-symbols file already is a .def file (1st line
# is EXPORTS), use it as is; otherwise, prepend...
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
cp $export_symbols $output_objdir/$soname.def;
else
echo EXPORTS > $output_objdir/$soname.def;
cat $export_symbols >> $output_objdir/$soname.def;
fi~
$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
interix3*)
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
linux*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
tmp_addflag=
case $cc_basename,$host_cpu in
pgcc*) # Portland Group C compiler
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag'
;;
pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag -Mnomain' ;;
ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
tmp_addflag=' -i_dynamic' ;;
efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
tmp_addflag=' -i_dynamic -nofor_main' ;;
ifc* | ifort*) # Intel Fortran compiler
tmp_addflag=' -nofor_main' ;;
esac
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
if test $supports_anon_versioning = yes; then
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
$echo "local: *; };" >> $output_objdir/$libname.ver~
$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
fi
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
netbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
else
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
fi
;;
solaris*)
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
_LT_AC_TAGVAR(ld_shlibs, $1)=no
cat <&2
*** Warning: The releases 2.8.* of the GNU linker cannot reliably
*** create shared libraries on Solaris systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.9.1 or newer. Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.
EOF
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
case `$LD -v 2>&1` in
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
_LT_AC_TAGVAR(ld_shlibs, $1)=no
cat <<_LT_EOF 1>&2
*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
*** reliably create shared libraries on SCO systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.
_LT_EOF
;;
*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
esac
;;
sunos4*)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
wlarc=
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
_LT_AC_TAGVAR(ld_shlibs, $1)=no
fi
;;
esac
if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
runpath_var=
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
fi
else
# PORTME fill in a description of your system's linker (not GNU ld)
case $host_os in
aix3*)
_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_AC_TAGVAR(always_export_symbols, $1)=yes
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
# Note: this linker hardcodes the directories in LIBPATH if there
# are no directories specified by -L.
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
# Neither direct hardcoding nor static linking is supported with a
# broken collect2.
_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
fi
;;
aix4* | aix5*)
if test "$host_cpu" = ia64; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
no_entry_flag=""
else
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to AIX nm, but means don't demangle with GNU nm
if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
else
_LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# need to do runtime linking.
case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
for ld_flag in $LDFLAGS; do
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
aix_use_runtimelinking=yes
break
fi
done
;;
esac
exp_sym_flag='-bexport'
no_entry_flag='-bnoentry'
fi
# When large executables or shared objects are built, AIX ld can
# have problems creating the table of contents. If linking a library
# or program results in "error TOC overflow" add -mminimal-toc to
# CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
# enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
_LT_AC_TAGVAR(archive_cmds, $1)=''
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
if test "$GCC" = yes; then
case $host_os in aix4.[[012]]|aix4.[[012]].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
collect2name=`${CC} -print-prog-name=collect2`
if test -f "$collect2name" && \
strings "$collect2name" | grep resolve_lib_name >/dev/null
then
# We have reworked collect2
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
else
# We have old collect2
_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
# It fails to find uninstalled libraries when the uninstalled
# path is not listed in the libpath. Setting hardcode_minus_L
# to unsupported forces relinking
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
fi
;;
esac
shared_flag='-shared'
if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G'
fi
else
# not using gcc
if test "$host_cpu" = ia64; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
if test "$aix_use_runtimelinking" = yes; then
shared_flag='${wl}-G'
else
shared_flag='${wl}-bM:SRE'
fi
fi
fi
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to export.
_LT_AC_TAGVAR(always_export_symbols, $1)=yes
if test "$aix_use_runtimelinking" = yes; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
# Determine the default libpath from the value encoded in an empty executable.
_LT_AC_SYS_LIBPATH_AIX
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
else
if test "$host_cpu" = ia64; then
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an empty executable.
_LT_AC_SYS_LIBPATH_AIX
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
# Exported symbols can be pulled into shared objects from archives
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
# This is similar to how AIX traditionally builds its shared libraries.
_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
fi
fi
;;
amigaos*)
_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
# see comment about different semantics on the GNU ld section
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
bsdi[[45]]*)
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
;;
cygwin* | mingw* | pw32*)
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=".dll"
# FIXME: Setting linknames here is a bad hack.
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
# The linker will automatically build a .lib file if we build a DLL.
_LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
# FIXME: Should let the user specify the lib program.
_LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
_LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
;;
darwin* | rhapsody*)
case $host_os in
rhapsody* | darwin1.[[012]])
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
;;
*) # Darwin 1.3 on
if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
else
case ${MACOSX_DEPLOYMENT_TARGET} in
10.[[012]])
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
;;
10.*)
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
;;
esac
fi
;;
esac
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_automatic, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
if test "$GCC" = yes ; then
output_verbose_link_cmd='echo'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
_LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
# Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
_LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
else
case $cc_basename in
xlc*)
output_verbose_link_cmd='echo'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
_LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
# Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
_LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
;;
*)
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
fi
;;
dgux*)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
freebsd1*)
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
# extra space).
freebsd2.2*)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
# Unfortunately, older versions of FreeBSD 2 do not have this feature.
freebsd2*)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
freebsd* | kfreebsd*-gnu | dragonfly*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
hpux9*)
if test "$GCC" = yes; then
_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
fi
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
;;
hpux10*)
if test "$GCC" = yes -a "$with_gnu_ld" = no; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
if test "$with_gnu_ld" = no; then
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
fi
;;
hpux11*)
if test "$GCC" = yes -a "$with_gnu_ld" = no; then
case $host_cpu in
hppa*64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
else
case $host_cpu in
hppa*64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
fi
if test "$with_gnu_ld" = no; then
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
case $host_cpu in
hppa*64*|ia64*)
_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
_LT_AC_TAGVAR(hardcode_direct, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
*)
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
;;
esac
fi
;;
irix5* | irix6* | nonstopux*)
if test "$GCC" = yes; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
fi
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
;;
netbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
fi
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
newsos6)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
openbsd*)
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
else
case $host_os in
openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
;;
*)
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
;;
esac
fi
;;
os2*)
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
_LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
;;
osf3*)
if test "$GCC" = yes; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
fi
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
;;
osf4* | osf5*) # as osf3* with the addition of -msym flag
if test "$GCC" = yes; then
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
else
_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
# Both c and cxx compiler support -rpath directly
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
fi
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
;;
solaris*)
_LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
if test "$GCC" = yes; then
wlarc='${wl}'
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
$CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
else
wlarc=''
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
fi
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
case $host_os in
solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
*)
# The compiler driver will combine linker options so we
# cannot just pass the convience library names through
# without $wl, iff we do not link with $LD.
# Luckily, gcc supports the same syntax we need for Sun Studio.
# Supported since Solaris 2.6 (maybe 2.5.1?)
case $wlarc in
'')
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
*)
_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
esac ;;
esac
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
;;
sunos4*)
if test "x$host_vendor" = xsequent; then
# Use $CC to link under sequent, because it throws in some extra .o
# files that make .init and .fini sections work.
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
fi
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes
_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
sysv4)
case $host_vendor in
sni)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
;;
siemens)
## LD is ld it makes a PLAMLIB
## CC just makes a GrossModule.
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
_LT_AC_TAGVAR(hardcode_direct, $1)=no
;;
motorola)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
;;
esac
runpath_var='LD_RUN_PATH'
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
sysv4.3*)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
;;
sysv4*MP*)
if test -d /usr/nec; then
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
runpath_var=LD_RUN_PATH
hardcode_runpath_var=yes
_LT_AC_TAGVAR(ld_shlibs, $1)=yes
fi
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
_LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
runpath_var='LD_RUN_PATH'
if test "$GCC" = yes; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
sysv5* | sco3.2v5* | sco5v6*)
# Note: We can NOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
_LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
_LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
runpath_var='LD_RUN_PATH'
if test "$GCC" = yes; then
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
else
_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
uts4*)
_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
*)
_LT_AC_TAGVAR(ld_shlibs, $1)=no
;;
esac
fi
])
AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
#
# Do we need to explicitly link libc?
#
case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
x|xyes)
# Assume -lc should be added
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
if test "$enable_shared" = yes && test "$GCC" = yes; then
case $_LT_AC_TAGVAR(archive_cmds, $1) in
*'~'*)
# FIXME: we may have to deal with multi-command sequences.
;;
'$CC '*)
# Test whether the compiler implicitly links with -lc since on some
# systems, -lgcc has to come before -lc. If gcc already passes -lc
# to ld, don't add -lc before -lgcc.
AC_MSG_CHECKING([whether -lc should be explicitly linked in])
$rm conftest*
printf "$lt_simple_compile_test_code" > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
soname=conftest
lib=conftest
libobjs=conftest.$ac_objext
deplibs=
wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
compiler_flags=-v
linker_flags=-v
verstring=
output_objdir=.
libname=conftest
lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
_LT_AC_TAGVAR(allow_undefined_flag, $1)=
if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
then
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
else
_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
fi
_LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
else
cat conftest.err 1>&5
fi
$rm conftest*
AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
;;
esac
fi
;;
esac
])# AC_LIBTOOL_PROG_LD_SHLIBS
# _LT_AC_FILE_LTDLL_C
# -------------------
# Be careful that the start marker always follows a newline.
AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
# /* ltdll.c starts here */
# #define WIN32_LEAN_AND_MEAN
# #include
# #undef WIN32_LEAN_AND_MEAN
# #include
#
# #ifndef __CYGWIN__
# # ifdef __CYGWIN32__
# # define __CYGWIN__ __CYGWIN32__
# # endif
# #endif
#
# #ifdef __cplusplus
# extern "C" {
# #endif
# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
# #ifdef __cplusplus
# }
# #endif
#
# #ifdef __CYGWIN__
# #include
# DECLARE_CYGWIN_DLL( DllMain );
# #endif
# HINSTANCE __hDllInstance_base;
#
# BOOL APIENTRY
# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
# {
# __hDllInstance_base = hInst;
# return TRUE;
# }
# /* ltdll.c ends here */
])# _LT_AC_FILE_LTDLL_C
# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
# ---------------------------------
AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
# old names
AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
# This is just to silence aclocal about the macro not being used
ifelse([AC_DISABLE_FAST_INSTALL])
AC_DEFUN([LT_AC_PROG_GCJ],
[AC_CHECK_TOOL(GCJ, gcj, no)
test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
AC_SUBST(GCJFLAGS)
])
AC_DEFUN([LT_AC_PROG_RC],
[AC_CHECK_TOOL(RC, windres, no)
])
# NOTE: This macro has been submitted for inclusion into #
# GNU Autoconf as AC_PROG_SED. When it is available in #
# a released version of Autoconf we should remove this #
# macro and use it instead. #
# LT_AC_PROG_SED
# --------------
# Check for a fully-functional sed program, that truncates
# as few characters as possible. Prefer GNU sed if found.
AC_DEFUN([LT_AC_PROG_SED],
[AC_MSG_CHECKING([for a sed that does not truncate output])
AC_CACHE_VAL(lt_cv_path_SED,
[# Loop through the user's path and test for sed and gsed.
# Then use that list of sed's as ones to test for truncation.
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for lt_ac_prog in sed gsed; do
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
fi
done
done
done
IFS=$as_save_IFS
lt_ac_max=0
lt_ac_count=0
# Add /usr/xpg4/bin/sed as it is typically found on Solaris
# along with /bin/sed that truncates output.
for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
test ! -f $lt_ac_sed && continue
cat /dev/null > conftest.in
lt_ac_count=0
echo $ECHO_N "0123456789$ECHO_C" >conftest.in
# Check for GNU sed and select it if it is found.
if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
lt_cv_path_SED=$lt_ac_sed
break
fi
while true; do
cat conftest.in conftest.in >conftest.tmp
mv conftest.tmp conftest.in
cp conftest.in conftest.nl
echo >>conftest.nl
$lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
cmp -s conftest.out conftest.nl || break
# 10000 chars as input seems more than enough
test $lt_ac_count -gt 10 && break
lt_ac_count=`expr $lt_ac_count + 1`
if test $lt_ac_count -gt $lt_ac_max; then
lt_ac_max=$lt_ac_count
lt_cv_path_SED=$lt_ac_sed
fi
done
done
])
SED=$lt_cv_path_SED
AC_SUBST([SED])
AC_MSG_RESULT([$SED])
])
# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
# generated from the m4 files accompanying Automake X.Y.
AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
# AM_SET_CURRENT_AUTOMAKE_VERSION
# -------------------------------
# Call AM_AUTOMAKE_VERSION so it can be traced.
# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.9.6])])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
#
# Of course, Automake must honor this variable whenever it calls a
# tool from the auxiliary directory. The problem is that $srcdir (and
# therefore $ac_aux_dir as well) can be either absolute or relative,
# depending on how configure is run. This is pretty annoying, since
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
# source directory, any form will work fine, but in subdirectories a
# relative path needs to be adjusted first.
#
# $ac_aux_dir/missing
# fails when called from a subdirectory if $ac_aux_dir is relative
# $top_srcdir/$ac_aux_dir/missing
# fails if $ac_aux_dir is absolute,
# fails when called from a subdirectory in a VPATH build with
# a relative $ac_aux_dir
#
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
# are both prefixed by $srcdir. In an in-source build this is usually
# harmless because $srcdir is `.', but things will broke when you
# start a VPATH build or use an absolute $srcdir.
#
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
# and then we would define $MISSING as
# MISSING="\${SHELL} $am_aux_dir/missing"
# This will work as long as MISSING is not called from configure, because
# unfortunately $(top_srcdir) has no meaning in configure.
# However there are other variables, like CC, which are often used in
# configure, and could therefore not use this "fixed" $ac_aux_dir.
#
# Another solution, used here, is to always expand $ac_aux_dir to an
# absolute PATH. The drawback is that using absolute paths prevent a
# configured tree to be moved without reconfiguration.
AC_DEFUN([AM_AUX_DIR_EXPAND],
[dnl Rely on autoconf to set up CDPATH properly.
AC_PREREQ([2.50])dnl
# expand $ac_aux_dir to an absolute path
am_aux_dir=`cd $ac_aux_dir && pwd`
])
# AM_CONDITIONAL -*- Autoconf -*-
# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 7
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
# -------------------------------------
# Define a conditional.
AC_DEFUN([AM_CONDITIONAL],
[AC_PREREQ(2.52)dnl
ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
AC_SUBST([$1_TRUE])
AC_SUBST([$1_FALSE])
if $2; then
$1_TRUE=
$1_FALSE='#'
else
$1_TRUE='#'
$1_FALSE=
fi
AC_CONFIG_COMMANDS_PRE(
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
AC_MSG_ERROR([[conditional "$1" was never defined.
Usually this means the macro was only invoked conditionally.]])
fi])])
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 8
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
# _AM_DEPENDENCIES(NAME)
# ----------------------
# See how the compiler implements dependency checking.
# NAME is "CC", "CXX", "GCJ", or "OBJC".
# We try a few techniques and use that to set a single cache variable.
#
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
# dependency, and given that the user is not expected to run this macro,
# just rely on AC_PROG_CC.
AC_DEFUN([_AM_DEPENDENCIES],
[AC_REQUIRE([AM_SET_DEPDIR])dnl
AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
[$1], CXX, [depcc="$CXX" am_compiler_list=],
[$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
[$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
[depcc="$$1" am_compiler_list=])
AC_CACHE_CHECK([dependency style of $depcc],
[am_cv_$1_dependencies_compiler_type],
[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
cp "$am_depcomp" conftest.dir
cd conftest.dir
# We will build objects and dependencies in a subdirectory because
# it helps to detect inapplicable dependency modes. For instance
# both Tru64's cc and ICC support -MD to output dependencies as a
# side effect of compilation, but ICC will put the dependencies in
# the current directory while Tru64 will put them in the object
# directory.
mkdir sub
am_cv_$1_dependencies_compiler_type=none
if test "$am_compiler_list" = ""; then
am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
fi
for depmode in $am_compiler_list; do
# Setup a source with many dependencies, because some compilers
# like to wrap large dependency lists on column 80 (with \), and
# we should not choose a depcomp mode which is confused by this.
#
# We need to recreate these files for each test, as the compiler may
# overwrite some of them when testing with obscure command lines.
# This happens at least with the AIX C compiler.
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
# Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
# Solaris 8's {/usr,}/bin/sh.
touch sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
case $depmode in
nosideeffect)
# after this tag, mechanisms are not by side-effect, so they'll
# only be used when explicitly requested
if test "x$enable_dependency_tracking" = xyes; then
continue
else
break
fi
;;
none) break ;;
esac
# We check with `-c' and `-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
# handle `-M -o', and we need to detect this.
if depmode=$depmode \
source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
$SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
>/dev/null 2>conftest.err &&
grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
${MAKE-make} -s -f confmf > /dev/null 2>&1; then
# icc doesn't choke on unknown options, it will just issue warnings
# or remarks (even with -Werror). So we grep stderr for any message
# that says an option was ignored or not supported.
# When given -MP, icc 7.0 and 7.1 complain thusly:
# icc: Command line warning: ignoring option '-M'; no argument required
# The diagnosis changed in icc 8.0:
# icc: Command line remark: option '-MP' not supported
if (grep 'ignoring option' conftest.err ||
grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
am_cv_$1_dependencies_compiler_type=$depmode
break
fi
fi
done
cd ..
rm -rf conftest.dir
else
am_cv_$1_dependencies_compiler_type=none
fi
])
AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
AM_CONDITIONAL([am__fastdep$1], [
test "x$enable_dependency_tracking" != xno \
&& test "$am_cv_$1_dependencies_compiler_type" = gcc3])
])
# AM_SET_DEPDIR
# -------------
# Choose a directory name for dependency files.
# This macro is AC_REQUIREd in _AM_DEPENDENCIES
AC_DEFUN([AM_SET_DEPDIR],
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
])
# AM_DEP_TRACK
# ------------
AC_DEFUN([AM_DEP_TRACK],
[AC_ARG_ENABLE(dependency-tracking,
[ --disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors])
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])
])
# Generate code to set up dependency tracking. -*- Autoconf -*-
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
#serial 3
# _AM_OUTPUT_DEPENDENCY_COMMANDS
# ------------------------------
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
[for mf in $CONFIG_FILES; do
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
# We used to match only the files named `Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
# So let's grep whole file.
if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
dirpart=`AS_DIRNAME("$mf")`
else
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
# from the Makefile without running `make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
test -z "am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
# When using ansi2knr, U may be empty or an underscore; expand it
U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`AS_DIRNAME(["$file"])`
AS_MKDIR_P([$dirpart/$fdir])
# echo "creating $dirpart/$file"
echo '# dummy' > "$dirpart/$file"
done
done
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
# AM_OUTPUT_DEPENDENCY_COMMANDS
# -----------------------------
# This macro should only be invoked once -- use via AC_REQUIRE.
#
# This code is only required when automatic dependency tracking
# is enabled. FIXME. This creates each `.P' file that we will
# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AC_CONFIG_COMMANDS([depfiles],
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
])
# Do all the work for Automake. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 12
# This macro actually does too much. Some checks are only needed if
# your package does certain things. But this isn't really a big deal.
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
# AM_INIT_AUTOMAKE([OPTIONS])
# -----------------------------------------------
# The call with PACKAGE and VERSION arguments is the old style
# call (pre autoconf-2.50), which is being phased out. PACKAGE
# and VERSION should now be passed to AC_INIT and removed from
# the call to AM_INIT_AUTOMAKE.
# We support both call styles for the transition. After
# the next Automake release, Autoconf can make the AC_INIT
# arguments mandatory, and then we can depend on a new Autoconf
# release and drop the old call support.
AC_DEFUN([AM_INIT_AUTOMAKE],
[AC_PREREQ([2.58])dnl
dnl Autoconf wants to disallow AM_ names. We explicitly allow
dnl the ones we care about.
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
AC_REQUIRE([AC_PROG_INSTALL])dnl
# test to see if srcdir already configured
if test "`cd $srcdir && pwd`" != "`pwd`" &&
test -f $srcdir/config.status; then
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
fi
# test whether we have cygpath
if test -z "$CYGPATH_W"; then
if (cygpath --version) >/dev/null 2>/dev/null; then
CYGPATH_W='cygpath -w'
else
CYGPATH_W=echo
fi
fi
AC_SUBST([CYGPATH_W])
# Define the identity of the package.
dnl Distinguish between old-style and new-style calls.
m4_ifval([$2],
[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
AC_SUBST([PACKAGE], [$1])dnl
AC_SUBST([VERSION], [$2])],
[_AM_SET_OPTIONS([$1])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
_AM_IF_OPTION([no-define],,
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
# Some tools Automake needs.
AC_REQUIRE([AM_SANITY_CHECK])dnl
AC_REQUIRE([AC_ARG_PROGRAM])dnl
AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
AM_MISSING_PROG(AUTOCONF, autoconf)
AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
AM_MISSING_PROG(AUTOHEADER, autoheader)
AM_MISSING_PROG(MAKEINFO, makeinfo)
AM_PROG_INSTALL_SH
AM_PROG_INSTALL_STRIP
AC_REQUIRE([AM_PROG_MKDIR_P])dnl
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
[_AM_PROG_TAR([v7])])])
_AM_IF_OPTION([no-dependencies],,
[AC_PROVIDE_IFELSE([AC_PROG_CC],
[_AM_DEPENDENCIES(CC)],
[define([AC_PROG_CC],
defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_CXX],
[_AM_DEPENDENCIES(CXX)],
[define([AC_PROG_CXX],
defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
])
])
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
# loop where config.status creates the headers, so we can generate
# our stamp files there.
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
[# Compute $1's index in $config_headers.
_am_stamp_count=1
for _am_header in $config_headers :; do
case $_am_header in
$1 | $1:* )
break ;;
* )
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
esac
done
echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
AC_DEFUN([AM_PROG_INSTALL_SH],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
install_sh=${install_sh-"$am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 2
# Check whether the underlying file-system supports filenames
# with a leading dot. For instance MS-DOS doesn't.
AC_DEFUN([AM_SET_LEADING_DOT],
[rm -rf .tst 2>/dev/null
mkdir .tst 2>/dev/null
if test -d .tst; then
am__leading_dot=.
else
am__leading_dot=_
fi
rmdir .tst 2>/dev/null
AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
AC_DEFUN([AM_MAINTAINER_MODE],
[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode is disabled by default
AC_ARG_ENABLE(maintainer-mode,
[ --enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer],
USE_MAINTAINER_MODE=$enableval,
USE_MAINTAINER_MODE=no)
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
MAINT=$MAINTAINER_MODE_TRUE
AC_SUBST(MAINT)dnl
]
)
AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
# Check to see how 'make' treats includes. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 3
# AM_MAKE_INCLUDE()
# -----------------
# Check to see how make treats includes.
AC_DEFUN([AM_MAKE_INCLUDE],
[am_make=${MAKE-make}
cat > confinc << 'END'
am__doit:
@echo done
.PHONY: am__doit
END
# If we don't find an include directive, just comment out the code.
AC_MSG_CHECKING([for style of include used by $am_make])
am__include="#"
am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
# We grep out `Entering directory' and `Leaving directory'
# messages which can occur if `w' ends up in MAKEFLAGS.
# In particular we don't look at `^make:' because GNU make might
# be invoked under some other name (usually "gmake"), in which
# case it prints its new name instead of `make'.
if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
am__include=include
am__quote=
_am_result=GNU
fi
# Now try BSD make style include.
if test "$am__include" = "#"; then
echo '.include "confinc"' > confmf
if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
am__include=.include
am__quote="\""
_am_result=BSD
fi
fi
AC_SUBST([am__include])
AC_SUBST([am__quote])
AC_MSG_RESULT([$_am_result])
rm -f confinc confmf
])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
# AM_MISSING_PROG(NAME, PROGRAM)
# ------------------------------
AC_DEFUN([AM_MISSING_PROG],
[AC_REQUIRE([AM_MISSING_HAS_RUN])
$1=${$1-"${am_missing_run}$2"}
AC_SUBST($1)])
# AM_MISSING_HAS_RUN
# ------------------
# Define MISSING if not defined so far and test if it supports --run.
# If it does, set am_missing_run to use it, otherwise, to nothing.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
# Use eval to expand $SHELL
if eval "$MISSING --run true"; then
am_missing_run="$MISSING --run "
else
am_missing_run=
AC_MSG_WARN([`missing' script is too old or missing])
fi
])
# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_MKDIR_P
# ---------------
# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
#
# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
# created by `make install' are always world readable, even if the
# installer happens to have an overly restrictive umask (e.g. 077).
# This was a mistake. There are at least two reasons why we must not
# use `-m 0755':
# - it causes special bits like SGID to be ignored,
# - it may be too restrictive (some setups expect 775 directories).
#
# Do not use -m 0755 and let people choose whatever they expect by
# setting umask.
#
# We cannot accept any implementation of `mkdir' that recognizes `-p'.
# Some implementations (such as Solaris 8's) are not thread-safe: if a
# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
# concurrently, both version can detect that a/ is missing, but only
# one can create it and the other will error out. Consequently we
# restrict ourselves to GNU make (using the --version option ensures
# this.)
AC_DEFUN([AM_PROG_MKDIR_P],
[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
# We used to keeping the `.' as first argument, in order to
# allow $(mkdir_p) to be used without argument. As in
# $(mkdir_p) $(somedir)
# where $(somedir) is conditionally defined. However this is wrong
# for two reasons:
# 1. if the package is installed by a user who cannot write `.'
# make install will fail,
# 2. the above comment should most certainly read
# $(mkdir_p) $(DESTDIR)$(somedir)
# so it does not work when $(somedir) is undefined and
# $(DESTDIR) is not.
# To support the latter case, we have to write
# test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
# so the `.' trick is pointless.
mkdir_p='mkdir -p --'
else
# On NextStep and OpenStep, the `mkdir' command does not
# recognize any option. It will interpret all options as
# directories to create, and then abort because `.' already
# exists.
for d in ./-p ./--version;
do
test -d $d && rmdir $d
done
# $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
if test -f "$ac_aux_dir/mkinstalldirs"; then
mkdir_p='$(mkinstalldirs)'
else
mkdir_p='$(install_sh) -d'
fi
fi
AC_SUBST([mkdir_p])])
# Helper functions for option handling. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 3
# _AM_MANGLE_OPTION(NAME)
# -----------------------
AC_DEFUN([_AM_MANGLE_OPTION],
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME)
# ------------------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
# _AM_SET_OPTIONS(OPTIONS)
# ----------------------------------
# OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS],
[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
# -------------------------------------------
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
# Check to make sure that the build environment is sane. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_MSG_CHECKING([whether build environment is sane])
# Just in case
sleep 1
echo timestamp > conftest.file
# Do `set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
if test "$[*]" = "X"; then
# -L didn't work.
set X `ls -t $srcdir/configure conftest.file`
fi
rm -f conftest.file
if test "$[*]" != "X $srcdir/configure conftest.file" \
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
# If neither matched, then we have a broken ls. This can happen
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
alias in your environment])
fi
test "$[2]" = conftest.file
)
then
# Ok.
:
else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
AC_MSG_RESULT(yes)])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_STRIP
# ---------------------
# One issue with vendor `install' (even GNU) is that you can't
# specify the program used to strip binaries. This is especially
# annoying in cross-compiling environments, where the build's strip
# is unlikely to handle the host's binaries.
# Fortunately install-sh will honor a STRIPPROG variable, so we
# always use install-sh in `make install-strip', and initialize
# STRIPPROG with the value of the STRIP variable (set by the user).
AC_DEFUN([AM_PROG_INSTALL_STRIP],
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
# Installed binaries are usually stripped using `strip' when the user
# run `make install-strip'. However `strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
# will honor the `STRIP' environment variable to overrule this program.
dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
if test "$cross_compiling" != no; then
AC_CHECK_TOOL([STRIP], [strip], :)
fi
INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
# Check how to create a tarball. -*- Autoconf -*-
# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 2
# _AM_PROG_TAR(FORMAT)
# --------------------
# Check how to create a tarball in format FORMAT.
# FORMAT should be one of `v7', `ustar', or `pax'.
#
# Substitute a variable $(am__tar) that is a command
# writing to stdout a FORMAT-tarball containing the directory
# $tardir.
# tardir=directory && $(am__tar) > result.tar
#
# Substitute a variable $(am__untar) that extract such
# a tarball read from stdin.
# $(am__untar) < result.tar
AC_DEFUN([_AM_PROG_TAR],
[# Always define AMTAR for backward compatibility.
AM_MISSING_PROG([AMTAR], [tar])
m4_if([$1], [v7],
[am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
[m4_case([$1], [ustar],, [pax],,
[m4_fatal([Unknown tar format])])
AC_MSG_CHECKING([how to create a $1 tar archive])
# Loop over all known methods to create a tar archive until one works.
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
# Do not fold the above two line into one, because Tru64 sh and
# Solaris sh will not grok spaces in the rhs of `-'.
for _am_tool in $_am_tools
do
case $_am_tool in
gnutar)
for _am_tar in tar gnutar gtar;
do
AM_RUN_LOG([$_am_tar --version]) && break
done
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
am__untar="$_am_tar -xf -"
;;
plaintar)
# Must skip GNU tar: if it does not support --format= it doesn't create
# ustar tarball either.
(tar --version) >/dev/null 2>&1 && continue
am__tar='tar chf - "$$tardir"'
am__tar_='tar chf - "$tardir"'
am__untar='tar xf -'
;;
pax)
am__tar='pax -L -x $1 -w "$$tardir"'
am__tar_='pax -L -x $1 -w "$tardir"'
am__untar='pax -r'
;;
cpio)
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
am__untar='cpio -i -H $1 -d'
;;
none)
am__tar=false
am__tar_=false
am__untar=false
;;
esac
# If the value was cached, stop now. We just wanted to have am__tar
# and am__untar set.
test -n "${am_cv_prog_tar_$1}" && break
# tar/untar a dummy directory, and stop if the command works
rm -rf conftest.dir
mkdir conftest.dir
echo GrepMe > conftest.dir/file
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
rm -rf conftest.dir
if test -s conftest.tar; then
AM_RUN_LOG([$am__untar /dev/null 2>&1 && break
fi
done
rm -rf conftest.dir
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
dnl
dnl Doxygen related macros
dnl
AC_DEFUN([LAC_DOXYGEN_PROJECT],dnl
[
lac_doxygen_project=`echo "$1" | sed -e 's/_/ /g'`
AC_SUBST(lac_doxygen_project)
])
AC_DEFUN([LAC_DOXYGEN_SOURCE_DIRS],dnl
[
lac_doxygen_srcdirs=[$1]
AC_SUBST(lac_doxygen_srcdirs)
])
AC_DEFUN([LAC_DOXYGEN_INPUT_FILTER],dnl
[
lac_doxygen_input_filter=[$1]
AC_SUBST(lac_doxygen_input_filter)
])
AC_DEFUN([LAC_DOXYGEN_OUTPUT_TAGFILE],dnl
[
lac_doxygen_output_tagfile=[$1]
AC_SUBST(lac_doxygen_output_tagfile)
])
AC_DEFUN([LAC_DOXYGEN_TAGFILES],dnl
[
lac_doxygen_tagfiles=""
for x in "" $1; do
if test "X$x" != "X" ; then
lac_tag_base=`echo ${x} | sed -e 's|.*/||' -e 's|\.tag$||'`
lac_tag="${lac_tag_base}.tag"
lac_doxygen_tagfiles="$lac_doxygen_tagfiles $x"
lac_doxygen_internal_tagfiles="$lac_doxygen_internal_tagfiles ${x}i"
lac_html_dir=`echo ${x} | sed -e 's|.*/\(.*/html\)/.*|../../\1|'`
lac_doxygen_installdox="$lac_doxygen_installdox -l${lac_tag}@${lac_html_dir}"
fi
done
AC_SUBST(lac_doxygen_tagfiles)
AC_SUBST(lac_doxygen_internal_tagfiles)
AC_SUBST(lac_doxygen_installdox)
])
AC_DEFUN([LAC_DOXYGEN_FILE_PATTERNS],dnl
[
lac_doxygen_file_patterns=[$1]
])
AC_DEFUN([LAC_DOXYGEN_EXAMPLE_DIR],dnl
[
lac_doxygen_examples=[$1]
])
AC_DEFUN([LAC_DOXYGEN_PREDEFINES],dnl
[
lac_doxygen_predefines=[$1]
])
AC_DEFUN([LAC_DOXYGEN],dnl
[
AC_ARG_ENABLE(doxygen,
AC_HELP_STRING([--enable-doxygen[[=PATH]]],
[Use Doxygen to generate doxygen. If specified, PATH is the
path to the doxygen executable; otherwise it is
autodiscovered]),
[
if test "$enableval" = "yes"; then
AC_PATH_PROG(DOXYGEN,
doxygen,
[
AC_MSG_ERROR(Doxygen installation not found)
])
else
DOXYGEN="$enableval"
AC_SUBST(DOXYGEN)
fi
],
[
DOXYGEN=""
AC_SUBST(DOXYGEN)
])
AC_ARG_ENABLE(internal-doc,
AC_HELP_STRING(
[--enable-internal-doc],
[Generate Doxygen documentation for internal functions.
Requires --enable-doxygen]),
[
DOXYFILE="Doxyfile-internal"
AC_SUBST(DOXYFILE)
],
[
DOXYFILE="Doxyfile"
AC_SUBST(DOXYFILE)
])
if test -n "$DOXYGEN" ; then
AC_PATH_PROG(DOT, dot)
if test -z "$GLOBUS_SH_PERL" ; then
AC_PATH_PROG(PERL, perl)
else
PERL="$GLOBUS_SH_PERL"
AC_SUBST(PERL)
fi
if test "$DOT" != ""; then
HAVE_DOT=YES
else
HAVE_DOT=NO
fi
AC_SUBST(HAVE_DOT)
LAC_DOXYGEN_SOURCE_DIRS($1)
LAC_DOXYGEN_FILE_PATTERNS($2)
LAC_DOXYGEN_INPUT_FILTER($3)
LAC_DOXYGEN_PROJECT($GPT_NAME)
LAC_DOXYGEN_OUTPUT_TAGFILE($GPT_NAME)
lac_dep_check="${GLOBUS_LOCATION:-$ac_default_prefix}/sbin/globus-build-doxygen-dependencies"
if test ! -x $lac_dep_check ; then
# assume we are dealing with common
lac_dep_check="$srcdir/scripts/globus-build-doxygen-dependencies"
chmod 0755 $lac_dep_check
fi
AC_MSG_CHECKING([documentation dependencies])
tagfiles="`$lac_dep_check -src $srcdir/pkgdata/pkg_data_src.gpt.in 2>/dev/null`"
if test "$?" != "0"; then
AC_MSG_RESULT([failed])
AC_MSG_ERROR([Documentation dependencies could not be satisfied.])
else
AC_MSG_RESULT([ok])
fi
LAC_DOXYGEN_TAGFILES($tagfiles)
AC_SUBST(lac_doxygen_file_patterns)
AC_SUBST(lac_doxygen_examples)
AC_SUBST(lac_doxygen_predefines)
fi
]
)
AC_DEFUN([GLOBUS_INITIALIZERS], [
initializer_prefix="${prefix}"
test "$initializer_prefix" = "NONE" && initializer_prefix="$ac_default_prefix"
initializer_exec_prefix="${exec_prefix}"
test "$initializer_exec_prefix" = "NONE" && initializer_exec_prefix='${prefix}'
test "$datarootdir" = "" && datarootdir='${prefix}/share'
AC_SUBST(datarootdir)
case $guess_libdir:${host}:${libdir} in
1:*linux*:*lib64)
libdir32="${libdir%%64}"
libdir64="${libdir}"
libdir_choice="
case \`uname -m\` in
aarch64|ppc64|s390x|sparc64|x86_64)
libdir=\"$libdir64\"
;;
*)
libdir=\"$libdir32\"
;;
esac
"
perl_libdir_choice="
if (\`uname -m\` =~ /^(aarch64|ppc64|s390x|sparc64|x86_64)\$/) {
\$libdir = \"$libdir64\";
} else {
\$libdir = \"$libdir32\";
}
"
;;
1:*linux*:*lib)
libdir32="${libdir}"
libdir64="${libdir}64"
libdir_choice="
case \`uname -m\` in
aarch64|ppc64|s390x|sparc64|x86_64)
libdir=\"$libdir64\"
;;
*)
libdir=\"$libdir32\"
;;
esac
"
perl_libdir_choice="
if (\`uname -m\` =~ /^(aarch64|ppc64|s390x|sparc64|x86_64)\$/) {
\$libdir = \"$libdir64\";
} else {
\$libdir = \"$libdir32\";
}
"
;;
*)
libdir_choice="libdir=\"$libdir\""
perl_libdir_choice=" \$libdir = \"$libdir\";";
;;
esac
echo "$libdir_choice" | sed "s/\"/'/g" > globus-script-libdir-choice
GLOBUS_LIBDIR_CHOICE="globus-script-libdir-choice"
echo "$perl_libdir_choice" | sed "s/^ //" > globus-perl-libdir-choice
GLOBUS_PERL_LIBDIR_CHOICE="globus-perl-libdir-choice"
AC_SUBST_FILE(GLOBUS_LIBDIR_CHOICE)
AC_SUBST_FILE(GLOBUS_PERL_LIBDIR_CHOICE)
cat > globus-script-initializer << EOF
if test -n "\${GLOBUS_LOCATION}" ; then
prefix="\${GLOBUS_LOCATION}"
else
prefix="$initializer_prefix"
fi
exec_prefix="$initializer_exec_prefix"
sbindir="$sbindir"
bindir="$bindir"
$libdir_choice
includedir="$includedir"
datarootdir="$datarootdir"
datadir="$datadir"
libexecdir="$libexecdir"
sysconfdir="$sysconfdir"
sharedstatedir="$sharedstatedir"
localstatedir="$localstatedir"
aclocaldir="$aclocaldir"
EOF
GLOBUS_SCRIPT_INITIALIZER=globus-script-initializer
AC_SUBST_FILE(GLOBUS_SCRIPT_INITIALIZER)
cat > globus-perl-initializer << EOF
my (\$prefix, \$exec_prefix, \$libdir, \$perlmoduledir);
my (\$sbindir, \$bindir, \$includedir, \$datarootdir,
\$datadir, \$libexecdir, \$sysconfdir, \$sharedstatedir,
\$localstatedir, \$aclocaldir);
BEGIN
{
if (exists \$ENV{GLOBUS_LOCATION})
{
\$prefix = \$ENV{GLOBUS_LOCATION};
}
else
{
\$prefix = "$initializer_prefix";
}
\$exec_prefix = "$initializer_exec_prefix";
$perl_libdir_choice
\$sbindir = "$sbindir";
\$bindir = "$bindir";
\$includedir = "$includedir";
\$datarootdir = "$datarootdir";
\$datadir = "$datadir";
\$perlmoduledir = "$perlmoduledir";
\$libexecdir = "$libexecdir";
\$sysconfdir = "$sysconfdir";
\$sharedstatedir = "$sharedstatedir";
\$localstatedir = "$localstatedir";
\$aclocaldir = "$aclocaldir";
if (exists \$ENV{GPT_LOCATION})
{
unshift(@INC, "\$ENV{GPT_LOCATION}/lib/perl");
}
unshift(@INC, "\${perlmoduledir}");
}
EOF
GLOBUS_PERL_INITIALIZER=globus-perl-initializer
AC_SUBST_FILE(GLOBUS_PERL_INITIALIZER)
])
AC_DEFUN([GLOBUS_INIT], [
AM_MAINTAINER_MODE
dnl Default prefix is $GLOBUS_LOCATION, falling back to /usr if that
dnl is not present in the environment. Can be overridden by using
dnl --prefix during configure time
AC_PREFIX_DEFAULT(${GLOBUS_LOCATION:-/usr})
# checking for the GLOBUS_LOCATION
GLOBUS_LOCATION="${GLOBUS_LOCATION:-/usr}"
GPT_LOCATION="${GPT_LOCATION:-${GLOBUS_LOCATION}}"
# This is created in globus-bootstrap.sh
. "${srcdir}/gptdata.sh"
if test "x$GPT_BUILD_WITH_FLAVORS" = "xno"; then
GLOBUS_FLAVOR_NAME="noflavor"
fi
eval_path()
{
_pathval="[$]1"
_old_pathval=""
while test "$_pathval" != "$_old_pathval"; do
_old_pathval="$_pathval"
eval "_pathval=\"$_pathval\""
done
echo "$_pathval"
}
AC_ARG_WITH(flavor,
AC_HELP_STRING([--with-flavor=FLAVOR],
[Specify the globus build flavor or without-flavor for a flavor independent]),
[
case $withval in
no)
NO_FLAVOR="yes"
;;
yes)
echo "Please specify a globus build flavor" >&2
exit 1
;;
*)
if test "x$GLOBUS_FLAVOR_NAME" = "xnoflavor"; then
echo "Warning: package doesn't build with flavors $withval ignored" >&2
echo "Warning: $withval ignored" >&2
else
GLOBUS_FLAVOR_NAME=$withval
if test ! -f "${GLOBUS_LOCATION}/share/globus/flavors/flavor_$GLOBUS_FLAVOR_NAME.gpt"; then
echo "ERROR: Flavor $GLOBUS_FLAVOR_NAME has not been installed" >&2
exit 1
fi
fi
;;
esac
],
[
if test "x$GLOBUS_FLAVOR_NAME" = "x"; then
echo "Please specify a globus build flavor" >&2
exit 1
fi
]
)
GPT_INIT
AM_CONDITIONAL(WITHOUT_FLAVORS, test "$NO_FLAVOR" = "yes")
AC_SUBST(GLOBUS_FLAVOR_NAME)
# get the environment scripts
. ${GLOBUS_LOCATION}/share/globus/globus-build-env-$GLOBUS_FLAVOR_NAME.sh
GLOBUS_INITIALIZERS
doxygendir="`eval_path '$doxygendir'`"
AC_SUBST(CC)
AC_SUBST(CPP)
AC_SUBST(CFLAGS)
AC_SUBST(CPPFLAGS)
AC_SUBST(LD)
AC_SUBST(LDFLAGS)
AC_SUBST(LIBS)
AC_SUBST(CXX)
AC_SUBST(CXXCPP)
AC_SUBST(CXXFLAGS)
AC_SUBST(INSURE)
AC_SUBST(DOXYGEN)
AC_SUBST(F77)
AC_SUBST(F77FLAGS)
AC_SUBST(F90)
AC_SUBST(F90FLAGS)
AC_SUBST(AR)
AC_SUBST(ARFLAGS)
AC_SUBST(RANLIB)
AC_SUBST(PERL)
AC_SUBST(CROSS)
AC_SUBST(cross_compiling)
AC_SUBST(OBJEXT)
AC_SUBST(EXEEXT)
AC_SUBST(OBJECT_MODE)
AC_SUBST(setupdir)
AC_SUBST(testdir)
AC_SUBST(flavorincludedir)
AC_SUBST(pkgdir)
AC_SUBST(aclocaldir)
AC_SUBST(perlmoduledir)
AC_SUBST(doxygendir)
dnl define FILELIST_FILE variable
FILELIST_FILE=`pwd`;
FILELIST_FILE="$FILELIST_FILE/pkgdata/master.filelist"
AC_SUBST(FILELIST_FILE)
dnl export version information
dnl branch id 99999 means that timestamp refers to build time
if test -f $srcdir/dirt.sh ; then
. $srcdir/dirt.sh
else
DIRT_TIMESTAMP=`perl -e 'print time'`
DIRT_BRANCH_ID=99999
fi
dnl GPT_MAJOR_VERSION and GPT_MINOR_VERSION provided by GPT_INIT
AC_SUBST(GPT_MAJOR_VERSION)
AC_SUBST(GPT_MINOR_VERSION)
AC_SUBST(GPT_AGE_VERSION)
AC_SUBST(DIRT_TIMESTAMP)
AC_SUBST(DIRT_BRANCH_ID)
AC_ARG_ENABLE([programs],
AC_HELP_STRING([--disable-programs], [Don't compile/link programs]),
[case "${enableval}" in
yes)
ENABLE_PROGRAMS=true
;;
no)
ENABLE_PROGRAMS=false
;;
*)
AC_MSG_ERROR([bad value ${enableval} for --enable-programs])
;;
esac],
[ENABLE_PROGRAMS=true])
AM_CONDITIONAL(ENABLE_PROGRAMS, test "x$ENABLE_PROGRAMS" = "xtrue")
dnl END OF GLOBUS_INIT
])
dnl Nothing to do here after ensure flavoring is removed
AC_DEFUN([GLOBUS_FINALIZE], [])
dnl GPT_INIT()
AC_DEFUN([GPT_INIT], [
GPT_LOCATION="${GPT_LOCATION:-${GLOBUS_LOCATION:-/usr}}"
dnl --with-docdir for older autoconf (<2.60)
AC_ARG_WITH([docdir],
AC_HELP_STRING([--with-docdir=DIR], [Install documentation in DIR [[DATADIR/doc/PACKAGE]]]),
[case $withval in
yes|no)
AC_MSG_ERROR([Invalid DIR])
;;
*)
docdir="$withval"
;;
esac
],
[
if test -z "$docdir"; then
docdir='${datadir}/doc/${PACKAGE}'
fi
])
AC_SUBST(docdir)
AC_SUBST(GPT_LOCATION)
AC_SUBST(GPT_PKGCONFIG_DEPENDENCIES)
# bootstrap extracts the the name and version of the package from the
# src metadata into gptdata.sh for easier processing
. ${srcdir}/gptdata.sh
GPT_VERSION="$GPT_MAJOR_VERSION.$GPT_MINOR_VERSION"
# Determine if GPT is version 2.x
GPT_IS_2="no"
if test -f "$GPT_LOCATION/sbin/gpt-build"; then
GPT_IS_2="yes"
fi
AC_SUBST(GPT_IS_2)
#Default to shared, before checking static-only
GPT_LINKTYPE="shared"
# We have to figure out if we're linking only static before build_config
AC_ARG_ENABLE(static-only,
AC_HELP_STRING([--enable-static-only], [Don't do any dynamic linking]),
[
case $enableval in
no)
GPT_LINKTYPE="shared"
;;
yes)
GPT_LINKTYPE="static"
dnl if test "$STATIC_LDFLAGS" = ""; then
dnl GPT_LDFLAGS=" -all-static $GPT_LDFLAGS"
dnl else
dnl GPT_LDFLAGS=" $STATIC_LDFLAGS $GPT_LDFLAGS"
dnl fi
;;
*)
echo "--enable-static-only has no arguments" >&2
exit 1
;;
esac
]
)
#extract the cumulative build environment from the installed development tree
[
if $GPT_LOCATION/sbin/gpt_build_config -src $srcdir/pkgdata/pkg_data_src.gpt.in -f $GLOBUS_FLAVOR_NAME -link $GPT_LINKTYPE; then
echo "Dependencies Complete";
else
exit 1;
fi
]
# The following variables are used to manage the build enviroment
# GPT_CFLAGS, GPT_INCLUDES, GPT_PGM_LINKS, GPT_LIB_LINKS, and GPT_LDFLAGS
# are the variables used in the Makefile.am's
# GPT_PKG_CFLAGS, GPT_EXTERNAL_INCLUDES and GPT_EXTERNAL_LIBS are stored
# as build data in the packaging metadata file.
# GPT_CONFIG_FLAGS, GPT_CONFIG_INCLUDES, GPT_CONFIG_PGM_LINKS, and
# GPT_CONFIG_LIB_LINKS are returned by gpt_build_config and contain build
# environment data from the dependent packages.
. ./gpt_build_temp.sh
rm ./gpt_build_temp.sh
GPT_CFLAGS="$GPT_CONFIG_CFLAGS"
GPT_INCLUDES="$GPT_CONFIG_INCLUDES"
GPT_LIBS="$GPT_CONFIG_PKG_LIBS $GPT_CONFIG_LIBS"
GPT_LDFLAGS="$GPT_CONFIG_STATIC_LINKLINE $GPT_LDFLAGS"
GPT_PGM_LINKS="$GPT_CONFIG_PGM_LINKS $GPT_CONFIG_LIBS"
GPT_LIB_LINKS="-version-info $GPT_MAJOR_VERSION:$GPT_MINOR_VERSION:$GPT_AGE_VERSION $GPT_CONFIG_LIB_LINKS $GPT_CONFIG_LIBS"
AC_SUBST(GPT_CFLAGS)
AC_SUBST(GPT_PKG_CFLAGS)
AC_SUBST(GPT_INCLUDES)
AC_SUBST(GPT_EXTERNAL_INCLUDES)
AC_SUBST(GPT_EXTERNAL_LIBS)
AC_SUBST(GPT_LIBS)
AC_SUBST(GPT_LDFLAGS)
AC_SUBST(GPT_CONFIG_CFLAGS)
AC_SUBST(GPT_CONFIG_INCLUDES)
AC_SUBST(GPT_CONFIG_LIBS)
AC_SUBST(GPT_CONFIG_PKG_LIBS)
AC_SUBST(GPT_PGM_LINKS)
AC_SUBST(GPT_LIB_LINKS)
AC_SUBST(GPT_LINKTYPE)
builddir=`pwd`
AC_SUBST(builddir)
# Export pkg-config information about this package
pkgconfdir='${libdir}/pkgconfig'
pkgconffile=`echo "${GPT_NAME}.pc" | sed -e 's!_!-!g'`
pkgconffile_in="pkg_data_src.pc.in"
AC_SUBST(pkgconfdir)
AC_SUBST(pkgconffile)
AC_SUBST(pkgconffile_in)
AC_CONFIG_FILES(pkgdata/$pkgconffile:pkgdata/pkg_data_src.pc.in)
])
AC_DEFUN([GPT_SET_CFLAGS], [
GPT_CFLAGS_TMP=$1
GPT_CFLAGS="$GPT_CFLAGS_TMP $GPT_CFLAGS"
GPT_PKG_CFLAGS="$GPT_CFLAGS_TMP $GPT_PKG_CFLAGS"
])
AC_DEFUN([GPT_SET_INCLUDES], [
GPT_INCLUDES_TMP=$1
GPT_EXTERNAL_INCLUDES="$GPT_EXTERNAL_INCLUDES $GPT_INCLUDES_TMP"
GPT_INCLUDES="$GPT_INCLUDES_TMP $GPT_INCLUDES"
])
AC_DEFUN([GPT_SET_LIBS], [
GPT_LIBS_TMP=$1
GPT_EXTERNAL_LIBS="$GPT_EXTERNAL_LIBS $GPT_LIBS_TMP"
GPT_LIB_LINKS=" $GPT_LIB_LINKS $GPT_LIBS_TMP"
GPT_PGM_LINKS=" $GPT_PGM_LINKS $GPT_LIBS_TMP"
])
AC_DEFUN([GPT_SET_LDFLAGS], [
GPT_LDFLAGS_TMP=$1
GPT_EXTERNAL_LDFLAGS="$GPT_EXTERNAL_LDFLAGS $GPT_LDFLAGS_TMP"
GPT_LDFLAGS=" $GPT_LDFLAGS_TMP $GPT_LDFLAGS"
])
globus_ftp_control-4.7/GLOBUS_LICENSE 0000666 0000764 0000764 00000023676 11522621134 014320 0000000 0000000
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
globus_ftp_control-4.7/doxygen/ 0000775 0000764 0000764 00000000000 12227171044 013760 5 0000000 0000000 globus_ftp_control-4.7/doxygen/Doxyfile.in 0000644 0000764 0000764 00000011455 12225575522 016026 0000000 0000000 # Doxyfile 1.2.6
# This file describes the settings to be used by doxygen for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#
# Include the standard part of the doxygen configuration:
#
@INCLUDE_PATH = @doxygendir@
@INCLUDE = Doxyfile.include
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME = "@lac_doxygen_project@"
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = @VERSION@
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = @lac_doxygen_srcdirs@ \
@lac_doxygen_examples@
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
FILE_PATTERNS = *.c \
*.h \
@lac_doxygen_file_patterns@
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command , where
# is the value of the INPUT_FILTER tag, and is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output.
INPUT_FILTER = @lac_doxygen_input_filter@
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH = @lac_doxygen_examples@
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER = @doxygendir@/globus_head.html
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER = @doxygendir@/globus_foot.html
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet
HTML_STYLESHEET =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed.
PREDEFINED = GLOBUS_DONT_DOCUMENT_INTERNAL \
GLOBUS_SEPARATE_DOCS \
DOXYGEN \
@lac_doxygen_predefines@
# The TAGFILES tag can be used to specify one or more tagfiles.
TAGFILES = @lac_doxygen_tagfiles@
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE = doc/html/@lac_doxygen_output_tagfile@.tag
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH = @PERL@
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = @HAVE_DOT@
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the
# \dotfile command).
DOTFILE_DIRS = @lac_doxygen_srcdirs@ \
@lac_doxygen_examples@
globus_ftp_control-4.7/doxygen/Doxyfile-internal.in 0000644 0000764 0000764 00000010735 12225575522 017640 0000000 0000000 # Doxyfile 1.2.6
# This file describes the settings to be used by doxygen for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#
# Include the standard part of the doxygen configuration:
#
@INCLUDE_PATH = @doxygendir@
@INCLUDE = Doxyfile-internal.include
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME = "@lac_doxygen_project@ (Internal Documentation)"
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = @VERSION@
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = @lac_doxygen_srcdirs@ \
@lac_doxygen_examples@
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
FILE_PATTERNS = *.c \
*.h \
@lac_doxygen_file_patterns@
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command , where
# is the value of the INPUT_FILTER tag, and is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output.
INPUT_FILTER = @lac_doxygen_input_filter@
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH = @lac_doxygen_examples@
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER = @doxygendir@/globus_head.html
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER = @doxygendir@/globus_foot.html
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet
HTML_STYLESHEET =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed.
PREDEFINED = DOXYGEN \
@lac_doxygen_predefines@
# The TAGFILES tag can be used to specify one or more tagfiles.
TAGFILES = @lac_doxygen_tagfiles@
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE = doc/html/@lac_doxygen_output_tagfile@.tag
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH = @PERL@
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = @HAVE_DOT@
globus_ftp_control-4.7/doxygen/Makefile.am 0000644 0000764 0000764 00000004641 12225575522 015746 0000000 0000000 include $(top_srcdir)/globus_automake_pre
#
# Automake rules for installing and building doxygen docs
#
doxygen_installdox = @lac_doxygen_installdox@
doc-stamp: @DOXYFILE@
@if test ! -z "@DOXYGEN@"; then \
@DOXYGEN@ @DOXYFILE@; \
if test -n "$(doxygen_installdox)"; then \
if test -x ./doc/html/installdox; then \
$(PERL) ./doc/html/installdox $(doxygen_installdox) ./doc/html/*;\
fi ; \
fi ; \
if test -d doc/latex; then \
(cd doc/latex ; for f in *.tex ; do sed 's/\\doxyref{p\.}/\\doxyref{}{p\.}/g' $$f > $$f.new ; mv $$f.new $$f ; done ; sed 's/\(latex_count\)=[0-9] /\1=10 /' Makefile > Makefile.new ; mv Makefile.new Makefile ; make) ; \
fi \
fi
touch $@
all-local: doc-stamp
install-data-local: doc-stamp
@if test ! -z "@DOXYGEN@"; then \
for dir in `find ./doc/{html,man} -type d -print|sed "s,./doc/,,"`; do \
if test -z "`echo $${dir}|sed -n '/^man/ p'`"; then \
$(INSTALL) -d -m 755 \
$(DESTDIR)$(docdir)/$${dir}; \
else \
$(INSTALL) -d -m 755 \
$(DESTDIR)$(mandir)/`echo $${dir} | sed -e 's/^man//'`; \
fi \
done; \
for file in `find ./doc/{html,man} -type f -print|sed "s,./doc/,,"`; do \
if test -z "`echo $${file}|sed -n '/^man/ p'`"; then \
$(INSTALL) -m 644 ./doc/$${file} \
$(DESTDIR)$(docdir)/$${file}; \
else \
$(INSTALL) -m 644 ./doc/$${file} \
$(DESTDIR)$(mandir)/`echo $${file} | sed -e 's/^man//'`;\
fi \
done; \
if test -f doc/latex/refman.pdf; then \
$(INSTALL) -m 644 doc/latex/refman.pdf \
$(DESTDIR)$(docdir); \
fi \
fi
clean-local:
@if test ! -z "@DOXYGEN@"; then \
rm -rf ./doc*; \
fi
rm -f doc-stamp
filelist: doc-stamp
@if test ! -z "@DOXYGEN@"; then \
filelistdir="`echo $(FILELIST_FILE) | sed -e 's!/[^/]*$$!!'`"; \
find ./doc/{man,html} -type f -print | \
sed -e 's,./doc/man,$(mandir),' \
-e 's,./doc,$(docdir),' \
-e 's,^$(prefix),,' \
>> $${filelistdir}/noflavor_doc.filelist; \
if test -f doc/latex/refman.pdf; then \
echo $(docdir)/refman.pdf | sed 's,^$(prefix),,' \
>> $${filelistdir}/noflavor_doc.filelist; \
fi \
fi
dist-hook: doc-stamp
@if test ! -z "@DOXYGEN@"; then \
if test -d doc; then \
cp -r doc $(distdir)/doc ; \
fi ; \
if test -d doc-internal; then \
cp -r doc-internal $(distdir)/doc-internal ; \
fi ; \
fi ;
include $(top_srcdir)/globus_automake_post
globus_ftp_control-4.7/doxygen/Makefile.in 0000664 0000764 0000764 00000033143 12227171015 015747 0000000 0000000 # Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(srcdir)/Doxyfile-internal.in $(srcdir)/Doxyfile.in \
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/globus_automake_post \
$(top_srcdir)/globus_automake_pre
subdir = doxygen
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_CLEAN_FILES = Doxyfile Doxyfile-internal
depcomp =
am__depfiles_maybe =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
ARFLAGS = @ARFLAGS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CROSS = @CROSS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DIRT_BRANCH_ID = @DIRT_BRANCH_ID@
DIRT_TIMESTAMP = @DIRT_TIMESTAMP@
DOT = @DOT@
DOXYFILE = @DOXYFILE@
DOXYGEN = @DOXYGEN@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ENABLE_PROGRAMS_FALSE = @ENABLE_PROGRAMS_FALSE@
ENABLE_PROGRAMS_TRUE = @ENABLE_PROGRAMS_TRUE@
EXEEXT = @EXEEXT@
F77 = @F77@
F77FLAGS = @F77FLAGS@
F90 = @F90@
F90FLAGS = @F90FLAGS@
FFLAGS = @FFLAGS@
FILELIST_FILE = @FILELIST_FILE@
GLOBUS_FLAVOR_NAME = @GLOBUS_FLAVOR_NAME@
GPT_AGE_VERSION = @GPT_AGE_VERSION@
GPT_CFLAGS = @GPT_CFLAGS@
GPT_CONFIG_CFLAGS = @GPT_CONFIG_CFLAGS@
GPT_CONFIG_INCLUDES = @GPT_CONFIG_INCLUDES@
GPT_CONFIG_LIBS = @GPT_CONFIG_LIBS@
GPT_CONFIG_PKG_LIBS = @GPT_CONFIG_PKG_LIBS@
GPT_EXTERNAL_INCLUDES = @GPT_EXTERNAL_INCLUDES@
GPT_EXTERNAL_LIBS = @GPT_EXTERNAL_LIBS@
GPT_INCLUDES = @GPT_INCLUDES@
GPT_IS_2 = @GPT_IS_2@
GPT_LDFLAGS = @GPT_LDFLAGS@
GPT_LIBS = @GPT_LIBS@
GPT_LIB_LINKS = @GPT_LIB_LINKS@
GPT_LINKTYPE = @GPT_LINKTYPE@
GPT_LOCATION = @GPT_LOCATION@
GPT_MAJOR_VERSION = @GPT_MAJOR_VERSION@
GPT_MINOR_VERSION = @GPT_MINOR_VERSION@
GPT_PGM_LINKS = @GPT_PGM_LINKS@
GPT_PKGCONFIG_DEPENDENCIES = @GPT_PKGCONFIG_DEPENDENCIES@
GPT_PKG_CFLAGS = @GPT_PKG_CFLAGS@
HAVE_DOT = @HAVE_DOT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
INSURE = @INSURE@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
OBJECT_MODE = @OBJECT_MODE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
WITHOUT_FLAVORS_FALSE = @WITHOUT_FLAVORS_FALSE@
WITHOUT_FLAVORS_TRUE = @WITHOUT_FLAVORS_TRUE@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
aclocaldir = @aclocaldir@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
cross_compiling = @cross_compiling@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
doxygendir = @doxygendir@
exec_prefix = @exec_prefix@
flavorincludedir = @flavorincludedir@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
lac_doxygen_examples = @lac_doxygen_examples@
lac_doxygen_file_patterns = @lac_doxygen_file_patterns@
lac_doxygen_input_filter = @lac_doxygen_input_filter@
lac_doxygen_installdox = @lac_doxygen_installdox@
lac_doxygen_internal_tagfiles = @lac_doxygen_internal_tagfiles@
lac_doxygen_output_tagfile = @lac_doxygen_output_tagfile@
lac_doxygen_predefines = @lac_doxygen_predefines@
lac_doxygen_project = @lac_doxygen_project@
lac_doxygen_srcdirs = @lac_doxygen_srcdirs@
lac_doxygen_tagfiles = @lac_doxygen_tagfiles@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
perlmoduledir = @perlmoduledir@
pkgconfdir = @pkgconfdir@
pkgconffile = @pkgconffile@
pkgconffile_in = @pkgconffile_in@
pkgdir = @pkgdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
setupdir = @setupdir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
testdir = @testdir@
scriptsysconfdir = ${sysconfdir}
amdirdir = ${datadir}/globus_amdir
LINK_BAK = orig
AUTOMAKE_OPTIONS = no-dependencies
#
# Automake rules for installing and building doxygen docs
#
doxygen_installdox = @lac_doxygen_installdox@
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/globus_automake_pre $(top_srcdir)/globus_automake_post $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doxygen/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign doxygen/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*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);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
Doxyfile-internal: $(top_builddir)/config.status $(srcdir)/Doxyfile-internal.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
$(mkdir_p) $(distdir)/..
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-hook
check-am: all-am
check: check-am
all-am: Makefile all-local
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libtool clean-local mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-libtool
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am: install-data-local
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: all all-am all-local check check-am clean clean-generic \
clean-libtool clean-local dist-hook distclean \
distclean-generic distclean-libtool distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-data-local install-exec \
install-exec-am install-info install-info-am install-man \
install-strip installcheck installcheck-am installdirs \
maintainer-clean maintainer-clean-generic mostlyclean \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
uninstall uninstall-am uninstall-info-am
doc-stamp: @DOXYFILE@
@if test ! -z "@DOXYGEN@"; then \
@DOXYGEN@ @DOXYFILE@; \
if test -n "$(doxygen_installdox)"; then \
if test -x ./doc/html/installdox; then \
$(PERL) ./doc/html/installdox $(doxygen_installdox) ./doc/html/*;\
fi ; \
fi ; \
if test -d doc/latex; then \
(cd doc/latex ; for f in *.tex ; do sed 's/\\doxyref{p\.}/\\doxyref{}{p\.}/g' $$f > $$f.new ; mv $$f.new $$f ; done ; sed 's/\(latex_count\)=[0-9] /\1=10 /' Makefile > Makefile.new ; mv Makefile.new Makefile ; make) ; \
fi \
fi
touch $@
all-local: doc-stamp
install-data-local: doc-stamp
@if test ! -z "@DOXYGEN@"; then \
for dir in `find ./doc/{html,man} -type d -print|sed "s,./doc/,,"`; do \
if test -z "`echo $${dir}|sed -n '/^man/ p'`"; then \
$(INSTALL) -d -m 755 \
$(DESTDIR)$(docdir)/$${dir}; \
else \
$(INSTALL) -d -m 755 \
$(DESTDIR)$(mandir)/`echo $${dir} | sed -e 's/^man//'`; \
fi \
done; \
for file in `find ./doc/{html,man} -type f -print|sed "s,./doc/,,"`; do \
if test -z "`echo $${file}|sed -n '/^man/ p'`"; then \
$(INSTALL) -m 644 ./doc/$${file} \
$(DESTDIR)$(docdir)/$${file}; \
else \
$(INSTALL) -m 644 ./doc/$${file} \
$(DESTDIR)$(mandir)/`echo $${file} | sed -e 's/^man//'`;\
fi \
done; \
if test -f doc/latex/refman.pdf; then \
$(INSTALL) -m 644 doc/latex/refman.pdf \
$(DESTDIR)$(docdir); \
fi \
fi
clean-local:
@if test ! -z "@DOXYGEN@"; then \
rm -rf ./doc*; \
fi
rm -f doc-stamp
filelist: doc-stamp
@if test ! -z "@DOXYGEN@"; then \
filelistdir="`echo $(FILELIST_FILE) | sed -e 's!/[^/]*$$!!'`"; \
find ./doc/{man,html} -type f -print | \
sed -e 's,./doc/man,$(mandir),' \
-e 's,./doc,$(docdir),' \
-e 's,^$(prefix),,' \
>> $${filelistdir}/noflavor_doc.filelist; \
if test -f doc/latex/refman.pdf; then \
echo $(docdir)/refman.pdf | sed 's,^$(prefix),,' \
>> $${filelistdir}/noflavor_doc.filelist; \
fi \
fi
dist-hook: doc-stamp
@if test ! -z "@DOXYGEN@"; then \
if test -d doc; then \
cp -r doc $(distdir)/doc ; \
fi ; \
if test -d doc-internal; then \
cp -r doc-internal $(distdir)/doc-internal ; \
fi ; \
fi ;
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
globus_ftp_control-4.7/config.sub 0000755 0000764 0000764 00000075777 12227171016 014232 0000000 0000000 #! /bin/sh
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
timestamp='2005-07-08'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
# can handle that machine. It does not imply ALL GNU software can.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Please send patches to . Submit a context
# diff and a properly formatted ChangeLog entry.
#
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
# If it is invalid, we print an error message on stderr and exit with code 1.
# Otherwise, we print the canonical config type on stdout and succeed.
# This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases
# that are meaningful with *any* GNU software.
# Each package is responsible for reporting which valid configurations
# it does not support. The user should be able to distinguish
# a failure to support a valid configuration from a meaningless
# configuration.
# The goal of this file is to map all the various variations of a given
# machine specification into a single specification in the form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
# or in some cases, the newer four-part form:
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# It is wrong to echo any other type of specification.
me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
Usage: $0 [OPTION] CPU-MFR-OPSYS
$0 [OPTION] ALIAS
Canonicalize a configuration name.
Operation modes:
-h, --help print this help, then exit
-t, --time-stamp print date of last modification, then exit
-v, --version print version number, then exit
Report bugs and patches to ."
version="\
GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
help="
Try \`$me --help' for more information."
# Parse command line
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
echo "$timestamp" ; exit ;;
--version | -v )
echo "$version" ; exit ;;
--help | --h* | -h )
echo "$usage"; exit ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
break ;;
-* )
echo "$me: invalid option $1$help"
exit 1 ;;
*local*)
# First pass through any local machine types.
echo $1
exit ;;
* )
break ;;
esac
done
case $# in
0) echo "$me: missing argument$help" >&2
exit 1;;
1) ;;
*) echo "$me: too many arguments$help" >&2
exit 1;;
esac
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
*)
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
if [ $basic_machine != $1 ]
then os=`echo $1 | sed 's/.*-/-/'`
else os=; fi
;;
esac
### Let's recognize common machines as not being operating systems so
### that things like config.sub decstation-3100 work. We also
### recognize some manufacturers as not being operating systems, so we
### can provide default operating systems below.
case $os in
-sun*os*)
# Prevent following clause from handling this invalid input.
;;
-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple | -axis | -knuth | -cray)
os=
basic_machine=$1
;;
-sim | -cisco | -oki | -wec | -winbond)
os=
basic_machine=$1
;;
-scout)
;;
-wrs)
os=-vxworks
basic_machine=$1
;;
-chorusos*)
os=-chorusos
basic_machine=$1
;;
-chorusrdb)
os=-chorusrdb
basic_machine=$1
;;
-hiux*)
os=-hiuxwe2
;;
-sco5)
os=-sco3.2v5
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco4)
os=-sco3.2v4
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco3.2.[4-9]*)
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco3.2v[4-9]*)
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco*)
os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-udk*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-isc)
os=-isc2.2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-clix*)
basic_machine=clipper-intergraph
;;
-isc*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-lynx*)
os=-lynxos
;;
-ptx*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
;;
-windowsnt*)
os=`echo $os | sed -e 's/windowsnt/winnt/'`
;;
-psos*)
os=-psos
;;
-mint | -mint[0-9]*)
basic_machine=m68k-atari
os=-mint
;;
esac
# Decode aliases for certain CPU-COMPANY combinations.
case $basic_machine in
# Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below.
1750a | 580 \
| a29k \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
| bfin \
| c4x | clipper \
| d10v | d30v | dlx | dsp16xx \
| fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \
| ip2k | iq2000 \
| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
| mips | mipsbe | mipseb | mipsel | mipsle \
| mips16 \
| mips64 | mips64el \
| mips64vr | mips64vrel \
| mips64orion | mips64orionel \
| mips64vr4100 | mips64vr4100el \
| mips64vr4300 | mips64vr4300el \
| mips64vr5000 | mips64vr5000el \
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
| mipstx39 | mipstx39el \
| mn10200 | mn10300 \
| ms1 \
| msp430 \
| ns16k | ns32k \
| or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
| pyramid \
| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b \
| strongarm \
| tahoe | thumb | tic4x | tic80 | tron \
| v850 | v850e \
| we32k \
| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
| z8k)
basic_machine=$basic_machine-unknown
;;
m32c)
basic_machine=$basic_machine-unknown
;;
m6811 | m68hc11 | m6812 | m68hc12)
# Motorola 68HC11/12.
basic_machine=$basic_machine-unknown
os=-none
;;
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
i*86 | x86_64)
basic_machine=$basic_machine-pc
;;
# Object if more than one company name word.
*-*-*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
# Recognize the basic CPU types with company name.
580-* \
| a29k-* \
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* \
| bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
| clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| elxsi-* \
| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* | iq2000-* \
| m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | maxq-* | mcore-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips16-* \
| mips64-* | mips64el-* \
| mips64vr-* | mips64vrel-* \
| mips64orion-* | mips64orionel-* \
| mips64vr4100-* | mips64vr4100el-* \
| mips64vr4300-* | mips64vr4300el-* \
| mips64vr5000-* | mips64vr5000el-* \
| mips64vr5900-* | mips64vr5900el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa32r2-* | mipsisa32r2el-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64r2-* | mipsisa64r2el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipstx39-* | mipstx39el-* \
| mmix-* \
| ms1-* \
| msp430-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
| pyramid-* \
| romp-* | rs6000-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
| sparclite-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tron-* \
| v850-* | v850e-* | vax-* \
| we32k-* \
| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
| xstormy16-* | xtensa-* \
| ymp-* \
| z8k-*)
;;
m32c-*)
;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
386bsd)
basic_machine=i386-unknown
os=-bsd
;;
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
basic_machine=m68000-att
;;
3b*)
basic_machine=we32k-att
;;
a29khif)
basic_machine=a29k-amd
os=-udi
;;
abacus)
basic_machine=abacus-unknown
;;
adobe68k)
basic_machine=m68010-adobe
os=-scout
;;
alliant | fx80)
basic_machine=fx80-alliant
;;
altos | altos3068)
basic_machine=m68k-altos
;;
am29k)
basic_machine=a29k-none
os=-bsd
;;
amd64)
basic_machine=x86_64-pc
;;
amd64-*)
basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
amdahl)
basic_machine=580-amdahl
os=-sysv
;;
amiga | amiga-*)
basic_machine=m68k-unknown
;;
amigaos | amigados)
basic_machine=m68k-unknown
os=-amigaos
;;
amigaunix | amix)
basic_machine=m68k-unknown
os=-sysv4
;;
apollo68)
basic_machine=m68k-apollo
os=-sysv
;;
apollo68bsd)
basic_machine=m68k-apollo
os=-bsd
;;
aux)
basic_machine=m68k-apple
os=-aux
;;
balance)
basic_machine=ns32k-sequent
os=-dynix
;;
c90)
basic_machine=c90-cray
os=-unicos
;;
convex-c1)
basic_machine=c1-convex
os=-bsd
;;
convex-c2)
basic_machine=c2-convex
os=-bsd
;;
convex-c32)
basic_machine=c32-convex
os=-bsd
;;
convex-c34)
basic_machine=c34-convex
os=-bsd
;;
convex-c38)
basic_machine=c38-convex
os=-bsd
;;
cray | j90)
basic_machine=j90-cray
os=-unicos
;;
craynv)
basic_machine=craynv-cray
os=-unicosmp
;;
cr16c)
basic_machine=cr16c-unknown
os=-elf
;;
crds | unos)
basic_machine=m68k-crds
;;
crisv32 | crisv32-* | etraxfs*)
basic_machine=crisv32-axis
;;
cris | cris-* | etrax*)
basic_machine=cris-axis
;;
crx)
basic_machine=crx-unknown
os=-elf
;;
da30 | da30-*)
basic_machine=m68k-da30
;;
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
basic_machine=mips-dec
;;
decsystem10* | dec10*)
basic_machine=pdp10-dec
os=-tops10
;;
decsystem20* | dec20*)
basic_machine=pdp10-dec
os=-tops20
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
basic_machine=m68k-motorola
;;
delta88)
basic_machine=m88k-motorola
os=-sysv3
;;
djgpp)
basic_machine=i586-pc
os=-msdosdjgpp
;;
dpx20 | dpx20-*)
basic_machine=rs6000-bull
os=-bosx
;;
dpx2* | dpx2*-bull)
basic_machine=m68k-bull
os=-sysv3
;;
ebmon29k)
basic_machine=a29k-amd
os=-ebmon
;;
elxsi)
basic_machine=elxsi-elxsi
os=-bsd
;;
encore | umax | mmax)
basic_machine=ns32k-encore
;;
es1800 | OSE68k | ose68k | ose | OSE)
basic_machine=m68k-ericsson
os=-ose
;;
fx2800)
basic_machine=i860-alliant
;;
genix)
basic_machine=ns32k-ns
;;
gmicro)
basic_machine=tron-gmicro
os=-sysv
;;
go32)
basic_machine=i386-pc
os=-go32
;;
h3050r* | hiux*)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
h8300hms)
basic_machine=h8300-hitachi
os=-hms
;;
h8300xray)
basic_machine=h8300-hitachi
os=-xray
;;
h8500hms)
basic_machine=h8500-hitachi
os=-hms
;;
harris)
basic_machine=m88k-harris
os=-sysv3
;;
hp300-*)
basic_machine=m68k-hp
;;
hp300bsd)
basic_machine=m68k-hp
os=-bsd
;;
hp300hpux)
basic_machine=m68k-hp
os=-hpux
;;
hp3k9[0-9][0-9] | hp9[0-9][0-9])
basic_machine=hppa1.0-hp
;;
hp9k2[0-9][0-9] | hp9k31[0-9])
basic_machine=m68000-hp
;;
hp9k3[2-9][0-9])
basic_machine=m68k-hp
;;
hp9k6[0-9][0-9] | hp6[0-9][0-9])
basic_machine=hppa1.0-hp
;;
hp9k7[0-79][0-9] | hp7[0-79][0-9])
basic_machine=hppa1.1-hp
;;
hp9k78[0-9] | hp78[0-9])
# FIXME: really hppa2.0-hp
basic_machine=hppa1.1-hp
;;
hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
# FIXME: really hppa2.0-hp
basic_machine=hppa1.1-hp
;;
hp9k8[0-9][13679] | hp8[0-9][13679])
basic_machine=hppa1.1-hp
;;
hp9k8[0-9][0-9] | hp8[0-9][0-9])
basic_machine=hppa1.0-hp
;;
hppa-next)
os=-nextstep3
;;
hppaosf)
basic_machine=hppa1.1-hp
os=-osf
;;
hppro)
basic_machine=hppa1.1-hp
os=-proelf
;;
i370-ibm* | ibm*)
basic_machine=i370-ibm
;;
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
i*86v32)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv32
;;
i*86v4*)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv4
;;
i*86v)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv
;;
i*86sol2)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-solaris2
;;
i386mach)
basic_machine=i386-mach
os=-mach
;;
i386-vsta | vsta)
basic_machine=i386-unknown
os=-vsta
;;
iris | iris4d)
basic_machine=mips-sgi
case $os in
-irix*)
;;
*)
os=-irix4
;;
esac
;;
isi68 | isi)
basic_machine=m68k-isi
os=-sysv
;;
m88k-omron*)
basic_machine=m88k-omron
;;
magnum | m3230)
basic_machine=mips-mips
os=-sysv
;;
merlin)
basic_machine=ns32k-utek
os=-sysv
;;
mingw32)
basic_machine=i386-pc
os=-mingw32
;;
miniframe)
basic_machine=m68000-convergent
;;
*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
basic_machine=m68k-atari
os=-mint
;;
mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;;
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
monitor)
basic_machine=m68k-rom68k
os=-coff
;;
morphos)
basic_machine=powerpc-unknown
os=-morphos
;;
msdos)
basic_machine=i386-pc
os=-msdos
;;
mvs)
basic_machine=i370-ibm
os=-mvs
;;
ncr3000)
basic_machine=i486-ncr
os=-sysv4
;;
netbsd386)
basic_machine=i386-unknown
os=-netbsd
;;
netwinder)
basic_machine=armv4l-rebel
os=-linux
;;
news | news700 | news800 | news900)
basic_machine=m68k-sony
os=-newsos
;;
news1000)
basic_machine=m68030-sony
os=-newsos
;;
news-3600 | risc-news)
basic_machine=mips-sony
os=-newsos
;;
necv70)
basic_machine=v70-nec
os=-sysv
;;
next | m*-next )
basic_machine=m68k-next
case $os in
-nextstep* )
;;
-ns2*)
os=-nextstep2
;;
*)
os=-nextstep3
;;
esac
;;
nh3000)
basic_machine=m68k-harris
os=-cxux
;;
nh[45]000)
basic_machine=m88k-harris
os=-cxux
;;
nindy960)
basic_machine=i960-intel
os=-nindy
;;
mon960)
basic_machine=i960-intel
os=-mon960
;;
nonstopux)
basic_machine=mips-compaq
os=-nonstopux
;;
np1)
basic_machine=np1-gould
;;
nsr-tandem)
basic_machine=nsr-tandem
;;
op50n-* | op60c-*)
basic_machine=hppa1.1-oki
os=-proelf
;;
openrisc | openrisc-*)
basic_machine=or32-unknown
;;
os400)
basic_machine=powerpc-ibm
os=-os400
;;
OSE68000 | ose68000)
basic_machine=m68000-ericsson
os=-ose
;;
os68k)
basic_machine=m68k-none
os=-os68k
;;
pa-hitachi)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
paragon)
basic_machine=i860-intel
os=-osf
;;
pbd)
basic_machine=sparc-tti
;;
pbb)
basic_machine=m68k-tti
;;
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pentium | p5 | k5 | k6 | nexgen | viac3)
basic_machine=i586-pc
;;
pentiumpro | p6 | 6x86 | athlon | athlon_*)
basic_machine=i686-pc
;;
pentiumii | pentium2 | pentiumiii | pentium3)
basic_machine=i686-pc
;;
pentium4)
basic_machine=i786-pc
;;
pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumpro-* | p6-* | 6x86-* | athlon-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentium4-*)
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pn)
basic_machine=pn-gould
;;
power) basic_machine=power-ibm
;;
ppc) basic_machine=powerpc-unknown
;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
;;
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64) basic_machine=powerpc64-unknown
;;
ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
basic_machine=powerpc64le-unknown
;;
ppc64le-* | powerpc64little-*)
basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ps2)
basic_machine=i386-ibm
;;
pw32)
basic_machine=i586-unknown
os=-pw32
;;
rom68k)
basic_machine=m68k-rom68k
os=-coff
;;
rm[46]00)
basic_machine=mips-siemens
;;
rtpc | rtpc-*)
basic_machine=romp-ibm
;;
s390 | s390-*)
basic_machine=s390-ibm
;;
s390x | s390x-*)
basic_machine=s390x-ibm
;;
sa29200)
basic_machine=a29k-amd
os=-udi
;;
sb1)
basic_machine=mipsisa64sb1-unknown
;;
sb1el)
basic_machine=mipsisa64sb1el-unknown
;;
sei)
basic_machine=mips-sei
os=-seiux
;;
sequent)
basic_machine=i386-sequent
;;
sh)
basic_machine=sh-hitachi
os=-hms
;;
sh64)
basic_machine=sh64-unknown
;;
sparclite-wrs | simso-wrs)
basic_machine=sparclite-wrs
os=-vxworks
;;
sps7)
basic_machine=m68k-bull
os=-sysv2
;;
spur)
basic_machine=spur-unknown
;;
st2000)
basic_machine=m68k-tandem
;;
stratus)
basic_machine=i860-stratus
os=-sysv4
;;
sun2)
basic_machine=m68000-sun
;;
sun2os3)
basic_machine=m68000-sun
os=-sunos3
;;
sun2os4)
basic_machine=m68000-sun
os=-sunos4
;;
sun3os3)
basic_machine=m68k-sun
os=-sunos3
;;
sun3os4)
basic_machine=m68k-sun
os=-sunos4
;;
sun4os3)
basic_machine=sparc-sun
os=-sunos3
;;
sun4os4)
basic_machine=sparc-sun
os=-sunos4
;;
sun4sol2)
basic_machine=sparc-sun
os=-solaris2
;;
sun3 | sun3-*)
basic_machine=m68k-sun
;;
sun4)
basic_machine=sparc-sun
;;
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
;;
sv1)
basic_machine=sv1-cray
os=-unicos
;;
symmetry)
basic_machine=i386-sequent
os=-dynix
;;
t3e)
basic_machine=alphaev5-cray
os=-unicos
;;
t90)
basic_machine=t90-cray
os=-unicos
;;
tic54x | c54x*)
basic_machine=tic54x-unknown
os=-coff
;;
tic55x | c55x*)
basic_machine=tic55x-unknown
os=-coff
;;
tic6x | c6x*)
basic_machine=tic6x-unknown
os=-coff
;;
tx39)
basic_machine=mipstx39-unknown
;;
tx39el)
basic_machine=mipstx39el-unknown
;;
toad1)
basic_machine=pdp10-xkl
os=-tops20
;;
tower | tower-32)
basic_machine=m68k-ncr
;;
tpf)
basic_machine=s390x-ibm
os=-tpf
;;
udi29k)
basic_machine=a29k-amd
os=-udi
;;
ultra3)
basic_machine=a29k-nyu
os=-sym1
;;
v810 | necv810)
basic_machine=v810-nec
os=-none
;;
vaxv)
basic_machine=vax-dec
os=-sysv
;;
vms)
basic_machine=vax-dec
os=-vms
;;
vpp*|vx|vx-*)
basic_machine=f301-fujitsu
;;
vxworks960)
basic_machine=i960-wrs
os=-vxworks
;;
vxworks68)
basic_machine=m68k-wrs
os=-vxworks
;;
vxworks29k)
basic_machine=a29k-wrs
os=-vxworks
;;
w65*)
basic_machine=w65-wdc
os=-none
;;
w89k-*)
basic_machine=hppa1.1-winbond
os=-proelf
;;
xbox)
basic_machine=i686-pc
os=-mingw32
;;
xps | xps100)
basic_machine=xps100-honeywell
;;
ymp)
basic_machine=ymp-cray
os=-unicos
;;
z8k-*-coff)
basic_machine=z8k-unknown
os=-sim
;;
none)
basic_machine=none-none
os=-none
;;
# Here we handle the default manufacturer of certain CPU types. It is in
# some cases the only manufacturer, in others, it is the most popular.
w89k)
basic_machine=hppa1.1-winbond
;;
op50n)
basic_machine=hppa1.1-oki
;;
op60c)
basic_machine=hppa1.1-oki
;;
romp)
basic_machine=romp-ibm
;;
mmix)
basic_machine=mmix-knuth
;;
rs6000)
basic_machine=rs6000-ibm
;;
vax)
basic_machine=vax-dec
;;
pdp10)
# there are many clones, so DEC is not a safe bet
basic_machine=pdp10-unknown
;;
pdp11)
basic_machine=pdp11-dec
;;
we32k)
basic_machine=we32k-att
;;
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
basic_machine=sh-unknown
;;
sparc | sparcv8 | sparcv9 | sparcv9b)
basic_machine=sparc-sun
;;
cydra)
basic_machine=cydra-cydrome
;;
orion)
basic_machine=orion-highlevel
;;
orion105)
basic_machine=clipper-highlevel
;;
mac | mpw | mac-mpw)
basic_machine=m68k-apple
;;
pmac | pmac-mpw)
basic_machine=powerpc-apple
;;
*-unknown)
# Make sure to match an already-canonicalized machine name.
;;
*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
esac
# Here we canonicalize certain aliases for manufacturers.
case $basic_machine in
*-digital*)
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
;;
*-commodore*)
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
;;
*)
;;
esac
# Decode manufacturer-specific aliases for certain operating systems.
if [ x"$os" != x"" ]
then
case $os in
# First match some system type aliases
# that might get confused with valid system types.
# -solaris* is a basic system type, with this one exception.
-solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'`
;;
-solaris)
os=-solaris2
;;
-svr4*)
os=-sysv4
;;
-unixware*)
os=-sysv4.2uw
;;
-gnu/linux*)
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
;;
# First accept the basic system types.
# The portable systems comes first.
# Each alternative MUST END IN A *, to match a version number.
# -sysv* is not here because it comes later, after sysvr4.
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
| -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
| -skyos* | -haiku*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
case $basic_machine in
x86-* | i*86-*)
;;
*)
os=-nto$os
;;
esac
;;
-nto-qnx*)
;;
-nto*)
os=`echo $os | sed -e 's|nto|nto-qnx|'`
;;
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
;;
-mac*)
os=`echo $os | sed -e 's|mac|macos|'`
;;
-linux-dietlibc)
os=-linux-dietlibc
;;
-linux*)
os=`echo $os | sed -e 's|linux|linux-gnu|'`
;;
-sunos5*)
os=`echo $os | sed -e 's|sunos5|solaris2|'`
;;
-sunos6*)
os=`echo $os | sed -e 's|sunos6|solaris3|'`
;;
-opened*)
os=-openedition
;;
-os400*)
os=-os400
;;
-wince*)
os=-wince
;;
-osfrose*)
os=-osfrose
;;
-osf*)
os=-osf
;;
-utek*)
os=-bsd
;;
-dynix*)
os=-bsd
;;
-acis*)
os=-aos
;;
-atheos*)
os=-atheos
;;
-syllable*)
os=-syllable
;;
-386bsd)
os=-bsd
;;
-ctix* | -uts*)
os=-sysv
;;
-nova*)
os=-rtmk-nova
;;
-ns2 )
os=-nextstep2
;;
-nsk*)
os=-nsk
;;
# Preserve the version number of sinix5.
-sinix5.*)
os=`echo $os | sed -e 's|sinix|sysv|'`
;;
-sinix*)
os=-sysv4
;;
-tpf*)
os=-tpf
;;
-triton*)
os=-sysv3
;;
-oss*)
os=-sysv3
;;
-svr4)
os=-sysv4
;;
-svr3)
os=-sysv3
;;
-sysvr4)
os=-sysv4
;;
# This must come after -sysvr4.
-sysv*)
;;
-ose*)
os=-ose
;;
-es1800*)
os=-ose
;;
-xenix)
os=-xenix
;;
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
os=-mint
;;
-aros*)
os=-aros
;;
-kaos*)
os=-kaos
;;
-zvmoe)
os=-zvmoe
;;
-none)
;;
*)
# Get rid of the `-' at the beginning of $os.
os=`echo $os | sed 's/[^-]*-//'`
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
exit 1
;;
esac
else
# Here we handle the default operating systems that come with various machines.
# The value should be what the vendor currently ships out the door with their
# machine or put another way, the most popular os provided with the machine.
# Note that if you're going to try to match "-MANUFACTURER" here (say,
# "-sun"), then you have to tell the case statement up towards the top
# that MANUFACTURER isn't an operating system. Otherwise, code above
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
case $basic_machine in
*-acorn)
os=-riscix1.2
;;
arm*-rebel)
os=-linux
;;
arm*-semi)
os=-aout
;;
c4x-* | tic4x-*)
os=-coff
;;
# This must come before the *-dec entry.
pdp10-*)
os=-tops20
;;
pdp11-*)
os=-none
;;
*-dec | vax-*)
os=-ultrix4.2
;;
m68*-apollo)
os=-domain
;;
i386-sun)
os=-sunos4.0.2
;;
m68000-sun)
os=-sunos3
# This also exists in the configure program, but was not the
# default.
# os=-sunos4
;;
m68*-cisco)
os=-aout
;;
mips*-cisco)
os=-elf
;;
mips*-*)
os=-elf
;;
or32-*)
os=-coff
;;
*-tti) # must be before sparc entry or we get the wrong os.
os=-sysv3
;;
sparc-* | *-sun)
os=-sunos4.1.1
;;
*-be)
os=-beos
;;
*-haiku)
os=-haiku
;;
*-ibm)
os=-aix
;;
*-knuth)
os=-mmixware
;;
*-wec)
os=-proelf
;;
*-winbond)
os=-proelf
;;
*-oki)
os=-proelf
;;
*-hp)
os=-hpux
;;
*-hitachi)
os=-hiux
;;
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
os=-sysv
;;
*-cbm)
os=-amigaos
;;
*-dg)
os=-dgux
;;
*-dolphin)
os=-sysv3
;;
m68k-ccur)
os=-rtu
;;
m88k-omron*)
os=-luna
;;
*-next )
os=-nextstep
;;
*-sequent)
os=-ptx
;;
*-crds)
os=-unos
;;
*-ns)
os=-genix
;;
i370-*)
os=-mvs
;;
*-next)
os=-nextstep3
;;
*-gould)
os=-sysv
;;
*-highlevel)
os=-bsd
;;
*-encore)
os=-bsd
;;
*-sgi)
os=-irix
;;
*-siemens)
os=-sysv4
;;
*-masscomp)
os=-rtu
;;
f30[01]-fujitsu | f700-fujitsu)
os=-uxpv
;;
*-rom68k)
os=-coff
;;
*-*bug)
os=-coff
;;
*-apple)
os=-macos
;;
*-atari*)
os=-mint
;;
*)
os=-none
;;
esac
fi
# Here we handle the case where we know the os, and the CPU type, but not the
# manufacturer. We pick the logical manufacturer.
vendor=unknown
case $basic_machine in
*-unknown)
case $os in
-riscix*)
vendor=acorn
;;
-sunos*)
vendor=sun
;;
-aix*)
vendor=ibm
;;
-beos*)
vendor=be
;;
-hpux*)
vendor=hp
;;
-mpeix*)
vendor=hp
;;
-hiux*)
vendor=hitachi
;;
-unos*)
vendor=crds
;;
-dgux*)
vendor=dg
;;
-luna*)
vendor=omron
;;
-genix*)
vendor=ns
;;
-mvs* | -opened*)
vendor=ibm
;;
-os400*)
vendor=ibm
;;
-ptx*)
vendor=sequent
;;
-tpf*)
vendor=ibm
;;
-vxsim* | -vxworks* | -windiss*)
vendor=wrs
;;
-aux*)
vendor=apple
;;
-hms*)
vendor=hitachi
;;
-mpw* | -macos*)
vendor=apple
;;
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
vendor=atari
;;
-vos*)
vendor=stratus
;;
esac
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
;;
esac
echo $basic_machine$os
exit
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "timestamp='"
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "'"
# End:
globus_ftp_control-4.7/Makefile.am 0000666 0000764 0000764 00000004315 11614562626 014275 0000000 0000000 include $(top_srcdir)/globus_automake_pre
include $(top_srcdir)/globus_automake_pre_top
# SUBDIRS is an automake macro which contains
# the list of subdirectories that have Makefile.am's
SUBDIRS= \
pkgdata \
doxygen
# Sources contains all of the source files in the directory.
# Header files are included because automake will generate dependency targets
# for them and include them in a source distribution.
#
# If this directory builds multiple programs or libraries than these sources
# will need to be seperated into seperate macros.
Sources= \
globus_ftp_control.c \
globus_ftp_control_client.c \
globus_ftp_control_data.c \
globus_ftp_control_layout.c \
globus_ftp_control_server.c \
globus_ftp_control.h \
globus_i_ftp_control.h
# INCLUDES is an automake macro which contains
# the include directives (-I..) for the compiler.
#
# GPT_INCLUDES contains the include directives generated by GPT
# from the dependent packages.
INCLUDES = $(GPT_INCLUDES)
# include_HEADERS is an automake macro which contains
# a list of header files that are to be installed in $prefix/include
include_HEADERS= \
globus_ftp_control.h
# lib_LTLIBRARIES is an automake macro which contains
# a list of libtool libraries that are to be installed in $prefix/lib
lib_LTLIBRARIES = libglobus_ftp_control.la
# _SOURCES is an automake macro which contains
# a list of sources needed to compile the library.
libglobus_ftp_control_la_SOURCES = $(Sources)
# _LDFLAGS is an automake macro which contains
# directives to the linker add before the list of objects and libraries.
#
# GPT_LDFLAGS is a macro that contains the linker directives GPT generated
# from the dependent packages
libglobus_ftp_control_la_LDFLAGS = $(GPT_LDFLAGS)
# _LIBADD is an automake macro which contains
# directives to the linker added after the list of objects.
# LIBADD is specific for linking libraries
#
# GPT_LIB_LINKS is a macro that contains the linker directives GPT generated
# from the dependent packages
libglobus_ftp_control_la_LIBADD = $(GPT_LIB_LINKS)
doc_DATA = GLOBUS_LICENSE
EXTRA_DIST = \
globus_gridftp_protocol_extensions.doc \
version.h.in \
$(doc_DATA)
include $(top_srcdir)/globus_automake_post
include $(top_srcdir)/globus_automake_post_top
globus_ftp_control-4.7/globus_automake_post_top 0000644 0000764 0000764 00000000635 12225575522 017267 0000000 0000000 EXTRA_DIST += bootstrap \
globus_automake_pre \
globus_automake_post \
globus_automake_pre_top \
globus_automake_post_top \
dirt.sh \
gptdata.sh
dist-hook:
$(GPT_LOCATION)/sbin/gpt_create_automake_rules --excludes=doxygen -srcdir=$(top_distdir)
DISTCLEANFILES = globus-script-initializer globus-perl-initializer \
globus-script-libdir-choice globus-perl-libdir-choice
globus_ftp_control-4.7/ltmain.sh 0000644 0000764 0000764 00000603426 11312032604 014044 0000000 0000000 # ltmain.sh - Provide generalized library-building support services.
# NOTE: Changing this file will not affect anything until you rerun configure.
#
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
# Free Software Foundation, Inc.
# Originally by Gordon Matzigkeit , 1996
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
basename="s,^.*/,,g"
# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
# is ksh but when the shell is invoked as "sh" and the current value of
# the _XPG environment variable is not equal to 1 (one), the special
# positional parameter $0, within a function call, is the name of the
# function.
progpath="$0"
# The name of this program:
progname=`echo "$progpath" | $SED $basename`
modename="$progname"
# Global variables:
EXIT_SUCCESS=0
EXIT_FAILURE=1
PROGRAM=ltmain.sh
PACKAGE=libtool
VERSION=1.5.22
TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
# Check that we have a working $echo.
if test "X$1" = X--no-reexec; then
# Discard the --no-reexec flag, and continue.
shift
elif test "X$1" = X--fallback-echo; then
# Avoid inline document here, it may be left over
:
elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
# Yippee, $echo works!
:
else
# Restart under the correct shell, and then maybe $echo will work.
exec $SHELL "$progpath" --no-reexec ${1+"$@"}
fi
if test "X$1" = X--fallback-echo; then
# used as fallback echo
shift
cat <&2
$echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
exit $EXIT_FAILURE
fi
# Global variables.
mode=$default_mode
nonopt=
prev=
prevopt=
run=
show="$echo"
show_help=
execute_dlfiles=
duplicate_deps=no
preserve_args=
lo2o="s/\\.lo\$/.${objext}/"
o2lo="s/\\.${objext}\$/.lo/"
extracted_archives=
extracted_serial=0
#####################################
# Shell function definitions:
# This seems to be the best place for them
# func_mktempdir [string]
# Make a temporary directory that won't clash with other running
# libtool processes, and avoids race conditions if possible. If
# given, STRING is the basename for that directory.
func_mktempdir ()
{
my_template="${TMPDIR-/tmp}/${1-$progname}"
if test "$run" = ":"; then
# Return a directory name, but don't create it in dry-run mode
my_tmpdir="${my_template}-$$"
else
# If mktemp works, use that first and foremost
my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
if test ! -d "$my_tmpdir"; then
# Failing that, at least try and use $RANDOM to avoid a race
my_tmpdir="${my_template}-${RANDOM-0}$$"
save_mktempdir_umask=`umask`
umask 0077
$mkdir "$my_tmpdir"
umask $save_mktempdir_umask
fi
# If we're not in dry-run mode, bomb out on failure
test -d "$my_tmpdir" || {
$echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
exit $EXIT_FAILURE
}
fi
$echo "X$my_tmpdir" | $Xsed
}
# func_win32_libid arg
# return the library type of file 'arg'
#
# Need a lot of goo to handle *both* DLLs and import libs
# Has to be a shell function in order to 'eat' the argument
# that is supplied when $file_magic_command is called.
func_win32_libid ()
{
win32_libid_type="unknown"
win32_fileres=`file -L $1 2>/dev/null`
case $win32_fileres in
*ar\ archive\ import\ library*) # definitely import
win32_libid_type="x86 archive import"
;;
*ar\ archive*) # could be an import, or static
if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
$EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
win32_nmres=`eval $NM -f posix -A $1 | \
$SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'`
case $win32_nmres in
import*) win32_libid_type="x86 archive import";;
*) win32_libid_type="x86 archive static";;
esac
fi
;;
*DLL*)
win32_libid_type="x86 DLL"
;;
*executable*) # but shell scripts are "executable" too...
case $win32_fileres in
*MS\ Windows\ PE\ Intel*)
win32_libid_type="x86 DLL"
;;
esac
;;
esac
$echo $win32_libid_type
}
# func_infer_tag arg
# Infer tagged configuration to use if any are available and
# if one wasn't chosen via the "--tag" command line option.
# Only attempt this if the compiler in the base compile
# command doesn't match the default compiler.
# arg is usually of the form 'gcc ...'
func_infer_tag ()
{
if test -n "$available_tags" && test -z "$tagname"; then
CC_quoted=
for arg in $CC; do
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
CC_quoted="$CC_quoted $arg"
done
case $@ in
# Blanks in the command may have been stripped by the calling shell,
# but not from the CC environment variable when configure was run.
" $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
# Blanks at the start of $base_compile will cause this to fail
# if we don't check for them as well.
*)
for z in $available_tags; do
if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
# Evaluate the configuration.
eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
CC_quoted=
for arg in $CC; do
# Double-quote args containing other shell metacharacters.
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
CC_quoted="$CC_quoted $arg"
done
case "$@ " in
" $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
# The compiler in the base compile command matches
# the one in the tagged configuration.
# Assume this is the tagged configuration we want.
tagname=$z
break
;;
esac
fi
done
# If $tagname still isn't set, then no tagged configuration
# was found and let the user know that the "--tag" command
# line option must be used.
if test -z "$tagname"; then
$echo "$modename: unable to infer tagged configuration"
$echo "$modename: specify a tag with \`--tag'" 1>&2
exit $EXIT_FAILURE
# else
# $echo "$modename: using $tagname tagged configuration"
fi
;;
esac
fi
}
# func_extract_an_archive dir oldlib
func_extract_an_archive ()
{
f_ex_an_ar_dir="$1"; shift
f_ex_an_ar_oldlib="$1"
$show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
$run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
:
else
$echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
exit $EXIT_FAILURE
fi
}
# func_extract_archives gentop oldlib ...
func_extract_archives ()
{
my_gentop="$1"; shift
my_oldlibs=${1+"$@"}
my_oldobjs=""
my_xlib=""
my_xabs=""
my_xdir=""
my_status=""
$show "${rm}r $my_gentop"
$run ${rm}r "$my_gentop"
$show "$mkdir $my_gentop"
$run $mkdir "$my_gentop"
my_status=$?
if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
exit $my_status
fi
for my_xlib in $my_oldlibs; do
# Extract the objects.
case $my_xlib in
[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
*) my_xabs=`pwd`"/$my_xlib" ;;
esac
my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
my_xlib_u=$my_xlib
while :; do
case " $extracted_archives " in
*" $my_xlib_u "*)
extracted_serial=`expr $extracted_serial + 1`
my_xlib_u=lt$extracted_serial-$my_xlib ;;
*) break ;;
esac
done
extracted_archives="$extracted_archives $my_xlib_u"
my_xdir="$my_gentop/$my_xlib_u"
$show "${rm}r $my_xdir"
$run ${rm}r "$my_xdir"
$show "$mkdir $my_xdir"
$run $mkdir "$my_xdir"
exit_status=$?
if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
exit $exit_status
fi
case $host in
*-darwin*)
$show "Extracting $my_xabs"
# Do not bother doing anything if just a dry run
if test -z "$run"; then
darwin_orig_dir=`pwd`
cd $my_xdir || exit $?
darwin_archive=$my_xabs
darwin_curdir=`pwd`
darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
if test -n "$darwin_arches"; then
darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
darwin_arch=
$show "$darwin_base_archive has multiple architectures $darwin_arches"
for darwin_arch in $darwin_arches ; do
mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
func_extract_an_archive "`pwd`" "${darwin_base_archive}"
cd "$darwin_curdir"
$rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
done # $darwin_arches
## Okay now we have a bunch of thin objects, gotta fatten them up :)
darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
darwin_file=
darwin_files=
for darwin_file in $darwin_filelist; do
darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
lipo -create -output "$darwin_file" $darwin_files
done # $darwin_filelist
${rm}r unfat-$$
cd "$darwin_orig_dir"
else
cd "$darwin_orig_dir"
func_extract_an_archive "$my_xdir" "$my_xabs"
fi # $darwin_arches
fi # $run
;;
*)
func_extract_an_archive "$my_xdir" "$my_xabs"
;;
esac
my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
done
func_extract_archives_result="$my_oldobjs"
}
# End of Shell function definitions
#####################################
# Darwin sucks
eval std_shrext=\"$shrext_cmds\"
disable_libs=no
# Parse our command line options once, thoroughly.
while test "$#" -gt 0
do
arg="$1"
shift
case $arg in
-*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
# If the previous option needs an argument, assign it.
if test -n "$prev"; then
case $prev in
execute_dlfiles)
execute_dlfiles="$execute_dlfiles $arg"
;;
tag)
tagname="$arg"
preserve_args="${preserve_args}=$arg"
# Check whether tagname contains only valid characters
case $tagname in
*[!-_A-Za-z0-9,/]*)
$echo "$progname: invalid tag name: $tagname" 1>&2
exit $EXIT_FAILURE
;;
esac
case $tagname in
CC)
# Don't test for the "default" C tag, as we know, it's there, but
# not specially marked.
;;
*)
if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
taglist="$taglist $tagname"
# Evaluate the configuration.
eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
else
$echo "$progname: ignoring unknown tag $tagname" 1>&2
fi
;;
esac
;;
*)
eval "$prev=\$arg"
;;
esac
prev=
prevopt=
continue
fi
# Have we seen a non-optional argument yet?
case $arg in
--help)
show_help=yes
;;
--version)
$echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
$echo
$echo "Copyright (C) 2005 Free Software Foundation, Inc."
$echo "This is free software; see the source for copying conditions. There is NO"
$echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
exit $?
;;
--config)
${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
# Now print the configurations for the tags.
for tagname in $taglist; do
${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
done
exit $?
;;
--debug)
$echo "$progname: enabling shell trace mode"
set -x
preserve_args="$preserve_args $arg"
;;
--dry-run | -n)
run=:
;;
--features)
$echo "host: $host"
if test "$build_libtool_libs" = yes; then
$echo "enable shared libraries"
else
$echo "disable shared libraries"
fi
if test "$build_old_libs" = yes; then
$echo "enable static libraries"
else
$echo "disable static libraries"
fi
exit $?
;;
--finish) mode="finish" ;;
--mode) prevopt="--mode" prev=mode ;;
--mode=*) mode="$optarg" ;;
--preserve-dup-deps) duplicate_deps="yes" ;;
--quiet | --silent)
show=:
preserve_args="$preserve_args $arg"
;;
--tag)
prevopt="--tag"
prev=tag
preserve_args="$preserve_args --tag"
;;
--tag=*)
set tag "$optarg" ${1+"$@"}
shift
prev=tag
preserve_args="$preserve_args --tag"
;;
-dlopen)
prevopt="-dlopen"
prev=execute_dlfiles
;;
-*)
$echo "$modename: unrecognized option \`$arg'" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
;;
*)
nonopt="$arg"
break
;;
esac
done
if test -n "$prevopt"; then
$echo "$modename: option \`$prevopt' requires an argument" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
case $disable_libs in
no)
;;
shared)
build_libtool_libs=no
build_old_libs=yes
;;
static)
build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
;;
esac
# If this variable is set in any of the actions, the command in it
# will be execed at the end. This prevents here-documents from being
# left over by shells.
exec_cmd=
if test -z "$show_help"; then
# Infer the operation mode.
if test -z "$mode"; then
$echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
$echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
case $nonopt in
*cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
mode=link
for arg
do
case $arg in
-c)
mode=compile
break
;;
esac
done
;;
*db | *dbx | *strace | *truss)
mode=execute
;;
*install*|cp|mv)
mode=install
;;
*rm)
mode=uninstall
;;
*)
# If we have no mode, but dlfiles were specified, then do execute mode.
test -n "$execute_dlfiles" && mode=execute
# Just use the default operation mode.
if test -z "$mode"; then
if test -n "$nonopt"; then
$echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
else
$echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
fi
fi
;;
esac
fi
# Only execute mode is allowed to have -dlopen flags.
if test -n "$execute_dlfiles" && test "$mode" != execute; then
$echo "$modename: unrecognized option \`-dlopen'" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
# Change the help message to a mode-specific one.
generic_help="$help"
help="Try \`$modename --help --mode=$mode' for more information."
# These modes are in order of execution frequency so that they run quickly.
case $mode in
# libtool compile mode
compile)
modename="$modename: compile"
# Get the compilation command and the source file.
base_compile=
srcfile="$nonopt" # always keep a non-empty value in "srcfile"
suppress_opt=yes
suppress_output=
arg_mode=normal
libobj=
later=
for arg
do
case $arg_mode in
arg )
# do not "continue". Instead, add this to base_compile
lastarg="$arg"
arg_mode=normal
;;
target )
libobj="$arg"
arg_mode=normal
continue
;;
normal )
# Accept any command-line options.
case $arg in
-o)
if test -n "$libobj" ; then
$echo "$modename: you cannot specify \`-o' more than once" 1>&2
exit $EXIT_FAILURE
fi
arg_mode=target
continue
;;
-static | -prefer-pic | -prefer-non-pic)
later="$later $arg"
continue
;;
-no-suppress)
suppress_opt=no
continue
;;
-Xcompiler)
arg_mode=arg # the next one goes into the "base_compile" arg list
continue # The current "srcfile" will either be retained or
;; # replaced later. I would guess that would be a bug.
-Wc,*)
args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
lastarg=
save_ifs="$IFS"; IFS=','
for arg in $args; do
IFS="$save_ifs"
# Double-quote args containing other shell metacharacters.
# Many Bourne shells cannot handle close brackets correctly
# in scan sets, so we specify it separately.
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
lastarg="$lastarg $arg"
done
IFS="$save_ifs"
lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
# Add the arguments to base_compile.
base_compile="$base_compile $lastarg"
continue
;;
* )
# Accept the current argument as the source file.
# The previous "srcfile" becomes the current argument.
#
lastarg="$srcfile"
srcfile="$arg"
;;
esac # case $arg
;;
esac # case $arg_mode
# Aesthetically quote the previous argument.
lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
case $lastarg in
# Double-quote args containing other shell metacharacters.
# Many Bourne shells cannot handle close brackets correctly
# in scan sets, and some SunOS ksh mistreat backslash-escaping
# in scan sets (worked around with variable expansion),
# and furthermore cannot handle '|' '&' '(' ')' in scan sets
# at all, so we specify them separately.
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
lastarg="\"$lastarg\""
;;
esac
base_compile="$base_compile $lastarg"
done # for arg
case $arg_mode in
arg)
$echo "$modename: you must specify an argument for -Xcompile"
exit $EXIT_FAILURE
;;
target)
$echo "$modename: you must specify a target with \`-o'" 1>&2
exit $EXIT_FAILURE
;;
*)
# Get the name of the library object.
[ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
;;
esac
# Recognize several different file suffixes.
# If the user specifies -o file.o, it is replaced with file.lo
xform='[cCFSifmso]'
case $libobj in
*.ada) xform=ada ;;
*.adb) xform=adb ;;
*.ads) xform=ads ;;
*.asm) xform=asm ;;
*.c++) xform=c++ ;;
*.cc) xform=cc ;;
*.ii) xform=ii ;;
*.class) xform=class ;;
*.cpp) xform=cpp ;;
*.cxx) xform=cxx ;;
*.f90) xform=f90 ;;
*.for) xform=for ;;
*.java) xform=java ;;
*.obj) xform=obj ;;
esac
libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
case $libobj in
*.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
*)
$echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
exit $EXIT_FAILURE
;;
esac
func_infer_tag $base_compile
for arg in $later; do
case $arg in
-static)
build_old_libs=yes
continue
;;
-prefer-pic)
pic_mode=yes
continue
;;
-prefer-non-pic)
pic_mode=no
continue
;;
esac
done
qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
case $qlibobj in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
qlibobj="\"$qlibobj\"" ;;
esac
test "X$libobj" != "X$qlibobj" \
&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \
&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
if test "X$xdir" = "X$obj"; then
xdir=
else
xdir=$xdir/
fi
lobj=${xdir}$objdir/$objname
if test -z "$base_compile"; then
$echo "$modename: you must specify a compilation command" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
# Delete any leftover library objects.
if test "$build_old_libs" = yes; then
removelist="$obj $lobj $libobj ${libobj}T"
else
removelist="$lobj $libobj ${libobj}T"
fi
$run $rm $removelist
trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
# On Cygwin there's no "real" PIC flag so we must build both object types
case $host_os in
cygwin* | mingw* | pw32* | os2*)
pic_mode=default
;;
esac
if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
# non-PIC code in shared libraries is not supported
pic_mode=default
fi
# Calculate the filename of the output object if compiler does
# not support -o with -c
if test "$compiler_c_o" = no; then
output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
lockfile="$output_obj.lock"
removelist="$removelist $output_obj $lockfile"
trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
else
output_obj=
need_locks=no
lockfile=
fi
# Lock this critical section if it is needed
# We use this script file to make the link, it avoids creating a new file
if test "$need_locks" = yes; then
until $run ln "$progpath" "$lockfile" 2>/dev/null; do
$show "Waiting for $lockfile to be removed"
sleep 2
done
elif test "$need_locks" = warn; then
if test -f "$lockfile"; then
$echo "\
*** ERROR, $lockfile exists and contains:
`cat $lockfile 2>/dev/null`
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support \`-c' and \`-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
$run $rm $removelist
exit $EXIT_FAILURE
fi
$echo "$srcfile" > "$lockfile"
fi
if test -n "$fix_srcfile_path"; then
eval srcfile=\"$fix_srcfile_path\"
fi
qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
case $qsrcfile in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
qsrcfile="\"$qsrcfile\"" ;;
esac
$run $rm "$libobj" "${libobj}T"
# Create a libtool object file (analogous to a ".la" file),
# but don't create it if we're doing a dry run.
test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then
$echo "\
*** ERROR, $lockfile contains:
`cat $lockfile 2>/dev/null`
but it should contain:
$srcfile
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support \`-c' and \`-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
$run $rm $removelist
exit $EXIT_FAILURE
fi
# Just move the object if needed, then go on to compile the next one
if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
$show "$mv $output_obj $lobj"
if $run $mv $output_obj $lobj; then :
else
error=$?
$run $rm $removelist
exit $error
fi
fi
# Append the name of the PIC object to the libtool object file.
test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then
$echo "\
*** ERROR, $lockfile contains:
`cat $lockfile 2>/dev/null`
but it should contain:
$srcfile
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support \`-c' and \`-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
$run $rm $removelist
exit $EXIT_FAILURE
fi
# Just move the object if needed
if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
$show "$mv $output_obj $obj"
if $run $mv $output_obj $obj; then :
else
error=$?
$run $rm $removelist
exit $error
fi
fi
# Append the name of the non-PIC object the libtool object file.
# Only append if the libtool object file exists.
test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2
fi
if test -n "$link_static_flag"; then
dlopen_self=$dlopen_self_static
fi
prefer_static_libs=yes
;;
-static)
if test -z "$pic_flag" && test -n "$link_static_flag"; then
dlopen_self=$dlopen_self_static
fi
prefer_static_libs=built
;;
-static-libtool-libs)
if test -z "$pic_flag" && test -n "$link_static_flag"; then
dlopen_self=$dlopen_self_static
fi
prefer_static_libs=yes
;;
esac
build_libtool_libs=no
build_old_libs=yes
break
;;
esac
done
# See if our shared archives depend on static archives.
test -n "$old_archive_from_new_cmds" && build_old_libs=yes
# Go through the arguments, transforming them on the way.
while test "$#" -gt 0; do
arg="$1"
shift
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
;;
*) qarg=$arg ;;
esac
libtool_args="$libtool_args $qarg"
# If the previous option needs an argument, assign it.
if test -n "$prev"; then
case $prev in
output)
compile_command="$compile_command @OUTPUT@"
finalize_command="$finalize_command @OUTPUT@"
;;
esac
case $prev in
dlfiles|dlprefiles)
if test "$preload" = no; then
# Add the symbol object into the linking commands.
compile_command="$compile_command @SYMFILE@"
finalize_command="$finalize_command @SYMFILE@"
preload=yes
fi
case $arg in
*.la | *.lo) ;; # We handle these cases below.
force)
if test "$dlself" = no; then
dlself=needless
export_dynamic=yes
fi
prev=
continue
;;
self)
if test "$prev" = dlprefiles; then
dlself=yes
elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
dlself=yes
else
dlself=needless
export_dynamic=yes
fi
prev=
continue
;;
*)
if test "$prev" = dlfiles; then
dlfiles="$dlfiles $arg"
else
dlprefiles="$dlprefiles $arg"
fi
prev=
continue
;;
esac
;;
expsyms)
export_symbols="$arg"
if test ! -f "$arg"; then
$echo "$modename: symbol file \`$arg' does not exist"
exit $EXIT_FAILURE
fi
prev=
continue
;;
expsyms_regex)
export_symbols_regex="$arg"
prev=
continue
;;
inst_prefix)
inst_prefix_dir="$arg"
prev=
continue
;;
precious_regex)
precious_files_regex="$arg"
prev=
continue
;;
release)
release="-$arg"
prev=
continue
;;
objectlist)
if test -f "$arg"; then
save_arg=$arg
moreargs=
for fil in `cat $save_arg`
do
# moreargs="$moreargs $fil"
arg=$fil
# A libtool-controlled object.
# Check to see that this really is a libtool object.
if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
pic_object=
non_pic_object=
# Read the .lo file
# If there is no directory component, then add one.
case $arg in
*/* | *\\*) . $arg ;;
*) . ./$arg ;;
esac
if test -z "$pic_object" || \
test -z "$non_pic_object" ||
test "$pic_object" = none && \
test "$non_pic_object" = none; then
$echo "$modename: cannot find name of object for \`$arg'" 1>&2
exit $EXIT_FAILURE
fi
# Extract subdirectory from the argument.
xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
if test "X$xdir" = "X$arg"; then
xdir=
else
xdir="$xdir/"
fi
if test "$pic_object" != none; then
# Prepend the subdirectory the object is found in.
pic_object="$xdir$pic_object"
if test "$prev" = dlfiles; then
if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
dlfiles="$dlfiles $pic_object"
prev=
continue
else
# If libtool objects are unsupported, then we need to preload.
prev=dlprefiles
fi
fi
# CHECK ME: I think I busted this. -Ossama
if test "$prev" = dlprefiles; then
# Preload the old-style object.
dlprefiles="$dlprefiles $pic_object"
prev=
fi
# A PIC object.
libobjs="$libobjs $pic_object"
arg="$pic_object"
fi
# Non-PIC object.
if test "$non_pic_object" != none; then
# Prepend the subdirectory the object is found in.
non_pic_object="$xdir$non_pic_object"
# A standard non-PIC object
non_pic_objects="$non_pic_objects $non_pic_object"
if test -z "$pic_object" || test "$pic_object" = none ; then
arg="$non_pic_object"
fi
else
# If the PIC object exists, use it instead.
# $xdir was prepended to $pic_object above.
non_pic_object="$pic_object"
non_pic_objects="$non_pic_objects $non_pic_object"
fi
else
# Only an error if not doing a dry-run.
if test -z "$run"; then
$echo "$modename: \`$arg' is not a valid libtool object" 1>&2
exit $EXIT_FAILURE
else
# Dry-run case.
# Extract subdirectory from the argument.
xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
if test "X$xdir" = "X$arg"; then
xdir=
else
xdir="$xdir/"
fi
pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
libobjs="$libobjs $pic_object"
non_pic_objects="$non_pic_objects $non_pic_object"
fi
fi
done
else
$echo "$modename: link input file \`$save_arg' does not exist"
exit $EXIT_FAILURE
fi
arg=$save_arg
prev=
continue
;;
rpath | xrpath)
# We need an absolute path.
case $arg in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
$echo "$modename: only absolute run-paths are allowed" 1>&2
exit $EXIT_FAILURE
;;
esac
if test "$prev" = rpath; then
case "$rpath " in
*" $arg "*) ;;
*) rpath="$rpath $arg" ;;
esac
else
case "$xrpath " in
*" $arg "*) ;;
*) xrpath="$xrpath $arg" ;;
esac
fi
prev=
continue
;;
xcompiler)
compiler_flags="$compiler_flags $qarg"
prev=
compile_command="$compile_command $qarg"
finalize_command="$finalize_command $qarg"
continue
;;
xlinker)
linker_flags="$linker_flags $qarg"
compiler_flags="$compiler_flags $wl$qarg"
prev=
compile_command="$compile_command $wl$qarg"
finalize_command="$finalize_command $wl$qarg"
continue
;;
xcclinker)
linker_flags="$linker_flags $qarg"
compiler_flags="$compiler_flags $qarg"
prev=
compile_command="$compile_command $qarg"
finalize_command="$finalize_command $qarg"
continue
;;
shrext)
shrext_cmds="$arg"
prev=
continue
;;
darwin_framework|darwin_framework_skip)
test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
compile_command="$compile_command $arg"
finalize_command="$finalize_command $arg"
prev=
continue
;;
*)
eval "$prev=\"\$arg\""
prev=
continue
;;
esac
fi # test -n "$prev"
prevarg="$arg"
case $arg in
-all-static)
if test -n "$link_static_flag"; then
compile_command="$compile_command $link_static_flag"
finalize_command="$finalize_command $link_static_flag"
fi
continue
;;
-allow-undefined)
# FIXME: remove this flag sometime in the future.
$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
continue
;;
-avoid-version)
avoid_version=yes
continue
;;
-dlopen)
prev=dlfiles
continue
;;
-dlpreopen)
prev=dlprefiles
continue
;;
-export-dynamic)
export_dynamic=yes
continue
;;
-export-symbols | -export-symbols-regex)
if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
$echo "$modename: more than one -exported-symbols argument is not allowed"
exit $EXIT_FAILURE
fi
if test "X$arg" = "X-export-symbols"; then
prev=expsyms
else
prev=expsyms_regex
fi
continue
;;
-framework|-arch|-isysroot)
case " $CC " in
*" ${arg} ${1} "* | *" ${arg} ${1} "*)
prev=darwin_framework_skip ;;
*) compiler_flags="$compiler_flags $arg"
prev=darwin_framework ;;
esac
compile_command="$compile_command $arg"
finalize_command="$finalize_command $arg"
continue
;;
-inst-prefix-dir)
prev=inst_prefix
continue
;;
# The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
# so, if we see these flags be careful not to treat them like -L
-L[A-Z][A-Z]*:*)
case $with_gcc/$host in
no/*-*-irix* | /*-*-irix*)
compile_command="$compile_command $arg"
finalize_command="$finalize_command $arg"
;;
esac
continue
;;
-L*)
dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
absdir=`cd "$dir" && pwd`
if test -z "$absdir"; then
$echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
absdir="$dir"
notinst_path="$notinst_path $dir"
fi
dir="$absdir"
;;
esac
case "$deplibs " in
*" -L$dir "*) ;;
*)
deplibs="$deplibs -L$dir"
lib_search_path="$lib_search_path $dir"
;;
esac
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$dir:"*) ;;
*) dllsearchpath="$dllsearchpath:$dir";;
esac
case :$dllsearchpath: in
*":$testbindir:"*) ;;
*) dllsearchpath="$dllsearchpath:$testbindir";;
esac
;;
esac
continue
;;
-l*)
if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
# These systems don't actually have a C or math library (as such)
continue
;;
*-*-os2*)
# These systems don't actually have a C library (as such)
test "X$arg" = "X-lc" && continue
;;
*-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
# Do not include libc due to us having libc/libc_r.
test "X$arg" = "X-lc" && continue
;;
*-*-rhapsody* | *-*-darwin1.[012])
# Rhapsody C and math libraries are in the System framework
deplibs="$deplibs -framework System"
continue
;;
*-*-sco3.2v5* | *-*-sco5v6*)
# Causes problems with __ctype
test "X$arg" = "X-lc" && continue
;;
*-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
# Compiler inserts libc in the correct place for threads to work
test "X$arg" = "X-lc" && continue
;;
esac
elif test "X$arg" = "X-lc_r"; then
case $host in
*-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
# Do not include libc_r directly, use -pthread flag.
continue
;;
esac
fi
deplibs="$deplibs $arg"
continue
;;
# Tru64 UNIX uses -model [arg] to determine the layout of C++
# classes, name mangling, and exception handling.
-model)
compile_command="$compile_command $arg"
compiler_flags="$compiler_flags $arg"
finalize_command="$finalize_command $arg"
prev=xcompiler
continue
;;
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
compiler_flags="$compiler_flags $arg"
compile_command="$compile_command $arg"
finalize_command="$finalize_command $arg"
continue
;;
-module)
module=yes
continue
;;
# -64, -mips[0-9] enable 64-bit mode on the SGI compiler
# -r[0-9][0-9]* specifies the processor on the SGI compiler
# -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
# +DA*, +DD* enable 64-bit mode on the HP compiler
# -q* pass through compiler args for the IBM compiler
# -m* pass through architecture-specific compiler args for GCC
# -m*, -t[45]*, -txscale* pass through architecture-specific
# compiler args for GCC
# -pg pass through profiling flag for GCC
# @file GCC response files
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
-t[45]*|-txscale*|@*)
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
compile_command="$compile_command $arg"
finalize_command="$finalize_command $arg"
compiler_flags="$compiler_flags $arg"
continue
;;
-shrext)
prev=shrext
continue
;;
-no-fast-install)
fast_install=no
continue
;;
-no-install)
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
# The PATH hackery in wrapper scripts is required on Windows
# in order for the loader to find any dlls it needs.
$echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
$echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
fast_install=no
;;
*) no_install=yes ;;
esac
continue
;;
-no-undefined)
allow_undefined=no
continue
;;
-objectlist)
prev=objectlist
continue
;;
-o) prev=output ;;
-precious-files-regex)
prev=precious_regex
continue
;;
-release)
prev=release
continue
;;
-rpath)
prev=rpath
continue
;;
-R)
prev=xrpath
continue
;;
-R*)
dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
$echo "$modename: only absolute run-paths are allowed" 1>&2
exit $EXIT_FAILURE
;;
esac
case "$xrpath " in
*" $dir "*) ;;
*) xrpath="$xrpath $dir" ;;
esac
continue
;;
-static | -static-libtool-libs)
# The effects of -static are defined in a previous loop.
# We used to do the same as -all-static on platforms that
# didn't have a PIC flag, but the assumption that the effects
# would be equivalent was wrong. It would break on at least
# Digital Unix and AIX.
continue
;;
-thread-safe)
thread_safe=yes
continue
;;
-version-info)
prev=vinfo
continue
;;
-version-number)
prev=vinfo
vinfo_number=yes
continue
;;
-Wc,*)
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
arg=
save_ifs="$IFS"; IFS=','
for flag in $args; do
IFS="$save_ifs"
case $flag in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
flag="\"$flag\""
;;
esac
arg="$arg $wl$flag"
compiler_flags="$compiler_flags $flag"
done
IFS="$save_ifs"
arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
;;
-Wl,*)
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
arg=
save_ifs="$IFS"; IFS=','
for flag in $args; do
IFS="$save_ifs"
case $flag in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
flag="\"$flag\""
;;
esac
arg="$arg $wl$flag"
compiler_flags="$compiler_flags $wl$flag"
linker_flags="$linker_flags $flag"
done
IFS="$save_ifs"
arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
;;
-Xcompiler)
prev=xcompiler
continue
;;
-Xlinker)
prev=xlinker
continue
;;
-XCClinker)
prev=xcclinker
continue
;;
# Some other compiler flag.
-* | +*)
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
;;
*.$objext)
# A standard object.
objs="$objs $arg"
;;
*.lo)
# A libtool-controlled object.
# Check to see that this really is a libtool object.
if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
pic_object=
non_pic_object=
# Read the .lo file
# If there is no directory component, then add one.
case $arg in
*/* | *\\*) . $arg ;;
*) . ./$arg ;;
esac
if test -z "$pic_object" || \
test -z "$non_pic_object" ||
test "$pic_object" = none && \
test "$non_pic_object" = none; then
$echo "$modename: cannot find name of object for \`$arg'" 1>&2
exit $EXIT_FAILURE
fi
# Extract subdirectory from the argument.
xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
if test "X$xdir" = "X$arg"; then
xdir=
else
xdir="$xdir/"
fi
if test "$pic_object" != none; then
# Prepend the subdirectory the object is found in.
pic_object="$xdir$pic_object"
if test "$prev" = dlfiles; then
if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
dlfiles="$dlfiles $pic_object"
prev=
continue
else
# If libtool objects are unsupported, then we need to preload.
prev=dlprefiles
fi
fi
# CHECK ME: I think I busted this. -Ossama
if test "$prev" = dlprefiles; then
# Preload the old-style object.
dlprefiles="$dlprefiles $pic_object"
prev=
fi
# A PIC object.
libobjs="$libobjs $pic_object"
arg="$pic_object"
fi
# Non-PIC object.
if test "$non_pic_object" != none; then
# Prepend the subdirectory the object is found in.
non_pic_object="$xdir$non_pic_object"
# A standard non-PIC object
non_pic_objects="$non_pic_objects $non_pic_object"
if test -z "$pic_object" || test "$pic_object" = none ; then
arg="$non_pic_object"
fi
else
# If the PIC object exists, use it instead.
# $xdir was prepended to $pic_object above.
non_pic_object="$pic_object"
non_pic_objects="$non_pic_objects $non_pic_object"
fi
else
# Only an error if not doing a dry-run.
if test -z "$run"; then
$echo "$modename: \`$arg' is not a valid libtool object" 1>&2
exit $EXIT_FAILURE
else
# Dry-run case.
# Extract subdirectory from the argument.
xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
if test "X$xdir" = "X$arg"; then
xdir=
else
xdir="$xdir/"
fi
pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
libobjs="$libobjs $pic_object"
non_pic_objects="$non_pic_objects $non_pic_object"
fi
fi
;;
*.$libext)
# An archive.
deplibs="$deplibs $arg"
old_deplibs="$old_deplibs $arg"
continue
;;
*.la)
# A libtool-controlled library.
if test "$prev" = dlfiles; then
# This library was specified with -dlopen.
dlfiles="$dlfiles $arg"
prev=
elif test "$prev" = dlprefiles; then
# The library was specified with -dlpreopen.
dlprefiles="$dlprefiles $arg"
prev=
else
deplibs="$deplibs $arg"
fi
continue
;;
# Some other compiler argument.
*)
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
;;
esac # arg
# Now actually substitute the argument into the commands.
if test -n "$arg"; then
compile_command="$compile_command $arg"
finalize_command="$finalize_command $arg"
fi
done # argument parsing loop
if test -n "$prev"; then
$echo "$modename: the \`$prevarg' option requires an argument" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
eval arg=\"$export_dynamic_flag_spec\"
compile_command="$compile_command $arg"
finalize_command="$finalize_command $arg"
fi
oldlibs=
# calculate the name of the file, without its directory
outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
libobjs_save="$libobjs"
if test -n "$shlibpath_var"; then
# get the directories listed in $shlibpath_var
eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
else
shlib_search_path=
fi
eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
if test "X$output_objdir" = "X$output"; then
output_objdir="$objdir"
else
output_objdir="$output_objdir/$objdir"
fi
# Create the object directory.
if test ! -d "$output_objdir"; then
$show "$mkdir $output_objdir"
$run $mkdir $output_objdir
exit_status=$?
if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
exit $exit_status
fi
fi
# Determine the type of output
case $output in
"")
$echo "$modename: you must specify an output file" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
;;
*.$libext) linkmode=oldlib ;;
*.lo | *.$objext) linkmode=obj ;;
*.la) linkmode=lib ;;
*) linkmode=prog ;; # Anything else should be a program.
esac
case $host in
*cygwin* | *mingw* | *pw32*)
# don't eliminate duplications in $postdeps and $predeps
duplicate_compiler_generated_deps=yes
;;
*)
duplicate_compiler_generated_deps=$duplicate_deps
;;
esac
specialdeplibs=
libs=
# Find all interdependent deplibs by searching for libraries
# that are linked more than once (e.g. -la -lb -la)
for deplib in $deplibs; do
if test "X$duplicate_deps" = "Xyes" ; then
case "$libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
libs="$libs $deplib"
done
if test "$linkmode" = lib; then
libs="$predeps $libs $compiler_lib_search_path $postdeps"
# Compute libraries that are listed more than once in $predeps
# $postdeps and mark them as special (i.e., whose duplicates are
# not to be eliminated).
pre_post_deps=
if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
for pre_post_dep in $predeps $postdeps; do
case "$pre_post_deps " in
*" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
esac
pre_post_deps="$pre_post_deps $pre_post_dep"
done
fi
pre_post_deps=
fi
deplibs=
newdependency_libs=
newlib_search_path=
need_relink=no # whether we're linking any uninstalled libtool libraries
notinst_deplibs= # not-installed libtool libraries
case $linkmode in
lib)
passes="conv link"
for file in $dlfiles $dlprefiles; do
case $file in
*.la) ;;
*)
$echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
exit $EXIT_FAILURE
;;
esac
done
;;
prog)
compile_deplibs=
finalize_deplibs=
alldeplibs=no
newdlfiles=
newdlprefiles=
passes="conv scan dlopen dlpreopen link"
;;
*) passes="conv"
;;
esac
for pass in $passes; do
if test "$linkmode,$pass" = "lib,link" ||
test "$linkmode,$pass" = "prog,scan"; then
libs="$deplibs"
deplibs=
fi
if test "$linkmode" = prog; then
case $pass in
dlopen) libs="$dlfiles" ;;
dlpreopen) libs="$dlprefiles" ;;
link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
esac
fi
if test "$pass" = dlopen; then
# Collect dlpreopened libraries
save_deplibs="$deplibs"
deplibs=
fi
for deplib in $libs; do
lib=
found=no
case $deplib in
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
compiler_flags="$compiler_flags $deplib"
fi
continue
;;
-l*)
if test "$linkmode" != lib && test "$linkmode" != prog; then
$echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
continue
fi
name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
for search_ext in .la $std_shrext .so .a; do
# Search the libtool library
lib="$searchdir/lib${name}${search_ext}"
if test -f "$lib"; then
if test "$search_ext" = ".la"; then
found=yes
else
found=no
fi
break 2
fi
done
done
if test "$found" != yes; then
# deplib doesn't seem to be a libtool library
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
deplibs="$deplib $deplibs"
test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
fi
continue
else # deplib is a libtool library
# If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
# We need to do some special things here, and not later.
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $deplib "*)
if (${SED} -e '2q' $lib |
grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
library_names=
old_library=
case $lib in
*/* | *\\*) . $lib ;;
*) . ./$lib ;;
esac
for l in $old_library $library_names; do
ll="$l"
done
if test "X$ll" = "X$old_library" ; then # only static version available
found=no
ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
test "X$ladir" = "X$lib" && ladir="."
lib=$ladir/$old_library
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
deplibs="$deplib $deplibs"
test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
fi
continue
fi
fi
;;
*) ;;
esac
fi
fi
;; # -l
-L*)
case $linkmode in
lib)
deplibs="$deplib $deplibs"
test "$pass" = conv && continue
newdependency_libs="$deplib $newdependency_libs"
newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
;;
prog)
if test "$pass" = conv; then
deplibs="$deplib $deplibs"
continue
fi
if test "$pass" = scan; then
deplibs="$deplib $deplibs"
else
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
fi
newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
;;
*)
$echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
;;
esac # linkmode
continue
;; # -L
-R*)
if test "$pass" = link; then
dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
# Make sure the xrpath contains only unique directories.
case "$xrpath " in
*" $dir "*) ;;
*) xrpath="$xrpath $dir" ;;
esac
fi
deplibs="$deplib $deplibs"
continue
;;
*.la) lib="$deplib" ;;
*.$libext)
if test "$pass" = conv; then
deplibs="$deplib $deplibs"
continue
fi
case $linkmode in
lib)
valid_a_lib=no
case $deplibs_check_method in
match_pattern*)
set dummy $deplibs_check_method
match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
if eval $echo \"$deplib\" 2>/dev/null \
| $SED 10q \
| $EGREP "$match_pattern_regex" > /dev/null; then
valid_a_lib=yes
fi
;;
pass_all)
valid_a_lib=yes
;;
esac
if test "$valid_a_lib" != yes; then
$echo
$echo "*** Warning: Trying to link with static lib archive $deplib."
$echo "*** I have the capability to make that library automatically link in when"
$echo "*** you link to this library. But I can only do this if you have a"
$echo "*** shared version of the library, which you do not appear to have"
$echo "*** because the file extensions .$libext of this argument makes me believe"
$echo "*** that it is just a static archive that I should not used here."
else
$echo
$echo "*** Warning: Linking the shared library $output against the"
$echo "*** static library $deplib is not portable!"
deplibs="$deplib $deplibs"
fi
continue
;;
prog)
if test "$pass" != link; then
deplibs="$deplib $deplibs"
else
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
fi
continue
;;
esac # linkmode
;; # *.$libext
*.lo | *.$objext)
if test "$pass" = conv; then
deplibs="$deplib $deplibs"
elif test "$linkmode" = prog; then
if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
# If there is no dlopen support or we're linking statically,
# we need to preload.
newdlprefiles="$newdlprefiles $deplib"
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
newdlfiles="$newdlfiles $deplib"
fi
fi
continue
;;
%DEPLIBS%)
alldeplibs=yes
continue
;;
esac # case $deplib
if test "$found" = yes || test -f "$lib"; then :
else
$echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
exit $EXIT_FAILURE
fi
# Check to see that this really is a libtool archive.
if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
else
$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
exit $EXIT_FAILURE
fi
ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
test "X$ladir" = "X$lib" && ladir="."
dlname=
dlopen=
dlpreopen=
libdir=
library_names=
old_library=
# If the library was installed with an old release of libtool,
# it will not redefine variables installed, or shouldnotlink
installed=yes
shouldnotlink=no
avoidtemprpath=
# Read the .la file
case $lib in
*/* | *\\*) . $lib ;;
*) . ./$lib ;;
esac
if test "$linkmode,$pass" = "lib,link" ||
test "$linkmode,$pass" = "prog,scan" ||
{ test "$linkmode" != prog && test "$linkmode" != lib; }; then
test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
fi
if test "$pass" = conv; then
# Only check for convenience libraries
deplibs="$lib $deplibs"
if test -z "$libdir"; then
if test -z "$old_library"; then
$echo "$modename: cannot find name of link library for \`$lib'" 1>&2
exit $EXIT_FAILURE
fi
# It is a libtool convenience library, so add in its objects.
convenience="$convenience $ladir/$objdir/$old_library"
old_convenience="$old_convenience $ladir/$objdir/$old_library"
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
if test "X$duplicate_deps" = "Xyes" ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
elif test "$linkmode" != prog && test "$linkmode" != lib; then
$echo "$modename: \`$lib' is not a convenience library" 1>&2
exit $EXIT_FAILURE
fi
continue
fi # $pass = conv
# Get the name of the library we link against.
linklib=
for l in $old_library $library_names; do
linklib="$l"
done
if test -z "$linklib"; then
$echo "$modename: cannot find name of link library for \`$lib'" 1>&2
exit $EXIT_FAILURE
fi
# This library was specified with -dlopen.
if test "$pass" = dlopen; then
if test -z "$libdir"; then
$echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
exit $EXIT_FAILURE
fi
if test -z "$dlname" ||
test "$dlopen_support" != yes ||
test "$build_libtool_libs" = no; then
# If there is no dlname, no dlopen support or we're linking
# statically, we need to preload. We also need to preload any
# dependent libraries so libltdl's deplib preloader doesn't
# bomb out in the load deplibs phase.
dlprefiles="$dlprefiles $lib $dependency_libs"
else
newdlfiles="$newdlfiles $lib"
fi
continue
fi # $pass = dlopen
# We need an absolute path.
case $ladir in
[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
*)
abs_ladir=`cd "$ladir" && pwd`
if test -z "$abs_ladir"; then
$echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
$echo "$modename: passing it literally to the linker, although it might fail" 1>&2
abs_ladir="$ladir"
fi
;;
esac
laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
# Find the relevant object directory and library name.
if test "X$installed" = Xyes; then
if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
$echo "$modename: warning: library \`$lib' was moved." 1>&2
dir="$ladir"
absdir="$abs_ladir"
libdir="$abs_ladir"
else
dir="$libdir"
absdir="$libdir"
fi
test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
else
if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
dir="$ladir"
absdir="$abs_ladir"
# Remove this search path later
notinst_path="$notinst_path $abs_ladir"
else
dir="$ladir/$objdir"
absdir="$abs_ladir/$objdir"
# Remove this search path later
notinst_path="$notinst_path $abs_ladir"
fi
fi # $installed = yes
name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
# This library was specified with -dlpreopen.
if test "$pass" = dlpreopen; then
if test -z "$libdir"; then
$echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
exit $EXIT_FAILURE
fi
# Prefer using a static library (so that no silly _DYNAMIC symbols
# are required to link).
if test -n "$old_library"; then
newdlprefiles="$newdlprefiles $dir/$old_library"
# Otherwise, use the dlname, so that lt_dlopen finds it.
elif test -n "$dlname"; then
newdlprefiles="$newdlprefiles $dir/$dlname"
else
newdlprefiles="$newdlprefiles $dir/$linklib"
fi
fi # $pass = dlpreopen
if test -z "$libdir"; then
# Link the convenience library
if test "$linkmode" = lib; then
deplibs="$dir/$old_library $deplibs"
elif test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$dir/$old_library $compile_deplibs"
finalize_deplibs="$dir/$old_library $finalize_deplibs"
else
deplibs="$lib $deplibs" # used for prog,scan pass
fi
continue
fi
if test "$linkmode" = prog && test "$pass" != link; then
newlib_search_path="$newlib_search_path $ladir"
deplibs="$lib $deplibs"
linkalldeplibs=no
if test "$link_all_deplibs" != no || test -z "$library_names" ||
test "$build_libtool_libs" = no; then
linkalldeplibs=yes
fi
tmp_libs=
for deplib in $dependency_libs; do
case $deplib in
-L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
esac
# Need to link against all dependency_libs?
if test "$linkalldeplibs" = yes; then
deplibs="$deplib $deplibs"
else
# Need to hardcode shared library paths
# or/and link against static libraries
newdependency_libs="$deplib $newdependency_libs"
fi
if test "X$duplicate_deps" = "Xyes" ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done # for deplib
continue
fi # $linkmode = prog...
if test "$linkmode,$pass" = "prog,link"; then
if test -n "$library_names" &&
{ { test "$prefer_static_libs" = no ||
test "$prefer_static_libs,$installed" = "built,yes"; } ||
test -z "$old_library"; }; then
# We need to hardcode the library path
if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
# Make sure the rpath contains only unique directories.
case "$temp_rpath " in
*" $dir "*) ;;
*" $absdir "*) ;;
*) temp_rpath="$temp_rpath $absdir" ;;
esac
fi
# Hardcode the library path.
# Skip directories that are in the system default run-time
# search path.
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
case "$compile_rpath " in
*" $absdir "*) ;;
*) compile_rpath="$compile_rpath $absdir"
esac
;;
esac
case " $sys_lib_dlsearch_path " in
*" $libdir "*) ;;
*)
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir"
esac
;;
esac
fi # $linkmode,$pass = prog,link...
if test "$alldeplibs" = yes &&
{ test "$deplibs_check_method" = pass_all ||
{ test "$build_libtool_libs" = yes &&
test -n "$library_names"; }; }; then
# We only need to search for static libraries
continue
fi
fi
link_static=no # Whether the deplib will be linked statically
use_static_libs=$prefer_static_libs
if test "$use_static_libs" = built && test "$installed" = yes ; then
use_static_libs=no
fi
if test -n "$library_names" &&
{ test "$use_static_libs" = no || test -z "$old_library"; }; then
if test "$installed" = no; then
notinst_deplibs="$notinst_deplibs $lib"
need_relink=yes
fi
# This is a shared library
# Warn about portability, can't link against -module's on
# some systems (darwin)
if test "$shouldnotlink" = yes && test "$pass" = link ; then
$echo
if test "$linkmode" = prog; then
$echo "*** Warning: Linking the executable $output against the loadable module"
else
$echo "*** Warning: Linking the shared library $output against the loadable module"
fi
$echo "*** $linklib is not portable!"
fi
if test "$linkmode" = lib &&
test "$hardcode_into_libs" = yes; then
# Hardcode the library path.
# Skip directories that are in the system default run-time
# search path.
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
case "$compile_rpath " in
*" $absdir "*) ;;
*) compile_rpath="$compile_rpath $absdir"
esac
;;
esac
case " $sys_lib_dlsearch_path " in
*" $libdir "*) ;;
*)
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir"
esac
;;
esac
fi
if test -n "$old_archive_from_expsyms_cmds"; then
# figure out the soname
set dummy $library_names
realname="$2"
shift; shift
libname=`eval \\$echo \"$libname_spec\"`
# use dlname if we got it. it's perfectly good, no?
if test -n "$dlname"; then
soname="$dlname"
elif test -n "$soname_spec"; then
# bleh windows
case $host in
*cygwin* | mingw*)
major=`expr $current - $age`
versuffix="-$major"
;;
esac
eval soname=\"$soname_spec\"
else
soname="$realname"
fi
# Make a new name for the extract_expsyms_cmds to use
soroot="$soname"
soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
# If the library has no export list, then create one now
if test -f "$output_objdir/$soname-def"; then :
else
$show "extracting exported symbol list from \`$soname'"
save_ifs="$IFS"; IFS='~'
cmds=$extract_expsyms_cmds
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
fi
# Create $newlib
if test -f "$output_objdir/$newlib"; then :; else
$show "generating import library for \`$soname'"
save_ifs="$IFS"; IFS='~'
cmds=$old_archive_from_expsyms_cmds
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
fi
# make sure the library variables are pointing to the new library
dir=$output_objdir
linklib=$newlib
fi # test -n "$old_archive_from_expsyms_cmds"
if test "$linkmode" = prog || test "$mode" != relink; then
add_shlibpath=
add_dir=
add=
lib_linked=yes
case $hardcode_action in
immediate | unsupported)
if test "$hardcode_direct" = no; then
add="$dir/$linklib"
case $host in
*-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
*-*-sysv4*uw2*) add_dir="-L$dir" ;;
*-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
*-*-unixware7*) add_dir="-L$dir" ;;
*-*-darwin* )
# if the lib is a module then we can not link against
# it, someone is ignoring the new warnings I added
if /usr/bin/file -L $add 2> /dev/null |
$EGREP ": [^:]* bundle" >/dev/null ; then
$echo "** Warning, lib $linklib is a module, not a shared library"
if test -z "$old_library" ; then
$echo
$echo "** And there doesn't seem to be a static archive available"
$echo "** The link will probably fail, sorry"
else
add="$dir/$old_library"
fi
fi
esac
elif test "$hardcode_minus_L" = no; then
case $host in
*-*-sunos*) add_shlibpath="$dir" ;;
esac
add_dir="-L$dir"
add="-l$name"
elif test "$hardcode_shlibpath_var" = no; then
add_shlibpath="$dir"
add="-l$name"
else
lib_linked=no
fi
;;
relink)
if test "$hardcode_direct" = yes; then
add="$dir/$linklib"
elif test "$hardcode_minus_L" = yes; then
add_dir="-L$dir"
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
[\\/]*)
add_dir="$add_dir -L$inst_prefix_dir$libdir"
;;
esac
fi
add="-l$name"
elif test "$hardcode_shlibpath_var" = yes; then
add_shlibpath="$dir"
add="-l$name"
else
lib_linked=no
fi
;;
*) lib_linked=no ;;
esac
if test "$lib_linked" != yes; then
$echo "$modename: configuration error: unsupported hardcode properties"
exit $EXIT_FAILURE
fi
if test -n "$add_shlibpath"; then
case :$compile_shlibpath: in
*":$add_shlibpath:"*) ;;
*) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
esac
fi
if test "$linkmode" = prog; then
test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
test -n "$add" && compile_deplibs="$add $compile_deplibs"
else
test -n "$add_dir" && deplibs="$add_dir $deplibs"
test -n "$add" && deplibs="$add $deplibs"
if test "$hardcode_direct" != yes && \
test "$hardcode_minus_L" != yes && \
test "$hardcode_shlibpath_var" = yes; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
esac
fi
fi
fi
if test "$linkmode" = prog || test "$mode" = relink; then
add_shlibpath=
add_dir=
add=
# Finalize command for both is simple: just hardcode it.
if test "$hardcode_direct" = yes; then
add="$libdir/$linklib"
elif test "$hardcode_minus_L" = yes; then
add_dir="-L$libdir"
add="-l$name"
elif test "$hardcode_shlibpath_var" = yes; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
esac
add="-l$name"
elif test "$hardcode_automatic" = yes; then
if test -n "$inst_prefix_dir" &&
test -f "$inst_prefix_dir$libdir/$linklib" ; then
add="$inst_prefix_dir$libdir/$linklib"
else
add="$libdir/$linklib"
fi
else
# We cannot seem to hardcode it, guess we'll fake it.
add_dir="-L$libdir"
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
[\\/]*)
add_dir="$add_dir -L$inst_prefix_dir$libdir"
;;
esac
fi
add="-l$name"
fi
if test "$linkmode" = prog; then
test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
else
test -n "$add_dir" && deplibs="$add_dir $deplibs"
test -n "$add" && deplibs="$add $deplibs"
fi
fi
elif test "$linkmode" = prog; then
# Here we assume that one of hardcode_direct or hardcode_minus_L
# is not unsupported. This is valid on all known static and
# shared platforms.
if test "$hardcode_direct" != unsupported; then
test -n "$old_library" && linklib="$old_library"
compile_deplibs="$dir/$linklib $compile_deplibs"
finalize_deplibs="$dir/$linklib $finalize_deplibs"
else
compile_deplibs="-l$name -L$dir $compile_deplibs"
finalize_deplibs="-l$name -L$dir $finalize_deplibs"
fi
elif test "$build_libtool_libs" = yes; then
# Not a shared library
if test "$deplibs_check_method" != pass_all; then
# We're trying link a shared library against a static one
# but the system doesn't support it.
# Just print a warning and add the library to dependency_libs so
# that the program can be linked against the static library.
$echo
$echo "*** Warning: This system can not link to static lib archive $lib."
$echo "*** I have the capability to make that library automatically link in when"
$echo "*** you link to this library. But I can only do this if you have a"
$echo "*** shared version of the library, which you do not appear to have."
if test "$module" = yes; then
$echo "*** But as you try to build a module library, libtool will still create "
$echo "*** a static module, that should work as long as the dlopening application"
$echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
if test -z "$global_symbol_pipe"; then
$echo
$echo "*** However, this would only work if libtool was able to extract symbol"
$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
$echo "*** not find such a program. So, this module is probably useless."
$echo "*** \`nm' from GNU binutils and a full rebuild may help."
fi
if test "$build_old_libs" = no; then
build_libtool_libs=module
build_old_libs=yes
else
build_libtool_libs=no
fi
fi
else
deplibs="$dir/$old_library $deplibs"
link_static=yes
fi
fi # link shared/static library?
if test "$linkmode" = lib; then
if test -n "$dependency_libs" &&
{ test "$hardcode_into_libs" != yes ||
test "$build_old_libs" = yes ||
test "$link_static" = yes; }; then
# Extract -R from dependency_libs
temp_deplibs=
for libdir in $dependency_libs; do
case $libdir in
-R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
case " $xrpath " in
*" $temp_xrpath "*) ;;
*) xrpath="$xrpath $temp_xrpath";;
esac;;
*) temp_deplibs="$temp_deplibs $libdir";;
esac
done
dependency_libs="$temp_deplibs"
fi
newlib_search_path="$newlib_search_path $absdir"
# Link against this library
test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
# ... and its dependency_libs
tmp_libs=
for deplib in $dependency_libs; do
newdependency_libs="$deplib $newdependency_libs"
if test "X$duplicate_deps" = "Xyes" ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
if test "$link_all_deplibs" != no; then
# Add the search paths of all dependency libraries
for deplib in $dependency_libs; do
case $deplib in
-L*) path="$deplib" ;;
*.la)
dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
test "X$dir" = "X$deplib" && dir="."
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
*)
absdir=`cd "$dir" && pwd`
if test -z "$absdir"; then
$echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
absdir="$dir"
fi
;;
esac
if grep "^installed=no" $deplib > /dev/null; then
path="$absdir/$objdir"
else
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
if test -z "$libdir"; then
$echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
exit $EXIT_FAILURE
fi
if test "$absdir" != "$libdir"; then
$echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
fi
path="$absdir"
fi
depdepl=
case $host in
*-*-darwin*)
# we do not want to link against static libs,
# but need to link against shared
eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
if test -n "$deplibrary_names" ; then
for tmp in $deplibrary_names ; do
depdepl=$tmp
done
if test -f "$path/$depdepl" ; then
depdepl="$path/$depdepl"
fi
# do not add paths which are already there
case " $newlib_search_path " in
*" $path "*) ;;
*) newlib_search_path="$newlib_search_path $path";;
esac
fi
path=""
;;
*)
path="-L$path"
;;
esac
;;
-l*)
case $host in
*-*-darwin*)
# Again, we only want to link against shared libraries
eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
for tmp in $newlib_search_path ; do
if test -f "$tmp/lib$tmp_libs.dylib" ; then
eval depdepl="$tmp/lib$tmp_libs.dylib"
break
fi
done
path=""
;;
*) continue ;;
esac
;;
*) continue ;;
esac
case " $deplibs " in
*" $path "*) ;;
*) deplibs="$path $deplibs" ;;
esac
case " $deplibs " in
*" $depdepl "*) ;;
*) deplibs="$depdepl $deplibs" ;;
esac
done
fi # link_all_deplibs != no
fi # linkmode = lib
done # for deplib in $libs
dependency_libs="$newdependency_libs"
if test "$pass" = dlpreopen; then
# Link the dlpreopened libraries before other libraries
for deplib in $save_deplibs; do
deplibs="$deplib $deplibs"
done
fi
if test "$pass" != dlopen; then
if test "$pass" != conv; then
# Make sure lib_search_path contains only unique directories.
lib_search_path=
for dir in $newlib_search_path; do
case "$lib_search_path " in
*" $dir "*) ;;
*) lib_search_path="$lib_search_path $dir" ;;
esac
done
newlib_search_path=
fi
if test "$linkmode,$pass" != "prog,link"; then
vars="deplibs"
else
vars="compile_deplibs finalize_deplibs"
fi
for var in $vars dependency_libs; do
# Add libraries to $var in reverse order
eval tmp_libs=\"\$$var\"
new_libs=
for deplib in $tmp_libs; do
# FIXME: Pedantically, this is the right thing to do, so
# that some nasty dependency loop isn't accidentally
# broken:
#new_libs="$deplib $new_libs"
# Pragmatically, this seems to cause very few problems in
# practice:
case $deplib in
-L*) new_libs="$deplib $new_libs" ;;
-R*) ;;
*)
# And here is the reason: when a library appears more
# than once as an explicit dependence of a library, or
# is implicitly linked in more than once by the
# compiler, it is considered special, and multiple
# occurrences thereof are not removed. Compare this
# with having the same library being listed as a
# dependency of multiple other libraries: in this case,
# we know (pedantically, we assume) the library does not
# need to be listed more than once, so we keep only the
# last copy. This is not always right, but it is rare
# enough that we require users that really mean to play
# such unportable linking tricks to link the library
# using -Wl,-lname, so that libtool does not consider it
# for duplicate removal.
case " $specialdeplibs " in
*" $deplib "*) new_libs="$deplib $new_libs" ;;
*)
case " $new_libs " in
*" $deplib "*) ;;
*) new_libs="$deplib $new_libs" ;;
esac
;;
esac
;;
esac
done
tmp_libs=
for deplib in $new_libs; do
case $deplib in
-L*)
case " $tmp_libs " in
*" $deplib "*) ;;
*) tmp_libs="$tmp_libs $deplib" ;;
esac
;;
*) tmp_libs="$tmp_libs $deplib" ;;
esac
done
eval $var=\"$tmp_libs\"
done # for var
fi
# Last step: remove runtime libs from dependency_libs
# (they stay in deplibs)
tmp_libs=
for i in $dependency_libs ; do
case " $predeps $postdeps $compiler_lib_search_path " in
*" $i "*)
i=""
;;
esac
if test -n "$i" ; then
tmp_libs="$tmp_libs $i"
fi
done
dependency_libs=$tmp_libs
done # for pass
if test "$linkmode" = prog; then
dlfiles="$newdlfiles"
dlprefiles="$newdlprefiles"
fi
case $linkmode in
oldlib)
if test -n "$deplibs"; then
$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
fi
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
fi
if test -n "$rpath"; then
$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
fi
if test -n "$xrpath"; then
$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
fi
if test -n "$vinfo"; then
$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
fi
if test -n "$release"; then
$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
fi
if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
fi
# Now set the variables for building old libraries.
build_libtool_libs=no
oldlibs="$output"
objs="$objs$old_deplibs"
;;
lib)
# Make sure we only generate libraries of the form `libNAME.la'.
case $outputname in
lib*)
name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
eval shared_ext=\"$shrext_cmds\"
eval libname=\"$libname_spec\"
;;
*)
if test "$module" = no; then
$echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
if test "$need_lib_prefix" != no; then
# Add the "lib" prefix for modules if required
name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
eval shared_ext=\"$shrext_cmds\"
eval libname=\"$libname_spec\"
else
libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
fi
;;
esac
if test -n "$objs"; then
if test "$deplibs_check_method" != pass_all; then
$echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
exit $EXIT_FAILURE
else
$echo
$echo "*** Warning: Linking the shared library $output against the non-libtool"
$echo "*** objects $objs is not portable!"
libobjs="$libobjs $objs"
fi
fi
if test "$dlself" != no; then
$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
fi
set dummy $rpath
if test "$#" -gt 2; then
$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
fi
install_libdir="$2"
oldlibs=
if test -z "$rpath"; then
if test "$build_libtool_libs" = yes; then
# Building a libtool convenience library.
# Some compilers have problems with a `.al' extension so
# convenience libraries should have the same extension an
# archive normally would.
oldlibs="$output_objdir/$libname.$libext $oldlibs"
build_libtool_libs=convenience
build_old_libs=yes
fi
if test -n "$vinfo"; then
$echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
fi
if test -n "$release"; then
$echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
fi
else
# Parse the version information argument.
save_ifs="$IFS"; IFS=':'
set dummy $vinfo 0 0 0
IFS="$save_ifs"
if test -n "$8"; then
$echo "$modename: too many parameters to \`-version-info'" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
# convert absolute version numbers to libtool ages
# this retains compatibility with .la files and attempts
# to make the code below a bit more comprehensible
case $vinfo_number in
yes)
number_major="$2"
number_minor="$3"
number_revision="$4"
#
# There are really only two kinds -- those that
# use the current revision as the major version
# and those that subtract age and use age as
# a minor version. But, then there is irix
# which has an extra 1 added just for fun
#
case $version_type in
darwin|linux|osf|windows|none)
current=`expr $number_major + $number_minor`
age="$number_minor"
revision="$number_revision"
;;
freebsd-aout|freebsd-elf|sunos)
current="$number_major"
revision="$number_minor"
age="0"
;;
irix|nonstopux)
current=`expr $number_major + $number_minor - 1`
age="$number_minor"
revision="$number_minor"
;;
esac
;;
no)
current="$2"
revision="$3"
age="$4"
;;
esac
# Check that each of the things are valid numbers.
case $current in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
$echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit $EXIT_FAILURE
;;
esac
case $revision in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
$echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit $EXIT_FAILURE
;;
esac
case $age in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
$echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit $EXIT_FAILURE
;;
esac
if test "$age" -gt "$current"; then
$echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit $EXIT_FAILURE
fi
# Calculate the version variables.
major=
versuffix=
verstring=
case $version_type in
none) ;;
darwin)
# Like Linux, but with the current version available in
# verstring for coding it into the library header
major=.`expr $current - $age`
versuffix="$major.$age.$revision"
# Darwin ld doesn't like 0 for these options...
minor_current=`expr $current + 1`
verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
;;
freebsd-aout)
major=".$current"
versuffix=".$current.$revision";
;;
freebsd-elf)
major=".$current"
versuffix=".$current";
;;
irix | nonstopux)
major=`expr $current - $age + 1`
case $version_type in
nonstopux) verstring_prefix=nonstopux ;;
*) verstring_prefix=sgi ;;
esac
verstring="$verstring_prefix$major.$revision"
# Add in all the interfaces that we are compatible with.
loop=$revision
while test "$loop" -ne 0; do
iface=`expr $revision - $loop`
loop=`expr $loop - 1`
verstring="$verstring_prefix$major.$iface:$verstring"
done
# Before this point, $major must not contain `.'.
major=.$major
versuffix="$major.$revision"
;;
linux)
major=.`expr $current - $age`
versuffix="$major.$age.$revision"
;;
osf)
major=.`expr $current - $age`
versuffix=".$current.$age.$revision"
verstring="$current.$age.$revision"
# Add in all the interfaces that we are compatible with.
loop=$age
while test "$loop" -ne 0; do
iface=`expr $current - $loop`
loop=`expr $loop - 1`
verstring="$verstring:${iface}.0"
done
# Make executables depend on our current version.
verstring="$verstring:${current}.0"
;;
sunos)
major=".$current"
versuffix=".$current.$revision"
;;
windows)
# Use '-' rather than '.', since we only want one
# extension on DOS 8.3 filesystems.
major=`expr $current - $age`
versuffix="-$major"
;;
*)
$echo "$modename: unknown library version type \`$version_type'" 1>&2
$echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
exit $EXIT_FAILURE
;;
esac
# Clear the version info if we defaulted, and they specified a release.
if test -z "$vinfo" && test -n "$release"; then
major=
case $version_type in
darwin)
# we can't check for "0.0" in archive_cmds due to quoting
# problems, so we reset it completely
verstring=
;;
*)
verstring="0.0"
;;
esac
if test "$need_version" = no; then
versuffix=
else
versuffix=".0.0"
fi
fi
# Remove version info from name if versioning should be avoided
if test "$avoid_version" = yes && test "$need_version" = no; then
major=
versuffix=
verstring=""
fi
# Check to see if the archive will have undefined symbols.
if test "$allow_undefined" = yes; then
if test "$allow_undefined_flag" = unsupported; then
$echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
build_libtool_libs=no
build_old_libs=yes
fi
else
# Don't allow undefined symbols.
allow_undefined_flag="$no_undefined_flag"
fi
fi
if test "$mode" != relink; then
# Remove our outputs, but don't remove object files since they
# may have been created when compiling PIC objects.
removelist=
tempremovelist=`$echo "$output_objdir/*"`
for p in $tempremovelist; do
case $p in
*.$objext)
;;
$output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
if test "X$precious_files_regex" != "X"; then
if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
then
continue
fi
fi
removelist="$removelist $p"
;;
*) ;;
esac
done
if test -n "$removelist"; then
$show "${rm}r $removelist"
$run ${rm}r $removelist
fi
fi
# Now set the variables for building old libraries.
if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
oldlibs="$oldlibs $output_objdir/$libname.$libext"
# Transform .lo files to .o files.
oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
fi
# Eliminate all temporary directories.
# for path in $notinst_path; do
# lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
# deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
# dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
# done
if test -n "$xrpath"; then
# If the user specified any rpath flags, then add them.
temp_xrpath=
for libdir in $xrpath; do
temp_xrpath="$temp_xrpath -R$libdir"
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir" ;;
esac
done
if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
dependency_libs="$temp_xrpath $dependency_libs"
fi
fi
# Make sure dlfiles contains only unique files that won't be dlpreopened
old_dlfiles="$dlfiles"
dlfiles=
for lib in $old_dlfiles; do
case " $dlprefiles $dlfiles " in
*" $lib "*) ;;
*) dlfiles="$dlfiles $lib" ;;
esac
done
# Make sure dlprefiles contains only unique files
old_dlprefiles="$dlprefiles"
dlprefiles=
for lib in $old_dlprefiles; do
case "$dlprefiles " in
*" $lib "*) ;;
*) dlprefiles="$dlprefiles $lib" ;;
esac
done
if test "$build_libtool_libs" = yes; then
if test -n "$rpath"; then
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
# these systems don't actually have a c library (as such)!
;;
*-*-rhapsody* | *-*-darwin1.[012])
# Rhapsody C library is in the System framework
deplibs="$deplibs -framework System"
;;
*-*-netbsd*)
# Don't link with libc until the a.out ld.so is fixed.
;;
*-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
# Do not include libc due to us having libc/libc_r.
;;
*-*-sco3.2v5* | *-*-sco5v6*)
# Causes problems with __ctype
;;
*-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
# Compiler inserts libc in the correct place for threads to work
;;
*)
# Add libc to deplibs on all other systems if necessary.
if test "$build_libtool_need_lc" = "yes"; then
deplibs="$deplibs -lc"
fi
;;
esac
fi
# Transform deplibs into only deplibs that can be linked in shared.
name_save=$name
libname_save=$libname
release_save=$release
versuffix_save=$versuffix
major_save=$major
# I'm not sure if I'm treating the release correctly. I think
# release should show up in the -l (ie -lgmp5) so we don't want to
# add it in twice. Is that correct?
release=""
versuffix=""
major=""
newdeplibs=
droppeddeps=no
case $deplibs_check_method in
pass_all)
# Don't check for shared/static. Everything works.
# This might be a little naive. We might want to check
# whether the library exists or not. But this is on
# osf3 & osf4 and I'm not really sure... Just
# implementing what was already the behavior.
newdeplibs=$deplibs
;;
test_compile)
# This code stresses the "libraries are programs" paradigm to its
# limits. Maybe even breaks it. We compile a program, linking it
# against the deplibs as a proxy for the library. Then we can check
# whether they linked in statically or dynamically with ldd.
$rm conftest.c
cat > conftest.c </dev/null`
for potent_lib in $potential_libs; do
# Follow soft links.
if ls -lLd "$potent_lib" 2>/dev/null \
| grep " -> " >/dev/null; then
continue
fi
# The statement above tries to avoid entering an
# endless loop below, in case of cyclic links.
# We might still enter an endless loop, since a link
# loop can be closed while we follow links,
# but so what?
potlib="$potent_lib"
while test -h "$potlib" 2>/dev/null; do
potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
case $potliblink in
[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
esac
done
if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
| ${SED} 10q \
| $EGREP "$file_magic_regex" > /dev/null; then
newdeplibs="$newdeplibs $a_deplib"
a_deplib=""
break 2
fi
done
done
fi
if test -n "$a_deplib" ; then
droppeddeps=yes
$echo
$echo "*** Warning: linker path does not have real file for library $a_deplib."
$echo "*** I have the capability to make that library automatically link in when"
$echo "*** you link to this library. But I can only do this if you have a"
$echo "*** shared version of the library, which you do not appear to have"
$echo "*** because I did check the linker path looking for a file starting"
if test -z "$potlib" ; then
$echo "*** with $libname but no candidates were found. (...for file magic test)"
else
$echo "*** with $libname and none of the candidates passed a file format test"
$echo "*** using a file magic. Last file checked: $potlib"
fi
fi
else
# Add a -L argument.
newdeplibs="$newdeplibs $a_deplib"
fi
done # Gone through all deplibs.
;;
match_pattern*)
set dummy $deplibs_check_method
match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
for a_deplib in $deplibs; do
name=`expr $a_deplib : '-l\(.*\)'`
# If $name is empty we are operating on a -L argument.
if test -n "$name" && test "$name" != "0"; then
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $a_deplib "*)
newdeplibs="$newdeplibs $a_deplib"
a_deplib=""
;;
esac
fi
if test -n "$a_deplib" ; then
libname=`eval \\$echo \"$libname_spec\"`
for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
for potent_lib in $potential_libs; do
potlib="$potent_lib" # see symlink-check above in file_magic test
if eval $echo \"$potent_lib\" 2>/dev/null \
| ${SED} 10q \
| $EGREP "$match_pattern_regex" > /dev/null; then
newdeplibs="$newdeplibs $a_deplib"
a_deplib=""
break 2
fi
done
done
fi
if test -n "$a_deplib" ; then
droppeddeps=yes
$echo
$echo "*** Warning: linker path does not have real file for library $a_deplib."
$echo "*** I have the capability to make that library automatically link in when"
$echo "*** you link to this library. But I can only do this if you have a"
$echo "*** shared version of the library, which you do not appear to have"
$echo "*** because I did check the linker path looking for a file starting"
if test -z "$potlib" ; then
$echo "*** with $libname but no candidates were found. (...for regex pattern test)"
else
$echo "*** with $libname and none of the candidates passed a file format test"
$echo "*** using a regex pattern. Last file checked: $potlib"
fi
fi
else
# Add a -L argument.
newdeplibs="$newdeplibs $a_deplib"
fi
done # Gone through all deplibs.
;;
none | unknown | *)
newdeplibs=""
tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
-e 's/ -[LR][^ ]*//g'`
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
for i in $predeps $postdeps ; do
# can't use Xsed below, because $i might contain '/'
tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
done
fi
if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \
| grep . >/dev/null; then
$echo
if test "X$deplibs_check_method" = "Xnone"; then
$echo "*** Warning: inter-library dependencies are not supported in this platform."
else
$echo "*** Warning: inter-library dependencies are not known to be supported."
fi
$echo "*** All declared inter-library dependencies are being dropped."
droppeddeps=yes
fi
;;
esac
versuffix=$versuffix_save
major=$major_save
release=$release_save
libname=$libname_save
name=$name_save
case $host in
*-*-rhapsody* | *-*-darwin1.[012])
# On Rhapsody replace the C library is the System framework
newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
;;
esac
if test "$droppeddeps" = yes; then
if test "$module" = yes; then
$echo
$echo "*** Warning: libtool could not satisfy all declared inter-library"
$echo "*** dependencies of module $libname. Therefore, libtool will create"
$echo "*** a static module, that should work as long as the dlopening"
$echo "*** application is linked with the -dlopen flag."
if test -z "$global_symbol_pipe"; then
$echo
$echo "*** However, this would only work if libtool was able to extract symbol"
$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
$echo "*** not find such a program. So, this module is probably useless."
$echo "*** \`nm' from GNU binutils and a full rebuild may help."
fi
if test "$build_old_libs" = no; then
oldlibs="$output_objdir/$libname.$libext"
build_libtool_libs=module
build_old_libs=yes
else
build_libtool_libs=no
fi
else
$echo "*** The inter-library dependencies that have been dropped here will be"
$echo "*** automatically added whenever a program is linked with this library"
$echo "*** or is declared to -dlopen it."
if test "$allow_undefined" = no; then
$echo
$echo "*** Since this library must not contain undefined symbols,"
$echo "*** because either the platform does not support them or"
$echo "*** it was explicitly requested with -no-undefined,"
$echo "*** libtool will only create a static version of it."
if test "$build_old_libs" = no; then
oldlibs="$output_objdir/$libname.$libext"
build_libtool_libs=module
build_old_libs=yes
else
build_libtool_libs=no
fi
fi
fi
fi
# Done checking deplibs!
deplibs=$newdeplibs
fi
# move library search paths that coincide with paths to not yet
# installed libraries to the beginning of the library search list
new_libs=
for path in $notinst_path; do
case " $new_libs " in
*" -L$path/$objdir "*) ;;
*)
case " $deplibs " in
*" -L$path/$objdir "*)
new_libs="$new_libs -L$path/$objdir" ;;
esac
;;
esac
done
for deplib in $deplibs; do
case $deplib in
-L*)
case " $new_libs " in
*" $deplib "*) ;;
*) new_libs="$new_libs $deplib" ;;
esac
;;
*) new_libs="$new_libs $deplib" ;;
esac
done
deplibs="$new_libs"
# All the library-specific variables (install_libdir is set above).
library_names=
old_library=
dlname=
# Test again, we may have decided not to build it any more
if test "$build_libtool_libs" = yes; then
if test "$hardcode_into_libs" = yes; then
# Hardcode the library paths
hardcode_libdirs=
dep_rpath=
rpath="$finalize_rpath"
test "$mode" != relink && rpath="$compile_rpath$rpath"
for libdir in $rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
hardcode_libdirs="$libdir"
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
dep_rpath="$dep_rpath $flag"
fi
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
*) perm_rpath="$perm_rpath $libdir" ;;
esac
fi
done
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
libdir="$hardcode_libdirs"
if test -n "$hardcode_libdir_flag_spec_ld"; then
eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
else
eval dep_rpath=\"$hardcode_libdir_flag_spec\"
fi
fi
if test -n "$runpath_var" && test -n "$perm_rpath"; then
# We should set the runpath_var.
rpath=
for dir in $perm_rpath; do
rpath="$rpath$dir:"
done
eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
fi
test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
fi
shlibpath="$finalize_shlibpath"
test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
if test -n "$shlibpath"; then
eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
fi
# Get the real and link names of the library.
eval shared_ext=\"$shrext_cmds\"
eval library_names=\"$library_names_spec\"
set dummy $library_names
realname="$2"
shift; shift
if test -n "$soname_spec"; then
eval soname=\"$soname_spec\"
else
soname="$realname"
fi
if test -z "$dlname"; then
dlname=$soname
fi
lib="$output_objdir/$realname"
linknames=
for link
do
linknames="$linknames $link"
done
# Use standard objects if they are pic
test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
# Prepare the list of exported symbols
if test -z "$export_symbols"; then
if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
$show "generating symbol list for \`$libname.la'"
export_symbols="$output_objdir/$libname.exp"
$run $rm $export_symbols
cmds=$export_symbols_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
if len=`expr "X$cmd" : ".*"` &&
test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
$show "$cmd"
$run eval "$cmd" || exit $?
skipped_export=false
else
# The command line is too long to execute in one step.
$show "using reloadable object file for export list..."
skipped_export=:
# Break out early, otherwise skipped_export may be
# set to false by a later but shorter cmd.
break
fi
done
IFS="$save_ifs"
if test -n "$export_symbols_regex"; then
$show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
$run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
$show "$mv \"${export_symbols}T\" \"$export_symbols\""
$run eval '$mv "${export_symbols}T" "$export_symbols"'
fi
fi
fi
if test -n "$export_symbols" && test -n "$include_expsyms"; then
$run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
fi
tmp_deplibs=
for test_deplib in $deplibs; do
case " $convenience " in
*" $test_deplib "*) ;;
*)
tmp_deplibs="$tmp_deplibs $test_deplib"
;;
esac
done
deplibs="$tmp_deplibs"
if test -n "$convenience"; then
if test -n "$whole_archive_flag_spec"; then
save_libobjs=$libobjs
eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
else
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
func_extract_archives $gentop $convenience
libobjs="$libobjs $func_extract_archives_result"
fi
fi
if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
eval flag=\"$thread_safe_flag_spec\"
linker_flags="$linker_flags $flag"
fi
# Make a backup of the uninstalled library when relinking
if test "$mode" = relink; then
$run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
fi
# Do each of the archive commands.
if test "$module" = yes && test -n "$module_cmds" ; then
if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
eval test_cmds=\"$module_expsym_cmds\"
cmds=$module_expsym_cmds
else
eval test_cmds=\"$module_cmds\"
cmds=$module_cmds
fi
else
if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
eval test_cmds=\"$archive_expsym_cmds\"
cmds=$archive_expsym_cmds
else
eval test_cmds=\"$archive_cmds\"
cmds=$archive_cmds
fi
fi
if test "X$skipped_export" != "X:" &&
len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
:
else
# The command line is too long to link in one step, link piecewise.
$echo "creating reloadable object files..."
# Save the value of $output and $libobjs because we want to
# use them later. If we have whole_archive_flag_spec, we
# want to use save_libobjs as it was before
# whole_archive_flag_spec was expanded, because we can't
# assume the linker understands whole_archive_flag_spec.
# This may have to be revisited, in case too many
# convenience libraries get linked in and end up exceeding
# the spec.
if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
save_libobjs=$libobjs
fi
save_output=$output
output_la=`$echo "X$output" | $Xsed -e "$basename"`
# Clear the reloadable object creation command queue and
# initialize k to one.
test_cmds=
concat_cmds=
objlist=
delfiles=
last_robj=
k=1
output=$output_objdir/$output_la-${k}.$objext
# Loop over the list of objects to be linked.
for obj in $save_libobjs
do
eval test_cmds=\"$reload_cmds $objlist $last_robj\"
if test "X$objlist" = X ||
{ len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
test "$len" -le "$max_cmd_len"; }; then
objlist="$objlist $obj"
else
# The command $test_cmds is almost too long, add a
# command to the queue.
if test "$k" -eq 1 ; then
# The first file doesn't have a previous command to add.
eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
else
# All subsequent reloadable object files will link in
# the last one created.
eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
fi
last_robj=$output_objdir/$output_la-${k}.$objext
k=`expr $k + 1`
output=$output_objdir/$output_la-${k}.$objext
objlist=$obj
len=1
fi
done
# Handle the remaining objects by creating one last
# reloadable object file. All subsequent reloadable object
# files will link in the last one created.
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
if ${skipped_export-false}; then
$show "generating symbol list for \`$libname.la'"
export_symbols="$output_objdir/$libname.exp"
$run $rm $export_symbols
libobjs=$output
# Append the command to create the export file.
eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
fi
# Set up a command to remove the reloadable object files
# after they are used.
i=0
while test "$i" -lt "$k"
do
i=`expr $i + 1`
delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
done
$echo "creating a temporary reloadable object file: $output"
# Loop through the commands generated above and execute them.
save_ifs="$IFS"; IFS='~'
for cmd in $concat_cmds; do
IFS="$save_ifs"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
libobjs=$output
# Restore the value of output.
output=$save_output
if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
fi
# Expand the library linking commands again to reset the
# value of $libobjs for piecewise linking.
# Do each of the archive commands.
if test "$module" = yes && test -n "$module_cmds" ; then
if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
cmds=$module_expsym_cmds
else
cmds=$module_cmds
fi
else
if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
cmds=$archive_expsym_cmds
else
cmds=$archive_cmds
fi
fi
# Append the command to remove the reloadable object files
# to the just-reset $cmds.
eval cmds=\"\$cmds~\$rm $delfiles\"
fi
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || {
lt_exit=$?
# Restore the uninstalled library and exit
if test "$mode" = relink; then
$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
fi
exit $lt_exit
}
done
IFS="$save_ifs"
# Restore the uninstalled library and exit
if test "$mode" = relink; then
$run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
if test -n "$convenience"; then
if test -z "$whole_archive_flag_spec"; then
$show "${rm}r $gentop"
$run ${rm}r "$gentop"
fi
fi
exit $EXIT_SUCCESS
fi
# Create links to the real library.
for linkname in $linknames; do
if test "$realname" != "$linkname"; then
$show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
$run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
fi
done
# If -module or -export-dynamic was specified, set the dlname.
if test "$module" = yes || test "$export_dynamic" = yes; then
# On all known operating systems, these are identical.
dlname="$soname"
fi
fi
;;
obj)
if test -n "$deplibs"; then
$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
fi
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
fi
if test -n "$rpath"; then
$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
fi
if test -n "$xrpath"; then
$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
fi
if test -n "$vinfo"; then
$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
fi
if test -n "$release"; then
$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
fi
case $output in
*.lo)
if test -n "$objs$old_deplibs"; then
$echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
exit $EXIT_FAILURE
fi
libobj="$output"
obj=`$echo "X$output" | $Xsed -e "$lo2o"`
;;
*)
libobj=
obj="$output"
;;
esac
# Delete the old objects.
$run $rm $obj $libobj
# Objects from convenience libraries. This assumes
# single-version convenience libraries. Whenever we create
# different ones for PIC/non-PIC, this we'll have to duplicate
# the extraction.
reload_conv_objs=
gentop=
# reload_cmds runs $LD directly, so let us get rid of
# -Wl from whole_archive_flag_spec and hope we can get by with
# turning comma into space..
wl=
if test -n "$convenience"; then
if test -n "$whole_archive_flag_spec"; then
eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
else
gentop="$output_objdir/${obj}x"
generated="$generated $gentop"
func_extract_archives $gentop $convenience
reload_conv_objs="$reload_objs $func_extract_archives_result"
fi
fi
# Create the old-style object.
reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
output="$obj"
cmds=$reload_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
# Exit if we aren't doing a library object file.
if test -z "$libobj"; then
if test -n "$gentop"; then
$show "${rm}r $gentop"
$run ${rm}r $gentop
fi
exit $EXIT_SUCCESS
fi
if test "$build_libtool_libs" != yes; then
if test -n "$gentop"; then
$show "${rm}r $gentop"
$run ${rm}r $gentop
fi
# Create an invalid libtool object if no PIC, so that we don't
# accidentally link it into a program.
# $show "echo timestamp > $libobj"
# $run eval "echo timestamp > $libobj" || exit $?
exit $EXIT_SUCCESS
fi
if test -n "$pic_flag" || test "$pic_mode" != default; then
# Only do commands if we really have different PIC objects.
reload_objs="$libobjs $reload_conv_objs"
output="$libobj"
cmds=$reload_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
fi
if test -n "$gentop"; then
$show "${rm}r $gentop"
$run ${rm}r $gentop
fi
exit $EXIT_SUCCESS
;;
prog)
case $host in
*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
esac
if test -n "$vinfo"; then
$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
fi
if test -n "$release"; then
$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
fi
if test "$preload" = yes; then
if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
test "$dlopen_self_static" = unknown; then
$echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
fi
fi
case $host in
*-*-rhapsody* | *-*-darwin1.[012])
# On Rhapsody replace the C library is the System framework
compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
;;
esac
case $host in
*darwin*)
# Don't allow lazy linking, it breaks C++ global constructors
if test "$tagname" = CXX ; then
compile_command="$compile_command ${wl}-bind_at_load"
finalize_command="$finalize_command ${wl}-bind_at_load"
fi
;;
esac
# move library search paths that coincide with paths to not yet
# installed libraries to the beginning of the library search list
new_libs=
for path in $notinst_path; do
case " $new_libs " in
*" -L$path/$objdir "*) ;;
*)
case " $compile_deplibs " in
*" -L$path/$objdir "*)
new_libs="$new_libs -L$path/$objdir" ;;
esac
;;
esac
done
for deplib in $compile_deplibs; do
case $deplib in
-L*)
case " $new_libs " in
*" $deplib "*) ;;
*) new_libs="$new_libs $deplib" ;;
esac
;;
*) new_libs="$new_libs $deplib" ;;
esac
done
compile_deplibs="$new_libs"
compile_command="$compile_command $compile_deplibs"
finalize_command="$finalize_command $finalize_deplibs"
if test -n "$rpath$xrpath"; then
# If the user specified any rpath flags, then add them.
for libdir in $rpath $xrpath; do
# This is the magic to use -rpath.
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir" ;;
esac
done
fi
# Now hardcode the library paths
rpath=
hardcode_libdirs=
for libdir in $compile_rpath $finalize_rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
hardcode_libdirs="$libdir"
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
rpath="$rpath $flag"
fi
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
*) perm_rpath="$perm_rpath $libdir" ;;
esac
fi
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$libdir:"*) ;;
*) dllsearchpath="$dllsearchpath:$libdir";;
esac
case :$dllsearchpath: in
*":$testbindir:"*) ;;
*) dllsearchpath="$dllsearchpath:$testbindir";;
esac
;;
esac
done
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
libdir="$hardcode_libdirs"
eval rpath=\" $hardcode_libdir_flag_spec\"
fi
compile_rpath="$rpath"
rpath=
hardcode_libdirs=
for libdir in $finalize_rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
hardcode_libdirs="$libdir"
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
rpath="$rpath $flag"
fi
elif test -n "$runpath_var"; then
case "$finalize_perm_rpath " in
*" $libdir "*) ;;
*) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
esac
fi
done
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
libdir="$hardcode_libdirs"
eval rpath=\" $hardcode_libdir_flag_spec\"
fi
finalize_rpath="$rpath"
if test -n "$libobjs" && test "$build_old_libs" = yes; then
# Transform all the library objects into standard objects.
compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
fi
dlsyms=
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
if test -n "$NM" && test -n "$global_symbol_pipe"; then
dlsyms="${outputname}S.c"
else
$echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
fi
fi
if test -n "$dlsyms"; then
case $dlsyms in
"") ;;
*.c)
# Discover the nlist of each of the dlfiles.
nlist="$output_objdir/${outputname}.nm"
$show "$rm $nlist ${nlist}S ${nlist}T"
$run $rm "$nlist" "${nlist}S" "${nlist}T"
# Parse the name list into a source file.
$show "creating $output_objdir/$dlsyms"
test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
#ifdef __cplusplus
extern \"C\" {
#endif
/* Prevent the only kind of declaration conflicts we can make. */
#define lt_preloaded_symbols some_other_symbol
/* External symbol declarations for the compiler. */\
"
if test "$dlself" = yes; then
$show "generating symbol list for \`$output'"
test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
# Add our own program objects to the symbol list.
progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
for arg in $progfiles; do
$show "extracting global C symbols from \`$arg'"
$run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
done
if test -n "$exclude_expsyms"; then
$run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
$run eval '$mv "$nlist"T "$nlist"'
fi
if test -n "$export_symbols_regex"; then
$run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
$run eval '$mv "$nlist"T "$nlist"'
fi
# Prepare the list of exported symbols
if test -z "$export_symbols"; then
export_symbols="$output_objdir/$outputname.exp"
$run $rm $export_symbols
$run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
case $host in
*cygwin* | *mingw* )
$run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
;;
esac
else
$run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
$run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
$run eval 'mv "$nlist"T "$nlist"'
case $host in
*cygwin* | *mingw* )
$run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
;;
esac
fi
fi
for arg in $dlprefiles; do
$show "extracting global C symbols from \`$arg'"
name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
$run eval '$echo ": $name " >> "$nlist"'
$run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
done
if test -z "$run"; then
# Make sure we have at least an empty file.
test -f "$nlist" || : > "$nlist"
if test -n "$exclude_expsyms"; then
$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
$mv "$nlist"T "$nlist"
fi
# Try sorting and uniquifying the output.
if grep -v "^: " < "$nlist" |
if sort -k 3 /dev/null 2>&1; then
sort -k 3
else
sort +2
fi |
uniq > "$nlist"S; then
:
else
grep -v "^: " < "$nlist" > "$nlist"S
fi
if test -f "$nlist"S; then
eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
else
$echo '/* NONE */' >> "$output_objdir/$dlsyms"
fi
$echo >> "$output_objdir/$dlsyms" "\
#undef lt_preloaded_symbols
#if defined (__STDC__) && __STDC__
# define lt_ptr void *
#else
# define lt_ptr char *
# define const
#endif
/* The mapping between symbol names and symbols. */
"
case $host in
*cygwin* | *mingw* )
$echo >> "$output_objdir/$dlsyms" "\
/* DATA imports from DLLs on WIN32 can't be const, because
runtime relocations are performed -- see ld's documentation
on pseudo-relocs */
struct {
"
;;
* )
$echo >> "$output_objdir/$dlsyms" "\
const struct {
"
;;
esac
$echo >> "$output_objdir/$dlsyms" "\
const char *name;
lt_ptr address;
}
lt_preloaded_symbols[] =
{\
"
eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
$echo >> "$output_objdir/$dlsyms" "\
{0, (lt_ptr) 0}
};
/* This works around a problem in FreeBSD linker */
#ifdef FREEBSD_WORKAROUND
static const void *lt_preloaded_setup() {
return lt_preloaded_symbols;
}
#endif
#ifdef __cplusplus
}
#endif\
"
fi
pic_flag_for_symtable=
case $host in
# compiling the symbol table file with pic_flag works around
# a FreeBSD bug that causes programs to crash when -lm is
# linked before any other PIC object. But we must not use
# pic_flag when linking with -static. The problem exists in
# FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
*-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
case "$compile_command " in
*" -static "*) ;;
*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
esac;;
*-*-hpux*)
case "$compile_command " in
*" -static "*) ;;
*) pic_flag_for_symtable=" $pic_flag";;
esac
esac
# Now compile the dynamic symbol file.
$show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
$run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
# Clean up the generated files.
$show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
$run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
# Transform the symbol file into the correct name.
case $host in
*cygwin* | *mingw* )
if test -f "$output_objdir/${outputname}.def" ; then
compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
else
compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
fi
;;
* )
compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
;;
esac
;;
*)
$echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
exit $EXIT_FAILURE
;;
esac
else
# We keep going just in case the user didn't refer to
# lt_preloaded_symbols. The linker will fail if global_symbol_pipe
# really was required.
# Nullify the symbol file.
compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
fi
if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
# Replace the output file specification.
compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP`
link_command="$compile_command$compile_rpath"
# We have no uninstalled library dependencies, so finalize right now.
$show "$link_command"
$run eval "$link_command"
exit_status=$?
# Delete the generated files.
if test -n "$dlsyms"; then
$show "$rm $output_objdir/${outputname}S.${objext}"
$run $rm "$output_objdir/${outputname}S.${objext}"
fi
exit $exit_status
fi
if test -n "$shlibpath_var"; then
# We should set the shlibpath_var
rpath=
for dir in $temp_rpath; do
case $dir in
[\\/]* | [A-Za-z]:[\\/]*)
# Absolute path.
rpath="$rpath$dir:"
;;
*)
# Relative path: add a thisdir entry.
rpath="$rpath\$thisdir/$dir:"
;;
esac
done
temp_rpath="$rpath"
fi
if test -n "$compile_shlibpath$finalize_shlibpath"; then
compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
fi
if test -n "$finalize_shlibpath"; then
finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
fi
compile_var=
finalize_var=
if test -n "$runpath_var"; then
if test -n "$perm_rpath"; then
# We should set the runpath_var.
rpath=
for dir in $perm_rpath; do
rpath="$rpath$dir:"
done
compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
fi
if test -n "$finalize_perm_rpath"; then
# We should set the runpath_var.
rpath=
for dir in $finalize_perm_rpath; do
rpath="$rpath$dir:"
done
finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
fi
fi
if test "$no_install" = yes; then
# We don't need to create a wrapper script.
link_command="$compile_var$compile_command$compile_rpath"
# Replace the output file specification.
link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
# Delete the old output file.
$run $rm $output
# Link the executable and exit
$show "$link_command"
$run eval "$link_command" || exit $?
exit $EXIT_SUCCESS
fi
if test "$hardcode_action" = relink; then
# Fast installation is not supported
link_command="$compile_var$compile_command$compile_rpath"
relink_command="$finalize_var$finalize_command$finalize_rpath"
$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
$echo "$modename: \`$output' will be relinked during installation" 1>&2
else
if test "$fast_install" != no; then
link_command="$finalize_var$compile_command$finalize_rpath"
if test "$fast_install" = yes; then
relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP`
else
# fast_install is set to needless
relink_command=
fi
else
link_command="$compile_var$compile_command$compile_rpath"
relink_command="$finalize_var$finalize_command$finalize_rpath"
fi
fi
# Replace the output file specification.
link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
# Delete the old output files.
$run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
$show "$link_command"
$run eval "$link_command" || exit $?
# Now create the wrapper script.
$show "creating $output"
# Quote the relink command for shipping.
if test -n "$relink_command"; then
# Preserve any variables that may affect compiler behavior
for var in $variables_saved_for_relink; do
if eval test -z \"\${$var+set}\"; then
relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
relink_command="$var=\"$var_value\"; export $var; $relink_command"
fi
done
relink_command="(cd `pwd`; $relink_command)"
relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
fi
# Quote $echo for shipping.
if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
case $progpath in
[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
esac
qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
else
qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
fi
# Only actually do things if our run command is non-null.
if test -z "$run"; then
# win32 will think the script is a binary if it has
# a .exe suffix, so we strip it off here.
case $output in
*.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
esac
# test for cygwin because mv fails w/o .exe extensions
case $host in
*cygwin*)
exeext=.exe
outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
*) exeext= ;;
esac
case $host in
*cygwin* | *mingw* )
output_name=`basename $output`
output_path=`dirname $output`
cwrappersource="$output_path/$objdir/lt-$output_name.c"
cwrapper="$output_path/$output_name.exe"
$rm $cwrappersource $cwrapper
trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
cat > $cwrappersource <> $cwrappersource<<"EOF"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if defined(PATH_MAX)
# define LT_PATHMAX PATH_MAX
#elif defined(MAXPATHLEN)
# define LT_PATHMAX MAXPATHLEN
#else
# define LT_PATHMAX 1024
#endif
#ifndef DIR_SEPARATOR
# define DIR_SEPARATOR '/'
# define PATH_SEPARATOR ':'
#endif
#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
defined (__OS2__)
# define HAVE_DOS_BASED_FILE_SYSTEM
# ifndef DIR_SEPARATOR_2
# define DIR_SEPARATOR_2 '\\'
# endif
# ifndef PATH_SEPARATOR_2
# define PATH_SEPARATOR_2 ';'
# endif
#endif
#ifndef DIR_SEPARATOR_2
# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
#else /* DIR_SEPARATOR_2 */
# define IS_DIR_SEPARATOR(ch) \
(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
#endif /* DIR_SEPARATOR_2 */
#ifndef PATH_SEPARATOR_2
# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
#else /* PATH_SEPARATOR_2 */
# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
#endif /* PATH_SEPARATOR_2 */
#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
#define XFREE(stale) do { \
if (stale) { free ((void *) stale); stale = 0; } \
} while (0)
/* -DDEBUG is fairly common in CFLAGS. */
#undef DEBUG
#if defined DEBUGWRAPPER
# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
#else
# define DEBUG(format, ...)
#endif
const char *program_name = NULL;
void * xmalloc (size_t num);
char * xstrdup (const char *string);
const char * base_name (const char *name);
char * find_executable(const char *wrapper);
int check_executable(const char *path);
char * strendzap(char *str, const char *pat);
void lt_fatal (const char *message, ...);
int
main (int argc, char *argv[])
{
char **newargz;
int i;
program_name = (char *) xstrdup (base_name (argv[0]));
DEBUG("(main) argv[0] : %s\n",argv[0]);
DEBUG("(main) program_name : %s\n",program_name);
newargz = XMALLOC(char *, argc+2);
EOF
cat >> $cwrappersource <> $cwrappersource <<"EOF"
newargz[1] = find_executable(argv[0]);
if (newargz[1] == NULL)
lt_fatal("Couldn't find %s", argv[0]);
DEBUG("(main) found exe at : %s\n",newargz[1]);
/* we know the script has the same name, without the .exe */
/* so make sure newargz[1] doesn't end in .exe */
strendzap(newargz[1],".exe");
for (i = 1; i < argc; i++)
newargz[i+1] = xstrdup(argv[i]);
newargz[argc+1] = NULL;
for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF"
return 127;
}
void *
xmalloc (size_t num)
{
void * p = (void *) malloc (num);
if (!p)
lt_fatal ("Memory exhausted");
return p;
}
char *
xstrdup (const char *string)
{
return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
;
}
const char *
base_name (const char *name)
{
const char *base;
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
/* Skip over the disk name in MSDOS pathnames. */
if (isalpha ((unsigned char)name[0]) && name[1] == ':')
name += 2;
#endif
for (base = name; *name; name++)
if (IS_DIR_SEPARATOR (*name))
base = name + 1;
return base;
}
int
check_executable(const char * path)
{
struct stat st;
DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
if ((!path) || (!*path))
return 0;
if ((stat (path, &st) >= 0) &&
(
/* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
#if defined (S_IXOTH)
((st.st_mode & S_IXOTH) == S_IXOTH) ||
#endif
#if defined (S_IXGRP)
((st.st_mode & S_IXGRP) == S_IXGRP) ||
#endif
((st.st_mode & S_IXUSR) == S_IXUSR))
)
return 1;
else
return 0;
}
/* Searches for the full path of the wrapper. Returns
newly allocated full path name if found, NULL otherwise */
char *
find_executable (const char* wrapper)
{
int has_slash = 0;
const char* p;
const char* p_next;
/* static buffer for getcwd */
char tmp[LT_PATHMAX + 1];
int tmp_len;
char* concat_name;
DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
if ((wrapper == NULL) || (*wrapper == '\0'))
return NULL;
/* Absolute path? */
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
{
concat_name = xstrdup (wrapper);
if (check_executable(concat_name))
return concat_name;
XFREE(concat_name);
}
else
{
#endif
if (IS_DIR_SEPARATOR (wrapper[0]))
{
concat_name = xstrdup (wrapper);
if (check_executable(concat_name))
return concat_name;
XFREE(concat_name);
}
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
}
#endif
for (p = wrapper; *p; p++)
if (*p == '/')
{
has_slash = 1;
break;
}
if (!has_slash)
{
/* no slashes; search PATH */
const char* path = getenv ("PATH");
if (path != NULL)
{
for (p = path; *p; p = p_next)
{
const char* q;
size_t p_len;
for (q = p; *q; q++)
if (IS_PATH_SEPARATOR(*q))
break;
p_len = q - p;
p_next = (*q == '\0' ? q : q + 1);
if (p_len == 0)
{
/* empty path: current directory */
if (getcwd (tmp, LT_PATHMAX) == NULL)
lt_fatal ("getcwd failed");
tmp_len = strlen(tmp);
concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
memcpy (concat_name, tmp, tmp_len);
concat_name[tmp_len] = '/';
strcpy (concat_name + tmp_len + 1, wrapper);
}
else
{
concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
memcpy (concat_name, p, p_len);
concat_name[p_len] = '/';
strcpy (concat_name + p_len + 1, wrapper);
}
if (check_executable(concat_name))
return concat_name;
XFREE(concat_name);
}
}
/* not found in PATH; assume curdir */
}
/* Relative path | not found in path: prepend cwd */
if (getcwd (tmp, LT_PATHMAX) == NULL)
lt_fatal ("getcwd failed");
tmp_len = strlen(tmp);
concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
memcpy (concat_name, tmp, tmp_len);
concat_name[tmp_len] = '/';
strcpy (concat_name + tmp_len + 1, wrapper);
if (check_executable(concat_name))
return concat_name;
XFREE(concat_name);
return NULL;
}
char *
strendzap(char *str, const char *pat)
{
size_t len, patlen;
assert(str != NULL);
assert(pat != NULL);
len = strlen(str);
patlen = strlen(pat);
if (patlen <= len)
{
str += len - patlen;
if (strcmp(str, pat) == 0)
*str = '\0';
}
return str;
}
static void
lt_error_core (int exit_status, const char * mode,
const char * message, va_list ap)
{
fprintf (stderr, "%s: %s: ", program_name, mode);
vfprintf (stderr, message, ap);
fprintf (stderr, ".\n");
if (exit_status >= 0)
exit (exit_status);
}
void
lt_fatal (const char *message, ...)
{
va_list ap;
va_start (ap, message);
lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
va_end (ap);
}
EOF
# we should really use a build-platform specific compiler
# here, but OTOH, the wrappers (shell script and this C one)
# are only useful if you want to execute the "real" binary.
# Since the "real" binary is built for $host, then this
# wrapper might as well be built for $host, too.
$run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
;;
esac
$rm $output
trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
$echo > $output "\
#! $SHELL
# $output - temporary wrapper script for $objdir/$outputname
# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
#
# The $output program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
Xsed='${SED} -e 1s/^X//'
sed_quote_subst='$sed_quote_subst'
# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
else
case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
fi
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
relink_command=\"$relink_command\"
# This environment variable determines our operation mode.
if test \"\$libtool_install_magic\" = \"$magic\"; then
# install mode needs the following variable:
notinst_deplibs='$notinst_deplibs'
else
# When we are sourced in execute mode, \$file and \$echo are already set.
if test \"\$libtool_execute_magic\" != \"$magic\"; then
echo=\"$qecho\"
file=\"\$0\"
# Make sure echo works.
if test \"X\$1\" = X--no-reexec; then
# Discard the --no-reexec flag, and continue.
shift
elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
# Yippee, \$echo works!
:
else
# Restart under the correct shell, and then maybe \$echo will work.
exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
fi
fi\
"
$echo >> $output "\
# Find the directory that this script lives in.
thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
test \"x\$thisdir\" = \"x\$file\" && thisdir=.
# Follow symbolic links until we get to the real thisdir.
file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
while test -n \"\$file\"; do
destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
# If there was a directory component, then change thisdir.
if test \"x\$destdir\" != \"x\$file\"; then
case \"\$destdir\" in
[\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
*) thisdir=\"\$thisdir/\$destdir\" ;;
esac
fi
file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
done
# Try to get the absolute directory name.
absdir=\`cd \"\$thisdir\" && pwd\`
test -n \"\$absdir\" && thisdir=\"\$absdir\"
"
if test "$fast_install" = yes; then
$echo >> $output "\
program=lt-'$outputname'$exeext
progdir=\"\$thisdir/$objdir\"
if test ! -f \"\$progdir/\$program\" || \\
{ file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
test \"X\$file\" != \"X\$progdir/\$program\"; }; then
file=\"\$\$-\$program\"
if test ! -d \"\$progdir\"; then
$mkdir \"\$progdir\"
else
$rm \"\$progdir/\$file\"
fi"
$echo >> $output "\
# relink executable if necessary
if test -n \"\$relink_command\"; then
if relink_command_output=\`eval \$relink_command 2>&1\`; then :
else
$echo \"\$relink_command_output\" >&2
$rm \"\$progdir/\$file\"
exit $EXIT_FAILURE
fi
fi
$mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
{ $rm \"\$progdir/\$program\";
$mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
$rm \"\$progdir/\$file\"
fi"
else
$echo >> $output "\
program='$outputname'
progdir=\"\$thisdir/$objdir\"
"
fi
$echo >> $output "\
if test -f \"\$progdir/\$program\"; then"
# Export our shlibpath_var if we have one.
if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
$echo >> $output "\
# Add our own library path to $shlibpath_var
$shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
# Some systems cannot cope with colon-terminated $shlibpath_var
# The second colon is a workaround for a bug in BeOS R4 sed
$shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
export $shlibpath_var
"
fi
# fixup the dll searchpath if we need to.
if test -n "$dllsearchpath"; then
$echo >> $output "\
# Add the dll search path components to the executable PATH
PATH=$dllsearchpath:\$PATH
"
fi
$echo >> $output "\
if test \"\$libtool_execute_magic\" != \"$magic\"; then
# Run the actual program with our arguments.
"
case $host in
# Backslashes separate directories on plain windows
*-*-mingw | *-*-os2*)
$echo >> $output "\
exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
"
;;
*)
$echo >> $output "\
exec \"\$progdir/\$program\" \${1+\"\$@\"}
"
;;
esac
$echo >> $output "\
\$echo \"\$0: cannot exec \$program \$*\"
exit $EXIT_FAILURE
fi
else
# The program doesn't exist.
\$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
\$echo \"This script is just a wrapper for \$program.\" 1>&2
$echo \"See the $PACKAGE documentation for more information.\" 1>&2
exit $EXIT_FAILURE
fi
fi\
"
chmod +x $output
fi
exit $EXIT_SUCCESS
;;
esac
# See if we need to build an old-fashioned archive.
for oldlib in $oldlibs; do
if test "$build_libtool_libs" = convenience; then
oldobjs="$libobjs_save"
addlibs="$convenience"
build_libtool_libs=no
else
if test "$build_libtool_libs" = module; then
oldobjs="$libobjs_save"
build_libtool_libs=no
else
oldobjs="$old_deplibs $non_pic_objects"
fi
addlibs="$old_convenience"
fi
if test -n "$addlibs"; then
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
func_extract_archives $gentop $addlibs
oldobjs="$oldobjs $func_extract_archives_result"
fi
# Do each command in the archive commands.
if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
cmds=$old_archive_from_new_cmds
else
# POSIX demands no paths to be encoded in archives. We have
# to avoid creating archives with duplicate basenames if we
# might have to extract them afterwards, e.g., when creating a
# static archive out of a convenience library, or when linking
# the entirety of a libtool archive into another (currently
# not supported by libtool).
if (for obj in $oldobjs
do
$echo "X$obj" | $Xsed -e 's%^.*/%%'
done | sort | sort -uc >/dev/null 2>&1); then
:
else
$echo "copying selected object files to avoid basename conflicts..."
if test -z "$gentop"; then
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
$show "${rm}r $gentop"
$run ${rm}r "$gentop"
$show "$mkdir $gentop"
$run $mkdir "$gentop"
exit_status=$?
if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
exit $exit_status
fi
fi
save_oldobjs=$oldobjs
oldobjs=
counter=1
for obj in $save_oldobjs
do
objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
case " $oldobjs " in
" ") oldobjs=$obj ;;
*[\ /]"$objbase "*)
while :; do
# Make sure we don't pick an alternate name that also
# overlaps.
newobj=lt$counter-$objbase
counter=`expr $counter + 1`
case " $oldobjs " in
*[\ /]"$newobj "*) ;;
*) if test ! -f "$gentop/$newobj"; then break; fi ;;
esac
done
$show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
$run ln "$obj" "$gentop/$newobj" ||
$run cp "$obj" "$gentop/$newobj"
oldobjs="$oldobjs $gentop/$newobj"
;;
*) oldobjs="$oldobjs $obj" ;;
esac
done
fi
eval cmds=\"$old_archive_cmds\"
if len=`expr "X$cmds" : ".*"` &&
test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
cmds=$old_archive_cmds
else
# the command line is too long to link in one step, link in parts
$echo "using piecewise archive linking..."
save_RANLIB=$RANLIB
RANLIB=:
objlist=
concat_cmds=
save_oldobjs=$oldobjs
# Is there a better way of finding the last object in the list?
for obj in $save_oldobjs
do
last_oldobj=$obj
done
for obj in $save_oldobjs
do
oldobjs="$objlist $obj"
objlist="$objlist $obj"
eval test_cmds=\"$old_archive_cmds\"
if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
test "$len" -le "$max_cmd_len"; then
:
else
# the above command should be used before it gets too long
oldobjs=$objlist
if test "$obj" = "$last_oldobj" ; then
RANLIB=$save_RANLIB
fi
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
objlist=
fi
done
RANLIB=$save_RANLIB
oldobjs=$objlist
if test "X$oldobjs" = "X" ; then
eval cmds=\"\$concat_cmds\"
else
eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
fi
fi
fi
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
eval cmd=\"$cmd\"
IFS="$save_ifs"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
done
if test -n "$generated"; then
$show "${rm}r$generated"
$run ${rm}r$generated
fi
# Now create the libtool archive.
case $output in
*.la)
old_library=
test "$build_old_libs" = yes && old_library="$libname.$libext"
$show "creating $output"
# Preserve any variables that may affect compiler behavior
for var in $variables_saved_for_relink; do
if eval test -z \"\${$var+set}\"; then
relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
relink_command="$var=\"$var_value\"; export $var; $relink_command"
fi
done
# Quote the link command for shipping.
relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
if test "$hardcode_automatic" = yes ; then
relink_command=
fi
# Only create the output if not a dry run.
if test -z "$run"; then
for installed in no yes; do
if test "$installed" = yes; then
if test -z "$install_libdir"; then
break
fi
output="$output_objdir/$outputname"i
# Replace all uninstalled libtool libraries with the installed ones
newdependency_libs=
for deplib in $dependency_libs; do
case $deplib in
*.la)
name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
if test -z "$libdir"; then
$echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
exit $EXIT_FAILURE
fi
newdependency_libs="$newdependency_libs $libdir/$name"
;;
*) newdependency_libs="$newdependency_libs $deplib" ;;
esac
done
dependency_libs="$newdependency_libs"
newdlfiles=
for lib in $dlfiles; do
name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
if test -z "$libdir"; then
$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
exit $EXIT_FAILURE
fi
newdlfiles="$newdlfiles $libdir/$name"
done
dlfiles="$newdlfiles"
newdlprefiles=
for lib in $dlprefiles; do
name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
if test -z "$libdir"; then
$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
exit $EXIT_FAILURE
fi
newdlprefiles="$newdlprefiles $libdir/$name"
done
dlprefiles="$newdlprefiles"
else
newdlfiles=
for lib in $dlfiles; do
case $lib in
[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
*) abs=`pwd`"/$lib" ;;
esac
newdlfiles="$newdlfiles $abs"
done
dlfiles="$newdlfiles"
newdlprefiles=
for lib in $dlprefiles; do
case $lib in
[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
*) abs=`pwd`"/$lib" ;;
esac
newdlprefiles="$newdlprefiles $abs"
done
dlprefiles="$newdlprefiles"
fi
$rm $output
# place dlname in correct position for cygwin
tdlname=$dlname
case $host,$output,$installed,$module,$dlname in
*cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
esac
$echo > $output "\
# $outputname - a libtool library file
# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# The name that we can dlopen(3).
dlname='$tdlname'
# Names of this library.
library_names='$library_names'
# The name of the static archive.
old_library='$old_library'
# Libraries that this one depends upon.
dependency_libs='$dependency_libs'
# Version information for $libname.
current=$current
age=$age
revision=$revision
# Is this an already installed library?
installed=$installed
# Should we warn about portability when linking against -modules?
shouldnotlink=$module
# Files to dlopen/dlpreopen
dlopen='$dlfiles'
dlpreopen='$dlprefiles'
# Directory that this library needs to be installed in:
libdir='$install_libdir'"
if test "$installed" = no && test "$need_relink" = yes; then
$echo >> $output "\
relink_command=\"$relink_command\""
fi
done
fi
# Do a symbolic link so that the libtool archive can be found in
# LD_LIBRARY_PATH before the program is installed.
$show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
$run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
;;
esac
exit $EXIT_SUCCESS
;;
# libtool install mode
install)
modename="$modename: install"
# There may be an optional sh(1) argument at the beginning of
# install_prog (especially on Windows NT).
if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
# Allow the use of GNU shtool's install command.
$echo "X$nonopt" | grep shtool > /dev/null; then
# Aesthetically quote it.
arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
install_prog="$arg "
arg="$1"
shift
else
install_prog=
arg=$nonopt
fi
# The real first argument should be the name of the installation program.
# Aesthetically quote it.
arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
install_prog="$install_prog$arg"
# We need to accept at least all the BSD install flags.
dest=
files=
opts=
prev=
install_type=
isdir=no
stripme=
for arg
do
if test -n "$dest"; then
files="$files $dest"
dest=$arg
continue
fi
case $arg in
-d) isdir=yes ;;
-f)
case " $install_prog " in
*[\\\ /]cp\ *) ;;
*) prev=$arg ;;
esac
;;
-g | -m | -o) prev=$arg ;;
-s)
stripme=" -s"
continue
;;
-*)
;;
*)
# If the previous option needed an argument, then skip it.
if test -n "$prev"; then
prev=
else
dest=$arg
continue
fi
;;
esac
# Aesthetically quote the argument.
arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
case $arg in
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
arg="\"$arg\""
;;
esac
install_prog="$install_prog $arg"
done
if test -z "$install_prog"; then
$echo "$modename: you must specify an install program" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
if test -n "$prev"; then
$echo "$modename: the \`$prev' option requires an argument" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
if test -z "$files"; then
if test -z "$dest"; then
$echo "$modename: no file or destination specified" 1>&2
else
$echo "$modename: you must specify a destination" 1>&2
fi
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
# Strip any trailing slash from the destination.
dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
# Check to see that the destination is a directory.
test -d "$dest" && isdir=yes
if test "$isdir" = yes; then
destdir="$dest"
destname=
else
destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
test "X$destdir" = "X$dest" && destdir=.
destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
# Not a directory, so check to see that there is only one file specified.
set dummy $files
if test "$#" -gt 2; then
$echo "$modename: \`$dest' is not a directory" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
fi
case $destdir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
for file in $files; do
case $file in
*.lo) ;;
*)
$echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
;;
esac
done
;;
esac
# This variable tells wrapper scripts just to set variables rather
# than running their programs.
libtool_install_magic="$magic"
staticlibs=
future_libdirs=
current_libdirs=
for file in $files; do
# Do each installation.
case $file in
*.$libext)
# Do the static libraries later.
staticlibs="$staticlibs $file"
;;
*.la)
# Check to see that this really is a libtool archive.
if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
else
$echo "$modename: \`$file' is not a valid libtool archive" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
library_names=
old_library=
relink_command=
# If there is no directory component, then add one.
case $file in
*/* | *\\*) . $file ;;
*) . ./$file ;;
esac
# Add the libdir to current_libdirs if it is the destination.
if test "X$destdir" = "X$libdir"; then
case "$current_libdirs " in
*" $libdir "*) ;;
*) current_libdirs="$current_libdirs $libdir" ;;
esac
else
# Note the libdir as a future libdir.
case "$future_libdirs " in
*" $libdir "*) ;;
*) future_libdirs="$future_libdirs $libdir" ;;
esac
fi
dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
test "X$dir" = "X$file/" && dir=
dir="$dir$objdir"
if test -n "$relink_command"; then
# Determine the prefix the user has applied to our future dir.
inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
# Don't allow the user to place us outside of our expected
# location b/c this prevents finding dependent libraries that
# are installed to the same prefix.
# At present, this check doesn't affect windows .dll's that
# are installed into $libdir/../bin (currently, that works fine)
# but it's something to keep an eye on.
if test "$inst_prefix_dir" = "$destdir"; then
$echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
exit $EXIT_FAILURE
fi
if test -n "$inst_prefix_dir"; then
# Stick the inst_prefix_dir data into the link command.
relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP`
else
relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP`
fi
$echo "$modename: warning: relinking \`$file'" 1>&2
$show "$relink_command"
if $run eval "$relink_command"; then :
else
$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
exit $EXIT_FAILURE
fi
fi
# See the names of the shared library.
set dummy $library_names
if test -n "$2"; then
realname="$2"
shift
shift
srcname="$realname"
test -n "$relink_command" && srcname="$realname"T
# Install the shared library and build the symlinks.
$show "$install_prog $dir/$srcname $destdir/$realname"
$run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
if test -n "$stripme" && test -n "$striplib"; then
$show "$striplib $destdir/$realname"
$run eval "$striplib $destdir/$realname" || exit $?
fi
if test "$#" -gt 0; then
# Delete the old symlinks, and create new ones.
# Try `ln -sf' first, because the `ln' binary might depend on
# the symlink we replace! Solaris /bin/ln does not understand -f,
# so we also need to try rm && ln -s.
for linkname
do
if test "$linkname" != "$realname"; then
$show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
$run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
fi
done
fi
# Do each command in the postinstall commands.
lib="$destdir/$realname"
cmds=$postinstall_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || {
lt_exit=$?
# Restore the uninstalled library and exit
if test "$mode" = relink; then
$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
fi
exit $lt_exit
}
done
IFS="$save_ifs"
fi
# Install the pseudo-library for information purposes.
name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
instname="$dir/$name"i
$show "$install_prog $instname $destdir/$name"
$run eval "$install_prog $instname $destdir/$name" || exit $?
# Maybe install the static library, too.
test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
;;
*.lo)
# Install (i.e. copy) a libtool object.
# Figure out destination file name, if it wasn't already specified.
if test -n "$destname"; then
destfile="$destdir/$destname"
else
destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
destfile="$destdir/$destfile"
fi
# Deduce the name of the destination old-style object file.
case $destfile in
*.lo)
staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
;;
*.$objext)
staticdest="$destfile"
destfile=
;;
*)
$echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
;;
esac
# Install the libtool object if requested.
if test -n "$destfile"; then
$show "$install_prog $file $destfile"
$run eval "$install_prog $file $destfile" || exit $?
fi
# Install the old object if enabled.
if test "$build_old_libs" = yes; then
# Deduce the name of the old-style object file.
staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
$show "$install_prog $staticobj $staticdest"
$run eval "$install_prog \$staticobj \$staticdest" || exit $?
fi
exit $EXIT_SUCCESS
;;
*)
# Figure out destination file name, if it wasn't already specified.
if test -n "$destname"; then
destfile="$destdir/$destname"
else
destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
destfile="$destdir/$destfile"
fi
# If the file is missing, and there is a .exe on the end, strip it
# because it is most likely a libtool script we actually want to
# install
stripped_ext=""
case $file in
*.exe)
if test ! -f "$file"; then
file=`$echo $file|${SED} 's,.exe$,,'`
stripped_ext=".exe"
fi
;;
esac
# Do a test to see if this is really a libtool program.
case $host in
*cygwin*|*mingw*)
wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
;;
*)
wrapper=$file
;;
esac
if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
notinst_deplibs=
relink_command=
# Note that it is not necessary on cygwin/mingw to append a dot to
# foo even if both foo and FILE.exe exist: automatic-append-.exe
# behavior happens only for exec(3), not for open(2)! Also, sourcing
# `FILE.' does not work on cygwin managed mounts.
#
# If there is no directory component, then add one.
case $wrapper in
*/* | *\\*) . ${wrapper} ;;
*) . ./${wrapper} ;;
esac
# Check the variables that should have been set.
if test -z "$notinst_deplibs"; then
$echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
exit $EXIT_FAILURE
fi
finalize=yes
for lib in $notinst_deplibs; do
# Check to see that each library is installed.
libdir=
if test -f "$lib"; then
# If there is no directory component, then add one.
case $lib in
*/* | *\\*) . $lib ;;
*) . ./$lib ;;
esac
fi
libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
if test -n "$libdir" && test ! -f "$libfile"; then
$echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
finalize=no
fi
done
relink_command=
# Note that it is not necessary on cygwin/mingw to append a dot to
# foo even if both foo and FILE.exe exist: automatic-append-.exe
# behavior happens only for exec(3), not for open(2)! Also, sourcing
# `FILE.' does not work on cygwin managed mounts.
#
# If there is no directory component, then add one.
case $wrapper in
*/* | *\\*) . ${wrapper} ;;
*) . ./${wrapper} ;;
esac
outputname=
if test "$fast_install" = no && test -n "$relink_command"; then
if test "$finalize" = yes && test -z "$run"; then
tmpdir=`func_mktempdir`
file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
outputname="$tmpdir/$file"
# Replace the output file specification.
relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP`
$show "$relink_command"
if $run eval "$relink_command"; then :
else
$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
${rm}r "$tmpdir"
continue
fi
file="$outputname"
else
$echo "$modename: warning: cannot relink \`$file'" 1>&2
fi
else
# Install the binary that we compiled earlier.
file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
fi
fi
# remove .exe since cygwin /usr/bin/install will append another
# one anyway
case $install_prog,$host in
*/usr/bin/install*,*cygwin*)
case $file:$destfile in
*.exe:*.exe)
# this is ok
;;
*.exe:*)
destfile=$destfile.exe
;;
*:*.exe)
destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
;;
esac
;;
esac
$show "$install_prog$stripme $file $destfile"
$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
test -n "$outputname" && ${rm}r "$tmpdir"
;;
esac
done
for file in $staticlibs; do
name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
# Set up the ranlib parameters.
oldlib="$destdir/$name"
$show "$install_prog $file $oldlib"
$run eval "$install_prog \$file \$oldlib" || exit $?
if test -n "$stripme" && test -n "$old_striplib"; then
$show "$old_striplib $oldlib"
$run eval "$old_striplib $oldlib" || exit $?
fi
# Do each command in the postinstall commands.
cmds=$old_postinstall_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
done
if test -n "$future_libdirs"; then
$echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
fi
if test -n "$current_libdirs"; then
# Maybe just do a dry run.
test -n "$run" && current_libdirs=" -n$current_libdirs"
exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
else
exit $EXIT_SUCCESS
fi
;;
# libtool finish mode
finish)
modename="$modename: finish"
libdirs="$nonopt"
admincmds=
if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
for dir
do
libdirs="$libdirs $dir"
done
for libdir in $libdirs; do
if test -n "$finish_cmds"; then
# Do each command in the finish commands.
cmds=$finish_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd" || admincmds="$admincmds
$cmd"
done
IFS="$save_ifs"
fi
if test -n "$finish_eval"; then
# Do the single finish_eval.
eval cmds=\"$finish_eval\"
$run eval "$cmds" || admincmds="$admincmds
$cmds"
fi
done
fi
# Exit here if they wanted silent mode.
test "$show" = : && exit $EXIT_SUCCESS
$echo "X----------------------------------------------------------------------" | $Xsed
$echo "Libraries have been installed in:"
for libdir in $libdirs; do
$echo " $libdir"
done
$echo
$echo "If you ever happen to want to link against installed libraries"
$echo "in a given directory, LIBDIR, you must either use libtool, and"
$echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
$echo "flag during linking and do at least one of the following:"
if test -n "$shlibpath_var"; then
$echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
$echo " during execution"
fi
if test -n "$runpath_var"; then
$echo " - add LIBDIR to the \`$runpath_var' environment variable"
$echo " during linking"
fi
if test -n "$hardcode_libdir_flag_spec"; then
libdir=LIBDIR
eval flag=\"$hardcode_libdir_flag_spec\"
$echo " - use the \`$flag' linker flag"
fi
if test -n "$admincmds"; then
$echo " - have your system administrator run these commands:$admincmds"
fi
if test -f /etc/ld.so.conf; then
$echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
fi
$echo
$echo "See any operating system documentation about shared libraries for"
$echo "more information, such as the ld(1) and ld.so(8) manual pages."
$echo "X----------------------------------------------------------------------" | $Xsed
exit $EXIT_SUCCESS
;;
# libtool execute mode
execute)
modename="$modename: execute"
# The first argument is the command name.
cmd="$nonopt"
if test -z "$cmd"; then
$echo "$modename: you must specify a COMMAND" 1>&2
$echo "$help"
exit $EXIT_FAILURE
fi
# Handle -dlopen flags immediately.
for file in $execute_dlfiles; do
if test ! -f "$file"; then
$echo "$modename: \`$file' is not a file" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
dir=
case $file in
*.la)
# Check to see that this really is a libtool archive.
if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
else
$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
# Read the libtool library.
dlname=
library_names=
# If there is no directory component, then add one.
case $file in
*/* | *\\*) . $file ;;
*) . ./$file ;;
esac
# Skip this library if it cannot be dlopened.
if test -z "$dlname"; then
# Warn if it was a shared library.
test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
continue
fi
dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
test "X$dir" = "X$file" && dir=.
if test -f "$dir/$objdir/$dlname"; then
dir="$dir/$objdir"
else
$echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
exit $EXIT_FAILURE
fi
;;
*.lo)
# Just add the directory containing the .lo file.
dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
test "X$dir" = "X$file" && dir=.
;;
*)
$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
continue
;;
esac
# Get the absolute pathname.
absdir=`cd "$dir" && pwd`
test -n "$absdir" && dir="$absdir"
# Now add the directory to shlibpath_var.
if eval "test -z \"\$$shlibpath_var\""; then
eval "$shlibpath_var=\"\$dir\""
else
eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
fi
done
# This variable tells wrapper scripts just to set shlibpath_var
# rather than running their programs.
libtool_execute_magic="$magic"
# Check if any of the arguments is a wrapper script.
args=
for file
do
case $file in
-*) ;;
*)
# Do a test to see if this is really a libtool program.
if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
# If there is no directory component, then add one.
case $file in
*/* | *\\*) . $file ;;
*) . ./$file ;;
esac
# Transform arg to wrapped name.
file="$progdir/$program"
fi
;;
esac
# Quote arguments (to preserve shell metacharacters).
file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
args="$args \"$file\""
done
if test -z "$run"; then
if test -n "$shlibpath_var"; then
# Export the shlibpath_var.
eval "export $shlibpath_var"
fi
# Restore saved environment variables
for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
do
eval "if test \"\${save_$lt_var+set}\" = set; then
$lt_var=\$save_$lt_var; export $lt_var
else
$lt_unset $lt_var
fi"
done
# Now prepare to actually exec the command.
exec_cmd="\$cmd$args"
else
# Display what would be done.
if test -n "$shlibpath_var"; then
eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
$echo "export $shlibpath_var"
fi
$echo "$cmd$args"
exit $EXIT_SUCCESS
fi
;;
# libtool clean and uninstall mode
clean | uninstall)
modename="$modename: $mode"
rm="$nonopt"
files=
rmforce=
exit_status=0
# This variable tells wrapper scripts just to set variables rather
# than running their programs.
libtool_install_magic="$magic"
for arg
do
case $arg in
-f) rm="$rm $arg"; rmforce=yes ;;
-*) rm="$rm $arg" ;;
*) files="$files $arg" ;;
esac
done
if test -z "$rm"; then
$echo "$modename: you must specify an RM program" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
fi
rmdirs=
origobjdir="$objdir"
for file in $files; do
dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
if test "X$dir" = "X$file"; then
dir=.
objdir="$origobjdir"
else
objdir="$dir/$origobjdir"
fi
name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
test "$mode" = uninstall && objdir="$dir"
# Remember objdir for removal later, being careful to avoid duplicates
if test "$mode" = clean; then
case " $rmdirs " in
*" $objdir "*) ;;
*) rmdirs="$rmdirs $objdir" ;;
esac
fi
# Don't error if the file doesn't exist and rm -f was used.
if (test -L "$file") >/dev/null 2>&1 \
|| (test -h "$file") >/dev/null 2>&1 \
|| test -f "$file"; then
:
elif test -d "$file"; then
exit_status=1
continue
elif test "$rmforce" = yes; then
continue
fi
rmfiles="$file"
case $name in
*.la)
# Possibly a libtool archive, so verify it.
if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
. $dir/$name
# Delete the libtool libraries and symlinks.
for n in $library_names; do
rmfiles="$rmfiles $objdir/$n"
done
test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
case "$mode" in
clean)
case " $library_names " in
# " " in the beginning catches empty $dlname
*" $dlname "*) ;;
*) rmfiles="$rmfiles $objdir/$dlname" ;;
esac
test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
;;
uninstall)
if test -n "$library_names"; then
# Do each command in the postuninstall commands.
cmds=$postuninstall_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd"
if test "$?" -ne 0 && test "$rmforce" != yes; then
exit_status=1
fi
done
IFS="$save_ifs"
fi
if test -n "$old_library"; then
# Do each command in the old_postuninstall commands.
cmds=$old_postuninstall_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$show "$cmd"
$run eval "$cmd"
if test "$?" -ne 0 && test "$rmforce" != yes; then
exit_status=1
fi
done
IFS="$save_ifs"
fi
# FIXME: should reinstall the best remaining shared library.
;;
esac
fi
;;
*.lo)
# Possibly a libtool object, so verify it.
if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
# Read the .lo file
. $dir/$name
# Add PIC object to the list of files to remove.
if test -n "$pic_object" \
&& test "$pic_object" != none; then
rmfiles="$rmfiles $dir/$pic_object"
fi
# Add non-PIC object to the list of files to remove.
if test -n "$non_pic_object" \
&& test "$non_pic_object" != none; then
rmfiles="$rmfiles $dir/$non_pic_object"
fi
fi
;;
*)
if test "$mode" = clean ; then
noexename=$name
case $file in
*.exe)
file=`$echo $file|${SED} 's,.exe$,,'`
noexename=`$echo $name|${SED} 's,.exe$,,'`
# $file with .exe has already been added to rmfiles,
# add $file without .exe
rmfiles="$rmfiles $file"
;;
esac
# Do a test to see if this is a libtool program.
if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
relink_command=
. $dir/$noexename
# note $name still contains .exe if it was in $file originally
# as does the version of $file that was added into $rmfiles
rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
if test "$fast_install" = yes && test -n "$relink_command"; then
rmfiles="$rmfiles $objdir/lt-$name"
fi
if test "X$noexename" != "X$name" ; then
rmfiles="$rmfiles $objdir/lt-${noexename}.c"
fi
fi
fi
;;
esac
$show "$rm $rmfiles"
$run $rm $rmfiles || exit_status=1
done
objdir="$origobjdir"
# Try to remove the ${objdir}s in the directories where we deleted files
for dir in $rmdirs; do
if test -d "$dir"; then
$show "rmdir $dir"
$run rmdir $dir >/dev/null 2>&1
fi
done
exit $exit_status
;;
"")
$echo "$modename: you must specify a MODE" 1>&2
$echo "$generic_help" 1>&2
exit $EXIT_FAILURE
;;
esac
if test -z "$exec_cmd"; then
$echo "$modename: invalid operation mode \`$mode'" 1>&2
$echo "$generic_help" 1>&2
exit $EXIT_FAILURE
fi
fi # test -z "$show_help"
if test -n "$exec_cmd"; then
eval exec $exec_cmd
exit $EXIT_FAILURE
fi
# We need to display help for each of the modes.
case $mode in
"") $echo \
"Usage: $modename [OPTION]... [MODE-ARG]...
Provide generalized library-building support services.
--config show all configuration variables
--debug enable verbose shell tracing
-n, --dry-run display commands without modifying any files
--features display basic configuration information and exit
--finish same as \`--mode=finish'
--help display this help message and exit
--mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
--quiet same as \`--silent'
--silent don't print informational messages
--tag=TAG use configuration variables from tag TAG
--version print version information
MODE must be one of the following:
clean remove files from the build directory
compile compile a source file into a libtool object
execute automatically set library path, then run a program
finish complete the installation of libtool libraries
install install libraries or executables
link create a library or an executable
uninstall remove libraries from an installed directory
MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
a more detailed description of MODE.
Report bugs to ."
exit $EXIT_SUCCESS
;;
clean)
$echo \
"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
Remove files from the build directory.
RM is the name of the program to use to delete files associated with each FILE
(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
to RM.
If FILE is a libtool library, object or program, all the files associated
with it are deleted. Otherwise, only FILE itself is deleted using RM."
;;
compile)
$echo \
"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
Compile a source file into a libtool library object.
This mode accepts the following additional options:
-o OUTPUT-FILE set the output file name to OUTPUT-FILE
-prefer-pic try to building PIC objects only
-prefer-non-pic try to building non-PIC objects only
-static always build a \`.o' file suitable for static linking
COMPILE-COMMAND is a command to be used in creating a \`standard' object file
from the given SOURCEFILE.
The output file name is determined by removing the directory component from
SOURCEFILE, then substituting the C source code suffix \`.c' with the
library object suffix, \`.lo'."
;;
execute)
$echo \
"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
Automatically set library path, then run a program.
This mode accepts the following additional options:
-dlopen FILE add the directory containing FILE to the library path
This mode sets the library path environment variable according to \`-dlopen'
flags.
If any of the ARGS are libtool executable wrappers, then they are translated
into their corresponding uninstalled binary, and any of their required library
directories are added to the library path.
Then, COMMAND is executed, with ARGS as arguments."
;;
finish)
$echo \
"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
Complete the installation of libtool libraries.
Each LIBDIR is a directory that contains libtool libraries.
The commands that this mode executes may require superuser privileges. Use
the \`--dry-run' option if you just want to see what would be executed."
;;
install)
$echo \
"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
Install executables or libraries.
INSTALL-COMMAND is the installation command. The first component should be
either the \`install' or \`cp' program.
The rest of the components are interpreted as arguments to that command (only
BSD-compatible install options are recognized)."
;;
link)
$echo \
"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
Link object files or libraries together to form another library, or to
create an executable program.
LINK-COMMAND is a command using the C compiler that you would use to create
a program from several object files.
The following components of LINK-COMMAND are treated specially:
-all-static do not do any dynamic linking at all
-avoid-version do not add a version suffix if possible
-dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
-dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
-export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-export-symbols SYMFILE
try to export only the symbols listed in SYMFILE
-export-symbols-regex REGEX
try to export only the symbols matching REGEX
-LLIBDIR search LIBDIR for required installed libraries
-lNAME OUTPUT-FILE requires the installed library libNAME
-module build a library that can dlopened
-no-fast-install disable the fast-install mode
-no-install link a not-installable executable
-no-undefined declare that a library does not refer to external symbols
-o OUTPUT-FILE create OUTPUT-FILE from the specified objects
-objectlist FILE Use a list of object files found in FILE to specify objects
-precious-files-regex REGEX
don't remove output files matching REGEX
-release RELEASE specify package release information
-rpath LIBDIR the created library will eventually be installed in LIBDIR
-R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
-static do not do any dynamic linking of uninstalled libtool libraries
-static-libtool-libs
do not do any dynamic linking of libtool libraries
-version-info CURRENT[:REVISION[:AGE]]
specify library version info [each variable defaults to 0]
All other options (arguments beginning with \`-') are ignored.
Every other argument is treated as a filename. Files ending in \`.la' are
treated as uninstalled libtool libraries, other files are standard or library
object files.
If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
only library objects (\`.lo' files) may be specified, and \`-rpath' is
required, except when creating a convenience library.
If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
using \`ar' and \`ranlib', or on Windows using \`lib'.
If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
is created, otherwise an executable program is created."
;;
uninstall)
$echo \
"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
Remove libraries from an installation directory.
RM is the name of the program to use to delete files associated with each FILE
(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
to RM.
If FILE is a libtool library, all the files associated with it are deleted.
Otherwise, only FILE itself is deleted using RM."
;;
*)
$echo "$modename: invalid operation mode \`$mode'" 1>&2
$echo "$help" 1>&2
exit $EXIT_FAILURE
;;
esac
$echo
$echo "Try \`$modename --help' for more information about other modes."
exit $?
# The TAGs below are defined such that we never get into a situation
# in which we disable both kinds of libraries. Given conflicting
# choices, we go for a static library, that is the most portable,
# since we can't tell whether shared libraries were disabled because
# the user asked for that or because the platform doesn't support
# them. This is particularly important on AIX, because we don't
# support having both static and shared libraries enabled at the same
# time on that platform, so we default to a shared-only configuration.
# If a disable-shared tag is given, we'll fallback to a static-only
# configuration. But we'll never go from static-only to shared-only.
# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
disable_libs=shared
# ### END LIBTOOL TAG CONFIG: disable-shared
# ### BEGIN LIBTOOL TAG CONFIG: disable-static
disable_libs=static
# ### END LIBTOOL TAG CONFIG: disable-static
# Local Variables:
# mode:shell-script
# sh-indentation:2
# End:
globus_ftp_control-4.7/globus_ftp_control_server.c 0000666 0000764 0000764 00000406356 11522621135 017677 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file globus_ftp_control_server.c
*
* FTP Server-side Control Connection Management.
*/
#include "globus_ftp_control.h"
#include "globus_i_ftp_control.h"
#include
#include
/* Local variable declarations */
static globus_list_t * globus_l_ftp_server_handle_list=GLOBUS_NULL;
static globus_mutex_t globus_l_ftp_server_handle_list_mutex;
static globus_hashtable_t globus_l_ftp_control_parse_table;
#ifndef GLOBUS_SEPARATE_DOCS
typedef globus_result_t (*globus_l_ftp_control_parse_command_t)(
globus_ftp_control_command_t * command);
typedef struct globus_ftp_l_command_hash_entry_s
{
globus_l_ftp_control_parse_command_t parse_func;
globus_ftp_control_command_code_t code;
}
globus_ftp_l_command_hash_entry_t;
static void
globus_l_ftp_control_listen_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result);
static void
globus_l_ftp_control_accept_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result);
static void
globus_l_ftp_control_stop_server_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result);
static void
globus_l_ftp_control_read_command_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
static void
globus_l_ftp_control_send_response_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
static void
globus_l_ftp_control_auth_write_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
static void
globus_l_ftp_control_auth_read_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes);
globus_result_t globus_l_ftp_control_parse_sbuf_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_allo_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_port_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_spor_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_type_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_stru_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_auth_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_mode_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_opts_cmd(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_string_arg(
globus_ftp_control_command_t * command);
globus_result_t globus_l_ftp_control_parse_no_arg(
globus_ftp_control_command_t * command);
#endif
/*
* Hardcoded replies used int the accept/authentication process
*/
const char * globus_i_ftp_server_220_reply=
"220 Service ready for new user.\r\n";
const char * globus_i_ftp_server_235_reply=
"235 GSSAPI Authentication succeeded\r\n";
const char * globus_i_ftp_server_331_reply=
"331 User name okay, need password.\r\n";
const char * globus_i_ftp_server_332_reply=
"332 Need account for login.\r\n";
const char * globus_i_ftp_server_334_reply=
"334 Using authentication type GSSAPI; ADAT must follow.\r\n";
/**
* Initialize a globus ftp server handle
*
* This function will set up (i.e. intialize all mutexes and
* variables) a globus ftp server handle. It will also enter the
* handle in a list used by the module activation/deactivation functions.
*
* @param handle
* The handle to initialize.
* @return
* - GLOBUS_SUCCESS
* - invalid handle
*/
globus_result_t
globus_ftp_control_server_handle_init(
globus_ftp_control_server_t * handle)
{
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_handle_init: handle argument is NULL"))
);
}
handle->state=GLOBUS_FTP_CONTROL_SERVER_DEAF;
handle->callback=GLOBUS_NULL;
handle->callback_arg=GLOBUS_NULL;
globus_mutex_init(&(handle->mutex),GLOBUS_NULL);
globus_mutex_lock(&globus_l_ftp_server_handle_list_mutex);
{
globus_list_insert(&globus_l_ftp_server_handle_list,
handle);
handle->list_elem=globus_l_ftp_server_handle_list;
}
globus_mutex_unlock(&globus_l_ftp_server_handle_list_mutex);
return GLOBUS_SUCCESS;
}
/**
* Destroy a globus ftp server handle
*
* This function will free up all dynamicly allocated memory
* associated with a given globus ftp server handle. It will also
* remove the handle from a list used by the module activation/deactivation
* functions. This function should only be called after a call to
* globus_ftp_control_server_stop.
*
* @param handle
* The handle to destory.
* @return
* - success
* - invalid handle
* - handle is still in listening state
*/
globus_result_t
globus_ftp_control_server_handle_destroy(
globus_ftp_control_server_t * handle)
{
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_handle_destroy: handle argument is NULL"))
);
}
if(handle->state ==
GLOBUS_FTP_CONTROL_SERVER_LISTENING)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_handle_destroy: handle is still listening"))
);
}
globus_mutex_lock(&globus_l_ftp_server_handle_list_mutex);
{
globus_mutex_destroy(&(handle->mutex));
globus_list_remove(&globus_l_ftp_server_handle_list,
handle->list_elem);
}
globus_mutex_unlock(&globus_l_ftp_server_handle_list_mutex);
handle->callback=GLOBUS_NULL;
handle->callback_arg=GLOBUS_NULL;
return GLOBUS_SUCCESS;
}
/**
* Start listening on a given port for FTP client connections.
*
* This function starts the listening on *port for connections
* from ftp clients. When a connection request is made callback is
* called and passed callback_arg. Upon return from this function
* the server_handle structure is initialized.
*
* @param server_handle
* A pointer to a initialized server handle.
* @param port
* A pointer to the port to listen on. If the initial value
* is zero it will be set to the default value.
* @param callback
* The callback function called when connection requests
* are made.
* @param callback_arg
* The user argument passed to the callback function when
* connection requests are made.
*
* @note I'm not providing any mechanism for making sure that this
* function is only called once. Is this needed?
*/
globus_result_t
globus_ftp_control_server_listen(
globus_ftp_control_server_t * server_handle,
unsigned short * port,
globus_ftp_control_server_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
int backlog;
globus_io_attr_t attr;
if(server_handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_listen: handle argument is NULL"))
);
}
if(port == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_listen: port argument is NULL"))
);
}
if(callback == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_listen: Argument callback is NULL"))
);
}
globus_mutex_lock(&(server_handle->mutex));
{
if(server_handle->callback == GLOBUS_NULL)
{
server_handle->callback=callback;
server_handle->callback_arg=callback_arg;
}
else
{
globus_mutex_unlock(&(server_handle->mutex));
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_listen: Other operation already in progress"))
);
}
}
globus_mutex_unlock(&(server_handle->mutex));
backlog=-1;
globus_io_tcpattr_init(&attr);
globus_io_attr_set_socket_oobinline(&attr, GLOBUS_TRUE);
globus_io_attr_set_tcp_nodelay(&attr,
GLOBUS_TRUE);
rc=globus_io_tcp_create_listener(port,
backlog,
&attr,
&server_handle->io_handle);
if(rc != GLOBUS_SUCCESS)
{
return rc;
}
globus_mutex_lock(&(server_handle->mutex));
{
server_handle->state=GLOBUS_FTP_CONTROL_SERVER_LISTENING;
}
globus_mutex_unlock(&(server_handle->mutex));
rc=globus_io_tcp_register_listen(&server_handle->io_handle,
globus_l_ftp_control_listen_cb,
(void *) server_handle);
if(rc != GLOBUS_SUCCESS)
{
return rc;
}
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_tcp_register_listen function.
*
* This is a internal callback used with the
* globus_io_tcp_register_listen function, which in this library is
* used for detecting connections to a listening "server" socket.
* If this function is called with a successful result the correct
* user callback is called, followed by another call to
* globus_io_tcp_register_listen.
*
* @param arg
* The callback argument.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the listen operation
*
* @return void
*
* @note If a error is detected in this function the user callback is
* called with an appropriate error object and the function
* returns.
*/
#endif
static void
globus_l_ftp_control_listen_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_object_t * error;
globus_ftp_control_server_t * server_handle;
globus_result_t rc;
server_handle=(globus_ftp_control_server_t *) arg;
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
(server_handle->callback)(server_handle->callback_arg,
server_handle,
error);
globus_object_free(error);
return;
}
(server_handle->callback)(server_handle->callback_arg,
server_handle,
GLOBUS_NULL);
rc=globus_io_tcp_register_listen(&server_handle->io_handle,
globus_l_ftp_control_listen_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
(server_handle->callback)(server_handle->callback_arg,
server_handle,
error);
globus_object_free(error);
return;
}
return;
}
/**
* Initialize a command structure.
*
* This function initializes a command structure based on a null
* terminated string representing one line of input from the
* client. The command structure is used as a convience to determine
* what command the client issued. This function parses a command
* string sent by a client and populates the command argument
* appropriately. In the GSSAPI case it will also decode and unwrap
* the command before parsing it.
*
* @param command
* A pointer to the command structure to be initialized
* @param raw_command
* A null terminated line of client input. Should contain one
* command.
* @param auth_info
* Authentication information needed for unwrapping a command
*
*/
globus_result_t
globus_ftp_control_command_init(
globus_ftp_control_command_t * command,
char * raw_command,
globus_ftp_control_auth_info_t * auth_info)
{
int i;
int j;
int length;
char cmd[5];
char * decoded_cmd = GLOBUS_NULL;
globus_result_t rc;
globus_ftp_l_command_hash_entry_t * command_hash_entry;
length=strlen(raw_command);
command->noop.raw_command=
(char *) globus_libc_malloc(length+1);
command->noop.string_arg = NULL;
if(command->noop.raw_command == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_init: malloc failed")));
}
j=0;
for(i=0;inoop.raw_command[j]=raw_command[i];
j++;
}
}
command->noop.raw_command[j]='\0';
if(auth_info->authenticated == GLOBUS_TRUE)
{
rc=globus_i_ftp_control_decode_command(command->noop.raw_command,
&decoded_cmd,
auth_info);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(command->noop.raw_command);
return rc;
}
}
if(decoded_cmd != GLOBUS_NULL)
{
globus_libc_free(command->noop.raw_command);
command->noop.raw_command = decoded_cmd;
}
/* convert command to upper case */
cmd[0]='\0';
sscanf(command->noop.raw_command,"%4s",cmd);
i=0;
while(cmd[i] != '\0')
{
cmd[i]=toupper(cmd[i]);
i++;
}
command_hash_entry = (globus_ftp_l_command_hash_entry_t *)
globus_hashtable_lookup(&globus_l_ftp_control_parse_table,
(void *) cmd);
if(command_hash_entry != GLOBUS_NULL)
{
command->code = command_hash_entry->code;
rc = command_hash_entry->parse_func(command);
}
else
{
command->code = GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
rc = GLOBUS_SUCCESS;
}
return rc;
}
/**
* Destroy a command structure.
*
* This function frees up the memory allocated to the command
* argument.
*
* @param command
* The command structure whose associated memory is to be freed
*
*/
globus_result_t
globus_ftp_control_command_destroy(
globus_ftp_control_command_t * command)
{
if(command == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_destroy: command argument is NULL"))
);
}
globus_libc_free(command->noop.raw_command);
switch(command->code)
{
case GLOBUS_FTP_CONTROL_COMMAND_SITE:
case GLOBUS_FTP_CONTROL_COMMAND_DELE:
case GLOBUS_FTP_CONTROL_COMMAND_RMD:
case GLOBUS_FTP_CONTROL_COMMAND_MKD:
case GLOBUS_FTP_CONTROL_COMMAND_NLST:
case GLOBUS_FTP_CONTROL_COMMAND_HELP:
case GLOBUS_FTP_CONTROL_COMMAND_STAT:
case GLOBUS_FTP_CONTROL_COMMAND_STOU:
case GLOBUS_FTP_CONTROL_COMMAND_ACCT:
case GLOBUS_FTP_CONTROL_COMMAND_CWD:
case GLOBUS_FTP_CONTROL_COMMAND_PASS:
case GLOBUS_FTP_CONTROL_COMMAND_PASV:
case GLOBUS_FTP_CONTROL_COMMAND_SPAS:
case GLOBUS_FTP_CONTROL_COMMAND_USER:
case GLOBUS_FTP_CONTROL_COMMAND_SMNT:
case GLOBUS_FTP_CONTROL_COMMAND_LIST:
case GLOBUS_FTP_CONTROL_COMMAND_RETR:
case GLOBUS_FTP_CONTROL_COMMAND_STOR:
case GLOBUS_FTP_CONTROL_COMMAND_APPE:
case GLOBUS_FTP_CONTROL_COMMAND_RNFR:
case GLOBUS_FTP_CONTROL_COMMAND_RNTO:
{
if(command->noop.string_arg != NULL)
{
globus_libc_free(command->noop.string_arg);
}
break;
}
case GLOBUS_FTP_CONTROL_COMMAND_SPOR:
{
globus_libc_free(command->spor.host_port);
break;
}
default:
break;
}
return GLOBUS_SUCCESS;
}
/**
* Creates a copy of a command structure.
*
* This function should be called when the user needs to make a
* copy of a command structure.
*
* @param dest
* The area of memory that the command structure is copied to.
* @param src
* The command structure to be copied.
*/
globus_result_t
globus_ftp_control_command_copy(
globus_ftp_control_command_t * dest,
globus_ftp_control_command_t * src)
{
if(dest == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_copy: dest argument is NULL"))
);
}
if(src == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_copy: src argument is NULL"))
);
}
dest->code=src->code;
dest->noop.raw_command=globus_libc_strdup(src->noop.raw_command);
if(dest->noop.raw_command == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_copy: strdup failed"))
);
}
switch(dest->code)
{
case GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN:
case GLOBUS_FTP_CONTROL_COMMAND_SITE:
case GLOBUS_FTP_CONTROL_COMMAND_DELE:
case GLOBUS_FTP_CONTROL_COMMAND_RMD:
case GLOBUS_FTP_CONTROL_COMMAND_MKD:
case GLOBUS_FTP_CONTROL_COMMAND_NLST:
case GLOBUS_FTP_CONTROL_COMMAND_HELP:
case GLOBUS_FTP_CONTROL_COMMAND_STAT:
case GLOBUS_FTP_CONTROL_COMMAND_STOU:
case GLOBUS_FTP_CONTROL_COMMAND_ACCT:
case GLOBUS_FTP_CONTROL_COMMAND_CWD:
case GLOBUS_FTP_CONTROL_COMMAND_PASS:
case GLOBUS_FTP_CONTROL_COMMAND_PASV:
case GLOBUS_FTP_CONTROL_COMMAND_SPAS:
case GLOBUS_FTP_CONTROL_COMMAND_USER:
case GLOBUS_FTP_CONTROL_COMMAND_SMNT:
case GLOBUS_FTP_CONTROL_COMMAND_LIST:
case GLOBUS_FTP_CONTROL_COMMAND_RETR:
case GLOBUS_FTP_CONTROL_COMMAND_STOR:
case GLOBUS_FTP_CONTROL_COMMAND_APPE:
case GLOBUS_FTP_CONTROL_COMMAND_RNFR:
case GLOBUS_FTP_CONTROL_COMMAND_RNTO:
case GLOBUS_FTP_CONTROL_COMMAND_REST:
case GLOBUS_FTP_CONTROL_COMMAND_QUIT:
dest->noop.string_arg = GLOBUS_NULL;
if(src->noop.string_arg != GLOBUS_NULL)
{
dest->noop.string_arg=
globus_libc_strdup(src->noop.string_arg);
if(dest->noop.string_arg == GLOBUS_NULL)
{
globus_libc_free(dest->noop.raw_command);
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_copy: strdup failed"))
);
}
}
break;
case GLOBUS_FTP_CONTROL_COMMAND_PORT:
dest->port.host_port.host[0]=src->port.host_port.host[0];
dest->port.host_port.host[1]=src->port.host_port.host[1];
dest->port.host_port.host[2]=src->port.host_port.host[2];
dest->port.host_port.host[3]=src->port.host_port.host[3];
dest->port.host_port.port=src->port.host_port.port;
dest->port.host_port.hostlen=4;
break;
case GLOBUS_FTP_CONTROL_COMMAND_SPOR:
dest->spor.num_args=src->spor.num_args;
dest->spor.host_port = (globus_ftp_control_host_port_t *)
globus_libc_malloc(src->spor.num_args *
sizeof(globus_ftp_control_host_port_t));
if(dest->spor.host_port == GLOBUS_NULL)
{
globus_libc_free(dest->noop.raw_command);
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_copy: malloc failed"))
);
}
memcpy(dest->spor.host_port,
src->spor.host_port,
src->spor.num_args *
sizeof(globus_ftp_control_host_port_t));
break;
case GLOBUS_FTP_CONTROL_COMMAND_TYPE:
dest->type.type=src->type.type;
dest->type.option=src->type.option;
dest->type.bytesize=src->type.bytesize;
break;
case GLOBUS_FTP_CONTROL_COMMAND_STRU:
dest->stru.structure=src->stru.structure;
break;
case GLOBUS_FTP_CONTROL_COMMAND_MODE:
dest->mode.mode=src->mode.mode;
break;
case GLOBUS_FTP_CONTROL_COMMAND_ALLO:
dest->allo.size=src->allo.size;
dest->allo.record_size=src->allo.record_size;
break;
default:
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_copy: Unknown command"))
);
}
return GLOBUS_SUCCESS;
}
/**
* Stop the GSIFTP server from listening for client connections.
*
* This function stops listening on the given listener object
* for client connections. All existing client connections are
* left open.
*
* @param listener
* the globus_ftp_control_server_t object that should
* no longer listen for connections.
* @param callback
* The user callback that will be called when the server
* structure is no longer listening.
* @param callback_arg
* The user argument that is passed into callback.
*/
globus_result_t
globus_ftp_control_server_stop(
globus_ftp_control_server_t * listener,
globus_ftp_control_server_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_i_ftp_server_passthru_cb_arg_t * cb_arg;
if(listener == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_stop: listener argument is NULL"))
);
}
if(callback == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_stop: callback argument is NULL"))
);
}
globus_mutex_lock(&(listener->mutex));
{
if(listener->state !=
GLOBUS_FTP_CONTROL_SERVER_LISTENING)
{
globus_mutex_unlock(&(listener->mutex));
return GLOBUS_SUCCESS;
}
listener->state=GLOBUS_FTP_CONTROL_SERVER_DEAF;
}
globus_mutex_unlock(&(listener->mutex));
cb_arg = (globus_i_ftp_server_passthru_cb_arg_t *)
globus_libc_malloc(
sizeof(globus_i_ftp_server_passthru_cb_arg_t));
if(cb_arg == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_stop: malloc failed"))
);
}
cb_arg->callback=callback;
cb_arg->callback_arg=callback_arg;
cb_arg->server_handle=listener;
rc=globus_io_register_close(&listener->io_handle,
globus_l_ftp_control_stop_server_cb,
(void *) cb_arg);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(cb_arg);
return rc;
}
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_register_close function.
*
* This is an internal callback used as part of the
* globus_ftp_control_server_stop function. It checks the result of
* the close and calls the user callback.
*
* @param arg
* The callback argument, which in this case is used to pass
* the original user callback and argument.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the close operation
*
* @return void
*
* @note If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_stop_server_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_i_ftp_server_passthru_cb_arg_t * cb_arg;
globus_object_t * error;
cb_arg = (globus_i_ftp_server_passthru_cb_arg_t *) arg;
if(result != GLOBUS_SUCCESS){
error=globus_error_get(result);
(cb_arg->callback)(cb_arg->callback_arg,
cb_arg->server_handle,
error);
globus_object_free(error);
}
else
{
(cb_arg->callback)(cb_arg->callback_arg,
cb_arg->server_handle,
GLOBUS_NULL);
}
globus_libc_free(cb_arg);
return;
}
/**
* Accept a client connection request.
*
* This function is called to accept a connection request from
* a client.
*
* When the listen callback is called (see
* globus_ftp_control_server_listen) a client has requested a
* connection. This function must be called to accept that user
* connection request. Once the connection is established or if
* a error occurs, the callback function is called.
*
* @param listener
* The server object that received the connection request.
* @param handle
* The control connection object. This structure will be populated
* and passed to the callback when the client is authorized. This
* structure represents the control connection between the server
* and client. It will be used to read commands from the client
* and send responses to the client.]
* @param callback
* The function called when the client connection has been
* accepted.
* @param callback_arg
* The user argument passed to the callback.
*
* @note This functions assumes the the server and control handles
* have been initialized prior to calling this function.
*/
globus_result_t
globus_ftp_control_server_accept(
globus_ftp_control_server_t * listener,
globus_ftp_control_handle_t * handle,
globus_ftp_control_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_io_attr_t attr;
globus_bool_t call_close_cb = GLOBUS_FALSE;
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_accept: handle argument is NULL"))
);
}
if(listener == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_accept: listener argument is NULL"))
);
}
globus_mutex_lock(&(listener->mutex));
{
if(listener->state !=
GLOBUS_FTP_CONTROL_SERVER_LISTENING)
{
globus_mutex_unlock(&(listener->mutex));
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_accept: server not listening"))
);
}
}
globus_mutex_unlock(&(listener->mutex));
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.auth_cb == GLOBUS_NULL &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_UNCONNECTED)
{
handle->cc_handle.accept_cb=callback;
handle->cc_handle.accept_cb_arg=callback_arg;
handle->cc_handle.cb_count++;
}
else
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_accept: Other operation already in progress"))
);
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
globus_io_tcpattr_init(&attr);
globus_io_attr_set_socket_oobinline(&attr, GLOBUS_TRUE);
globus_io_attr_set_tcp_nodelay(&attr, GLOBUS_TRUE);
rc=globus_io_tcp_register_accept(&(listener->io_handle),
&attr,
&(handle->cc_handle.io_handle),
globus_l_ftp_control_accept_cb,
(void *) handle);
globus_io_tcpattr_destroy(&attr);
if(rc != GLOBUS_SUCCESS)
{
globus_mutex_lock(&(handle->cc_handle.mutex));
{
handle->cc_handle.cb_count--;
if(!handle->cc_handle.cb_count &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
return rc;
}
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_register_accept function.
*
* This is an internal callback used as part of the
* globus_ftp_control_accept function. It checks the result of
* the accept, and sends a initial response to the user.
*
* @param arg
* The callback argument, which in this case is the control
* handle.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the accept operation
*
* @return void
*
* @note If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_accept_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result)
{
globus_object_t * error = GLOBUS_NULL;
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_bool_t call_close_cb = GLOBUS_FALSE;
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle=&(c_handle->cc_handle);
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
}
globus_mutex_lock(&(cc_handle->mutex));
{
if(cc_handle->cc_state == GLOBUS_FTP_CONTROL_UNCONNECTED)
{
cc_handle->cc_state=GLOBUS_FTP_CONTROL_CONNECTED;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
/*
* call the users callback
*/
(cc_handle->accept_cb)(cc_handle->accept_cb_arg,
c_handle,
error);
if(error != GLOBUS_NULL)
{
globus_object_free(error);
}
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
}
/**
* Authenticate a client connection.
*
* This function is called to authenticate a connection from
* a client.
*
* After a client connection has been accepted (using the
* globus_ftp_control_server_accept call), this function should be called
* to authenticate the client. The caller of this function may specify
* certain authentication requirements using the auth_requirements parameter.
*
* @param handle
* The control connection object. This structure will be populated
* and passed to the callback when the client is authorized. This
* structure represents the control connection between the server
* and client. It will be used to read commands from the client
* and send responses to the client.]
* @param auth_requirements
* This structure represents the authentication requirements that
* the user has for a given connection. For example GSIFTP
* user name, password, and account.
* @param callback
* The function called when the client authentication has been
* accepted or rejected.
* @param callback_arg
* The user argument passed to the callback.
*
* @note It is up to the user of this function to send the reply to
* the last command of the authentication sequence.
* @note This functions assumes the the server and control handles
* have been initialized prior to calling this function.
*/
globus_result_t
globus_ftp_control_server_authenticate(
globus_ftp_control_handle_t * handle,
globus_ftp_control_auth_requirements_t auth_requirements,
globus_ftp_control_auth_callback_t callback,
void * callback_arg)
{
globus_object_t * error = GLOBUS_NULL;
globus_ftp_cc_handle_t * cc_handle;
globus_result_t rc;
globus_result_t rc2;
globus_bool_t call_close_cb = GLOBUS_FALSE;
cc_handle=&(handle->cc_handle);
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_authenticate: handle argument is NULL"))
);
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.auth_cb == GLOBUS_NULL &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED)
{
handle->cc_handle.auth_cb=callback;
handle->cc_handle.auth_cb_arg=callback_arg;
handle->cc_handle.auth_requirements=auth_requirements;
handle->cc_handle.cb_count++;
}
else
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_server_accept: Other operation already in progress"))
);
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
rc = globus_i_ftp_control_auth_info_init(
&(cc_handle->auth_info),GLOBUS_NULL);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_std;
}
rc=globus_io_register_read(&cc_handle->io_handle,
cc_handle->read_buffer,
GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE,
1,
globus_l_ftp_control_auth_read_cb,
handle);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_std;
}
return GLOBUS_SUCCESS;
error_std:
rc2 = globus_i_ftp_control_auth_info_destroy(
&(cc_handle->auth_info));
globus_assert(rc2 == GLOBUS_SUCCESS);
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
return rc;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_register_write function.
*
* This is an internal callback used as part of the
* globus_ftp_control_authenticate function. It checks the result of
* the write (which was used to send a response to the client), and
* if the authentication requirements are set to NONE calls the user
* callback and returns or registers a read in anticipation of further
* client commands.
*
* @param arg
* The callback argument, which in this case is the control
* handle.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the write operation
*
* @return void
*
* @note If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_auth_write_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_object_t * error;
globus_result_t rc;
globus_bool_t call_close_cb = GLOBUS_FALSE;
void * callback_arg;
globus_ftp_control_auth_callback_t callback;
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle=&(c_handle->cc_handle);
globus_libc_free(buf);
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
goto error_auth_destroy;
}
if(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_NONE)
{
callback=cc_handle->auth_cb;
callback_arg=cc_handle->auth_cb_arg;
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->auth_cb=GLOBUS_NULL;
cc_handle->auth_cb_arg=GLOBUS_NULL;
}
globus_mutex_unlock(&(cc_handle->mutex));
(callback)(callback_arg,
c_handle,
GLOBUS_NULL,
&(cc_handle->auth_info));
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
return;
}
/* call register_read with 0 byte minimum because we may already
* have read the command
*/
rc=globus_io_register_read(handle,
cc_handle->read_buffer,
GLOBUS_FTP_CONTROL_READ_BUFFER_SIZE,
0,
globus_l_ftp_control_auth_read_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_auth_destroy;
}
return;
error_auth_destroy:
rc = globus_i_ftp_control_auth_info_destroy(
&(cc_handle->auth_info));
globus_assert(rc == GLOBUS_SUCCESS);
(cc_handle->auth_cb)(cc_handle->auth_cb_arg,
c_handle,
error,
GLOBUS_NULL);
globus_object_free(error);
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
return;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_register_read function.
*
* This is an internal callback used as part of the
* globus_ftp_control_authenticate function. It checks the result of
* the read (which was used to read commands from the client), and
* if a full command was received, parses it and uses it as part of the
* specified authentication process. If authentication is complete the
* user callback is called and the function returns. If authentication
* is not complete a reply to the received command is sent to then
* client using the auth_write callbacks which will continue to read
* commands. If no full command was received a new register_read is
* called.
*
* @param arg
* The callback argument, which in this case is the control
* handle.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the accept operation
*
* @return void
*
* @note If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_auth_read_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_byte_t * new_buf;
globus_object_t * error;
globus_result_t rc;
globus_ftp_control_command_t command;
globus_bool_t call_close_cb = GLOBUS_FALSE;
int i;
int j;
int length;
void * callback_arg;
globus_ftp_control_auth_callback_t callback;
OM_uint32 maj_stat;
OM_uint32 min_stat;
OM_uint32 ret_flags=0;
gss_buffer_desc recv_tok=GSS_C_EMPTY_BUFFER;
gss_buffer_desc send_tok=GSS_C_EMPTY_BUFFER;
gss_buffer_desc subject_buf=GSS_C_EMPTY_BUFFER;
gss_OID mech_type;
char * reply = NULL;
char * encoded_reply;
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle=&(c_handle->cc_handle);
callback=cc_handle->auth_cb;
callback_arg=cc_handle->auth_cb_arg;
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
goto error_auth_destroy;
}
/* cc_handle->bytes_read == 0 ? i = 1 : i = cc_handle->bytes_read;
*/
cc_handle->bytes_read += nbytes;
for(i = 1;ibytes_read;i++)
{
if(cc_handle->read_buffer[i-1] == '\r' &&
cc_handle->read_buffer[i] == '\n')
{
cc_handle->read_buffer[i-1]='\0';
rc=globus_ftp_control_command_init(
&command,
cc_handle->read_buffer,
&cc_handle->auth_info);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_auth_destroy;
}
for(j=i+1;jbytes_read;j++)
{
cc_handle->read_buffer[j-(i+1)]=
cc_handle->read_buffer[j];
}
cc_handle->bytes_read -= (i+1);
switch(command.code)
{
case GLOBUS_FTP_CONTROL_COMMAND_AUTH:
if(command.auth.type !=
GLOBUS_FTP_CONTROL_AUTH_GSSAPI)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: Authentication mechanism not supported"));
goto error_cmd_destroy;
}
if( !(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_GSSAPI))
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: GSSAPI authentication not allowed"));
goto error_cmd_destroy;
}
if(cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: AUTH must be the first command in the authentication sequence"));
goto error_cmd_destroy;
}
maj_stat=globus_gss_assist_acquire_cred(
&min_stat,
GSS_C_ACCEPT,
&(cc_handle->auth_info.credential_handle));
if(maj_stat != GSS_S_COMPLETE)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: globus_gss_assist_acquire_cred failed"));
goto error_cmd_destroy;
}
else
{
cc_handle->auth_info.locally_acquired_credential = GLOBUS_TRUE;
}
cc_handle->auth_info.prev_cmd=command.code;
reply=globus_libc_strdup(
globus_i_ftp_server_334_reply);
if(reply == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: strdup failed"));
goto error_cmd_destroy;
}
rc=globus_io_register_write(
handle,
reply,
(globus_size_t) strlen(reply),
globus_l_ftp_control_auth_write_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(reply);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
break;
case GLOBUS_FTP_CONTROL_COMMAND_ADAT:
if((cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_AUTH) &&
(cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_ADAT))
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: ADAT must be preceded by either AUTH or ADAT"));
goto error_cmd_destroy;
}
cc_handle->auth_info.prev_cmd=command.code;
recv_tok.value=
globus_libc_malloc(
(strlen(command.adat.string_arg) + 3) * 6 / 8);
if(recv_tok.value == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: malloc failed"));
goto error_cmd_destroy;
}
rc=globus_i_ftp_control_radix_decode(
command.adat.string_arg,
recv_tok.value,
&length);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(recv_tok.value);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
recv_tok.length = length;
if(cc_handle->auth_info.encrypt)
{
ret_flags |= GSS_C_CONF_FLAG;
}
maj_stat = gss_accept_sec_context(
&min_stat,
/* context_handle */
&(cc_handle->auth_info.auth_gssapi_context),
/* verifier_cred_handle */
cc_handle->auth_info.credential_handle,
/* input_token */
&recv_tok,
/* channel bindings */
GSS_C_NO_CHANNEL_BINDINGS,
/* src_name */
&cc_handle->auth_info.target_name,
/* mech_type */
&mech_type,
/* output_token */
&send_tok,
&ret_flags,
/* ignore time_rec */
GLOBUS_NULL,
&(cc_handle->auth_info.delegated_credential_handle)
);
globus_libc_free(recv_tok.value);
switch(maj_stat)
{
case GSS_S_COMPLETE:
cc_handle->use_auth = GLOBUS_TRUE;
cc_handle->auth_info.authenticated = GLOBUS_TRUE;
if(ret_flags & GSS_C_CONF_FLAG)
{
cc_handle->auth_info.encrypt = GLOBUS_TRUE;
}
maj_stat = gss_display_name(
&min_stat,
cc_handle->auth_info.target_name,
&subject_buf,
GLOBUS_NULL);
cc_handle->auth_info.auth_gssapi_subject =
globus_libc_malloc(sizeof(char)*
(subject_buf.length + 1));
if(cc_handle->auth_info.auth_gssapi_subject == GLOBUS_NULL)
{
gss_release_buffer(&min_stat, &subject_buf);
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: malloc failed"));
goto error_cmd_destroy;
}
memcpy(cc_handle->auth_info.auth_gssapi_subject,
subject_buf.value,
subject_buf.length);
cc_handle->auth_info.auth_gssapi_subject[
subject_buf.length] = '\0';
if(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_USER)
{
if(send_tok.length == 0)
{
reply=globus_libc_strdup(
globus_i_ftp_server_235_reply);
if(reply == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: strdup failed"));
goto error_cmd_destroy;
}
}
else
{
reply= (char *) globus_libc_malloc(
send_tok.length * 8 / 6 + 16);
if(reply == GLOBUS_NULL)
{
gss_release_buffer(&min_stat, &send_tok);
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: malloc failed"));
goto error_cmd_destroy;
}
strcpy(reply,"235 ADAT=");
length=send_tok.length;
rc = globus_i_ftp_control_radix_encode(send_tok.value,
&(reply[9]),
&length);
gss_release_buffer(&min_stat, &send_tok);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(reply);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
reply[length+9]='\r';
reply[length+10]='\n';
}
rc=globus_io_register_write(
handle,
reply,
(globus_size_t) strlen(reply),
globus_l_ftp_control_auth_write_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(reply);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
}
else
{
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->auth_cb=GLOBUS_NULL;
cc_handle->auth_cb_arg=GLOBUS_NULL;
}
globus_mutex_unlock(&(cc_handle->mutex));
(callback)(callback_arg,
c_handle,
GLOBUS_NULL,
&(cc_handle->auth_info));
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state ==
GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
}
break;
case GSS_S_CONTINUE_NEEDED:
reply= (char *) globus_libc_malloc(
send_tok.length * 8 / 6 + 16);
if(reply == GLOBUS_NULL)
{
gss_release_buffer(&min_stat, &send_tok);
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: malloc failed"));
goto error_cmd_destroy;
}
strcpy(reply,"335 ADAT=");
length=send_tok.length;
rc = globus_i_ftp_control_radix_encode(send_tok.value,
&(reply[9]),
&length);
gss_release_buffer(&min_stat, &send_tok);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(reply);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
reply[length+9]='\r';
reply[length+10]='\n';
rc=globus_io_register_write(
handle,
reply,
(globus_size_t) length+11,
globus_l_ftp_control_auth_write_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(reply);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
break;
default:
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: gss_accept_sec_context failed"));
goto error_cmd_destroy;
}
break;
case GLOBUS_FTP_CONTROL_COMMAND_USER:
if((cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_ADAT) &&
(cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN))
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: USER must either be preceded by ADAT or be the first command"));
goto error_cmd_destroy;
}
cc_handle->auth_info.prev_cmd=command.code;
if((cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_GSSAPI) &&
(cc_handle->use_auth == GLOBUS_FALSE))
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: GSSAPI authentication required"));
goto error_cmd_destroy;
}
cc_handle->auth_info.user=globus_libc_strdup(
command.user.string_arg);
if(cc_handle->auth_info.user == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: strdup failed"));
goto error_cmd_destroy;
}
if(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_USER)
{
if(!(cc_handle->auth_requirements &
(GLOBUS_FTP_CONTROL_AUTH_REQ_PASS |
GLOBUS_FTP_CONTROL_AUTH_REQ_ACCT)))
{
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->auth_cb=GLOBUS_NULL;
cc_handle->auth_cb_arg=GLOBUS_NULL;
}
globus_mutex_unlock(&(cc_handle->mutex));
(callback)(callback_arg,
c_handle,
GLOBUS_NULL,
&(cc_handle->auth_info));
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state ==
GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
break;
}
if(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_PASS)
{
reply= globus_libc_strdup(
globus_i_ftp_server_331_reply);
}
if(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_ACCT)
{
reply= globus_libc_strdup(
globus_i_ftp_server_332_reply);
}
if(reply == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: strdup failed"));
goto error_cmd_destroy;
}
if(cc_handle->auth_info.authenticated == GLOBUS_TRUE)
{
rc=globus_i_ftp_control_encode_reply(
reply,
&encoded_reply,
&(cc_handle->auth_info));
globus_libc_free(reply);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_cmd_destroy;
}
reply=encoded_reply;
}
rc=globus_io_register_write(
handle,
reply,
(globus_size_t) strlen(reply),
globus_l_ftp_control_auth_write_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(reply);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
}
else
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: USER command not allowed"));
goto error_cmd_destroy;
}
break;
case GLOBUS_FTP_CONTROL_COMMAND_PASS:
if(cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_USER)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: PASS must be preceded by USER"));
goto error_cmd_destroy;
}
cc_handle->auth_info.prev_cmd=command.code;
cc_handle->auth_info.password=globus_libc_strdup(
command.pass.string_arg);
if(cc_handle->auth_info.password == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: No password given"));
goto error_cmd_destroy;
}
if(!(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_ACCT))
{
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->auth_cb=GLOBUS_NULL;
cc_handle->auth_cb_arg=GLOBUS_NULL;
}
globus_mutex_unlock(&(cc_handle->mutex));
(callback)(callback_arg,
c_handle,
GLOBUS_NULL,
&(cc_handle->auth_info));
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
}
else
{
reply=globus_libc_strdup(
globus_i_ftp_server_332_reply);
if(reply == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: strdup failed"));
goto error_cmd_destroy;
}
if(cc_handle->auth_info.authenticated == GLOBUS_TRUE)
{
rc=globus_i_ftp_control_encode_reply(
reply,
&encoded_reply,
&(cc_handle->auth_info));
globus_libc_free(reply);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_cmd_destroy;
}
reply=encoded_reply;
}
rc=globus_io_register_write(
handle,
reply,
(globus_size_t) strlen(reply),
globus_l_ftp_control_auth_write_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(reply);
error=globus_error_get(rc);
goto error_cmd_destroy;
}
}
break;
case GLOBUS_FTP_CONTROL_COMMAND_ACCT:
if(((cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_PASS) &&
(cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_PASS)) ||
(cc_handle->auth_info.prev_cmd !=
GLOBUS_FTP_CONTROL_COMMAND_USER))
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: ACCT must be preceded by either USER or PASS"));
goto error_cmd_destroy;
}
cc_handle->auth_info.account=globus_libc_strdup(
command.acct.string_arg);
if(cc_handle->auth_info.account == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: no account given"));
goto error_cmd_destroy;
}
if(cc_handle->auth_requirements &
GLOBUS_FTP_CONTROL_AUTH_REQ_ACCT)
{
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->auth_cb=GLOBUS_NULL;
cc_handle->auth_cb_arg=GLOBUS_NULL;
}
globus_mutex_unlock(&(cc_handle->mutex));
(callback)(callback_arg,
c_handle,
GLOBUS_NULL,
&(cc_handle->auth_info));
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
}
else
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: ACCT not allowed"));
goto error_cmd_destroy;
}
break;
default:
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: Command not part of authentication process"));
goto error_cmd_destroy;
}
globus_ftp_control_command_destroy(&command);
return;
}
}
if(cc_handle->bytes_read == cc_handle->read_buffer_size)
{
new_buf= (globus_byte_t *) globus_libc_malloc(
cc_handle->read_buffer_size +
GLOBUS_I_FTP_CONTROL_BUF_INCR);
if(new_buf == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_auth_read_cb: malloc failed"));
goto error_auth_destroy;
}
memcpy(new_buf,
cc_handle->read_buffer,
cc_handle->bytes_read);
cc_handle->read_buffer_size += GLOBUS_I_FTP_CONTROL_BUF_INCR;
globus_libc_free(cc_handle->read_buffer);
cc_handle->read_buffer=new_buf;
}
rc=globus_io_register_read(&(cc_handle->io_handle),
&(cc_handle->read_buffer[
cc_handle->bytes_read]),
cc_handle->read_buffer_size -
cc_handle->bytes_read,
1,
globus_l_ftp_control_auth_read_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_auth_destroy;
}
return;
error_cmd_destroy:
globus_ftp_control_command_destroy(&command);
error_auth_destroy:
rc = globus_i_ftp_control_auth_info_destroy(
&(cc_handle->auth_info));
globus_assert(rc == GLOBUS_SUCCESS);
(cc_handle->auth_cb)(cc_handle->auth_cb_arg,
c_handle,
error,
GLOBUS_NULL);
globus_object_free(error);
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
return;
}
/**
* Begin reading GSIFTP commands on a given control connection.
*
* This function begins reading control commands on a
* globus_ftp_control_handle_t. When a command is read
* the callback function is called.
*
* @param handle
* The control connection handle that commands will be read
* from. Prior to calling this the function
* globus_ftp_control_handle_t must be populated via a
* call to globus_ftp_control_accept().
* @param callback
* The user callback that will be called when commands are read.
* @param callback_arg
* The user argument passed to the callback.
*/
globus_result_t
globus_ftp_control_read_commands(
globus_ftp_control_handle_t * handle,
globus_ftp_control_command_callback_t callback,
void * callback_arg)
{
globus_result_t rc;
globus_bool_t call_close_cb = GLOBUS_FALSE;
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_read_commands: handle argument is NULL"))
);
}
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.command_cb == GLOBUS_NULL &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED &&
handle->cc_handle.auth_cb == GLOBUS_NULL )
{
handle->cc_handle.command_cb=callback;
handle->cc_handle.command_cb_arg=callback_arg;
handle->cc_handle.cb_count++;
}
else
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_read_commands: handle is not connected or other operation is in progress"))
);
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
rc=globus_io_register_read(&(handle->cc_handle.io_handle),
&(handle->cc_handle.read_buffer[
handle->cc_handle.bytes_read]),
handle->cc_handle.read_buffer_size -
handle->cc_handle.bytes_read,
0,
globus_l_ftp_control_read_command_cb,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
globus_i_ftp_control_auth_info_destroy(
&(handle->cc_handle.auth_info));
globus_mutex_lock(&(handle->cc_handle.mutex));
{
handle->cc_handle.cb_count--;
if(!handle->cc_handle.cb_count &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
return rc;
}
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_register_read function.
*
* This is an internal callback used as part of the
* globus_ftp_control_read_commands function. It checks the result of
* the read (which was used to read commands from the client), and
* if a full command was received, parses it and returns the resulting
* command structure to the user through the user callback. If no full
* command was received a new register_read is called.
*
* @param arg
* The callback argument, which in this case is the control
* handle.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the accept operation
*
* @return void
*
* @note If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_read_command_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_byte_t * new_buf;
globus_object_t * error;
globus_result_t rc;
globus_bool_t call_close_cb = GLOBUS_FALSE;
globus_ftp_control_command_t command;
globus_ftp_control_command_code_t code =
GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
int last;
int i;
c_handle=(globus_ftp_control_handle_t *) arg;
cc_handle=&(c_handle->cc_handle);
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
goto error_auth_destroy;
}
cc_handle->bytes_read += nbytes;
last=0;
for(i = 1;i < cc_handle->bytes_read; i++)
{
if(cc_handle->read_buffer[i-1] == '\r' &&
cc_handle->read_buffer[i] == '\n')
{
cc_handle->read_buffer[i-1]='\0';
rc=globus_ftp_control_command_init(
&command,
&(cc_handle->read_buffer[last]),
&cc_handle->auth_info);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_auth_destroy;
}
(cc_handle->command_cb)(cc_handle->command_cb_arg,
c_handle,
GLOBUS_NULL,
&command);
code=command.code;
globus_ftp_control_command_destroy(&command);
last=i+1;
}
}
if(last != 0)
{
for(i=last;ibytes_read;i++)
{
cc_handle->read_buffer[i-last]=
cc_handle->read_buffer[i];
}
cc_handle->bytes_read -= last;
}
else
{
if(cc_handle->bytes_read == cc_handle->read_buffer_size)
{
new_buf= (globus_byte_t *) globus_libc_malloc(
cc_handle->read_buffer_size +
GLOBUS_I_FTP_CONTROL_BUF_INCR);
if(new_buf == GLOBUS_NULL)
{
error=globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_l_ftp_control_read_command_cb: malloc failed"));
goto error_auth_destroy;
}
memcpy(new_buf,
cc_handle->read_buffer,
cc_handle->bytes_read);
cc_handle->read_buffer_size += GLOBUS_I_FTP_CONTROL_BUF_INCR;
globus_libc_free(cc_handle->read_buffer);
cc_handle->read_buffer=new_buf;
}
}
globus_mutex_lock(&(cc_handle->mutex));
{
if(cc_handle->cb_count == 1 &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
cc_handle->cb_count--;
call_close_cb = GLOBUS_TRUE;
}
else if(code == GLOBUS_FTP_CONTROL_COMMAND_QUIT)
{
cc_handle->cb_count--;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
return;
}
if(code != GLOBUS_FTP_CONTROL_COMMAND_QUIT)
{
rc=globus_io_register_read(&(cc_handle->io_handle),
&(cc_handle->read_buffer[
cc_handle->bytes_read]),
cc_handle->read_buffer_size -
cc_handle->bytes_read,
1,
globus_l_ftp_control_read_command_cb,
arg);
if(rc != GLOBUS_SUCCESS)
{
error=globus_error_get(rc);
goto error_auth_destroy;
}
}
return;
error_auth_destroy:
rc = globus_i_ftp_control_auth_info_destroy(
&(cc_handle->auth_info));
globus_assert(rc == GLOBUS_SUCCESS);
(cc_handle->command_cb)(cc_handle->command_cb_arg,
c_handle,
error,
GLOBUS_NULL);
globus_object_free(error);
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
return;
}
/**
* Send a response to the GSIFTP client
*
* This function sends a GSIFTP formatted response to the client.
* When a command callback is received the user calls this function
* to respond to the clients request.
*
* @param handle
* The control connection to send the response across.
* @param respspec
* A formated string representing the users response.
* @param callback
* The user callback that will be called when the response has
* been sent.
* @param callback_arg
* The user argument passed to the callback.
*/
globus_result_t
globus_ftp_control_send_response(
globus_ftp_control_handle_t * handle,
const char * respspec,
globus_ftp_control_callback_t callback,
void * callback_arg,
...)
{
globus_ftp_control_rw_queue_element_t * element;
globus_bool_t queue_empty;
globus_result_t rc;
globus_result_t result;
globus_byte_t * buf;
globus_byte_t * encoded_buf;
globus_bool_t call_close_cb = GLOBUS_FALSE;
va_list ap;
int arglength;
if(handle == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_send_response: handle argument is NULL"))
);
}
#ifdef HAVE_STDARG_H
va_start(ap, callback_arg);
#else
va_start(ap);
#endif
arglength=globus_libc_vfprintf(globus_i_ftp_control_devnull,
respspec,
ap);
va_end(ap);
if(arglength < 1)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_send_response: Unable to determine total length of response string"))
);
goto return_error;
}
buf=(globus_byte_t *) globus_libc_malloc(sizeof(globus_byte_t)*
(arglength+1));
if(buf == GLOBUS_NULL)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_send_response: malloc failed"))
);
goto return_error;
}
#ifdef HAVE_STDARG_H
va_start(ap, callback_arg);
#else
va_start(ap);
#endif
if(globus_libc_vsprintf((char *) buf, respspec,ap) < arglength)
{
globus_libc_free(buf);
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_send_response: Response string construction failed"))
);
va_end(ap);
goto return_error;
}
va_end(ap);
if(handle->cc_handle.auth_info.authenticated == GLOBUS_TRUE)
{
rc=globus_i_ftp_control_encode_reply(buf,(char **) (void *) &encoded_buf,
&(handle->cc_handle.auth_info));
globus_libc_free(buf);
if(rc != GLOBUS_SUCCESS)
{
result=rc;
goto return_error;
}
buf=encoded_buf;
}
element = (globus_ftp_control_rw_queue_element_t *)
globus_libc_malloc(sizeof(globus_ftp_control_rw_queue_element_t));
if(element == GLOBUS_NULL)
{
result=globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_send_response: malloc failed"))
);
globus_libc_free(buf);
goto return_error;
}
element->callback = GLOBUS_NULL;
element->send_response_cb = callback;
element->arg = callback_arg;
element->write_flags = 0;
element->write_buf = buf;
element->write_callback = globus_l_ftp_control_send_response_cb;
globus_mutex_lock(&(handle->cc_handle.mutex));
{
if(handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CONNECTED &&
handle->cc_handle.auth_cb == GLOBUS_NULL)
{
queue_empty=globus_fifo_empty(&handle->cc_handle.writers);
globus_fifo_enqueue(&handle->cc_handle.writers,
element);
handle->cc_handle.cb_count++;
}
else
{
globus_mutex_unlock(&(handle->cc_handle.mutex));
globus_libc_free(buf);
globus_libc_free(element);
result = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_send_response: handle is not connected/authenticated"))
);
goto return_error;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(queue_empty == GLOBUS_TRUE)
{
rc = globus_io_register_write(&(handle->cc_handle.io_handle),
buf,
(globus_size_t) strlen(buf),
globus_l_ftp_control_send_response_cb,
(void *) handle);
if(rc != GLOBUS_SUCCESS)
{
globus_mutex_lock(&(handle->cc_handle.mutex));
{
globus_fifo_dequeue(&handle->cc_handle.writers);
handle->cc_handle.cb_count--;
queue_empty=globus_fifo_empty(&handle->cc_handle.writers);
if(!handle->cc_handle.cb_count &&
handle->cc_handle.cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(handle->cc_handle.mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(handle);
}
globus_libc_free(buf);
globus_libc_free(element);
if(queue_empty == GLOBUS_FALSE)
{
globus_i_ftp_control_write_next(handle);
}
result=rc;
goto return_error;
}
}
return GLOBUS_SUCCESS;
return_error:
return result;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal callback for the globus_io_register_write function.
*
* This is an internal callback used as part of the
* globus_ftp_control_send_response function. It checks the result of
* the write (which was used to send a response to the client), and
* calls the user callback
*
* @param arg
* The callback argument, which in this case is the control
* handle.
* @param handle
* The globus_io handle for the connection. In practice this
* represents the socket fd for the connection.
* @param result
* The result of the write operation
*
* @return void
*
* @note If a error is detected in this function the user callback is
* called with an appropriate error object or ftp response and
* the function returns.
*/
#endif
static void
globus_l_ftp_control_send_response_cb(
void * arg,
globus_io_handle_t * handle,
globus_result_t result,
globus_byte_t * buf,
globus_size_t nbytes)
{
globus_ftp_cc_handle_t * cc_handle;
globus_ftp_control_handle_t * c_handle;
globus_object_t * error;
globus_ftp_control_rw_queue_element_t * element;
globus_bool_t queue_empty;
globus_bool_t call_close_cb = GLOBUS_FALSE;
c_handle = (globus_ftp_control_handle_t *) arg;
cc_handle = &(c_handle->cc_handle);
globus_libc_free(buf);
globus_mutex_lock(&(cc_handle->mutex));
{
element = (globus_ftp_control_rw_queue_element_t *)
globus_fifo_dequeue(&cc_handle->writers);
queue_empty=globus_fifo_empty(&cc_handle->writers);
}
globus_mutex_unlock(&(cc_handle->mutex));
if(queue_empty == GLOBUS_FALSE)
{
globus_i_ftp_control_write_next(c_handle);
}
if(result != GLOBUS_SUCCESS)
{
error=globus_error_get(result);
goto return_error;
}
(element->send_response_cb)((element->arg),
c_handle,
GLOBUS_NULL);
globus_libc_free(element);
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
return;
return_error:
(element->send_response_cb)((element->arg),
c_handle,
error);
globus_libc_free(element);
globus_object_free(error);
globus_mutex_lock(&(cc_handle->mutex));
{
cc_handle->cb_count--;
if(!cc_handle->cb_count &&
cc_handle->cc_state == GLOBUS_FTP_CONTROL_CLOSING)
{
call_close_cb = GLOBUS_TRUE;
}
}
globus_mutex_unlock(&(cc_handle->mutex));
if(call_close_cb == GLOBUS_TRUE)
{
globus_i_ftp_control_call_close_cb(c_handle);
}
return;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which base 64 decodes and gss unwraps a
* MIC command
*
* Internal helper function which base 64 decodes and gss unwraps a
* MIC command
*
* @param cmd
* A string representing the command to decode.
* @param encoded_cmd
* Used to return the decoded command. Memory for the encoded
* command is allocated in this function.
* @param auth_info
* The auth_info structure to use for gss unwrapping the command
*
* @return
* - error object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_decode_command(
char * cmd,
char ** decoded_cmd,
globus_ftp_control_auth_info_t * auth_info)
{
int length;
int i;
char * tmp;
globus_result_t rc;
gss_buffer_desc wrapped_token;
gss_buffer_desc unwrapped_token;
OM_uint32 maj_stat;
OM_uint32 min_stat;
int conf_state;
gss_qop_t qop_state;
if(cmd == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_decode_command: cmd argument is NULL"))
);
}
length=strlen(cmd);
tmp=(char *) globus_libc_malloc(length+1);
if(tmp == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_decode_command: malloc failed"))
);
}
if(sscanf(cmd,"%4s",tmp) < 1)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_decode_command: parse error"))
);
goto decode_error;
}
i=0;
while(tmp[i] != '\0')
{
tmp[i]=toupper(tmp[i]);
i++;
}
if(strcmp(tmp,"MIC") &&
strcmp(tmp,"ENC"))
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_decode_command: parse error"))
);
goto decode_error;
}
if((!strcmp(tmp,"ENC")) && auth_info->encrypt == GLOBUS_FALSE)
{
/* if command is ENC and encryption isn't turned on in
sec context */
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_decode_command: encryption not supported"))
);
goto decode_error;
}
if(sscanf(cmd,"%*s %s",tmp) < 1)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_decode_command: parse error"))
);
goto decode_error;
}
*decoded_cmd = (char *) globus_libc_malloc((length+3) * 6/8);
if(*decoded_cmd == GLOBUS_NULL)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_decode_command: malloc failed"))
);
goto decode_error;
}
rc=globus_i_ftp_control_radix_decode(
tmp,
*decoded_cmd,&length);
if(rc != GLOBUS_SUCCESS)
{
globus_libc_free(*decoded_cmd);
goto decode_error;
}
wrapped_token.value = *decoded_cmd;
wrapped_token.length = length;
maj_stat = gss_unwrap(&min_stat,
auth_info->auth_gssapi_context,
&wrapped_token,
&unwrapped_token,
&conf_state,
&qop_state);
if(maj_stat != GSS_S_COMPLETE)
{
rc = globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_decode_command: failed to unwrap command"))
);
globus_libc_free(*decoded_cmd);
goto decode_error;
}
globus_assert(strlen(cmd) > unwrapped_token.length);
memcpy(tmp,
unwrapped_token.value,
unwrapped_token.length);
tmp[unwrapped_token.length] = '\0';
gss_release_buffer(&min_stat, &unwrapped_token);
globus_libc_free(*decoded_cmd);
*decoded_cmd=tmp;
return GLOBUS_SUCCESS;
decode_error:
*decoded_cmd=GLOBUS_NULL;
globus_libc_free(tmp);
return rc;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which gss wraps, base 64 encodes and puts
* a 635 in front of the suplied response
*
* Internal helper function which gss wraps, base 64 encodes and puts
* a 635 in front of the suplied response
*
* @param reply
* A string representing the response to encode.
* @param encoded_reply
* Used to return the encoded reply. Memory for the encoded
* reply is allocated in this function.
* @param auth_info
* The auth_info structure to use for gss wrapping the reply.
*
* @return
* - error object
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_encode_reply(
char * reply,
char ** encoded_reply,
globus_ftp_control_auth_info_t * auth_info)
{
gss_buffer_desc in_buf;
gss_buffer_desc out_buf;
OM_uint32 maj_stat;
OM_uint32 min_stat;
int conf_state;
int length;
if(auth_info == GLOBUS_NULL ||
reply == GLOBUS_NULL ||
encoded_reply == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_encode_reply: NULL argument detected"))
);
}
in_buf.value = reply;
in_buf.length = strlen(reply)+1;
maj_stat = gss_wrap(&min_stat,
auth_info->auth_gssapi_context,
0,
GSS_C_QOP_DEFAULT,
&in_buf,
&conf_state,
&out_buf);
if(maj_stat != GSS_S_COMPLETE)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_encode_reply: gss_wrap failed"))
);
}
*encoded_reply = (char *) globus_libc_malloc(
(out_buf.length + 3) * 8 / 6 + 9);
if(*encoded_reply == GLOBUS_NULL)
{
gss_release_buffer(&min_stat, &out_buf);
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_i_ftp_control_encode_reply: malloc failed"))
);
}
(*encoded_reply)[0]='\0';
if(auth_info->encrypt == GLOBUS_TRUE)
{
strcat(*encoded_reply,"632 ");
}
else
{
strcat(*encoded_reply,"631 ");
}
length = out_buf.length;
globus_i_ftp_control_radix_encode(
out_buf.value,&((*encoded_reply)[4]),
&length);
(*encoded_reply)[length+4]='\r';
(*encoded_reply)[length+5]='\n';
(*encoded_reply)[length+6]='\0';
gss_release_buffer(&min_stat, &out_buf);
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
* Internal helper function which sets up a list for keeping track of
* server handles.
*
* Internal helper function which sets up a list for keeping track of
* server handles.
*
*
* @return
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_server_activate(void)
{
globus_ftp_l_command_hash_entry_t * entries;
globus_mutex_init(
&(globus_l_ftp_server_handle_list_mutex), GLOBUS_NULL);
globus_hashtable_init(&globus_l_ftp_control_parse_table,
64,
globus_hashtable_string_hash,
globus_hashtable_string_keyeq);
/* the size of this array needs to be adjusted */
entries = (globus_ftp_l_command_hash_entry_t *)
globus_libc_malloc(44 * sizeof(globus_ftp_l_command_hash_entry_t));
entries[0].code = GLOBUS_FTP_CONTROL_COMMAND_SBUF;
entries[0].parse_func = globus_l_ftp_control_parse_sbuf_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"SBUF",
&entries[0]);
entries[1].code = GLOBUS_FTP_CONTROL_COMMAND_SIZE;
entries[1].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"SIZE",
&entries[1]);
entries[2].code = GLOBUS_FTP_CONTROL_COMMAND_STOR;
entries[2].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"STOR",
&entries[2]);
entries[3].code = GLOBUS_FTP_CONTROL_COMMAND_ADAT;
entries[3].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"ADAT",
&entries[3]);
entries[4].code = GLOBUS_FTP_CONTROL_COMMAND_RETR;
entries[4].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"RETR",
&entries[4]);
entries[5].code = GLOBUS_FTP_CONTROL_COMMAND_ERET;
entries[5].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"ERET",
&entries[5]);
entries[6].code = GLOBUS_FTP_CONTROL_COMMAND_ESTO;
entries[6].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"ESTO",
&entries[6]);
entries[7].code = GLOBUS_FTP_CONTROL_COMMAND_USER;
entries[7].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"USER",
&entries[7]);
entries[8].code = GLOBUS_FTP_CONTROL_COMMAND_STOU;
entries[8].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"STOU",
&entries[8]);
entries[9].code = GLOBUS_FTP_CONTROL_COMMAND_DELE;
entries[9].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"DELE",
&entries[9]);
entries[10].code = GLOBUS_FTP_CONTROL_COMMAND_ACCT;
entries[10].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"ACCT",
&entries[10]);
entries[11].code = GLOBUS_FTP_CONTROL_COMMAND_SITE;
entries[11].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"SITE",
&entries[11]);
entries[12].code = GLOBUS_FTP_CONTROL_COMMAND_RNFR;
entries[12].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"RNFR",
&entries[12]);
entries[13].code = GLOBUS_FTP_CONTROL_COMMAND_RNTO;
entries[13].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"RNTO",
&entries[13]);
entries[14].code = GLOBUS_FTP_CONTROL_COMMAND_APPE;
entries[14].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"APPE",
&entries[14]);
entries[15].code = GLOBUS_FTP_CONTROL_COMMAND_REST;
entries[15].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"REST",
&entries[15]);
entries[16].code = GLOBUS_FTP_CONTROL_COMMAND_ALLO;
entries[16].parse_func = globus_l_ftp_control_parse_allo_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"ALLO",
&entries[16]);
entries[17].code = GLOBUS_FTP_CONTROL_COMMAND_SMNT;
entries[17].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"SMNT",
&entries[17]);
entries[18].code = GLOBUS_FTP_CONTROL_COMMAND_OPTS;
entries[18].parse_func = globus_l_ftp_control_parse_opts_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"OPTS",
&entries[18]);
entries[19].code = GLOBUS_FTP_CONTROL_COMMAND_PORT;
entries[19].parse_func = globus_l_ftp_control_parse_port_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"PORT",
&entries[19]);
entries[20].code = GLOBUS_FTP_CONTROL_COMMAND_SPOR;
entries[20].parse_func = globus_l_ftp_control_parse_spor_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"SPOR",
&entries[20]);
entries[21].code = GLOBUS_FTP_CONTROL_COMMAND_TYPE;
entries[21].parse_func = globus_l_ftp_control_parse_type_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"TYPE",
&entries[21]);
entries[22].code = GLOBUS_FTP_CONTROL_COMMAND_STRU;
entries[22].parse_func = globus_l_ftp_control_parse_stru_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"STRU",
&entries[22]);
entries[23].code = GLOBUS_FTP_CONTROL_COMMAND_AUTH;
entries[23].parse_func = globus_l_ftp_control_parse_auth_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"AUTH",
&entries[23]);
entries[24].code = GLOBUS_FTP_CONTROL_COMMAND_MODE;
entries[24].parse_func = globus_l_ftp_control_parse_mode_cmd;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"MODE",
&entries[24]);
entries[25].code = GLOBUS_FTP_CONTROL_COMMAND_CWD;
entries[25].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"CWD",
&entries[25]);
entries[26].code = GLOBUS_FTP_CONTROL_COMMAND_PASS;
entries[26].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"PASS",
&entries[26]);
entries[27].code = GLOBUS_FTP_CONTROL_COMMAND_RMD;
entries[27].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"RMD",
&entries[27]);
entries[28].code = GLOBUS_FTP_CONTROL_COMMAND_MKD;
entries[28].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"MKD",
&entries[28]);
entries[29].code = GLOBUS_FTP_CONTROL_COMMAND_CDUP;
entries[29].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"CDUP",
&entries[29]);
entries[30].code = GLOBUS_FTP_CONTROL_COMMAND_QUIT;
entries[30].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"QUIT",
&entries[30]);
entries[31].code = GLOBUS_FTP_CONTROL_COMMAND_REIN;
entries[31].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"REIN",
&entries[31]);
entries[32].code = GLOBUS_FTP_CONTROL_COMMAND_PASV;
entries[32].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"PASV",
&entries[32]);
entries[33].code = GLOBUS_FTP_CONTROL_COMMAND_SPAS;
entries[33].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"SPAS",
&entries[33]);
entries[34].code = GLOBUS_FTP_CONTROL_COMMAND_ABOR;
entries[34].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"ABOR",
&entries[34]);
entries[35].code = GLOBUS_FTP_CONTROL_COMMAND_SYST;
entries[35].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"SYST",
&entries[35]);
entries[36].code = GLOBUS_FTP_CONTROL_COMMAND_NOOP;
entries[36].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"NOOP",
&entries[36]);
entries[37].code = GLOBUS_FTP_CONTROL_COMMAND_FEAT;
entries[37].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"FEAT",
&entries[37]);
entries[38].code = GLOBUS_FTP_CONTROL_COMMAND_PWD;
entries[38].parse_func = globus_l_ftp_control_parse_no_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"PWD",
&entries[38]);
entries[39].code = GLOBUS_FTP_CONTROL_COMMAND_LIST;
entries[39].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"LIST",
&entries[39]);
entries[40].code = GLOBUS_FTP_CONTROL_COMMAND_NLST;
entries[40].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"NLST",
&entries[40]);
entries[41].code = GLOBUS_FTP_CONTROL_COMMAND_STAT;
entries[41].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"STAT",
&entries[41]);
entries[42].code = GLOBUS_FTP_CONTROL_COMMAND_HELP;
entries[42].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"HELP",
&entries[42]);
entries[43].code = GLOBUS_FTP_CONTROL_COMMAND_LANG;
entries[43].parse_func = globus_l_ftp_control_parse_string_arg;
globus_hashtable_insert(&globus_l_ftp_control_parse_table,
"LANG",
&entries[43]);
return GLOBUS_SUCCESS;
}
#ifdef GLOBUS_INTERNAL_DOC
/**
*
* Internal helper function which deactivates any server handles
*
* Internal helper function which goes through a list of server
* handles and closes any open connections associated with the
* handles.
*
* @return
* - GLOBUS_SUCCESS
*
*/
#endif
globus_result_t
globus_i_ftp_control_server_deactivate(void)
{
globus_ftp_control_server_t * server_handle;
globus_result_t rc;
globus_mutex_lock(&globus_l_ftp_server_handle_list_mutex);
{
while(!globus_list_empty(globus_l_ftp_server_handle_list))
{
server_handle=(globus_ftp_control_server_t *)
globus_list_first(globus_l_ftp_server_handle_list);
globus_mutex_lock(&(server_handle->mutex));
{
if(server_handle->state ==
GLOBUS_FTP_CONTROL_SERVER_LISTENING)
{
rc=globus_io_close(&(server_handle->io_handle));
globus_assert(rc == GLOBUS_SUCCESS);
server_handle->state = GLOBUS_FTP_CONTROL_SERVER_DEAF;
}
}
globus_mutex_unlock(&(server_handle->mutex));
globus_mutex_destroy(&(server_handle->mutex));
globus_list_remove(&globus_l_ftp_server_handle_list,
globus_l_ftp_server_handle_list);
}
}
globus_mutex_unlock(&globus_l_ftp_server_handle_list_mutex);
globus_mutex_destroy(&globus_l_ftp_server_handle_list_mutex);
/* free all command hash memory */
globus_libc_free(globus_hashtable_lookup(
&globus_l_ftp_control_parse_table,
"SBUF"));
globus_hashtable_destroy(&globus_l_ftp_control_parse_table);
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_sbuf_cmd(
globus_ftp_control_command_t * command)
{
if(sscanf(command->noop.raw_command,
"%*s %d", &command->sbuf.buffer_size) < 1)
{
command->code=GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
}
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_string_arg(
globus_ftp_control_command_t * command)
{
int length;
int arg_start;
length = strlen(command->noop.raw_command);
command->size.string_arg =
(char *) globus_libc_malloc(length);
if(command->size.string_arg == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_init: malloc failed")));
}
sscanf(command->noop.raw_command,"%*s%n",
&arg_start);
while(isspace(command->noop.raw_command[arg_start]))
{
arg_start++;
}
while(isspace(command->noop.raw_command[length-1]))
{
length--;
}
command->noop.raw_command[length]='\0';
strcpy(command->eret.string_arg,
&command->noop.raw_command[arg_start]);
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_no_arg(
globus_ftp_control_command_t * command)
{
command->cdup.string_arg=GLOBUS_NULL;
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_allo_cmd(
globus_ftp_control_command_t * command)
{
command->allo.record_size = 0;
if(sscanf(command->noop.raw_command,"%*s %d R %d",
&(command->allo.size),
&(command->allo.record_size))<1)
{
command->allo.size = 0;
command->allo.record_size = 0;
}
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_opts_cmd(
globus_ftp_control_command_t * command)
{
int length;
length = strlen(command->noop.raw_command);
command->opts.cmd_name =
(char *) globus_libc_malloc(length);
if(command->opts.cmd_name == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_init: malloc failed")));
}
command->opts.cmd_opts =
(char *) globus_libc_malloc(length);
if(command->opts.cmd_opts == GLOBUS_NULL)
{
globus_libc_free(command->opts.cmd_name);
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_init: malloc failed")));
}
if(sscanf(command->noop.raw_command,"%*s %s %s",
command->opts.cmd_name, command->opts.cmd_opts) < 2)
{
globus_libc_free(command->opts.cmd_name);
globus_libc_free(command->opts.cmd_opts);
command->opts.cmd_name=GLOBUS_NULL;
command->opts.cmd_opts=GLOBUS_NULL;
}
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_port_cmd(
globus_ftp_control_command_t * command)
{
int port[2];
if(sscanf(command->noop.raw_command,
"%*s %u,%u,%u,%u,%u,%u",
&(command->port.host_port.host[0]),
&(command->port.host_port.host[1]),
&(command->port.host_port.host[2]),
&(command->port.host_port.host[3]),
&port[0],
&port[1]) < 6)
{
command->code=GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
return GLOBUS_SUCCESS;
}
if((command->port.host_port.host)[0] > 255 ||
(command->port.host_port.host)[1] > 255 ||
(command->port.host_port.host)[2] > 255 ||
(command->port.host_port.host)[3] > 255 ||
port[0] > 255 ||
port[1] > 255)
{
command->code=GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
return GLOBUS_SUCCESS;
}
command->port.host_port.port= (short) 256*port[0]+port[1];
command->port.host_port.hostlen = 4;
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_spor_cmd(
globus_ftp_control_command_t * command)
{
char * start;
int i;
int j;
int arg_start;
int port[2];
start=strstr(command->noop.raw_command,"SPOR");
i=0;
while(start != &(command->noop.raw_command[i]))
{
i++;
}
arg_start = i+4;
i = arg_start;
j = 0;
/* figure out how many host/port arguments there are */
while(command->noop.raw_command[i])
{
if(isspace(command->noop.raw_command[i]))
{
i++;
while(command->noop.raw_command[i] &&
isspace(command->noop.raw_command[i]))
{
i++;
}
if(command->noop.raw_command[i])
{
j++;
}
}
else
{
i++;
}
}
/* allocate memory for them */
command->spor.host_port = (globus_ftp_control_host_port_t*)
globus_libc_malloc(j*sizeof(globus_ftp_control_host_port_t));
if(command->spor.host_port == GLOBUS_NULL)
{
return globus_error_put(
globus_error_construct_string(
GLOBUS_FTP_CONTROL_MODULE,
GLOBUS_NULL,
_FCSL("globus_ftp_control_command_init: malloc failed")));
}
command->spor.num_args = j;
i = arg_start;
j = 0;
while(command->noop.raw_command[i])
{
if(!isspace(command->noop.raw_command[i]))
{
if(sscanf(&(command->noop.raw_command[i]),
"%u,%u,%u,%u,%u,%u",
&(command->spor.host_port[j].host[0]),
&(command->spor.host_port[j].host[1]),
&(command->spor.host_port[j].host[2]),
&(command->spor.host_port[j].host[3]),
&port[0],
&port[1]) < 6)
{
globus_libc_free(command->spor.host_port);
command->code=GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
return GLOBUS_SUCCESS;
}
if((command->spor.host_port[j].host)[0] > 255 ||
(command->spor.host_port[j].host)[1] > 255 ||
(command->spor.host_port[j].host)[2] > 255 ||
(command->spor.host_port[j].host)[3] > 255 ||
port[0] > 255 ||
port[1] > 255)
{
globus_libc_free(command->spor.host_port);
command->code=GLOBUS_FTP_CONTROL_COMMAND_UNKNOWN;
return GLOBUS_SUCCESS;
}
command->spor.host_port[j].port=
(short) 256*port[0]+port[1];
command->spor.host_port[j].hostlen = 4;
i++;
while(command->noop.raw_command[i] &&
!isspace(command->noop.raw_command[i]))
{
i++;
}
if(command->noop.raw_command[i])
{
j++;
}
}
else
{
i++;
}
}
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_type_cmd(
globus_ftp_control_command_t * command)
{
char tmp;
command->type.option=GLOBUS_FTP_CONTROL_TYPE_NO_OPTION;
command->type.bytesize=0;
if(sscanf(command->noop.raw_command,"%*s %c",&tmp) < 1)
{
command->type.type=GLOBUS_FTP_CONTROL_TYPE_NONE;
}
switch(tmp)
{
case 'A':
case 'a':
command->type.type=GLOBUS_FTP_CONTROL_TYPE_ASCII;
if(sscanf(command->noop.raw_command,
"%*s %*c %c",&tmp) > 0)
{
switch(tmp)
{
case 'N':
command->type.option=GLOBUS_FTP_CONTROL_TYPE_OPTION_N;
return GLOBUS_SUCCESS;
case 'T':
command->type.option=GLOBUS_FTP_CONTROL_TYPE_OPTION_T;
return GLOBUS_SUCCESS;
case 'C':
command->type.option=GLOBUS_FTP_CONTROL_TYPE_OPTION_C;
return GLOBUS_SUCCESS;
default:
command->type.type=GLOBUS_FTP_CONTROL_TYPE_NONE;
command->type.option=GLOBUS_FTP_CONTROL_TYPE_NO_OPTION;
return GLOBUS_SUCCESS;
}
}
return GLOBUS_SUCCESS;
case 'E':
case 'e':
command->type.type=GLOBUS_FTP_CONTROL_TYPE_EBCDIC;
if(sscanf(command->noop.raw_command,
"%*s %*c %c",&tmp) > 0)
{
switch(tmp)
{
case 'N':
command->type.option=GLOBUS_FTP_CONTROL_TYPE_OPTION_N;
return GLOBUS_SUCCESS;
case 'T':
command->type.option=GLOBUS_FTP_CONTROL_TYPE_OPTION_T;
return GLOBUS_SUCCESS;
case 'C':
command->type.option=GLOBUS_FTP_CONTROL_TYPE_OPTION_C;
return GLOBUS_SUCCESS;
default:
command->type.type=GLOBUS_FTP_CONTROL_TYPE_NONE;
command->type.option=GLOBUS_FTP_CONTROL_TYPE_NO_OPTION;
return GLOBUS_SUCCESS;
}
}
return GLOBUS_SUCCESS;
case 'I':
case 'i':
command->type.type=GLOBUS_FTP_CONTROL_TYPE_IMAGE;
return GLOBUS_SUCCESS;
case 'L':
case 'l':
command->type.type=GLOBUS_FTP_CONTROL_TYPE_LOCAL;
if(sscanf(command->noop.raw_command,"%*s %*c %u",
&command->type.bytesize) < 1)
{
command->type.type=GLOBUS_FTP_CONTROL_TYPE_NONE;
command->type.option=GLOBUS_FTP_CONTROL_TYPE_NO_OPTION;
return GLOBUS_SUCCESS;
}
return GLOBUS_SUCCESS;
default:
command->type.type=GLOBUS_FTP_CONTROL_TYPE_NONE;
return GLOBUS_SUCCESS;
}
}
globus_result_t globus_l_ftp_control_parse_stru_cmd(
globus_ftp_control_command_t * command)
{
char tmp;
command->stru.structure=
GLOBUS_FTP_CONTROL_STRUCTURE_NONE;
if(sscanf(command->noop.raw_command,"%*s %c",&tmp) < 1)
{
return GLOBUS_SUCCESS;
}
switch(tmp)
{
case 'F':
case 'f':
command->stru.structure=
GLOBUS_FTP_CONTROL_STRUCTURE_FILE;
return GLOBUS_SUCCESS;
case 'R':
case 'r':
command->stru.structure=
GLOBUS_FTP_CONTROL_STRUCTURE_RECORD;
return GLOBUS_SUCCESS;
case 'P':
case 'p':
command->stru.structure=
GLOBUS_FTP_CONTROL_STRUCTURE_PAGE;
return GLOBUS_SUCCESS;
default:
return GLOBUS_SUCCESS;
}
}
globus_result_t globus_l_ftp_control_parse_auth_cmd(
globus_ftp_control_command_t * command)
{
char tmp[10];
int i;
command->auth.type=GLOBUS_FTP_CONTROL_AUTH_UNKNOWN;
if(sscanf(command->noop.raw_command,"%*s %7s",tmp) < 1)
{
return GLOBUS_SUCCESS;
}
i = 0;
while(tmp[i] != '\0')
{
tmp[i] = toupper(tmp[i]);
i++;
}
if(strcmp("GSSAPI",tmp) == 0)
{
command->auth.type=GLOBUS_FTP_CONTROL_AUTH_GSSAPI;
}
return GLOBUS_SUCCESS;
}
globus_result_t globus_l_ftp_control_parse_mode_cmd(
globus_ftp_control_command_t * command)
{
char tmp;
command->code=GLOBUS_FTP_CONTROL_COMMAND_MODE;
if(sscanf(command->noop.raw_command,"%*s %c",&tmp) < 1)
{
command->mode.mode=GLOBUS_FTP_CONTROL_MODE_NONE;
return GLOBUS_SUCCESS;
}
switch(tmp)
{
case 'S':
case 's':
command->mode.mode=GLOBUS_FTP_CONTROL_MODE_STREAM;
return GLOBUS_SUCCESS;
case 'B':
case 'b':
command->mode.mode=GLOBUS_FTP_CONTROL_MODE_BLOCK;
return GLOBUS_SUCCESS;
case 'C':
case 'c':
command->mode.mode=GLOBUS_FTP_CONTROL_MODE_COMPRESSED;
return GLOBUS_SUCCESS;
case 'E':
case 'e':
command->mode.mode=GLOBUS_FTP_CONTROL_MODE_EXTENDED_BLOCK;
return GLOBUS_SUCCESS;
default:
command->mode.mode=GLOBUS_FTP_CONTROL_MODE_NONE;
return GLOBUS_SUCCESS;
}
}
globus_ftp_control-4.7/globus_ftp_control.c 0000666 0000764 0000764 00000022371 10363624663 016313 0000000 0000000 /*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifdef GLOBUS_SEPARATE_DOCS
/**
* @file globus_ftp_control.c
*
* FTP Control API Activation/Deactivation and Global State
*
*/
#endif
#include "globus_ftp_control.h"
#include "globus_i_ftp_control.h"
#ifndef TARGET_ARCH_WIN32
#include
#include
#include
#endif
#include "version.h"
#undef GLOBUS_FAILURE
#define GLOBUS_FAILURE globus_error_put(GLOBUS_ERROR_NO_INFO)
static int globus_l_ftp_control_activate(void);
static int globus_l_ftp_control_deactivate(void);
globus_module_descriptor_t globus_i_ftp_control_module =
{
"globus_ftp_control",
globus_l_ftp_control_activate,
globus_l_ftp_control_deactivate,
GLOBUS_NULL,
GLOBUS_NULL,
&local_version
};
/**
* Debugging level
*
* 1 thru 3 enable debug output for control channel
* 4 thru 6 enable debug output for control and data channel
*/
int globus_i_ftp_control_debug_level = 0;
static
int
globus_l_ftp_control_activate(void)
{
int rc;
char * tmp_string;
rc = globus_module_activate(GLOBUS_IO_MODULE);
if(rc != GLOBUS_SUCCESS)
{
return rc;
}
tmp_string = globus_module_getenv("GLOBUS_FTP_CONTROL_DEBUG_LEVEL");
if(tmp_string != GLOBUS_NULL)
{
globus_i_ftp_control_debug_level = atoi(tmp_string);
if(globus_i_ftp_control_debug_level < 0)
{
globus_i_ftp_control_debug_level = 0;
}
}
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_activate() entering\n"));
rc = globus_module_activate(GLOBUS_THREAD_MODULE);
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = globus_module_activate(GLOBUS_COMMON_MODULE);
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = globus_module_activate(GLOBUS_GSI_GSSAPI_MODULE);
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = (int)globus_i_ftp_control_server_activate();
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = (int)globus_i_ftp_control_client_activate();
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = (int)globus_i_ftp_control_data_activate();
exit:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_activate() exiting\n"));
return rc;
}
static
int
globus_l_ftp_control_deactivate(void)
{
int rc;
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_deactivate() entering\n"));
rc = (int)globus_i_ftp_control_data_deactivate();
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = (int)globus_i_ftp_control_client_deactivate();
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = (int)globus_i_ftp_control_server_deactivate();
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = globus_module_deactivate(GLOBUS_IO_MODULE);
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = globus_module_deactivate(GLOBUS_GSI_GSSAPI_MODULE);
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = globus_module_deactivate(GLOBUS_THREAD_MODULE);
if(rc != GLOBUS_SUCCESS)
{
goto exit;
}
rc = globus_module_deactivate(GLOBUS_COMMON_MODULE);
exit:
globus_i_ftp_control_debug_printf(1,
(stderr, "globus_l_ftp_control_deactivate() exiting\n"));
return rc;
}
/*
* access functions for globus_ftp_control_parallelism_t
*/
globus_result_t
globus_i_ftp_parallelism_copy(
globus_ftp_control_parallelism_t * dest_parallelism,
globus_ftp_control_parallelism_t * src_parallelism)
{
/*
* for now there are no pointers in any of the sub classes of
* globus_i_ftp_parallelism_base_t so we can just do a mem
* copy.
*/
memcpy(
dest_parallelism,
src_parallelism,
sizeof(globus_ftp_control_parallelism_t));
if(dest_parallelism->mode == GLOBUS_FTP_CONTROL_PARALLELISM_NONE)
{
dest_parallelism->base.size = 1;
}
/* TODO check src_parallelism for vaid members */
return GLOBUS_SUCCESS;
}
globus_result_t
globus_ftp_control_set_netlogger(
globus_ftp_control_handle_t * handle,
globus_netlogger_handle_t * nl_handle,
globus_bool_t nl_ftp_control,
globus_bool_t nl_globus_io)
{
globus_result_t res;
res = globus_i_ftp_control_client_set_netlogger(handle, nl_handle);
if(res != GLOBUS_SUCCESS)
{
return res;
}
res = globus_i_ftp_control_data_set_netlogger(
handle, nl_handle, nl_ftp_control, nl_globus_io);
return res;
}
int
globus_i_ftp_parallelism_get_size(
globus_ftp_control_parallelism_t * parallelism)
{
return parallelism->base.size;
}
int
globus_i_ftp_parallelism_get_max_size(
globus_ftp_control_parallelism_t * parallelism)
{
if(parallelism->mode == GLOBUS_FTP_CONTROL_PARALLELISM_NONE)
{
return 1;
}
/* else if(parallelism->mode == GLOBUS_FTP_CONTROL_PARALLELISM_FIXED)
{
return parallelism->fixed.size;
}
else if(parallelism->mode == GLOBUS_FTP_CONTROL_PARALLELISM_AUTOMATIC)
{
return parallelism->automatic.max_size;
}
*/
return -1;
}
int
globus_i_ftp_parallelism_get_min_size(
globus_ftp_control_parallelism_t * parallelism)
{
if(parallelism->mode == GLOBUS_FTP_CONTROL_PARALLELISM_NONE)
{
return 1;
}
/* else if(parallelism->mode == GLOBUS_FTP_CONTROL_PARALLELISM_FIXED)
{
return parallelism->fixed.size;
}
else if(parallelism->mode == GLOBUS_FTP_CONTROL_PARALLELISM_AUTOMATIC)
{
return parallelism->automatic.min_size;
}
*/
return -1;
}
/*
* access functions for globus_ftp_host_port_t
*/
void
globus_ftp_control_host_port_init(
globus_ftp_control_host_port_t * host_port,
char * host,
unsigned short port)
{
struct hostent hostent;
globus_byte_t bs_buf[8192];
int err_no;
char hostip[30];
memset(host_port, 0, sizeof(*host_port));
if(host != GLOBUS_NULL)
{
struct in_addr tmp_addr;
globus_libc_gethostbyname_r(
host,
&hostent,
bs_buf,
8192,
&err_no);
memcpy(&tmp_addr, hostent.h_addr_list[0], sizeof(struct in_addr));
strcpy(
hostip,
inet_ntoa(tmp_addr));
sscanf(
hostip,
"%d.%d.%d.%d",
&host_port->host[0],
&host_port->host[1],
&host_port->host[2],
&host_port->host[3]);
host_port->hostlen = 4;
}
host_port->port = port;
}
void
globus_ftp_control_host_port_destroy(
globus_ftp_control_host_port_t * host_port)
{
}
/* XX this is crap.. no idea how big host is. should probably be at least
* 50 bytes
*/
void
globus_ftp_control_host_port_get_host(
globus_ftp_control_host_port_t * host_port,
char * host)
{
char * str;
/* this api doesnt let me play nice with people that arent aware of the new
* hostlen field in host_port. since i have tried to assume 4 wherever
* ipv6 is not allowed, I will assume 4 unless the len is actually 16.
* this is in the hopes that it is not likely for a random unitialized int
* to be 16
*/
str = globus_libc_ints_to_contact_string(
host_port->host, host_port->hostlen == 16 ? 16 : 4, 0);
if(str)
{
strcpy(host, str);
globus_free(str);
}
else
{
*host = 0;
}
}
unsigned short
globus_ftp_control_host_port_get_port(
globus_ftp_control_host_port_t * host_port)
{
return host_port->port;
}
void
globus_ftp_control_host_port_copy(
globus_ftp_control_host_port_t * dest,
globus_ftp_control_host_port_t * src)
{
memcpy(dest, src, sizeof(*src));
}
globus_result_t
globus_ftp_control_layout_copy(
globus_ftp_control_layout_t * dest,
globus_ftp_control_layout_t * src)
{
if(dest == GLOBUS_NULL)
{
return GLOBUS_FAILURE;
}
if(src == GLOBUS_NULL)
{
return GLOBUS_FAILURE;
}
memcpy(
(void *)dest,
(void *)src,
sizeof(globus_ftp_control_layout_t));
return GLOBUS_SUCCESS;
}
globus_ftp_control-4.7/Makefile.in 0000664 0000764 0000764 00000106155 12227171016 014277 0000000 0000000 # Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(am__configure_deps) $(include_HEADERS) \
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/version.h.in $(top_srcdir)/configure \
$(top_srcdir)/globus_automake_post \
$(top_srcdir)/globus_automake_post_top \
$(top_srcdir)/globus_automake_pre \
$(top_srcdir)/globus_automake_pre_top config.guess config.sub \
install-sh ltmain.sh missing
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno configure.status.lineno
mkinstalldirs = $(install_sh) -d
CONFIG_CLEAN_FILES = version.h
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(docdir)" \
"$(DESTDIR)$(includedir)"
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
am__DEPENDENCIES_1 =
libglobus_ftp_control_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_1 = globus_ftp_control.lo globus_ftp_control_client.lo \
globus_ftp_control_data.lo globus_ftp_control_layout.lo \
globus_ftp_control_server.lo
am_libglobus_ftp_control_la_OBJECTS = $(am__objects_1)
libglobus_ftp_control_la_OBJECTS = \
$(am_libglobus_ftp_control_la_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(srcdir)
depcomp =
am__depfiles_maybe =
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libglobus_ftp_control_la_SOURCES)
DIST_SOURCES = $(libglobus_ftp_control_la_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-exec-recursive install-info-recursive \
install-recursive installcheck-recursive installdirs-recursive \
pdf-recursive ps-recursive uninstall-info-recursive \
uninstall-recursive
docDATA_INSTALL = $(INSTALL_DATA)
DATA = $(doc_DATA)
includeHEADERS_INSTALL = $(INSTALL_HEADER)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
DIST_SUBDIRS = $(SUBDIRS)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
{ test ! -d $(distdir) \
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -fr $(distdir); }; }
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
ARFLAGS = @ARFLAGS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CROSS = @CROSS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DIRT_BRANCH_ID = @DIRT_BRANCH_ID@
DIRT_TIMESTAMP = @DIRT_TIMESTAMP@
DOT = @DOT@
DOXYFILE = @DOXYFILE@
DOXYGEN = @DOXYGEN@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ENABLE_PROGRAMS_FALSE = @ENABLE_PROGRAMS_FALSE@
ENABLE_PROGRAMS_TRUE = @ENABLE_PROGRAMS_TRUE@
EXEEXT = @EXEEXT@
F77 = @F77@
F77FLAGS = @F77FLAGS@
F90 = @F90@
F90FLAGS = @F90FLAGS@
FFLAGS = @FFLAGS@
FILELIST_FILE = @FILELIST_FILE@
GLOBUS_FLAVOR_NAME = @GLOBUS_FLAVOR_NAME@
GPT_AGE_VERSION = @GPT_AGE_VERSION@
GPT_CFLAGS = @GPT_CFLAGS@
GPT_CONFIG_CFLAGS = @GPT_CONFIG_CFLAGS@
GPT_CONFIG_INCLUDES = @GPT_CONFIG_INCLUDES@
GPT_CONFIG_LIBS = @GPT_CONFIG_LIBS@
GPT_CONFIG_PKG_LIBS = @GPT_CONFIG_PKG_LIBS@
GPT_EXTERNAL_INCLUDES = @GPT_EXTERNAL_INCLUDES@
GPT_EXTERNAL_LIBS = @GPT_EXTERNAL_LIBS@
GPT_INCLUDES = @GPT_INCLUDES@
GPT_IS_2 = @GPT_IS_2@
GPT_LDFLAGS = @GPT_LDFLAGS@
GPT_LIBS = @GPT_LIBS@
GPT_LIB_LINKS = @GPT_LIB_LINKS@
GPT_LINKTYPE = @GPT_LINKTYPE@
GPT_LOCATION = @GPT_LOCATION@
GPT_MAJOR_VERSION = @GPT_MAJOR_VERSION@
GPT_MINOR_VERSION = @GPT_MINOR_VERSION@
GPT_PGM_LINKS = @GPT_PGM_LINKS@
GPT_PKGCONFIG_DEPENDENCIES = @GPT_PKGCONFIG_DEPENDENCIES@
GPT_PKG_CFLAGS = @GPT_PKG_CFLAGS@
HAVE_DOT = @HAVE_DOT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
INSURE = @INSURE@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
OBJECT_MODE = @OBJECT_MODE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
WITHOUT_FLAVORS_FALSE = @WITHOUT_FLAVORS_FALSE@
WITHOUT_FLAVORS_TRUE = @WITHOUT_FLAVORS_TRUE@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
aclocaldir = @aclocaldir@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
cross_compiling = @cross_compiling@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
doxygendir = @doxygendir@
exec_prefix = @exec_prefix@
flavorincludedir = @flavorincludedir@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
lac_doxygen_examples = @lac_doxygen_examples@
lac_doxygen_file_patterns = @lac_doxygen_file_patterns@
lac_doxygen_input_filter = @lac_doxygen_input_filter@
lac_doxygen_installdox = @lac_doxygen_installdox@
lac_doxygen_internal_tagfiles = @lac_doxygen_internal_tagfiles@
lac_doxygen_output_tagfile = @lac_doxygen_output_tagfile@
lac_doxygen_predefines = @lac_doxygen_predefines@
lac_doxygen_project = @lac_doxygen_project@
lac_doxygen_srcdirs = @lac_doxygen_srcdirs@
lac_doxygen_tagfiles = @lac_doxygen_tagfiles@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
perlmoduledir = @perlmoduledir@
pkgconfdir = @pkgconfdir@
pkgconffile = @pkgconffile@
pkgconffile_in = @pkgconffile_in@
pkgdir = @pkgdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
setupdir = @setupdir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
testdir = @testdir@
scriptsysconfdir = ${sysconfdir}
amdirdir = ${datadir}/globus_amdir
LINK_BAK = orig
AUTOMAKE_OPTIONS = no-dependencies
# SUBDIRS is an automake macro which contains
# the list of subdirectories that have Makefile.am's
SUBDIRS = \
pkgdata \
doxygen
# Sources contains all of the source files in the directory.
# Header files are included because automake will generate dependency targets
# for them and include them in a source distribution.
#
# If this directory builds multiple programs or libraries than these sources
# will need to be seperated into seperate macros.
Sources = \
globus_ftp_control.c \
globus_ftp_control_client.c \
globus_ftp_control_data.c \
globus_ftp_control_layout.c \
globus_ftp_control_server.c \
globus_ftp_control.h \
globus_i_ftp_control.h
# INCLUDES is an automake macro which contains
# the include directives (-I..) for the compiler.
#
# GPT_INCLUDES contains the include directives generated by GPT
# from the dependent packages.
INCLUDES = $(GPT_INCLUDES)
# include_HEADERS is an automake macro which contains
# a list of header files that are to be installed in $prefix/include
include_HEADERS = \
globus_ftp_control.h
# lib_LTLIBRARIES is an automake macro which contains
# a list of libtool libraries that are to be installed in $prefix/lib
lib_LTLIBRARIES = libglobus_ftp_control.la
# _SOURCES is an automake macro which contains
# a list of sources needed to compile the library.
libglobus_ftp_control_la_SOURCES = $(Sources)
# _LDFLAGS is an automake macro which contains
# directives to the linker add before the list of objects and libraries.
#
# GPT_LDFLAGS is a macro that contains the linker directives GPT generated
# from the dependent packages
libglobus_ftp_control_la_LDFLAGS = $(GPT_LDFLAGS)
# _LIBADD is an automake macro which contains
# directives to the linker added after the list of objects.
# LIBADD is specific for linking libraries
#
# GPT_LIB_LINKS is a macro that contains the linker directives GPT generated
# from the dependent packages
libglobus_ftp_control_la_LIBADD = $(GPT_LIB_LINKS)
doc_DATA = GLOBUS_LICENSE
EXTRA_DIST = globus_gridftp_protocol_extensions.doc version.h.in \
$(doc_DATA) bootstrap globus_automake_pre globus_automake_post \
globus_automake_pre_top globus_automake_post_top dirt.sh \
gptdata.sh
DISTCLEANFILES = globus-script-initializer globus-perl-initializer \
globus-script-libdir-choice globus-perl-libdir-choice
all: all-recursive
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
am--refresh:
@:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/globus_automake_pre $(top_srcdir)/globus_automake_pre_top $(top_srcdir)/globus_automake_post $(top_srcdir)/globus_automake_post_top $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
cd $(srcdir) && $(AUTOMAKE) --foreign \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
echo ' $(SHELL) ./config.status'; \
$(SHELL) ./config.status;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
version.h: $(top_builddir)/config.status $(srcdir)/version.h.in
cd $(top_builddir) && $(SHELL) ./config.status $@
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
f=$(am__strip_dir) \
echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
p=$(am__strip_dir) \
echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
$(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
done
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
test "$$dir" != "$$p" || dir=.; \
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
libglobus_ftp_control.la: $(libglobus_ftp_control_la_OBJECTS) $(libglobus_ftp_control_la_DEPENDENCIES)
$(LINK) -rpath $(libdir) $(libglobus_ftp_control_la_LDFLAGS) $(libglobus_ftp_control_la_OBJECTS) $(libglobus_ftp_control_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
.c.o:
$(COMPILE) -c $<
.c.obj:
$(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
$(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
install-docDATA: $(doc_DATA)
@$(NORMAL_INSTALL)
test -z "$(docdir)" || $(mkdir_p) "$(DESTDIR)$(docdir)"
@list='$(doc_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \
$(docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \
done
uninstall-docDATA:
@$(NORMAL_UNINSTALL)
@list='$(doc_DATA)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \
rm -f "$(DESTDIR)$(docdir)/$$f"; \
done
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
@list='$(include_HEADERS)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
$(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
done
uninstall-includeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(include_HEADERS)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
rm -f "$(DESTDIR)$(includedir)/$$f"; \
done
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
empty_fix=.; \
else \
include_option=--include; \
empty_fix=; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(am__remove_distdir)
mkdir $(distdir)
$(mkdir_p) $(distdir)/. $(distdir)/doxygen $(distdir)/pkgdata
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(mkdir_p) "$(distdir)/$$subdir" \
|| exit 1; \
distdir=`$(am__cd) $(distdir) && pwd`; \
top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
(cd $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$$top_distdir" \
distdir="$$distdir/$$subdir" \
distdir) \
|| exit 1; \
fi; \
done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-hook
-find $(distdir) -type d ! -perm -755 -exec chmod a+rwx,go+rx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r $(distdir)
dist-gzip: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
dist-bzip2: distdir
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-tarZ: distdir
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
$(am__remove_distdir)
dist-shar: distdir
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
$(am__remove_distdir)
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
$(am__remove_distdir)
dist dist-all: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& cd $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
distuninstallcheck \
&& chmod -R a-w "$$dc_install_base" \
&& ({ \
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
} || { rm -rf "$$dc_destdir"; exit 1; }) \
&& rm -rf "$$dc_destdir" \
&& $(MAKE) $(AM_MAKEFLAGS) dist \
&& rm -rf $(DIST_ARCHIVES) \
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
$(am__remove_distdir)
@(echo "$(distdir) archives ready for distribution: "; \
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
distuninstallcheck:
@cd $(distuninstallcheck_dir) \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
fi ; \
$(distuninstallcheck_listfiles) ; \
exit 1; } >&2
distcleancheck: distclean
@if test '$(srcdir)' = . ; then \
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
exit 1 ; \
fi
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left in build directory after distclean:" ; \
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
check: check-recursive
all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
installdirs: installdirs-recursive
installdirs-am:
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(includedir)"; do \
test -z "$$dir" || $(mkdir_p) "$$dir"; \
done
install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-recursive
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
mostlyclean-am
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-libtool distclean-tags
dvi: dvi-recursive
dvi-am:
html: html-recursive
info: info-recursive
info-am:
install-data-am: install-docDATA install-includeHEADERS
install-exec-am: install-libLTLIBRARIES
install-info: install-info-recursive
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-recursive
pdf-am:
ps: ps-recursive
ps-am:
uninstall-am: uninstall-docDATA uninstall-includeHEADERS \
uninstall-info-am uninstall-libLTLIBRARIES
uninstall-info: uninstall-info-recursive
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
check-am clean clean-generic clean-libLTLIBRARIES \
clean-libtool clean-recursive ctags ctags-recursive dist \
dist-all dist-bzip2 dist-gzip dist-hook dist-shar dist-tarZ \
dist-zip distcheck distclean distclean-compile \
distclean-generic distclean-libtool distclean-recursive \
distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-docDATA install-exec \
install-exec-am install-includeHEADERS install-info \
install-info-am install-libLTLIBRARIES install-man \
install-strip installcheck installcheck-am installdirs \
installdirs-am maintainer-clean maintainer-clean-generic \
maintainer-clean-recursive mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
uninstall-docDATA uninstall-includeHEADERS uninstall-info-am \
uninstall-libLTLIBRARIES
dist-hook:
$(GPT_LOCATION)/sbin/gpt_create_automake_rules --excludes=doxygen -srcdir=$(top_distdir)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# BEGIN GPT AUTOMAKE RULES
link-am:
unlink-am:
filelist-am:
link: link-recursive link-docDATA link-includeHEADERS link-libLTLIBRARIES
:
unlink: unlink-recursive unlink-docDATA unlink-includeHEADERS unlink-libLTLIBRARIES
:
.PHONY: link unlink link-recursive unlink-recursive link-am unlink-am filelist-amlink-docDATA unlink-docDATA filelist-docDATA link-includeHEADERS unlink-includeHEADERS filelist-includeHEADERS link-libLTLIBRARIES unlink-libLTLIBRARIES filelist-libLTLIBRARIES
filelist: filelist-recursive filelist-docDATA filelist-includeHEADERS filelist-libLTLIBRARIES
:
link-docDATA: $(doc_DATA)
@$(NORMAL_INSTALL)
@$(mkinstalldirs) $(DESTDIR)$(docdir)
@list='$(doc_DATA)'; for p in $$list; do \
mydir=`pwd`; \
target_p=$(DESTDIR)$(docdir)/$$p; \
if test -f $(srcdir)/$$p; then \
cd $(srcdir); \
fullsrcdir=`pwd`; \
cd $$mydir; \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$fullsrcdir/$$p $$target_p"; \
ln -s $$fullsrcdir/$$p $$target_p; \
fi; \
else if test -f $$p; then \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$mydir/$$p $$target_p"; \
ln -s $$mydir/$$p $$target_p; \
fi; \
fi; fi; \
done
unlink-docDATA:
@$(NORMAL_UNINSTALL)
@list='$(doc_DATA)'; for p in $$list; do \
target_p=$(DESTDIR)$(docdir)/$$p; \
if test -h $$target_p; then \
echo "rm $$target_p"; \
rm $$target_p; \
fi; \
if test -f $$target_p.$(LINK_BAK); then \
echo "mv $$target_p.$(LINK_BAK) $$target_p"; \
mv $$target_p.$(LINK_BAK) $$target_p; \
fi; \
done
filelist-docDATA:
@list='$(doc_DATA)'; for p in $$list; do \
filelistdir="`echo $(FILELIST_FILE) | sed -e 's!/[^/]*$$!!'`"; \
dirname='doc'; \
origp="$$p" ; \
p="`echo $(docdir)/$$p | sed -e 's!^$(prefix)!!'`"; \
case "$$dirname-$$origp" in \
*-pkg_data_*.gpt) \
type=`echo $$origp | sed -e 's!^pkg_data_!!' -e 's!.gpt$$!!'`; \
echo "$$p" >> "$${filelistdir}/$${type}.filelist" ; \
;; \
*-*.filelist) \
echo "$$p" >> "$${filelistdir}/$${origp}" ; \
;; \
*-*.pc) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_dev.filelist"; \
;; \
*-flavor_*.gpt) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_dev.filelist"; \
;; \
*-*.pm) \
echo "$$p" >> "$${filelistdir}/$(GLOBUS_FLAVOR_NAME)_rtl.filelist"; \
;; \
*doc-*) \
echo "$$p" >> "$${filelistdir}/noflavor_doc.filelist"; \
;; \
*) \
echo "$$p" >> "$${filelistdir}/noflavor_data.filelist"; \
;; \
esac ; \
done
link-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
@$(mkinstalldirs) $(DESTDIR)$(includedir)
@list='$(include_HEADERS)'; for p in $$list; do \
mydir=`pwd`; \
target_p="$(DESTDIR)$(includedir)/$$p"; \
cd $(srcdir); \
fullsrcdir=`pwd`; \
cd $$mydir; \
if test -f "$$p"; then d="$$mydir/"; else d="$$fullsrcdir/"; fi; \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$d$$p $$target_p"; \
ln -s $$d$$p $$target_p; \
fi; \
done
unlink-includeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(include_HEADERS)'; for p in $$list; do \
target_p="$(DESTDIR)$(includedir)/$$p"; \
if test -h $$target_p; then \
echo "rm $$target_p"; \
rm $$target_p; \
fi; \
if test -f $$target_p.$(LINK_BAK); then \
echo "mv $$target_p.$(LINK_BAK) $$target_p"; \
mv $$target_p.$(LINK_BAK) $$target_p; \
fi; \
done
filelist-includeHEADERS:
@list='$(include_HEADERS)'; for p in $$list; do \
filelistdir="`echo $(FILELIST_FILE) | sed -e 's!/[^/]*$$!!'`"; \
p="`echo $(includedir)/$$p | sed -e 's!^$(prefix)!!'`"; \
echo "$$p" >> "$${filelistdir}/${GLOBUS_FLAVOR_NAME}_dev.filelist"; \
done
link-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
@$(mkinstalldirs) $(DESTDIR)$(libdir)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
mydir=`pwd`; \
target_p=$(DESTDIR)$(libdir)/$$p; \
target_dir="$(DESTDIR)$(libdir)/"; \
root_p=`echo $$p | sed "s,.la,,"`; \
liblist=`ls $$mydir/.libs/$$root_p.so*`; for so in $$liblist; do \
if test ! -h $$so; then \
so_name=`echo $$so | sed "s,$$mydir/.libs/,,"`; \
so_list="$$so_list $$so_name"; \
fi; \
done; \
if test -f $$target_p -a ! -h $$target_p; then \
echo "mv $$target_p $$target_p.$(LINK_BAK)"; \
mv $$target_p $$target_p.$(LINK_BAK); \
for so in $$so_list; do \
echo "mv $$target_dir/$$so $$target_dir/$$so.$(LINK_BAK)"; \
mv $$target_dir/$$so $$target_dir/$$so.$(LINK_BAK); \
done; \
fi; \
if test ! -h $$target_p; then \
echo "ln -s $$mydir/$$p $$target_p"; \
ln -s $$mydir/$$p $$target_p; \
for so in $$so_list; do \
echo "ln -s $$mydir/.libs/$$so $$target_dir/$$so"; \
ln -s $$mydir/.libs/$$so $$target_dir/$$so; \
done; \
fi; \
else :; fi; \
done
unlink-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
target_p=$(DESTDIR)$(libdir)/$$p; \
target_dir="$(DESTDIR)$(libdir)/"; \
root_p=`echo $$p | sed "s,.la,,"`; \
so_list=`ls $$target_dir/$$root_p.so*.$(LINK_BAK)`; \
if test -h $$target_p; then \
echo "rm $$target_p"; \
rm $$target_p; \
for so in $$so_list; do \
so_name=`echo $$so | sed "s,.$(LINK_BAK),,"`; \
echo "rm $$so_name"; \
rm $$so_name; \
done; \
fi; \
if test -f $$target_p.$(LINK_BAK); then \
echo "mv $$target_p.$(LINK_BAK) $$target_p"; \
mv $$target_p.$(LINK_BAK) $$target_p; \
for so in $$so_list; do \
so_name=`echo $$so | sed "s,.$(LINK_BAK),,"`; \
mv $$so_name.$(LINK_BAK) $$so_name; \
done; \
fi; \
done
filelist-libLTLIBRARIES: $(lib_LTLIBRARIES)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
filelistdir="`echo $(FILELIST_FILE) | sed -e 's!/[^/]*$$!!'`"; \
$(GPT_LOCATION)/sbin/gpt_get_lib_names $$p $(DESTDIR)$(libdir) -old | sed -e 's!^$(DESTDIR)$(exec_prefix)!!' -e 's!$(exec_prefix)!!' >> "$${filelistdir}/${GLOBUS_FLAVOR_NAME}_dev.filelist"; \
$(GPT_LOCATION)/sbin/gpt_get_lib_names $$p $(DESTDIR)$(libdir) -dynamic | sed -e 's!^$(DESTDIR)$(exec_prefix)!!' -e 's!$(exec_prefix)!!' >> "$${filelistdir}/${GLOBUS_FLAVOR_NAME}_rtl.filelist"; \
done
link-recursive unlink-recursive filelist-recursive:
@set fnord $(MAKEFLAGS); amf=$$2; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
globus_ftp_control-4.7/configure 0000775 0000764 0000764 00002465314 12227171017 014151 0000000 0000000 #! /bin/sh
# From configure.in Revision: 1.6 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.59.
#
# Copyright (C) 2003 Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## --------------------- ##
## M4sh Initialization. ##
## --------------------- ##
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
set -o posix
fi
DUALCASE=1; export DUALCASE # for MKS sh
# Support unset when possible.
if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
as_unset=unset
else
as_unset=false
fi
# Work around bugs in pre-3.0 UWIN ksh.
$as_unset ENV MAIL MAILPATH
PS1='$ '
PS2='> '
PS4='+ '
# NLS nuisances.
for as_var in \
LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
LC_TELEPHONE LC_TIME
do
if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
eval $as_var=C; export $as_var
else
$as_unset $as_var
fi
done
# Required to use basename.
if expr a : '\(a\)' >/dev/null 2>&1; then
as_expr=expr
else
as_expr=false
fi
if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
as_basename=basename
else
as_basename=false
fi
# Name of the executable.
as_me=`$as_basename "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)$' \| \
. : '\(.\)' 2>/dev/null ||
echo X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
/^X\/\(\/\/\)$/{ s//\1/; q; }
/^X\/\(\/\).*/{ s//\1/; q; }
s/.*/./; q'`
# PATH needs CR, and LINENO needs CR and PATH.
# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
echo "#! /bin/sh" >conf$$.sh
echo "exit 0" >>conf$$.sh
chmod +x conf$$.sh
if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
PATH_SEPARATOR=';'
else
PATH_SEPARATOR=:
fi
rm -f conf$$.sh
fi
as_lineno_1=$LINENO
as_lineno_2=$LINENO
as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
test "x$as_lineno_1" != "x$as_lineno_2" &&
test "x$as_lineno_3" = "x$as_lineno_2" || {
# Find who we are. Look in the path if we contain no path at all
# relative or not.
case $0 in
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
done
;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
{ echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
{ (exit 1); exit 1; }; }
fi
case $CONFIG_SHELL in
'')
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for as_base in sh bash ksh sh5; do
case $as_dir in
/*)
if ("$as_dir/$as_base" -c '
as_lineno_1=$LINENO
as_lineno_2=$LINENO
as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
test "x$as_lineno_1" != "x$as_lineno_2" &&
test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
$as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
$as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
CONFIG_SHELL=$as_dir/$as_base
export CONFIG_SHELL
exec "$CONFIG_SHELL" "$0" ${1+"$@"}
fi;;
esac
done
done
;;
esac
# Create $as_me.lineno as a copy of $as_myself, but with $LINENO
# uniformly replaced by the line number. The first 'sed' inserts a
# line-number line before each line; the second 'sed' does the real
# work. The second script uses 'N' to pair each line-number line
# with the numbered line, and appends trailing '-' during
# substitution so that $LINENO is not a special case at line end.
# (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
# second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
sed '=' <$as_myself |
sed '
N
s,$,-,
: loop
s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
t loop
s,-$,,
s,^['$as_cr_digits']*\n,,
' >$as_me.lineno &&
chmod +x $as_me.lineno ||
{ echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
{ (exit 1); exit 1; }; }
# Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensible to this).
. ./$as_me.lineno
# Exit status is that of the last command.
exit
}
case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
*c*,-n*) ECHO_N= ECHO_C='
' ECHO_T=' ' ;;
*c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
*) ECHO_N= ECHO_C='\c' ECHO_T= ;;
esac
if expr a : '\(a\)' >/dev/null 2>&1; then
as_expr=expr
else
as_expr=false
fi
rm -f conf$$ conf$$.exe conf$$.file
echo >conf$$.file
if ln -s conf$$.file conf$$ 2>/dev/null; then
# We could just check for DJGPP; but this test a) works b) is more generic
# and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
if test -f conf$$.exe; then
# Don't use ln at all; we don't have any links
as_ln_s='cp -p'
else
as_ln_s='ln -s'
fi
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.file
if mkdir -p . 2>/dev/null; then
as_mkdir_p=:
else
test -d ./-p && rmdir ./-p
as_mkdir_p=false
fi
as_executable_p="test -f"
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
# IFS
# We need space, tab and new line, in precisely that order.
as_nl='
'
IFS=" $as_nl"
# CDPATH.
$as_unset CDPATH
# Check that we are running under the correct shell.
SHELL=${CONFIG_SHELL-/bin/sh}
case X$ECHO in
X*--fallback-echo)
# Remove one level of quotation (which was required for Make).
ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
;;
esac
echo=${ECHO-echo}
if test "X$1" = X--no-reexec; then
# Discard the --no-reexec flag, and continue.
shift
elif test "X$1" = X--fallback-echo; then
# Avoid inline document here, it may be left over
:
elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
# Yippee, $echo works!
:
else
# Restart under the correct shell.
exec $SHELL "$0" --no-reexec ${1+"$@"}
fi
if test "X$1" = X--fallback-echo; then
# used as fallback echo
shift
cat </dev/null 2>&1 && unset CDPATH
if test -z "$ECHO"; then
if test "X${echo_test_string+set}" != Xset; then
# find a string as large as possible, as long as the shell can cope with it
for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
# expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
if (echo_test_string=`eval $cmd`) 2>/dev/null &&
echo_test_string=`eval $cmd` &&
(test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
then
break
fi
done
fi
if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
:
else
# The Solaris, AIX, and Digital Unix default echo programs unquote
# backslashes. This makes it impossible to quote backslashes using
# echo "$something" | sed 's/\\/\\\\/g'
#
# So, first we look for a working echo in the user's PATH.
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for dir in $PATH /usr/ucb; do
IFS="$lt_save_ifs"
if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
echo="$dir/echo"
break
fi
done
IFS="$lt_save_ifs"
if test "X$echo" = Xecho; then
# We didn't find a better echo, so look for alternatives.
if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
# This shell has a builtin print -r that does the trick.
echo='print -r'
elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
test "X$CONFIG_SHELL" != X/bin/ksh; then
# If we have ksh, try running configure again with it.
ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
export ORIGINAL_CONFIG_SHELL
CONFIG_SHELL=/bin/ksh
export CONFIG_SHELL
exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
else
# Try using printf.
echo='printf %s\n'
if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
# Cool, printf works
:
elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
test "X$echo_testing_string" = 'X\t' &&
echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
export CONFIG_SHELL
SHELL="$CONFIG_SHELL"
export SHELL
echo="$CONFIG_SHELL $0 --fallback-echo"
elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
test "X$echo_testing_string" = 'X\t' &&
echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
test "X$echo_testing_string" = "X$echo_test_string"; then
echo="$CONFIG_SHELL $0 --fallback-echo"
else
# maybe with a smaller string...
prev=:
for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
then
break
fi
prev="$cmd"
done
if test "$prev" != 'sed 50q "$0"'; then
echo_test_string=`eval $prev`
export echo_test_string
exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
else
# Oops. We lost completely, so just stick with echo.
echo=echo
fi
fi
fi
fi
fi
fi
# Copy echo and quote the copy suitably for passing to libtool from
# the Makefile, instead of quoting the original, which is used later.
ECHO=$echo
if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
fi
tagnames=${tagnames+${tagnames},}CXX
tagnames=${tagnames+${tagnames},}F77
# Name of the host.
# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
exec 6>&1
#
# Initializations.
#
ac_default_prefix=/usr/local
ac_config_libobj_dir=.
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
# This variable seems obsolete. It should probably be removed, and
# only ac_max_sed_lines should be used.
: ${ac_max_here_lines=38}
# Identity of this package.
PACKAGE_NAME=
PACKAGE_TARNAME=
PACKAGE_VERSION=
PACKAGE_STRING=
PACKAGE_BUGREPORT=
ac_unique_file="Makefile.am"
ac_default_prefix=${GLOBUS_LOCATION:-/usr}
# Factoring default headers for most tests.
ac_includes_default="\
#include
#if HAVE_SYS_TYPES_H
# include
#endif
#if HAVE_SYS_STAT_H
# include
#endif
#if STDC_HEADERS
# include
# include
#else
# if HAVE_STDLIB_H
# include
# endif
#endif
#if HAVE_STRING_H
# if !STDC_HEADERS && HAVE_MEMORY_H
# include
# endif
# include
#endif
#if HAVE_STRINGS_H
# include
#endif
#if HAVE_INTTYPES_H
# include
#else
# if HAVE_STDINT_H
# include
# endif
#endif
#if HAVE_UNISTD_H
# include
#endif"
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT docdir GPT_LOCATION GPT_PKGCONFIG_DEPENDENCIES GPT_IS_2 GPT_CFLAGS GPT_PKG_CFLAGS GPT_INCLUDES GPT_EXTERNAL_INCLUDES GPT_EXTERNAL_LIBS GPT_LIBS GPT_LDFLAGS GPT_CONFIG_CFLAGS GPT_CONFIG_INCLUDES GPT_CONFIG_LIBS GPT_CONFIG_PKG_LIBS GPT_PGM_LINKS GPT_LIB_LINKS GPT_LINKTYPE builddir pkgconfdir pkgconffile pkgconffile_in WITHOUT_FLAVORS_TRUE WITHOUT_FLAVORS_FALSE GLOBUS_FLAVOR_NAME datarootdir CC CPP CFLAGS CPPFLAGS LD LDFLAGS CXX CXXCPP CXXFLAGS INSURE DOXYGEN F77 F77FLAGS F90 F90FLAGS AR ARFLAGS RANLIB PERL CROSS cross_compiling OBJEXT EXEEXT OBJECT_MODE setupdir testdir flavorincludedir pkgdir aclocaldir perlmoduledir doxygendir FILELIST_FILE GPT_MAJOR_VERSION GPT_MINOR_VERSION GPT_AGE_VERSION DIRT_TIMESTAMP DIRT_BRANCH_ID ENABLE_PROGRAMS_TRUE ENABLE_PROGRAMS_FALSE build build_cpu build_vendor build_os host host_cpu host_vendor host_os ac_ct_CC SED EGREP LN_S ECHO ac_ct_AR ac_ct_RANLIB STRIP ac_ct_STRIP ac_ct_CXX FFLAGS ac_ct_F77 LIBTOOL INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE DOXYFILE DOT HAVE_DOT lac_doxygen_srcdirs lac_doxygen_input_filter lac_doxygen_project lac_doxygen_output_tagfile lac_doxygen_tagfiles lac_doxygen_internal_tagfiles lac_doxygen_installdox lac_doxygen_file_patterns lac_doxygen_examples lac_doxygen_predefines LIBOBJS LTLIBOBJS'
ac_subst_files='GLOBUS_LIBDIR_CHOICE GLOBUS_PERL_LIBDIR_CHOICE GLOBUS_SCRIPT_INITIALIZER GLOBUS_PERL_INITIALIZER'
# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE
# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'
ac_prev=
for ac_option
do
# If the previous option needs an argument, assign it.
if test -n "$ac_prev"; then
eval "$ac_prev=\$ac_option"
ac_prev=
continue
fi
ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
# Accept the important Cygnus configure options, so we can diagnose typos.
case $ac_option in
-bindir | --bindir | --bindi | --bind | --bin | --bi)
ac_prev=bindir ;;
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
bindir=$ac_optarg ;;
-build | --build | --buil | --bui | --bu)
ac_prev=build_alias ;;
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
build_alias=$ac_optarg ;;
-cache-file | --cache-file | --cache-fil | --cache-fi \
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
ac_prev=cache_file ;;
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
cache_file=$ac_optarg ;;
--config-cache | -C)
cache_file=config.cache ;;
-datadir | --datadir | --datadi | --datad | --data | --dat | --da)
ac_prev=datadir ;;
-datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
| --da=*)
datadir=$ac_optarg ;;
-disable-* | --disable-*)
ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
{ echo "$as_me: error: invalid feature name: $ac_feature" >&2
{ (exit 1); exit 1; }; }
ac_feature=`echo $ac_feature | sed 's/-/_/g'`
eval "enable_$ac_feature=no" ;;
-enable-* | --enable-*)
ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
{ echo "$as_me: error: invalid feature name: $ac_feature" >&2
{ (exit 1); exit 1; }; }
ac_feature=`echo $ac_feature | sed 's/-/_/g'`
case $ac_option in
*=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
*) ac_optarg=yes ;;
esac
eval "enable_$ac_feature='$ac_optarg'" ;;
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
| --exec | --exe | --ex)
ac_prev=exec_prefix ;;
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
| --exec=* | --exe=* | --ex=*)
exec_prefix=$ac_optarg ;;
-gas | --gas | --ga | --g)
# Obsolete; use --with-gas.
with_gas=yes ;;
-help | --help | --hel | --he | -h)
ac_init_help=long ;;
-help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
ac_init_help=recursive ;;
-help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
ac_init_help=short ;;
-host | --host | --hos | --ho)
ac_prev=host_alias ;;
-host=* | --host=* | --hos=* | --ho=*)
host_alias=$ac_optarg ;;
-includedir | --includedir | --includedi | --included | --include \
| --includ | --inclu | --incl | --inc)
ac_prev=includedir ;;
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
| --includ=* | --inclu=* | --incl=* | --inc=*)
includedir=$ac_optarg ;;
-infodir | --infodir | --infodi | --infod | --info | --inf)
ac_prev=infodir ;;
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
infodir=$ac_optarg ;;
-libdir | --libdir | --libdi | --libd)
ac_prev=libdir ;;
-libdir=* | --libdir=* | --libdi=* | --libd=*)
libdir=$ac_optarg ;;
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
| --libexe | --libex | --libe)
ac_prev=libexecdir ;;
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
| --libexe=* | --libex=* | --libe=*)
libexecdir=$ac_optarg ;;
-localstatedir | --localstatedir | --localstatedi | --localstated \
| --localstate | --localstat | --localsta | --localst \
| --locals | --local | --loca | --loc | --lo)
ac_prev=localstatedir ;;
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
| --localstate=* | --localstat=* | --localsta=* | --localst=* \
| --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
localstatedir=$ac_optarg ;;
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
ac_prev=mandir ;;
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
mandir=$ac_optarg ;;
-nfp | --nfp | --nf)
# Obsolete; use --without-fp.
with_fp=no ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
| --no-cr | --no-c | -n)
no_create=yes ;;
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
no_recursion=yes ;;
-oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
| --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
| --oldin | --oldi | --old | --ol | --o)
ac_prev=oldincludedir ;;
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
oldincludedir=$ac_optarg ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
prefix=$ac_optarg ;;
-program-prefix | --program-prefix | --program-prefi | --program-pref \
| --program-pre | --program-pr | --program-p)
ac_prev=program_prefix ;;
-program-prefix=* | --program-prefix=* | --program-prefi=* \
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
program_prefix=$ac_optarg ;;
-program-suffix | --program-suffix | --program-suffi | --program-suff \
| --program-suf | --program-su | --program-s)
ac_prev=program_suffix ;;
-program-suffix=* | --program-suffix=* | --program-suffi=* \
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
program_suffix=$ac_optarg ;;
-program-transform-name | --program-transform-name \
| --program-transform-nam | --program-transform-na \
| --program-transform-n | --program-transform- \
| --program-transform | --program-transfor \
| --program-transfo | --program-transf \
| --program-trans | --program-tran \
| --progr-tra | --program-tr | --program-t)
ac_prev=program_transform_name ;;
-program-transform-name=* | --program-transform-name=* \
| --program-transform-nam=* | --program-transform-na=* \
| --program-transform-n=* | --program-transform-=* \
| --program-transform=* | --program-transfor=* \
| --program-transfo=* | --program-transf=* \
| --program-trans=* | --program-tran=* \
| --progr-tra=* | --program-tr=* | --program-t=*)
program_transform_name=$ac_optarg ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
| --sbi=* | --sb=*)
sbindir=$ac_optarg ;;
-sharedstatedir | --sharedstatedir | --sharedstatedi \
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
| --sharedst | --shareds | --shared | --share | --shar \
| --sha | --sh)
ac_prev=sharedstatedir ;;
-sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
| --sha=* | --sh=*)
sharedstatedir=$ac_optarg ;;
-site | --site | --sit)
ac_prev=site ;;
-site=* | --site=* | --sit=*)
site=$ac_optarg ;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
srcdir=$ac_optarg ;;
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
| --syscon | --sysco | --sysc | --sys | --sy)
ac_prev=sysconfdir ;;
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
sysconfdir=$ac_optarg ;;
-target | --target | --targe | --targ | --tar | --ta | --t)
ac_prev=target_alias ;;
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
target_alias=$ac_optarg ;;
-v | -verbose | --verbose | --verbos | --verbo | --verb)
verbose=yes ;;
-version | --version | --versio | --versi | --vers | -V)
ac_init_version=: ;;
-with-* | --with-*)
ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
{ echo "$as_me: error: invalid package name: $ac_package" >&2
{ (exit 1); exit 1; }; }
ac_package=`echo $ac_package| sed 's/-/_/g'`
case $ac_option in
*=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
*) ac_optarg=yes ;;
esac
eval "with_$ac_package='$ac_optarg'" ;;
-without-* | --without-*)
ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
{ echo "$as_me: error: invalid package name: $ac_package" >&2
{ (exit 1); exit 1; }; }
ac_package=`echo $ac_package | sed 's/-/_/g'`
eval "with_$ac_package=no" ;;
--x)
# Obsolete; use --with-x.
with_x=yes ;;
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
| --x-incl | --x-inc | --x-in | --x-i)
ac_prev=x_includes ;;
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
x_includes=$ac_optarg ;;
-x-libraries | --x-libraries | --x-librarie | --x-librari \
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
ac_prev=x_libraries ;;
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries=$ac_optarg ;;
-*) { echo "$as_me: error: unrecognized option: $ac_option
Try \`$0 --help' for more information." >&2
{ (exit 1); exit 1; }; }
;;
*=*)
ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
# Reject names that are not valid shell variable names.
expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
{ echo "$as_me: error: invalid variable name: $ac_envvar" >&2
{ (exit 1); exit 1; }; }
ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
eval "$ac_envvar='$ac_optarg'"
export $ac_envvar ;;
*)
# FIXME: should be removed in autoconf 3.0.
echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
echo "$as_me: WARNING: invalid host type: $ac_option" >&2
: ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
;;
esac
done
if test -n "$ac_prev"; then
ac_option=--`echo $ac_prev | sed 's/_/-/g'`
{ echo "$as_me: error: missing argument to $ac_option" >&2
{ (exit 1); exit 1; }; }
fi
# Be sure to have absolute paths.
for ac_var in exec_prefix prefix
do
eval ac_val=$`echo $ac_var`
case $ac_val in
[\\/$]* | ?:[\\/]* | NONE | '' ) ;;
*) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
{ (exit 1); exit 1; }; };;
esac
done
# Be sure to have absolute paths.
for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
localstatedir libdir includedir oldincludedir infodir mandir
do
eval ac_val=$`echo $ac_var`
case $ac_val in
[\\/$]* | ?:[\\/]* ) ;;
*) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
{ (exit 1); exit 1; }; };;
esac
done
# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias
# FIXME: To remove some day.
if test "x$host_alias" != x; then
if test "x$build_alias" = x; then
cross_compiling=maybe
echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used." >&2
elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes
fi
fi
ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-
test "$silent" = yes && exec 6>/dev/null
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
# Try the directory containing this script, then its parent.
ac_confdir=`(dirname "$0") 2>/dev/null ||
$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$0" : 'X\(//\)[^/]' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| \
. : '\(.\)' 2>/dev/null ||
echo X"$0" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
/^X\(\/\/\)[^/].*/{ s//\1/; q; }
/^X\(\/\/\)$/{ s//\1/; q; }
/^X\(\/\).*/{ s//\1/; q; }
s/.*/./; q'`
srcdir=$ac_confdir
if test ! -r $srcdir/$ac_unique_file; then
srcdir=..
fi
else
ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
if test "$ac_srcdir_defaulted" = yes; then
{ echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
{ (exit 1); exit 1; }; }
else
{ echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
{ (exit 1); exit 1; }; }
fi
fi
(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
{ echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
{ (exit 1); exit 1; }; }
srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
ac_env_build_alias_set=${build_alias+set}
ac_env_build_alias_value=$build_alias
ac_cv_env_build_alias_set=${build_alias+set}
ac_cv_env_build_alias_value=$build_alias
ac_env_host_alias_set=${host_alias+set}
ac_env_host_alias_value=$host_alias
ac_cv_env_host_alias_set=${host_alias+set}
ac_cv_env_host_alias_value=$host_alias
ac_env_target_alias_set=${target_alias+set}
ac_env_target_alias_value=$target_alias
ac_cv_env_target_alias_set=${target_alias+set}
ac_cv_env_target_alias_value=$target_alias
ac_env_CC_set=${CC+set}
ac_env_CC_value=$CC
ac_cv_env_CC_set=${CC+set}
ac_cv_env_CC_value=$CC
ac_env_CFLAGS_set=${CFLAGS+set}
ac_env_CFLAGS_value=$CFLAGS
ac_cv_env_CFLAGS_set=${CFLAGS+set}
ac_cv_env_CFLAGS_value=$CFLAGS
ac_env_LDFLAGS_set=${LDFLAGS+set}
ac_env_LDFLAGS_value=$LDFLAGS
ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
ac_cv_env_LDFLAGS_value=$LDFLAGS
ac_env_CPPFLAGS_set=${CPPFLAGS+set}
ac_env_CPPFLAGS_value=$CPPFLAGS
ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
ac_cv_env_CPPFLAGS_value=$CPPFLAGS
ac_env_CPP_set=${CPP+set}
ac_env_CPP_value=$CPP
ac_cv_env_CPP_set=${CPP+set}
ac_cv_env_CPP_value=$CPP
ac_env_CXX_set=${CXX+set}
ac_env_CXX_value=$CXX
ac_cv_env_CXX_set=${CXX+set}
ac_cv_env_CXX_value=$CXX
ac_env_CXXFLAGS_set=${CXXFLAGS+set}
ac_env_CXXFLAGS_value=$CXXFLAGS
ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
ac_cv_env_CXXFLAGS_value=$CXXFLAGS
ac_env_CXXCPP_set=${CXXCPP+set}
ac_env_CXXCPP_value=$CXXCPP
ac_cv_env_CXXCPP_set=${CXXCPP+set}
ac_cv_env_CXXCPP_value=$CXXCPP
ac_env_F77_set=${F77+set}
ac_env_F77_value=$F77
ac_cv_env_F77_set=${F77+set}
ac_cv_env_F77_value=$F77
ac_env_FFLAGS_set=${FFLAGS+set}
ac_env_FFLAGS_value=$FFLAGS
ac_cv_env_FFLAGS_set=${FFLAGS+set}
ac_cv_env_FFLAGS_value=$FFLAGS
#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures this package to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print \`checking...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for \`--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or \`..']
_ACEOF
cat <<_ACEOF
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[$ac_default_prefix]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--datadir=DIR read-only architecture-independent data [PREFIX/share]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--infodir=DIR info documentation [PREFIX/info]
--mandir=DIR man documentation [PREFIX/man]
_ACEOF
cat <<\_ACEOF
Program names:
--program-prefix=PREFIX prepend PREFIX to installed program names
--program-suffix=SUFFIX append SUFFIX to installed program names
--program-transform-name=PROGRAM run sed PROGRAM on installed program names
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
_ACEOF
fi
if test -n "$ac_init_help"; then
cat <<\_ACEOF
Optional Features:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer
--enable-static-only Don't do any dynamic linking
--disable-programs Don't compile/link programs
--enable-shared[=PKGS]
build shared libraries [default=yes]
--enable-static[=PKGS]
build static libraries [default=yes]
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
--disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors
--enable-doxygen=PATH Use Doxygen to generate doxygen. If specified, PATH is
the path to the doxygen executable; otherwise it is
autodiscovered
--enable-internal-doc Generate Doxygen documentation for internal
functions. Requires --enable-doxygen
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-flavor=FLAVOR Specify the globus build flavor or without-flavor
for a flavor independent
--with-docdir=DIR Install documentation in DIR [DATADIR/doc/PACKAGE]
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
--with-pic try to use only PIC/non-PIC objects [default=use
both]
--with-tags[=TAGS]
include additional configurations [automatic]
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L if you have libraries in a
nonstandard directory
CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have
headers in a nonstandard directory
CPP C preprocessor
CXX C++ compiler command
CXXFLAGS C++ compiler flags
CXXCPP C++ preprocessor
F77 Fortran 77 compiler command
FFLAGS Fortran 77 compiler flags
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
_ACEOF
fi
if test "$ac_init_help" = "recursive"; then
# If there are subdirs, report their specific --help.
ac_popdir=`pwd`
for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
test -d $ac_dir || continue
ac_builddir=.
if test "$ac_dir" != .; then
ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
# A "../" for each directory in $ac_dir_suffix.
ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
else
ac_dir_suffix= ac_top_builddir=
fi
case $srcdir in
.) # No --srcdir option. We are building in place.
ac_srcdir=.
if test -z "$ac_top_builddir"; then
ac_top_srcdir=.
else
ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
fi ;;
[\\/]* | ?:[\\/]* ) # Absolute path.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir ;;
*) # Relative path.
ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_builddir$srcdir ;;
esac
# Do not use `cd foo && pwd` to compute absolute paths, because
# the directories may not exist.
case `pwd` in
.) ac_abs_builddir="$ac_dir";;
*)
case "$ac_dir" in
.) ac_abs_builddir=`pwd`;;
[\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
*) ac_abs_builddir=`pwd`/"$ac_dir";;
esac;;
esac
case $ac_abs_builddir in
.) ac_abs_top_builddir=${ac_top_builddir}.;;
*)
case ${ac_top_builddir}. in
.) ac_abs_top_builddir=$ac_abs_builddir;;
[\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
*) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
esac;;
esac
case $ac_abs_builddir in
.) ac_abs_srcdir=$ac_srcdir;;
*)
case $ac_srcdir in
.) ac_abs_srcdir=$ac_abs_builddir;;
[\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
*) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
esac;;
esac
case $ac_abs_builddir in
.) ac_abs_top_srcdir=$ac_top_srcdir;;
*)
case $ac_top_srcdir in
.) ac_abs_top_srcdir=$ac_abs_builddir;;
[\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
*) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
esac;;
esac
cd $ac_dir
# Check for guested configure; otherwise get Cygnus style configure.
if test -f $ac_srcdir/configure.gnu; then
echo
$SHELL $ac_srcdir/configure.gnu --help=recursive
elif test -f $ac_srcdir/configure; then
echo
$SHELL $ac_srcdir/configure --help=recursive
elif test -f $ac_srcdir/configure.ac ||
test -f $ac_srcdir/configure.in; then
echo
$ac_configure --help
else
echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi
cd $ac_popdir
done
fi
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
Copyright (C) 2003 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
exit 0
fi
exec 5>config.log
cat >&5 <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
generated by GNU Autoconf 2.59. Invocation command line was
$ $0 $@
_ACEOF
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##
hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`
/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
_ASUNAME
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
echo "PATH: $as_dir"
done
} >&5
cat >&5 <<_ACEOF
## ----------- ##
## Core tests. ##
## ----------- ##
_ACEOF
# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_sep=
ac_must_keep_next=false
for ac_pass in 1 2
do
for ac_arg
do
case $ac_arg in
-no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
2)
ac_configure_args1="$ac_configure_args1 '$ac_arg'"
if test $ac_must_keep_next = true; then
ac_must_keep_next=false # Got value, back to normal.
else
case $ac_arg in
*=* | --config-cache | -C | -disable-* | --disable-* \
| -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
| -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
| -with-* | --with-* | -without-* | --without-* | --x)
case "$ac_configure_args0 " in
"$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
esac
;;
-* ) ac_must_keep_next=true ;;
esac
fi
ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
# Get rid of the leading space.
ac_sep=" "
;;
esac
done
done
$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
# When interrupted or exit'd, cleanup temporary files, and complete
# config.log. We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Be sure not to use single quotes in there, as some shells,
# such as our DU 5.0 friend, will then `close' the trap.
trap 'exit_status=$?
# Save into config.log some information that might help in debugging.
{
echo
cat <<\_ASBOX
## ---------------- ##
## Cache variables. ##
## ---------------- ##
_ASBOX
echo
# The following way of writing the cache mishandles newlines in values,
{
(set) 2>&1 |
case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
*ac_space=\ *)
sed -n \
"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
;;
*)
sed -n \
"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
;;
esac;
}
echo
cat <<\_ASBOX
## ----------------- ##
## Output variables. ##
## ----------------- ##
_ASBOX
echo
for ac_var in $ac_subst_vars
do
eval ac_val=$`echo $ac_var`
echo "$ac_var='"'"'$ac_val'"'"'"
done | sort
echo
if test -n "$ac_subst_files"; then
cat <<\_ASBOX
## ------------- ##
## Output files. ##
## ------------- ##
_ASBOX
echo
for ac_var in $ac_subst_files
do
eval ac_val=$`echo $ac_var`
echo "$ac_var='"'"'$ac_val'"'"'"
done | sort
echo
fi
if test -s confdefs.h; then
cat <<\_ASBOX
## ----------- ##
## confdefs.h. ##
## ----------- ##
_ASBOX
echo
sed "/^$/d" confdefs.h | sort
echo
fi
test "$ac_signal" != 0 &&
echo "$as_me: caught signal $ac_signal"
echo "$as_me: exit $exit_status"
} >&5
rm -f core *.core &&
rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
done
ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo >confdefs.h
# Predefined preprocessor variables.
cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF
# Let the site file select an alternate cache file if it wants to.
# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
if test "x$prefix" != xNONE; then
CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
else
CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
fi
for ac_site_file in $CONFIG_SITE; do
if test -r "$ac_site_file"; then
{ echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
echo "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file"
fi
done
if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special
# files actually), so we avoid doing that.
if test -f "$cache_file"; then
{ echo "$as_me:$LINENO: loading cache $cache_file" >&5
echo "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . $cache_file;;
*) . ./$cache_file;;
esac
fi
else
{ echo "$as_me:$LINENO: creating cache $cache_file" >&5
echo "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in `(set) 2>&1 |
sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
eval ac_old_set=\$ac_cv_env_${ac_var}_set
eval ac_new_set=\$ac_env_${ac_var}_set
eval ac_old_val="\$ac_cv_env_${ac_var}_value"
eval ac_new_val="\$ac_env_${ac_var}_value"
case $ac_old_set,$ac_new_set in
set,)
{ echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
{ echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
if test "x$ac_old_val" != "x$ac_new_val"; then
{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
{ echo "$as_me:$LINENO: former value: $ac_old_val" >&5
echo "$as_me: former value: $ac_old_val" >&2;}
{ echo "$as_me:$LINENO: current value: $ac_new_val" >&5
echo "$as_me: current value: $ac_new_val" >&2;}
ac_cache_corrupted=:
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
*" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
*" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
*) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
esac
fi
done
if $ac_cache_corrupted; then
{ echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
echo "$as_me: error: changes in the environment can compromise the build" >&2;}
{ { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
{ (exit 1); exit 1; }; }
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then
enableval="$enable_maintainer_mode"
USE_MAINTAINER_MODE=$enableval
else
USE_MAINTAINER_MODE=no
fi;
echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
if test $USE_MAINTAINER_MODE = yes; then
MAINTAINER_MODE_TRUE=
MAINTAINER_MODE_FALSE='#'
else
MAINTAINER_MODE_TRUE='#'
MAINTAINER_MODE_FALSE=
fi
MAINT=$MAINTAINER_MODE_TRUE
# checking for the GLOBUS_LOCATION
GLOBUS_LOCATION="${GLOBUS_LOCATION:-/usr}"
GPT_LOCATION="${GPT_LOCATION:-${GLOBUS_LOCATION}}"
# This is created in globus-bootstrap.sh
. "${srcdir}/gptdata.sh"
if test "x$GPT_BUILD_WITH_FLAVORS" = "xno"; then
GLOBUS_FLAVOR_NAME="noflavor"
fi
eval_path()
{
_pathval="$1"
_old_pathval=""
while test "$_pathval" != "$_old_pathval"; do
_old_pathval="$_pathval"
eval "_pathval=\"$_pathval\""
done
echo "$_pathval"
}
# Check whether --with-flavor or --without-flavor was given.
if test "${with_flavor+set}" = set; then
withval="$with_flavor"
case $withval in
no)
NO_FLAVOR="yes"
;;
yes)
echo "Please specify a globus build flavor" >&2
exit 1
;;
*)
if test "x$GLOBUS_FLAVOR_NAME" = "xnoflavor"; then
echo "Warning: package doesn't build with flavors $withval ignored" >&2
echo "Warning: $withval ignored" >&2
else
GLOBUS_FLAVOR_NAME=$withval
if test ! -f "${GLOBUS_LOCATION}/share/globus/flavors/flavor_$GLOBUS_FLAVOR_NAME.gpt"; then
echo "ERROR: Flavor $GLOBUS_FLAVOR_NAME has not been installed" >&2
exit 1
fi
fi
;;
esac
else
if test "x$GLOBUS_FLAVOR_NAME" = "x"; then
echo "Please specify a globus build flavor" >&2
exit 1
fi
fi;
GPT_LOCATION="${GPT_LOCATION:-${GLOBUS_LOCATION:-/usr}}"
# Check whether --with-docdir or --without-docdir was given.
if test "${with_docdir+set}" = set; then
withval="$with_docdir"
case $withval in
yes|no)
{ { echo "$as_me:$LINENO: error: Invalid DIR" >&5
echo "$as_me: error: Invalid DIR" >&2;}
{ (exit 1); exit 1; }; }
;;
*)
docdir="$withval"
;;
esac
else
if test -z "$docdir"; then
docdir='${datadir}/doc/${PACKAGE}'
fi
fi;
# bootstrap extracts the the name and version of the package from the
# src metadata into gptdata.sh for easier processing
. ${srcdir}/gptdata.sh
GPT_VERSION="$GPT_MAJOR_VERSION.$GPT_MINOR_VERSION"
# Determine if GPT is version 2.x
GPT_IS_2="no"
if test -f "$GPT_LOCATION/sbin/gpt-build"; then
GPT_IS_2="yes"
fi
#Default to shared, before checking static-only
GPT_LINKTYPE="shared"
# We have to figure out if we're linking only static before build_config
# Check whether --enable-static-only or --disable-static-only was given.
if test "${enable_static_only+set}" = set; then
enableval="$enable_static_only"
case $enableval in
no)
GPT_LINKTYPE="shared"
;;
yes)
GPT_LINKTYPE="static"
;;
*)
echo "--enable-static-only has no arguments" >&2
exit 1
;;
esac
fi;
#extract the cumulative build environment from the installed development tree
if $GPT_LOCATION/sbin/gpt_build_config -src $srcdir/pkgdata/pkg_data_src.gpt.in -f $GLOBUS_FLAVOR_NAME -link $GPT_LINKTYPE; then
echo "Dependencies Complete";
else
exit 1;
fi
# The following variables are used to manage the build enviroment
# GPT_CFLAGS, GPT_INCLUDES, GPT_PGM_LINKS, GPT_LIB_LINKS, and GPT_LDFLAGS
# are the variables used in the Makefile.am's
# GPT_PKG_CFLAGS, GPT_EXTERNAL_INCLUDES and GPT_EXTERNAL_LIBS are stored
# as build data in the packaging metadata file.
# GPT_CONFIG_FLAGS, GPT_CONFIG_INCLUDES, GPT_CONFIG_PGM_LINKS, and
# GPT_CONFIG_LIB_LINKS are returned by gpt_build_config and contain build
# environment data from the dependent packages.
. ./gpt_build_temp.sh
rm ./gpt_build_temp.sh
GPT_CFLAGS="$GPT_CONFIG_CFLAGS"
GPT_INCLUDES="$GPT_CONFIG_INCLUDES"
GPT_LIBS="$GPT_CONFIG_PKG_LIBS $GPT_CONFIG_LIBS"
GPT_LDFLAGS="$GPT_CONFIG_STATIC_LINKLINE $GPT_LDFLAGS"
GPT_PGM_LINKS="$GPT_CONFIG_PGM_LINKS $GPT_CONFIG_LIBS"
GPT_LIB_LINKS="-version-info $GPT_MAJOR_VERSION:$GPT_MINOR_VERSION:$GPT_AGE_VERSION $GPT_CONFIG_LIB_LINKS $GPT_CONFIG_LIBS"
builddir=`pwd`
# Export pkg-config information about this package
pkgconfdir='${libdir}/pkgconfig'
pkgconffile=`echo "${GPT_NAME}.pc" | sed -e 's!_!-!g'`
pkgconffile_in="pkg_data_src.pc.in"
ac_config_files="$ac_config_files pkgdata/$pkgconffile:pkgdata/pkg_data_src.pc.in"
if test "$NO_FLAVOR" = "yes"; then
WITHOUT_FLAVORS_TRUE=
WITHOUT_FLAVORS_FALSE='#'
else
WITHOUT_FLAVORS_TRUE='#'
WITHOUT_FLAVORS_FALSE=
fi
# get the environment scripts
. ${GLOBUS_LOCATION}/share/globus/globus-build-env-$GLOBUS_FLAVOR_NAME.sh
initializer_prefix="${prefix}"
test "$initializer_prefix" = "NONE" && initializer_prefix="$ac_default_prefix"
initializer_exec_prefix="${exec_prefix}"
test "$initializer_exec_prefix" = "NONE" && initializer_exec_prefix='${prefix}'
test "$datarootdir" = "" && datarootdir='${prefix}/share'
case $guess_libdir:${host}:${libdir} in
1:*linux*:*lib64)
libdir32="${libdir%%64}"
libdir64="${libdir}"
libdir_choice="
case \`uname -m\` in
aarch64|ppc64|s390x|sparc64|x86_64)
libdir=\"$libdir64\"
;;
*)
libdir=\"$libdir32\"
;;
esac
"
perl_libdir_choice="
if (\`uname -m\` =~ /^(aarch64|ppc64|s390x|sparc64|x86_64)\$/) {
\$libdir = \"$libdir64\";
} else {
\$libdir = \"$libdir32\";
}
"
;;
1:*linux*:*lib)
libdir32="${libdir}"
libdir64="${libdir}64"
libdir_choice="
case \`uname -m\` in
aarch64|ppc64|s390x|sparc64|x86_64)
libdir=\"$libdir64\"
;;
*)
libdir=\"$libdir32\"
;;
esac
"
perl_libdir_choice="
if (\`uname -m\` =~ /^(aarch64|ppc64|s390x|sparc64|x86_64)\$/) {
\$libdir = \"$libdir64\";
} else {
\$libdir = \"$libdir32\";
}
"
;;
*)
libdir_choice="libdir=\"$libdir\""
perl_libdir_choice=" \$libdir = \"$libdir\";";
;;
esac
echo "$libdir_choice" | sed "s/\"/'/g" > globus-script-libdir-choice
GLOBUS_LIBDIR_CHOICE="globus-script-libdir-choice"
echo "$perl_libdir_choice" | sed "s/^ //" > globus-perl-libdir-choice
GLOBUS_PERL_LIBDIR_CHOICE="globus-perl-libdir-choice"
cat > globus-script-initializer << EOF
if test -n "\${GLOBUS_LOCATION}" ; then
prefix="\${GLOBUS_LOCATION}"
else
prefix="$initializer_prefix"
fi
exec_prefix="$initializer_exec_prefix"
sbindir="$sbindir"
bindir="$bindir"
$libdir_choice
includedir="$includedir"
datarootdir="$datarootdir"
datadir="$datadir"
libexecdir="$libexecdir"
sysconfdir="$sysconfdir"
sharedstatedir="$sharedstatedir"
localstatedir="$localstatedir"
aclocaldir="$aclocaldir"
EOF
GLOBUS_SCRIPT_INITIALIZER=globus-script-initializer
cat > globus-perl-initializer << EOF
my (\$prefix, \$exec_prefix, \$libdir, \$perlmoduledir);
my (\$sbindir, \$bindir, \$includedir, \$datarootdir,
\$datadir, \$libexecdir, \$sysconfdir, \$sharedstatedir,
\$localstatedir, \$aclocaldir);
BEGIN
{
if (exists \$ENV{GLOBUS_LOCATION})
{
\$prefix = \$ENV{GLOBUS_LOCATION};
}
else
{
\$prefix = "$initializer_prefix";
}
\$exec_prefix = "$initializer_exec_prefix";
$perl_libdir_choice
\$sbindir = "$sbindir";
\$bindir = "$bindir";
\$includedir = "$includedir";
\$datarootdir = "$datarootdir";
\$datadir = "$datadir";
\$perlmoduledir = "$perlmoduledir";
\$libexecdir = "$libexecdir";
\$sysconfdir = "$sysconfdir";
\$sharedstatedir = "$sharedstatedir";
\$localstatedir = "$localstatedir";
\$aclocaldir = "$aclocaldir";
if (exists \$ENV{GPT_LOCATION})
{
unshift(@INC, "\$ENV{GPT_LOCATION}/lib/perl");
}
unshift(@INC, "\${perlmoduledir}");
}
EOF
GLOBUS_PERL_INITIALIZER=globus-perl-initializer
doxygendir="`eval_path '$doxygendir'`"
FILELIST_FILE=`pwd`;
FILELIST_FILE="$FILELIST_FILE/pkgdata/master.filelist"
if test -f $srcdir/dirt.sh ; then
. $srcdir/dirt.sh
else
DIRT_TIMESTAMP=`perl -e 'print time'`
DIRT_BRANCH_ID=99999
fi
# Check whether --enable-programs or --disable-programs was given.
if test "${enable_programs+set}" = set; then
enableval="$enable_programs"
case "${enableval}" in
yes)
ENABLE_PROGRAMS=true
;;
no)
ENABLE_PROGRAMS=false
;;
*)
{ { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-programs" >&5
echo "$as_me: error: bad value ${enableval} for --enable-programs" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
else
ENABLE_PROGRAMS=true
fi;
if test "x$ENABLE_PROGRAMS" = "xtrue"; then
ENABLE_PROGRAMS_TRUE=
ENABLE_PROGRAMS_FALSE='#'
else
ENABLE_PROGRAMS_TRUE='#'
ENABLE_PROGRAMS_FALSE=
fi
# Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
enableval="$enable_shared"
p=${PACKAGE-default}
case $enableval in
yes) enable_shared=yes ;;
no) enable_shared=no ;;
*)
enable_shared=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for pkg in $enableval; do
IFS="$lt_save_ifs"
if test "X$pkg" = "X$p"; then
enable_shared=yes
fi
done
IFS="$lt_save_ifs"
;;
esac
else
enable_shared=yes
fi;
# Check whether --enable-static or --disable-static was given.
if test "${enable_static+set}" = set; then
enableval="$enable_static"
p=${PACKAGE-default}
case $enableval in
yes) enable_static=yes ;;
no) enable_static=no ;;
*)
enable_static=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for pkg in $enableval; do
IFS="$lt_save_ifs"
if test "X$pkg" = "X$p"; then
enable_static=yes
fi
done
IFS="$lt_save_ifs"
;;
esac
else
enable_static=yes
fi;
# Check whether --enable-fast-install or --disable-fast-install was given.
if test "${enable_fast_install+set}" = set; then
enableval="$enable_fast_install"
p=${PACKAGE-default}
case $enableval in
yes) enable_fast_install=yes ;;
no) enable_fast_install=no ;;
*)
enable_fast_install=no
# Look at the argument we got. We use all the common list separators.
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for pkg in $enableval; do
IFS="$lt_save_ifs"
if test "X$pkg" = "X$p"; then
enable_fast_install=yes
fi
done
IFS="$lt_save_ifs"
;;
esac
else
enable_fast_install=yes
fi;
ac_aux_dir=
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
if test -f $ac_dir/install-sh; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install-sh -c"
break
elif test -f $ac_dir/install.sh; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install.sh -c"
break
elif test -f $ac_dir/shtool; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/shtool install -c"
break
fi
done
if test -z "$ac_aux_dir"; then
{ { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
{ (exit 1); exit 1; }; }
fi
ac_config_guess="$SHELL $ac_aux_dir/config.guess"
ac_config_sub="$SHELL $ac_aux_dir/config.sub"
ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
# Make sure we can run config.sub.
$ac_config_sub sun4 >/dev/null 2>&1 ||
{ { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
echo "$as_me: error: cannot run $ac_config_sub" >&2;}
{ (exit 1); exit 1; }; }
echo "$as_me:$LINENO: checking build system type" >&5
echo $ECHO_N "checking build system type... $ECHO_C" >&6
if test "${ac_cv_build+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_cv_build_alias=$build_alias
test -z "$ac_cv_build_alias" &&
ac_cv_build_alias=`$ac_config_guess`
test -z "$ac_cv_build_alias" &&
{ { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
{ (exit 1); exit 1; }; }
ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
{ { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
{ (exit 1); exit 1; }; }
fi
echo "$as_me:$LINENO: result: $ac_cv_build" >&5
echo "${ECHO_T}$ac_cv_build" >&6
build=$ac_cv_build
build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$as_me:$LINENO: checking host system type" >&5
echo $ECHO_N "checking host system type... $ECHO_C" >&6
if test "${ac_cv_host+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_cv_host_alias=$host_alias
test -z "$ac_cv_host_alias" &&
ac_cv_host_alias=$ac_cv_build_alias
ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
{ { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
{ (exit 1); exit 1; }; }
fi
echo "$as_me:$LINENO: result: $ac_cv_host" >&5
echo "${ECHO_T}$ac_cv_host" >&6
host=$ac_cv_host
host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
echo "$as_me:$LINENO: result: $CC" >&5
echo "${ECHO_T}$CC" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
echo "${ECHO_T}$ac_ct_CC" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
CC=$ac_ct_CC
else
CC="$ac_cv_prog_CC"
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
echo "$as_me:$LINENO: result: $CC" >&5
echo "${ECHO_T}$CC" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="cc"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
echo "${ECHO_T}$ac_ct_CC" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
CC=$ac_ct_CC
else
CC="$ac_cv_prog_CC"
fi
fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
if test $ac_prog_rejected = yes; then
# We found a bogon in the path, so make sure we never use it.
set dummy $ac_cv_prog_CC
shift
if test $# != 0; then
# We chose a different compiler from the bogus one.
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
echo "$as_me:$LINENO: result: $CC" >&5
echo "${ECHO_T}$CC" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
for ac_prog in cl
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
echo "$as_me:$LINENO: result: $CC" >&5
echo "${ECHO_T}$CC" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -n "$CC" && break
done
fi
if test -z "$CC"; then
ac_ct_CC=$CC
for ac_prog in cl
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
echo "${ECHO_T}$ac_ct_CC" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -n "$ac_ct_CC" && break
done
CC=$ac_ct_CC
fi
fi
test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
See \`config.log' for more details." >&5
echo "$as_me: error: no acceptable C compiler found in \$PATH
See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
# Provide some information about the compiler.
echo "$as_me:$LINENO:" \
"checking for C compiler version" >&5
ac_compiler=`set X $ac_compile; echo $2`
{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5
(eval $ac_compiler --version &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5
(eval $ac_compiler -v &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5
(eval $ac_compiler -V &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
(eval $ac_link_default) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
# Find the output, starting from the most likely. This scheme is
# not robust to junk in `.', hence go to wildcards (a.*) only as a last
# resort.
# Be careful to initialize this variable, since it used to be cached.
# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
ac_cv_exeext=
# b.out is created by i960 compilers.
for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
do
test -f "$ac_file" || continue
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
;;
conftest.$ac_ext )
# This is the source file.
;;
[ab].out )
# We found the default executable, but exeext='' is most
# certainly right.
break;;
*.* )
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
# FIXME: I believe we export ac_cv_exeext for Libtool,
# but it would be cool to find out if it's true. Does anybody
# maintain Libtool? --akim.
export ac_cv_exeext
break;;
* )
break;;
esac
done
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
See \`config.log' for more details." >&5
echo "$as_me: error: C compiler cannot create executables
See \`config.log' for more details." >&2;}
{ (exit 77); exit 77; }; }
fi
ac_exeext=$ac_cv_exeext
echo "$as_me:$LINENO: result: $ac_file" >&5
echo "${ECHO_T}$ac_file" >&6
# Check the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
echo "$as_me:$LINENO: checking whether the C compiler works" >&5
echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
# If not cross compiling, check that we can run a simple program.
if test "$cross_compiling" != yes; then
if { ac_try='./$ac_file'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details." >&5
echo "$as_me: error: cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
fi
fi
fi
echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6
rm -f a.out a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
# Check the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
echo "$as_me:$LINENO: result: $cross_compiling" >&5
echo "${ECHO_T}$cross_compiling" >&6
echo "$as_me:$LINENO: checking for suffix of executables" >&5
echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
test -f "$ac_file" || continue
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
*.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
export ac_cv_exeext
break;;
* ) break;;
esac
done
else
{ { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details." >&5
echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
fi
rm -f conftest$ac_cv_exeext
echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
echo "${ECHO_T}$ac_cv_exeext" >&6
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
echo "$as_me:$LINENO: checking for suffix of object files" >&5
echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
if test "${ac_cv_objext+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
*) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
break;;
esac
done
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
See \`config.log' for more details." >&5
echo "$as_me: error: cannot compute suffix of object files: cannot compile
See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
echo "${ECHO_T}$ac_cv_objext" >&6
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
if test "${ac_cv_c_compiler_gnu+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
#ifndef __GNUC__
choke me
#endif
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_compiler_gnu=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_compiler_gnu=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
GCC=`test $ac_compiler_gnu = yes && echo yes`
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
CFLAGS="-g"
echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
if test "${ac_cv_prog_cc_g+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_prog_cc_g=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_prog_cc_g=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
if test "$ac_test_CFLAGS" = set; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
CFLAGS="-g -O2"
else
CFLAGS="-g"
fi
else
if test "$GCC" = yes; then
CFLAGS="-O2"
else
CFLAGS=
fi
fi
echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
if test "${ac_cv_prog_cc_stdc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_cv_prog_cc_stdc=no
ac_save_CC=$CC
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
#include
#include
#include
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
char **p;
int i;
{
return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
char *s;
va_list v;
va_start (v,p);
s = g (p, va_arg (v,int));
va_end (v);
return s;
}
/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
function prototypes and stuff, but not '\xHH' hex character constants.
These don't provoke an error unfortunately, instead are silently treated
as 'x'. The following induces an error, until -std1 is added to get
proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
array size at least. It's necessary to write '\x00'==0 to get something
that's true only with -std1. */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];
int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
;
return 0;
}
_ACEOF
# Don't try gcc -ansi; that turns off useful extensions and
# breaks some systems' header files.
# AIX -qlanglvl=ansi
# Ultrix and OSF/1 -std1
# HP-UX 10.20 and later -Ae
# HP-UX older versions -Aa -D_HPUX_SOURCE
# SVR4 -Xc -D__EXTENSIONS__
for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_prog_cc_stdc=$ac_arg
break
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext
done
rm -f conftest.$ac_ext conftest.$ac_objext
CC=$ac_save_CC
fi
case "x$ac_cv_prog_cc_stdc" in
x|xno)
echo "$as_me:$LINENO: result: none needed" >&5
echo "${ECHO_T}none needed" >&6 ;;
*)
echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
CC="$CC $ac_cv_prog_cc_stdc" ;;
esac
# Some people use a C++ compiler to compile C. Since we use `exit',
# in C++ we need to declare it. In case someone uses the same compiler
# for both compiling C and C++ we need to have the C++ compiler decide
# the declaration of exit, since it's the most demanding environment.
cat >conftest.$ac_ext <<_ACEOF
#ifndef __cplusplus
choke me
#endif
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
for ac_declaration in \
'' \
'extern "C" void std::exit (int) throw (); using std::exit;' \
'extern "C" void std::exit (int); using std::exit;' \
'extern "C" void exit (int) throw ();' \
'extern "C" void exit (int);' \
'void exit (int);'
do
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_declaration
#include
int
main ()
{
exit (42);
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
continue
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_declaration
int
main ()
{
exit (42);
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
done
rm -f conftest*
if test -n "$ac_declaration"; then
echo '#ifdef __cplusplus' >>confdefs.h
echo $ac_declaration >>confdefs.h
echo '#endif' >>confdefs.h
fi
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
if test "${lt_cv_path_SED+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
# Loop through the user's path and test for sed and gsed.
# Then use that list of sed's as ones to test for truncation.
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for lt_ac_prog in sed gsed; do
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
fi
done
done
done
IFS=$as_save_IFS
lt_ac_max=0
lt_ac_count=0
# Add /usr/xpg4/bin/sed as it is typically found on Solaris
# along with /bin/sed that truncates output.
for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
test ! -f $lt_ac_sed && continue
cat /dev/null > conftest.in
lt_ac_count=0
echo $ECHO_N "0123456789$ECHO_C" >conftest.in
# Check for GNU sed and select it if it is found.
if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
lt_cv_path_SED=$lt_ac_sed
break
fi
while true; do
cat conftest.in conftest.in >conftest.tmp
mv conftest.tmp conftest.in
cp conftest.in conftest.nl
echo >>conftest.nl
$lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
cmp -s conftest.out conftest.nl || break
# 10000 chars as input seems more than enough
test $lt_ac_count -gt 10 && break
lt_ac_count=`expr $lt_ac_count + 1`
if test $lt_ac_count -gt $lt_ac_max; then
lt_ac_max=$lt_ac_count
lt_cv_path_SED=$lt_ac_sed
fi
done
done
fi
SED=$lt_cv_path_SED
echo "$as_me:$LINENO: result: $SED" >&5
echo "${ECHO_T}$SED" >&6
echo "$as_me:$LINENO: checking for egrep" >&5
echo $ECHO_N "checking for egrep... $ECHO_C" >&6
if test "${ac_cv_prog_egrep+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if echo a | (grep -E '(a|b)') >/dev/null 2>&1
then ac_cv_prog_egrep='grep -E'
else ac_cv_prog_egrep='egrep'
fi
fi
echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
echo "${ECHO_T}$ac_cv_prog_egrep" >&6
EGREP=$ac_cv_prog_egrep
# Check whether --with-gnu-ld or --without-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then
withval="$with_gnu_ld"
test "$withval" = no || with_gnu_ld=yes
else
with_gnu_ld=no
fi;
ac_prog=ld
if test "$GCC" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
echo "$as_me:$LINENO: checking for ld used by $CC" >&5
echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
esac
case $ac_prog in
# Accept absolute paths.
[\\/]* | ?:[\\/]*)
re_direlt='/[^/][^/]*/\.\./'
# Canonicalize the pathname of ld
ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
done
test -z "$LD" && LD="$ac_prog"
;;
"")
# If it fails, then pretend we aren't using GCC.
ac_prog=ld
;;
*)
# If it is relative, then search for the first ld in PATH.
with_gnu_ld=unknown
;;
esac
elif test "$with_gnu_ld" = yes; then
echo "$as_me:$LINENO: checking for GNU ld" >&5
echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
else
echo "$as_me:$LINENO: checking for non-GNU ld" >&5
echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
fi
if test "${lt_cv_path_LD+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -z "$LD"; then
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
lt_cv_path_LD="$ac_dir/$ac_prog"
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
case `"$lt_cv_path_LD" -v 2>&1 &5
echo "${ECHO_T}$LD" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
{ (exit 1); exit 1; }; }
echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
if test "${lt_cv_prog_gnu_ld+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
# I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 &5
echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
with_gnu_ld=$lt_cv_prog_gnu_ld
echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
if test "${lt_cv_ld_reload_flag+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
lt_cv_ld_reload_flag='-r'
fi
echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
reload_flag=$lt_cv_ld_reload_flag
case $reload_flag in
"" | " "*) ;;
*) reload_flag=" $reload_flag" ;;
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
darwin*)
if test "$GCC" = yes; then
reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
else
reload_cmds='$LD$reload_flag -o $output$reload_objs'
fi
;;
esac
echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
if test "${lt_cv_path_NM+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$NM"; then
# Let the user override the test.
lt_cv_path_NM="$NM"
else
lt_nm_to_check="${ac_tool_prefix}nm"
if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
lt_nm_to_check="$lt_nm_to_check nm"
fi
for lt_tmp_nm in $lt_nm_to_check; do
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
tmp_nm="$ac_dir/$lt_tmp_nm"
if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
# Check to see if the nm accepts a BSD-compat flag.
# Adding the `sed 1q' prevents false positives on HP-UX, which says:
# nm: unknown option "B" ignored
# Tru64's nm complains that /dev/null is an invalid object file
case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
*/dev/null* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
break
;;
*)
case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
break
;;
*)
lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
continue # so that we can try to find one that supports BSD flags
;;
esac
;;
esac
fi
done
IFS="$lt_save_ifs"
done
test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
fi
fi
echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
echo "${ECHO_T}$lt_cv_path_NM" >&6
NM="$lt_cv_path_NM"
echo "$as_me:$LINENO: checking whether ln -s works" >&5
echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
echo "$as_me:$LINENO: result: no, using $LN_S" >&5
echo "${ECHO_T}no, using $LN_S" >&6
fi
echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
if test "${lt_cv_deplibs_check_method+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
lt_cv_file_magic_cmd='$MAGIC_CMD'
lt_cv_file_magic_test_file=
lt_cv_deplibs_check_method='unknown'
# Need to set the preceding variable on all platforms that support
# interlibrary dependencies.
# 'none' -- dependencies not supported.
# `unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
# which responds to the $file_magic_cmd with a given extended regex.
# If you have `file' or equivalent on your system and you're not sure
# whether `pass_all' will *always* work, you probably want this one.
case $host_os in
aix4* | aix5*)
lt_cv_deplibs_check_method=pass_all
;;
beos*)
lt_cv_deplibs_check_method=pass_all
;;
bsdi[45]*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
lt_cv_file_magic_cmd='/usr/bin/file -L'
lt_cv_file_magic_test_file=/shlib/libc.so
;;
cygwin*)
# func_win32_libid is a shell function defined in ltmain.sh
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
;;
mingw* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump'.
lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
lt_cv_file_magic_cmd='$OBJDUMP -f'
;;
darwin* | rhapsody*)
lt_cv_deplibs_check_method=pass_all
;;
freebsd* | kfreebsd*-gnu | dragonfly*)
if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
case $host_cpu in
i*86 )
# Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up.
lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;;
esac
else
lt_cv_deplibs_check_method=pass_all
fi
;;
gnu*)
lt_cv_deplibs_check_method=pass_all
;;
hpux10.20* | hpux11*)
lt_cv_file_magic_cmd=/usr/bin/file
case $host_cpu in
ia64*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
;;
hppa*64*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
;;
*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
lt_cv_file_magic_test_file=/usr/lib/libc.sl
;;
esac
;;
interix3*)
# PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
;;
irix5* | irix6* | nonstopux*)
case $LD in
*-32|*"-32 ") libmagic=32-bit;;
*-n32|*"-n32 ") libmagic=N32;;
*-64|*"-64 ") libmagic=64-bit;;
*) libmagic=never-match;;
esac
lt_cv_deplibs_check_method=pass_all
;;
# This must be Linux ELF.
linux*)
lt_cv_deplibs_check_method=pass_all
;;
netbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
fi
;;
newos6*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=/usr/lib/libnls.so
;;
nto-qnx*)
lt_cv_deplibs_check_method=unknown
;;
openbsd*)
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
fi
;;
osf3* | osf4* | osf5*)
lt_cv_deplibs_check_method=pass_all
;;
solaris*)
lt_cv_deplibs_check_method=pass_all
;;
sysv4 | sysv4.3*)
case $host_vendor in
motorola)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
;;
ncr)
lt_cv_deplibs_check_method=pass_all
;;
sequent)
lt_cv_file_magic_cmd='/bin/file'
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
;;
sni)
lt_cv_file_magic_cmd='/bin/file'
lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
lt_cv_file_magic_test_file=/lib/libc.so
;;
siemens)
lt_cv_deplibs_check_method=pass_all
;;
pc)
lt_cv_deplibs_check_method=pass_all
;;
esac
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
lt_cv_deplibs_check_method=pass_all
;;
esac
fi
echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
test -z "$deplibs_check_method" && deplibs_check_method=unknown
# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}
# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
# Allow CC to be a program name with arguments.
compiler=$CC
# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
if test "${enable_libtool_lock+set}" = set; then
enableval="$enable_libtool_lock"
fi;
test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
case `/usr/bin/file conftest.$ac_objext` in
*ELF-32*)
HPUX_IA64_MODE="32"
;;
*ELF-64*)
HPUX_IA64_MODE="64"
;;
esac
fi
rm -rf conftest*
;;
*-*-irix6*)
# Find out which ABI we are using.
echo '#line 3553 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
if test "$lt_cv_prog_gnu_ld" = yes; then
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
;;
*N32*)
LD="${LD-ld} -melf32bmipn32"
;;
*64-bit*)
LD="${LD-ld} -melf64bmip"
;;
esac
else
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
;;
*N32*)
LD="${LD-ld} -n32"
;;
*64-bit*)
LD="${LD-ld} -64"
;;
esac
fi
fi
rm -rf conftest*
;;
x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
case `/usr/bin/file conftest.o` in
*32-bit*)
case $host in
x86_64-*linux*)
LD="${LD-ld} -m elf_i386"
;;
ppc64-*linux*|powerpc64-*linux*)
LD="${LD-ld} -m elf32ppclinux"
;;
s390x-*linux*)
LD="${LD-ld} -m elf_s390"
;;
sparc64-*linux*)
LD="${LD-ld} -m elf32_sparc"
;;
esac
;;
*64-bit*)
case $host in
x86_64-*linux*)
LD="${LD-ld} -m elf_x86_64"
;;
ppc*-*linux*|powerpc*-*linux*)
LD="${LD-ld} -m elf64ppc"
;;
s390*-*linux*)
LD="${LD-ld} -m elf64_s390"
;;
sparc*-*linux*)
LD="${LD-ld} -m elf64_sparc"
;;
esac
;;
esac
fi
rm -rf conftest*
;;
*-*-sco3.2v5*)
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -belf"
echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
if test "${lt_cv_cc_needs_belf+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
lt_cv_cc_needs_belf=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
lt_cv_cc_needs_belf=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
if test x"$lt_cv_cc_needs_belf" != x"yes"; then
# this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
CFLAGS="$SAVE_CFLAGS"
fi
;;
sparc*-*solaris*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
yes*) LD="${LD-ld} -m elf64_sparc" ;;
*) LD="${LD-ld} -64" ;;
esac
;;
esac
fi
rm -rf conftest*
;;
esac
need_locks="$enable_libtool_lock"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
if test "${ac_cv_prog_CPP+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
# Double quotes because CPP needs to be expanded
for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
do
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer to if __STDC__ is defined, since
# exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifdef __STDC__
# include
#else
# include
#endif
Syntax error
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
:
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext
# OK, works on sane cases. Now check whether non-existent headers
# can be detected and how.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
# Broken: success on invalid input.
continue
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then
break
fi
done
ac_cv_prog_CPP=$CPP
fi
CPP=$ac_cv_prog_CPP
else
ac_cv_prog_CPP=$CPP
fi
echo "$as_me:$LINENO: result: $CPP" >&5
echo "${ECHO_T}$CPP" >&6
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer to if __STDC__ is defined, since
# exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifdef __STDC__
# include
#else
# include
#endif
Syntax error
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
:
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext
# OK, works on sane cases. Now check whether non-existent headers
# can be detected and how.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
# Broken: success on invalid input.
continue
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then
:
else
{ { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details." >&5
echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
echo "$as_me:$LINENO: checking for ANSI C header files" >&5
echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
if test "${ac_cv_header_stdc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
#include
#include
#include
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_header_stdc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_header_stdc=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "memchr" >/dev/null 2>&1; then
:
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "free" >/dev/null 2>&1; then
:
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then
:
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
(('a' <= (c) && (c) <= 'i') \
|| ('j' <= (c) && (c) <= 'r') \
|| ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
int i;
for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i))
|| toupper (i) != TOUPPER (i))
exit(2);
exit (0);
}
_ACEOF
rm -f conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
ac_cv_header_stdc=no
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
fi
echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
echo "${ECHO_T}$ac_cv_header_stdc" >&6
if test $ac_cv_header_stdc = yes; then
cat >>confdefs.h <<\_ACEOF
#define STDC_HEADERS 1
_ACEOF
fi
# On IRIX 5.3, sys/types and inttypes.h are conflicting.
for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
inttypes.h stdint.h unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Header=yes"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_Header=no"
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in dlfcn.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking $ac_header usability" >&5
echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking $ac_header presence" >&5
echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
(
cat <<\_ASBOX
## ------------------------------------------ ##
## Report this to the AC_PACKAGE_NAME lists. ##
## ------------------------------------------ ##
_ASBOX
) |
sed "s/^/$as_me: WARNING: /" >&2
;;
esac
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test -n "$ac_tool_prefix"; then
for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CXX+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$CXX"; then
ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
echo "$as_me:$LINENO: result: $CXX" >&5
echo "${ECHO_T}$CXX" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -n "$CXX" && break
done
fi
if test -z "$CXX"; then
ac_ct_CXX=$CXX
for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_CXX"; then
ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CXX="$ac_prog"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
echo "${ECHO_T}$ac_ct_CXX" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -n "$ac_ct_CXX" && break
done
test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
CXX=$ac_ct_CXX
fi
# Provide some information about the compiler.
echo "$as_me:$LINENO:" \
"checking for C++ compiler version" >&5
ac_compiler=`set X $ac_compile; echo $2`
{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5
(eval $ac_compiler --version &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5
(eval $ac_compiler -v &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5
(eval $ac_compiler -V &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
#ifndef __GNUC__
choke me
#endif
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_cxx_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_compiler_gnu=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_compiler_gnu=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
fi
echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
GXX=`test $ac_compiler_gnu = yes && echo yes`
ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-g"
echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
if test "${ac_cv_prog_cxx_g+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_cxx_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_prog_cxx_g=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_prog_cxx_g=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
if test "$ac_test_CXXFLAGS" = set; then
CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
if test "$GXX" = yes; then
CXXFLAGS="-g -O2"
else
CXXFLAGS="-g"
fi
else
if test "$GXX" = yes; then
CXXFLAGS="-O2"
else
CXXFLAGS=
fi
fi
for ac_declaration in \
'' \
'extern "C" void std::exit (int) throw (); using std::exit;' \
'extern "C" void std::exit (int); using std::exit;' \
'extern "C" void exit (int) throw ();' \
'extern "C" void exit (int);' \
'void exit (int);'
do
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_declaration
#include
int
main ()
{
exit (42);
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_cxx_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
continue
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_declaration
int
main ()
{
exit (42);
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_cxx_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
done
rm -f conftest*
if test -n "$ac_declaration"; then
echo '#ifdef __cplusplus' >>confdefs.h
echo $ac_declaration >>confdefs.h
echo '#endif' >>confdefs.h
fi
ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
(test "X$CXX" != "Xg++"))) ; then
ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
if test -z "$CXXCPP"; then
if test "${ac_cv_prog_CXXCPP+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
# Double quotes because CXXCPP needs to be expanded
for CXXCPP in "$CXX -E" "/lib/cpp"
do
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer to if __STDC__ is defined, since
# exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifdef __STDC__
# include
#else
# include
#endif
Syntax error
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_cxx_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
:
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext
# OK, works on sane cases. Now check whether non-existent headers
# can be detected and how.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_cxx_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
# Broken: success on invalid input.
continue
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then
break
fi
done
ac_cv_prog_CXXCPP=$CXXCPP
fi
CXXCPP=$ac_cv_prog_CXXCPP
else
ac_cv_prog_CXXCPP=$CXXCPP
fi
echo "$as_me:$LINENO: result: $CXXCPP" >&5
echo "${ECHO_T}$CXXCPP" >&6
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer to if __STDC__ is defined, since
# exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifdef __STDC__
# include
#else
# include
#endif
Syntax error
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_cxx_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
:
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext
# OK, works on sane cases. Now check whether non-existent headers
# can be detected and how.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_cxx_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
# Broken: success on invalid input.
continue
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then
:
else
{ { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
See \`config.log' for more details." >&5
echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
fi
ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
fi
ac_ext=f
ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_f77_compiler_gnu
if test -n "$ac_tool_prefix"; then
for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_F77+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$F77"; then
ac_cv_prog_F77="$F77" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
F77=$ac_cv_prog_F77
if test -n "$F77"; then
echo "$as_me:$LINENO: result: $F77" >&5
echo "${ECHO_T}$F77" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -n "$F77" && break
done
fi
if test -z "$F77"; then
ac_ct_F77=$F77
for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_F77"; then
ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_F77="$ac_prog"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
ac_ct_F77=$ac_cv_prog_ac_ct_F77
if test -n "$ac_ct_F77"; then
echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
echo "${ECHO_T}$ac_ct_F77" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -n "$ac_ct_F77" && break
done
F77=$ac_ct_F77
fi
# Provide some information about the compiler.
echo "$as_me:5043:" \
"checking for Fortran 77 compiler version" >&5
ac_compiler=`set X $ac_compile; echo $2`
{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5
(eval $ac_compiler --version &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5
(eval $ac_compiler -v &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5
(eval $ac_compiler -V &5) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
rm -f a.out
# If we don't use `.F' as extension, the preprocessor is not run on the
# input file. (Note that this only needs to work for GNU compilers.)
ac_save_ext=$ac_ext
ac_ext=F
echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
if test "${ac_cv_f77_compiler_gnu+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
program main
#ifndef __GNUC__
choke me
#endif
end
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_f77_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_compiler_gnu=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_compiler_gnu=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_f77_compiler_gnu=$ac_compiler_gnu
fi
echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
ac_ext=$ac_save_ext
ac_test_FFLAGS=${FFLAGS+set}
ac_save_FFLAGS=$FFLAGS
FFLAGS=
echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
if test "${ac_cv_prog_f77_g+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
FFLAGS=-g
cat >conftest.$ac_ext <<_ACEOF
program main
end
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_f77_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_prog_f77_g=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_prog_f77_g=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
if test "$ac_test_FFLAGS" = set; then
FFLAGS=$ac_save_FFLAGS
elif test $ac_cv_prog_f77_g = yes; then
if test "x$ac_cv_f77_compiler_gnu" = xyes; then
FFLAGS="-g -O2"
else
FFLAGS="-g"
fi
else
if test "x$ac_cv_f77_compiler_gnu" = xyes; then
FFLAGS="-O2"
else
FFLAGS=
fi
fi
G77=`test $ac_compiler_gnu = yes && echo yes`
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
# find the maximum length of command line arguments
echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
if test "${lt_cv_sys_max_cmd_len+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
i=0
teststring="ABCD"
case $build_os in
msdosdjgpp*)
# On DJGPP, this test can blow up pretty badly due to problems in libc
# (any single argument exceeding 2000 bytes causes a buffer overrun
# during glob expansion). Even if it were fixed, the result of this
# check would be larger than it should be.
lt_cv_sys_max_cmd_len=12288; # 12K is about right
;;
gnu*)
# Under GNU Hurd, this test is not required because there is
# no limit to the length of command line arguments.
# Libtool will interpret -1 as no limit whatsoever
lt_cv_sys_max_cmd_len=-1;
;;
cygwin* | mingw*)
# On Win9x/ME, this test blows up -- it succeeds, but takes
# about 5 minutes as the teststring grows exponentially.
# Worse, since 9x/ME are not pre-emptively multitasking,
# you end up with a "frozen" computer, even though with patience
# the test eventually succeeds (with a max line length of 256k).
# Instead, let's just punt: use the minimum linelength reported by
# all of the supported platforms: 8192 (on NT/2K/XP).
lt_cv_sys_max_cmd_len=8192;
;;
amigaos*)
# On AmigaOS with pdksh, this test takes hours, literally.
# So we just punt and use a minimum line length of 8192.
lt_cv_sys_max_cmd_len=8192;
;;
netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
elif test -x /usr/sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
else
lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
fi
# And add a safety zone
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
;;
interix*)
# We know the value 262144 and hardcode it with a safety zone (like BSD)
lt_cv_sys_max_cmd_len=196608
;;
osf*)
# Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
# due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
# nice to cause kernel panics so lets avoid the loop below.
# First set a reasonable default.
lt_cv_sys_max_cmd_len=16384
#
if test -x /sbin/sysconfig; then
case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
*1*) lt_cv_sys_max_cmd_len=-1 ;;
esac
fi
;;
sco3.2v5*)
lt_cv_sys_max_cmd_len=102400
;;
sysv5* | sco5v6* | sysv4.2uw2*)
kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
if test -n "$kargmax"; then
lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
else
lt_cv_sys_max_cmd_len=32768
fi
;;
*)
# If test is not a shell built-in, we'll probably end up computing a
# maximum length that is only half of the actual maximum length, but
# we can't tell.
SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
= "XX$teststring") >/dev/null 2>&1 &&
new_result=`expr "X$teststring" : ".*" 2>&1` &&
lt_cv_sys_max_cmd_len=$new_result &&
test $i != 17 # 1/2 MB should be enough
do
i=`expr $i + 1`
teststring=$teststring$teststring
done
teststring=
# Add a significant safety factor because C++ compilers can tack on massive
# amounts of additional arguments before passing them to the linker.
# It appears as though 1/2 is a usable value.
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
;;
esac
fi
if test -n $lt_cv_sys_max_cmd_len ; then
echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
else
echo "$as_me:$LINENO: result: none" >&5
echo "${ECHO_T}none" >&6
fi
# Check for command to grab the raw symbol name followed by C symbol from nm.
echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
# These are sane defaults that work on at least a few old systems.
# [They come from Ultrix. What could be older than Ultrix?!! ;)]
# Character class describing NM global symbol codes.
symcode='[BCDEGRST]'
# Regexp to match symbols that can be accessed directly from C.
sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
# Transform an extracted symbol line into a proper C declaration
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
# Define system-specific variables.
case $host_os in
aix*)
symcode='[BCDT]'
;;
cygwin* | mingw* | pw32*)
symcode='[ABCDGISTW]'
;;
hpux*) # Its linker distinguishes data from code symbols
if test "$host_cpu" = ia64; then
symcode='[ABCDEGRST]'
fi
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
;;
linux*)
if test "$host_cpu" = ia64; then
symcode='[ABCDGIRSTW]'
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
fi
;;
irix* | nonstopux*)
symcode='[BCDEGRST]'
;;
osf*)
symcode='[BCDEGQRST]'
;;
solaris*)
symcode='[BDRT]'
;;
sco3.2v5*)
symcode='[DT]'
;;
sysv4.2uw2*)
symcode='[DT]'
;;
sysv5* | sco5v6* | unixware* | OpenUNIX*)
symcode='[ABDT]'
;;
sysv4)
symcode='[DFNSTU]'
;;
esac
# Handle CRLF in mingw tool chain
opt_cr=
case $build_os in
mingw*)
opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
;;
esac
# If we're using GNU nm, then use its standard symbol codes.
case `$NM -V 2>&1` in
*GNU* | *'with BFD'*)
symcode='[ABCDGIRSTW]' ;;
esac
# Try without a prefix undercore, then with it.
for ac_symprfx in "" "_"; do
# Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
symxfrm="\\1 $ac_symprfx\\2 \\2"
# Write the raw and C identifiers.
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
# Check to see that the pipe works correctly.
pipe_works=no
rm -f conftest*
cat > conftest.$ac_ext <&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
# Now try to grab the symbols.
nlist=conftest.nm
if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
(eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
else
rm -f "$nlist"T
fi
# Make sure that we snagged all the symbols we need.
if grep ' nm_test_var$' "$nlist" >/dev/null; then
if grep ' nm_test_func$' "$nlist" >/dev/null; then
cat < conftest.$ac_ext
#ifdef __cplusplus
extern "C" {
#endif
EOF
# Now generate the symbol file.
eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
cat <> conftest.$ac_ext
#if defined (__STDC__) && __STDC__
# define lt_ptr_t void *
#else
# define lt_ptr_t char *
# define const
#endif
/* The mapping between symbol names and symbols. */
const struct {
const char *name;
lt_ptr_t address;
}
lt_preloaded_symbols[] =
{
EOF
$SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
cat <<\EOF >> conftest.$ac_ext
{0, (lt_ptr_t) 0}
};
#ifdef __cplusplus
}
#endif
EOF
# Now try linking the two files.
mv conftest.$ac_objext conftstm.$ac_objext
lt_save_LIBS="$LIBS"
lt_save_CFLAGS="$CFLAGS"
LIBS="conftstm.$ac_objext"
CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && test -s conftest${ac_exeext}; then
pipe_works=yes
fi
LIBS="$lt_save_LIBS"
CFLAGS="$lt_save_CFLAGS"
else
echo "cannot find nm_test_func in $nlist" >&5
fi
else
echo "cannot find nm_test_var in $nlist" >&5
fi
else
echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
fi
else
echo "$progname: failed program was:" >&5
cat conftest.$ac_ext >&5
fi
rm -f conftest* conftst*
# Do not use the global_symbol_pipe unless it works.
if test "$pipe_works" = yes; then
break
else
lt_cv_sys_global_symbol_pipe=
fi
done
fi
if test -z "$lt_cv_sys_global_symbol_pipe"; then
lt_cv_sys_global_symbol_to_cdecl=
fi
if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
echo "$as_me:$LINENO: result: failed" >&5
echo "${ECHO_T}failed" >&6
else
echo "$as_me:$LINENO: result: ok" >&5
echo "${ECHO_T}ok" >&6
fi
echo "$as_me:$LINENO: checking for objdir" >&5
echo $ECHO_N "checking for objdir... $ECHO_C" >&6
if test "${lt_cv_objdir+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
lt_cv_objdir=.libs
else
# MS-DOS does not allow filenames that begin with a dot.
lt_cv_objdir=_libs
fi
rmdir .libs 2>/dev/null
fi
echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
echo "${ECHO_T}$lt_cv_objdir" >&6
objdir=$lt_cv_objdir
case $host_os in
aix3*)
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test "X${COLLECT_NAMES+set}" != Xset; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
;;
esac
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
Xsed='sed -e 1s/^X//'
sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
# Same as above, but do not quote variable references.
double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
# Sed substitution to delay expansion of an escaped shell variable in a
# double_quote_subst'ed string.
delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
# Sed substitution to avoid accidental globbing in evaled expressions
no_glob_subst='s/\*/\\\*/g'
# Constants:
rm="rm -f"
# Global variables:
default_ofile=libtool
can_build_shared=yes
# All known linkers require a `.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a
ltmain="$ac_aux_dir/ltmain.sh"
ofile="$default_ofile"
with_gnu_ld="$lt_cv_prog_gnu_ld"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_AR+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_AR="${ac_tool_prefix}ar"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
echo "$as_me:$LINENO: result: $AR" >&5
echo "${ECHO_T}$AR" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$ac_cv_prog_AR"; then
ac_ct_AR=$AR
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_AR"; then
ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AR="ar"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
echo "${ECHO_T}$ac_ct_AR" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
AR=$ac_ct_AR
else
AR="$ac_cv_prog_AR"
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_RANLIB+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
echo "$as_me:$LINENO: result: $RANLIB" >&5
echo "${ECHO_T}$RANLIB" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$ac_cv_prog_RANLIB"; then
ac_ct_RANLIB=$RANLIB
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_RANLIB"; then
ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_RANLIB="ranlib"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
echo "${ECHO_T}$ac_ct_RANLIB" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
RANLIB=$ac_ct_RANLIB
else
RANLIB="$ac_cv_prog_RANLIB"
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_STRIP+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$STRIP"; then
ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_STRIP="${ac_tool_prefix}strip"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
echo "$as_me:$LINENO: result: $STRIP" >&5
echo "${ECHO_T}$STRIP" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$ac_cv_prog_STRIP"; then
ac_ct_STRIP=$STRIP
# Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
echo "$as_me:$LINENO: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$ac_ct_STRIP"; then
ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_STRIP="strip"
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
echo "${ECHO_T}$ac_ct_STRIP" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
STRIP=$ac_ct_STRIP
else
STRIP="$ac_cv_prog_STRIP"
fi
old_CC="$CC"
old_CFLAGS="$CFLAGS"
# Set sane defaults for various variables
test -z "$AR" && AR=ar
test -z "$AR_FLAGS" && AR_FLAGS=cru
test -z "$AS" && AS=as
test -z "$CC" && CC=cc
test -z "$LTCC" && LTCC=$CC
test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
test -z "$DLLTOOL" && DLLTOOL=dlltool
test -z "$LD" && LD=ld
test -z "$LN_S" && LN_S="ln -s"
test -z "$MAGIC_CMD" && MAGIC_CMD=file
test -z "$NM" && NM=nm
test -z "$SED" && SED=sed
test -z "$OBJDUMP" && OBJDUMP=objdump
test -z "$RANLIB" && RANLIB=:
test -z "$STRIP" && STRIP=:
test -z "$ac_objext" && ac_objext=o
# Determine commands to create old-style static archives.
old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=
if test -n "$RANLIB"; then
case $host_os in
openbsd*)
old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
;;
*)
old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
;;
esac
old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
fi
for cc_temp in $compiler""; do
case $cc_temp in
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
\-*) ;;
*) break;;
esac
done
cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
# Only perform the check for file, if the check method requires it
case $deplibs_check_method in
file_magic*)
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
;;
*)
lt_save_MAGIC_CMD="$MAGIC_CMD"
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
for ac_dir in $ac_dummy; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/${ac_tool_prefix}file; then
lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
else
cat <&2
*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such. This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem. Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org
EOF
fi ;;
esac
fi
break
fi
done
IFS="$lt_save_ifs"
MAGIC_CMD="$lt_save_MAGIC_CMD"
;;
esac
fi
MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if test -n "$MAGIC_CMD"; then
echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
echo "${ECHO_T}$MAGIC_CMD" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
if test -z "$lt_cv_path_MAGIC_CMD"; then
if test -n "$ac_tool_prefix"; then
echo "$as_me:$LINENO: checking for file" >&5
echo $ECHO_N "checking for file... $ECHO_C" >&6
if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
;;
*)
lt_save_MAGIC_CMD="$MAGIC_CMD"
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
for ac_dir in $ac_dummy; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/file; then
lt_cv_path_MAGIC_CMD="$ac_dir/file"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
else
cat <&2
*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such. This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem. Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org
EOF
fi ;;
esac
fi
break
fi
done
IFS="$lt_save_ifs"
MAGIC_CMD="$lt_save_MAGIC_CMD"
;;
esac
fi
MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if test -n "$MAGIC_CMD"; then
echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
echo "${ECHO_T}$MAGIC_CMD" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
else
MAGIC_CMD=:
fi
fi
fi
;;
esac
enable_dlopen=no
enable_win32_dll=no
# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
if test "${enable_libtool_lock+set}" = set; then
enableval="$enable_libtool_lock"
fi;
test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
# Check whether --with-pic or --without-pic was given.
if test "${with_pic+set}" = set; then
withval="$with_pic"
pic_mode="$withval"
else
pic_mode=default
fi;
test -z "$pic_mode" && pic_mode=default
# Use C for the default configuration in the libtool script
tagname=
lt_save_CC="$CC"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
# Source file extension for C test sources.
ac_ext=c
# Object file extension for compiled C test sources.
objext=o
objext=$objext
# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;\n"
# Code to be used in simple link tests
lt_simple_link_test_code='int main(){return(0);}\n'
# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}
# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
# Allow CC to be a program name with arguments.
compiler=$CC
# save warnings/boilerplate of simple test code
ac_outfile=conftest.$ac_objext
printf "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$rm conftest*
ac_outfile=conftest.$ac_objext
printf "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$rm conftest*
lt_prog_compiler_no_builtin_flag=
if test "$GCC" = yes; then
lt_prog_compiler_no_builtin_flag=' -fno-builtin'
echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
lt_cv_prog_compiler_rtti_exceptions=no
ac_outfile=conftest.$ac_objext
printf "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-fno-rtti -fno-exceptions"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
# The option is referenced via a variable to avoid confusing sed.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:6106: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:6110: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
$echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_rtti_exceptions=yes
fi
fi
$rm conftest*
fi
echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
else
:
fi
fi
lt_prog_compiler_wl=
lt_prog_compiler_pic=
lt_prog_compiler_static=
echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
if test "$GCC" = yes; then
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_static='-static'
case $host_os in
aix*)
# All AIX code is PIC.
if test "$host_cpu" = ia64; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
;;
amigaos*)
# FIXME: we need at least 68020 code to build shared libraries, but
# adding the `-m68020' flag to GCC prevents building anything better,
# like `-m68040'.
lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
;;
beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
mingw* | pw32* | os2*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
lt_prog_compiler_pic='-DDLL_EXPORT'
;;
darwin* | rhapsody*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
lt_prog_compiler_pic='-fno-common'
;;
interix3*)
# Interix 3.x gcc -fpic/-fPIC options generate broken code.
# Instead, we relocate shared libraries at runtime.
;;
msdosdjgpp*)
# Just because we use GCC doesn't mean we suddenly get shared libraries
# on systems that don't support them.
lt_prog_compiler_can_build_shared=no
enable_shared=no
;;
sysv4*MP*)
if test -d /usr/nec; then
lt_prog_compiler_pic=-Kconform_pic
fi
;;
hpux*)
# PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
# not for PA HP-UX.
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
;;
*)
lt_prog_compiler_pic='-fPIC'
;;
esac
;;
*)
lt_prog_compiler_pic='-fPIC'
;;
esac
else
# PORTME Check for flag to pass linker flags through the system compiler.
case $host_os in
aix*)
lt_prog_compiler_wl='-Wl,'
if test "$host_cpu" = ia64; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
else
lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
fi
;;
darwin*)
# PIC is the default on this platform
# Common symbols not allowed in MH_DYLIB files
case $cc_basename in
xlc*)
lt_prog_compiler_pic='-qnocommon'
lt_prog_compiler_wl='-Wl,'
;;
esac
;;
mingw* | pw32* | os2*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
lt_prog_compiler_pic='-DDLL_EXPORT'
;;
hpux9* | hpux10* | hpux11*)
lt_prog_compiler_wl='-Wl,'
# PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
# not for PA HP-UX.
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
;;
*)
lt_prog_compiler_pic='+Z'
;;
esac
# Is there a better lt_prog_compiler_static that works with the bundled CC?
lt_prog_compiler_static='${wl}-a ${wl}archive'
;;
irix5* | irix6* | nonstopux*)
lt_prog_compiler_wl='-Wl,'
# PIC (with -KPIC) is the default.
lt_prog_compiler_static='-non_shared'
;;
newsos6)
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
;;
linux*)
case $cc_basename in
icc* | ecc*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-static'
;;
pgcc* | pgf77* | pgf90* | pgf95*)
# Portland Group compilers (*not* the Pentium gcc compiler,
# which looks to be a dead project)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-fpic'
lt_prog_compiler_static='-Bstatic'
;;
ccc*)
lt_prog_compiler_wl='-Wl,'
# All Alpha code is PIC.
lt_prog_compiler_static='-non_shared'
;;
esac
;;
osf3* | osf4* | osf5*)
lt_prog_compiler_wl='-Wl,'
# All OSF/1 code is PIC.
lt_prog_compiler_static='-non_shared'
;;
solaris*)
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
case $cc_basename in
f77* | f90* | f95*)
lt_prog_compiler_wl='-Qoption ld ';;
*)
lt_prog_compiler_wl='-Wl,';;
esac
;;
sunos4*)
lt_prog_compiler_wl='-Qoption ld '
lt_prog_compiler_pic='-PIC'
lt_prog_compiler_static='-Bstatic'
;;
sysv4 | sysv4.2uw2* | sysv4.3*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
;;
sysv4*MP*)
if test -d /usr/nec ;then
lt_prog_compiler_pic='-Kconform_pic'
lt_prog_compiler_static='-Bstatic'
fi
;;
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
;;
unicos*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_can_build_shared=no
;;
uts4*)
lt_prog_compiler_pic='-pic'
lt_prog_compiler_static='-Bstatic'
;;
*)
lt_prog_compiler_can_build_shared=no
;;
esac
fi
echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
echo "${ECHO_T}$lt_prog_compiler_pic" >&6
#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic"; then
echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
if test "${lt_prog_compiler_pic_works+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
lt_prog_compiler_pic_works=no
ac_outfile=conftest.$ac_objext
printf "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
# The option is referenced via a variable to avoid confusing sed.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:6374: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:6378: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
$echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
lt_prog_compiler_pic_works=yes
fi
fi
$rm conftest*
fi
echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
if test x"$lt_prog_compiler_pic_works" = xyes; then
case $lt_prog_compiler_pic in
"" | " "*) ;;
*) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
esac
else
lt_prog_compiler_pic=
lt_prog_compiler_can_build_shared=no
fi
fi
case $host_os in
# For platforms which do not support PIC, -DPIC is meaningless:
*djgpp*)
lt_prog_compiler_pic=
;;
*)
lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
;;
esac
#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
if test "${lt_prog_compiler_static_works+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
lt_prog_compiler_static_works=no
save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
printf "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
# The linker can only warn and ignore the option if not recognized
# So say no if there are warnings
if test -s conftest.err; then
# Append any errors to the config.log.
cat conftest.err 1>&5
$echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if diff conftest.exp conftest.er2 >/dev/null; then
lt_prog_compiler_static_works=yes
fi
else
lt_prog_compiler_static_works=yes
fi
fi
$rm conftest*
LDFLAGS="$save_LDFLAGS"
fi
echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
if test x"$lt_prog_compiler_static_works" = xyes; then
:
else
lt_prog_compiler_static=
fi
echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
if test "${lt_cv_prog_compiler_c_o+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
lt_cv_prog_compiler_c_o=no
$rm -r conftest 2>/dev/null
mkdir conftest
cd conftest
mkdir out
printf "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-o out/conftest2.$ac_objext"
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
# with a dollar sign (not a hyphen), so the echo should work correctly.
lt_compile=`echo "$ac_compile" | $SED \
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:6478: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:6482: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
$echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
lt_cv_prog_compiler_c_o=yes
fi
fi
chmod u+w . 2>&5
$rm conftest*
# SGI C++ compiler will create directory out/ii_files/ for
# template instantiation
test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
$rm out/* && rmdir out
cd ..
rmdir conftest
$rm conftest*
fi
echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
hard_links="nottested"
if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
# do not overwrite the value of need_locks provided by the user
echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
hard_links=yes
$rm conftest*
ln conftest.a conftest.b 2>/dev/null && hard_links=no
touch conftest.a
ln conftest.a conftest.b 2>&5 || hard_links=no
ln conftest.a conftest.b 2>/dev/null && hard_links=no
echo "$as_me:$LINENO: result: $hard_links" >&5
echo "${ECHO_T}$hard_links" >&6
if test "$hard_links" = no; then
{ echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
need_locks=warn
fi
else
need_locks=no
fi
echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
runpath_var=
allow_undefined_flag=
enable_shared_with_static_runtimes=no
archive_cmds=
archive_expsym_cmds=
old_archive_From_new_cmds=
old_archive_from_expsyms_cmds=
export_dynamic_flag_spec=
whole_archive_flag_spec=
thread_safe_flag_spec=
hardcode_libdir_flag_spec=
hardcode_libdir_flag_spec_ld=
hardcode_libdir_separator=
hardcode_direct=no
hardcode_minus_L=no
hardcode_shlibpath_var=unsupported
link_all_deplibs=unknown
hardcode_automatic=no
module_cmds=
module_expsym_cmds=
always_export_symbols=no
export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
# include_expsyms should be a list of space-separated symbols to be *always*
# included in the symbol list
include_expsyms=
# exclude_expsyms can be an extended regexp of symbols to exclude
# it will be wrapped by ` (' and `)$', so one must not match beginning or
# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
# as well as any symbol that contains `d'.
exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
# platforms (ab)use it in PIC code, but their linkers get confused if
# the symbol is explicitly referenced. Since portable code cannot
# rely on this symbol name, it's probably fine to never include it in
# preloaded symbol tables.
extract_expsyms_cmds=
# Just being paranoid about ensuring that cc_basename is set.
for cc_temp in $compiler""; do
case $cc_temp in
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
\-*) ;;
*) break;;
esac
done
cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
case $host_os in
cygwin* | mingw* | pw32*)
# FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
if test "$GCC" != yes; then
with_gnu_ld=no
fi
;;
interix*)
# we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
openbsd*)
with_gnu_ld=no
;;
esac
ld_shlibs=yes
if test "$with_gnu_ld" = yes; then
# If archive_cmds runs LD, not CC, wlarc should be empty
wlarc='${wl}'
# Set some defaults for GNU ld with shared library support. These
# are reset later if shared libraries are not supported. Putting them
# here allows them to be overridden if necessary.
runpath_var=LD_RUN_PATH
hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
export_dynamic_flag_spec='${wl}--export-dynamic'
# ancient GNU ld didn't support --whole-archive et. al.
if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
else
whole_archive_flag_spec=
fi
supports_anon_versioning=no
case `$LD -v 2>/dev/null` in
*\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
*\ 2.11.*) ;; # other 2.11 versions
*) supports_anon_versioning=yes ;;
esac
# See if GNU ld supports shared libraries.
case $host_os in
aix3* | aix4* | aix5*)
# On AIX/PPC, the GNU linker is very broken
if test "$host_cpu" != ia64; then
ld_shlibs=no
cat <&2
*** Warning: the GNU linker, at least up to release 2.9.1, is reported
*** to be unable to reliably create shared libraries on AIX.
*** Therefore, libtool is disabling shared libraries support. If you
*** really care for shared libraries, you may want to modify your PATH
*** so that a non-GNU linker is found, and then restart.
EOF
fi
;;
amigaos*)
archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
# Samuel A. Falvo II reports
# that the semantics of dynamic libraries on AmigaOS, at least up
# to version 4, is to share data among multiple programs linked
# with the same dynamic library. Since this doesn't match the
# behavior of shared libraries on other platforms, we can't use
# them.
ld_shlibs=no
;;
beos*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
allow_undefined_flag=unsupported
# Joseph Beckenbach says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
else
ld_shlibs=no
fi
;;
cygwin* | mingw* | pw32*)
# _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
# as there is no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir'
allow_undefined_flag=unsupported
always_export_symbols=no
enable_shared_with_static_runtimes=yes
export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
# If the export-symbols file already is a .def file (1st line
# is EXPORTS), use it as is; otherwise, prepend...
archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
cp $export_symbols $output_objdir/$soname.def;
else
echo EXPORTS > $output_objdir/$soname.def;
cat $export_symbols >> $output_objdir/$soname.def;
fi~
$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
ld_shlibs=no
fi
;;
interix3*)
hardcode_direct=no
hardcode_shlibpath_var=no
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
export_dynamic_flag_spec='${wl}-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
linux*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
tmp_addflag=
case $cc_basename,$host_cpu in
pgcc*) # Portland Group C compiler
whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag'
;;
pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag -Mnomain' ;;
ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
tmp_addflag=' -i_dynamic' ;;
efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
tmp_addflag=' -i_dynamic -nofor_main' ;;
ifc* | ifort*) # Intel Fortran compiler
tmp_addflag=' -nofor_main' ;;
esac
archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
if test $supports_anon_versioning = yes; then
archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
$echo "local: *; };" >> $output_objdir/$libname.ver~
$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
fi
else
ld_shlibs=no
fi
;;
netbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
else
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
fi
;;
solaris*)
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
ld_shlibs=no
cat <&2
*** Warning: The releases 2.8.* of the GNU linker cannot reliably
*** create shared libraries on Solaris systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.9.1 or newer. Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.
EOF
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
case `$LD -v 2>&1` in
*\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
ld_shlibs=no
cat <<_LT_EOF 1>&2
*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
*** reliably create shared libraries on SCO systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.
_LT_EOF
;;
*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
else
ld_shlibs=no
fi
;;
esac
;;
sunos4*)
archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
wlarc=
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
;;
esac
if test "$ld_shlibs" = no; then
runpath_var=
hardcode_libdir_flag_spec=
export_dynamic_flag_spec=
whole_archive_flag_spec=
fi
else
# PORTME fill in a description of your system's linker (not GNU ld)
case $host_os in
aix3*)
allow_undefined_flag=unsupported
always_export_symbols=yes
archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
# Note: this linker hardcodes the directories in LIBPATH if there
# are no directories specified by -L.
hardcode_minus_L=yes
if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
# Neither direct hardcoding nor static linking is supported with a
# broken collect2.
hardcode_direct=unsupported
fi
;;
aix4* | aix5*)
if test "$host_cpu" = ia64; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
no_entry_flag=""
else
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to AIX nm, but means don't demangle with GNU nm
if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
else
export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# need to do runtime linking.
case $host_os in aix4.[23]|aix4.[23].*|aix5*)
for ld_flag in $LDFLAGS; do
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
aix_use_runtimelinking=yes
break
fi
done
;;
esac
exp_sym_flag='-bexport'
no_entry_flag='-bnoentry'
fi
# When large executables or shared objects are built, AIX ld can
# have problems creating the table of contents. If linking a library
# or program results in "error TOC overflow" add -mminimal-toc to
# CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
# enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
archive_cmds=''
hardcode_direct=yes
hardcode_libdir_separator=':'
link_all_deplibs=yes
if test "$GCC" = yes; then
case $host_os in aix4.[012]|aix4.[012].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
collect2name=`${CC} -print-prog-name=collect2`
if test -f "$collect2name" && \
strings "$collect2name" | grep resolve_lib_name >/dev/null
then
# We have reworked collect2
hardcode_direct=yes
else
# We have old collect2
hardcode_direct=unsupported
# It fails to find uninstalled libraries when the uninstalled
# path is not listed in the libpath. Setting hardcode_minus_L
# to unsupported forces relinking
hardcode_minus_L=yes
hardcode_libdir_flag_spec='-L$libdir'
hardcode_libdir_separator=
fi
;;
esac
shared_flag='-shared'
if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G'
fi
else
# not using gcc
if test "$host_cpu" = ia64; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
if test "$aix_use_runtimelinking" = yes; then
shared_flag='${wl}-G'
else
shared_flag='${wl}-bM:SRE'
fi
fi
fi
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to export.
always_export_symbols=yes
if test "$aix_use_runtimelinking" = yes; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
allow_undefined_flag='-berok'
# Determine the default libpath from the value encoded in an empty executable.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`; fi
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
else
if test "$host_cpu" = ia64; then
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
allow_undefined_flag="-z nodefs"
archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an empty executable.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`; fi
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
no_undefined_flag=' ${wl}-bernotok'
allow_undefined_flag=' ${wl}-berok'
# Exported symbols can be pulled into shared objects from archives
whole_archive_flag_spec='$convenience'
archive_cmds_need_lc=yes
# This is similar to how AIX traditionally builds its shared libraries.
archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
fi
fi
;;
amigaos*)
archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
# see comment about different semantics on the GNU ld section
ld_shlibs=no
;;
bsdi[45]*)
export_dynamic_flag_spec=-rdynamic
;;
cygwin* | mingw* | pw32*)
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
hardcode_libdir_flag_spec=' '
allow_undefined_flag=unsupported
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=".dll"
# FIXME: Setting linknames here is a bad hack.
archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
# The linker will automatically build a .lib file if we build a DLL.
old_archive_From_new_cmds='true'
# FIXME: Should let the user specify the lib program.
old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
fix_srcfile_path='`cygpath -w "$srcfile"`'
enable_shared_with_static_runtimes=yes
;;
darwin* | rhapsody*)
case $host_os in
rhapsody* | darwin1.[012])
allow_undefined_flag='${wl}-undefined ${wl}suppress'
;;
*) # Darwin 1.3 on
if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
else
case ${MACOSX_DEPLOYMENT_TARGET} in
10.[012])
allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
;;
10.*)
allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
;;
esac
fi
;;
esac
archive_cmds_need_lc=no
hardcode_direct=no
hardcode_automatic=yes
hardcode_shlibpath_var=unsupported
whole_archive_flag_spec=''
link_all_deplibs=yes
if test "$GCC" = yes ; then
output_verbose_link_cmd='echo'
archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
# Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
else
case $cc_basename in
xlc*)
output_verbose_link_cmd='echo'
archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
# Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
;;
*)
ld_shlibs=no
;;
esac
fi
;;
dgux*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_shlibpath_var=no
;;
freebsd1*)
ld_shlibs=no
;;
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
# extra space).
freebsd2.2*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
# Unfortunately, older versions of FreeBSD 2 do not have this feature.
freebsd2*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes
hardcode_minus_L=yes
hardcode_shlibpath_var=no
;;
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
freebsd* | kfreebsd*-gnu | dragonfly*)
archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
hpux9*)
if test "$GCC" = yes; then
archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
else
archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
fi
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
export_dynamic_flag_spec='${wl}-E'
;;
hpux10*)
if test "$GCC" = yes -a "$with_gnu_ld" = no; then
archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
if test "$with_gnu_ld" = no; then
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
export_dynamic_flag_spec='${wl}-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
fi
;;
hpux11*)
if test "$GCC" = yes -a "$with_gnu_ld" = no; then
case $host_cpu in
hppa*64*)
archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
else
case $host_cpu in
hppa*64*)
archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
fi
if test "$with_gnu_ld" = no; then
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
hardcode_libdir_separator=:
case $host_cpu in
hppa*64*|ia64*)
hardcode_libdir_flag_spec_ld='+b $libdir'
hardcode_direct=no
hardcode_shlibpath_var=no
;;
*)
hardcode_direct=yes
export_dynamic_flag_spec='${wl}-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
;;
esac
fi
;;
irix5* | irix6* | nonstopux*)
if test "$GCC" = yes; then
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
hardcode_libdir_flag_spec_ld='-rpath $libdir'
fi
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
hardcode_libdir_separator=:
link_all_deplibs=yes
;;
netbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else
archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
fi
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
hardcode_shlibpath_var=no
;;
newsos6)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
hardcode_libdir_separator=:
hardcode_shlibpath_var=no
;;
openbsd*)
hardcode_direct=yes
hardcode_shlibpath_var=no
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
export_dynamic_flag_spec='${wl}-E'
else
case $host_os in
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
hardcode_libdir_flag_spec='-R$libdir'
;;
*)
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
;;
esac
fi
;;
os2*)
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
allow_undefined_flag=unsupported
archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
;;
osf3*)
if test "$GCC" = yes; then
allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
allow_undefined_flag=' -expect_unresolved \*'
archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
fi
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
hardcode_libdir_separator=:
;;
osf4* | osf5*) # as osf3* with the addition of -msym flag
if test "$GCC" = yes; then
allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
else
allow_undefined_flag=' -expect_unresolved \*'
archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
# Both c and cxx compiler support -rpath directly
hardcode_libdir_flag_spec='-rpath $libdir'
fi
hardcode_libdir_separator=:
;;
solaris*)
no_undefined_flag=' -z text'
if test "$GCC" = yes; then
wlarc='${wl}'
archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
$CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
else
wlarc=''
archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
fi
hardcode_libdir_flag_spec='-R$libdir'
hardcode_shlibpath_var=no
case $host_os in
solaris2.[0-5] | solaris2.[0-5].*) ;;
*)
# The compiler driver will combine linker options so we
# cannot just pass the convience library names through
# without $wl, iff we do not link with $LD.
# Luckily, gcc supports the same syntax we need for Sun Studio.
# Supported since Solaris 2.6 (maybe 2.5.1?)
case $wlarc in
'')
whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
*)
whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
esac ;;
esac
link_all_deplibs=yes
;;
sunos4*)
if test "x$host_vendor" = xsequent; then
# Use $CC to link under sequent, because it throws in some extra .o
# files that make .init and .fini sections work.
archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
fi
hardcode_libdir_flag_spec='-L$libdir'
hardcode_direct=yes
hardcode_minus_L=yes
hardcode_shlibpath_var=no
;;
sysv4)
case $host_vendor in
sni)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes # is this really true???
;;
siemens)
## LD is ld it makes a PLAMLIB
## CC just makes a GrossModule.
archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
reload_cmds='$CC -r -o $output$reload_objs'
hardcode_direct=no
;;
motorola)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
;;
esac
runpath_var='LD_RUN_PATH'
hardcode_shlibpath_var=no
;;
sysv4.3*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_shlibpath_var=no
export_dynamic_flag_spec='-Bexport'
;;
sysv4*MP*)
if test -d /usr/nec; then
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_shlibpath_var=no
runpath_var=LD_RUN_PATH
hardcode_runpath_var=yes
ld_shlibs=yes
fi
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
no_undefined_flag='${wl}-z,text'
archive_cmds_need_lc=no
hardcode_shlibpath_var=no
runpath_var='LD_RUN_PATH'
if test "$GCC" = yes; then
archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
sysv5* | sco3.2v5* | sco5v6*)
# Note: We can NOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
no_undefined_flag='${wl}-z,text'
allow_undefined_flag='${wl}-z,nodefs'
archive_cmds_need_lc=no
hardcode_shlibpath_var=no
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
hardcode_libdir_separator=':'
link_all_deplibs=yes
export_dynamic_flag_spec='${wl}-Bexport'
runpath_var='LD_RUN_PATH'
if test "$GCC" = yes; then
archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
uts4*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_libdir_flag_spec='-L$libdir'
hardcode_shlibpath_var=no
;;
*)
ld_shlibs=no
;;
esac
fi
echo "$as_me:$LINENO: result: $ld_shlibs" >&5
echo "${ECHO_T}$ld_shlibs" >&6
test "$ld_shlibs" = no && can_build_shared=no
#
# Do we need to explicitly link libc?
#
case "x$archive_cmds_need_lc" in
x|xyes)
# Assume -lc should be added
archive_cmds_need_lc=yes
if test "$enable_shared" = yes && test "$GCC" = yes; then
case $archive_cmds in
*'~'*)
# FIXME: we may have to deal with multi-command sequences.
;;
'$CC '*)
# Test whether the compiler implicitly links with -lc since on some
# systems, -lgcc has to come before -lc. If gcc already passes -lc
# to ld, don't add -lc before -lgcc.
echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
$rm conftest*
printf "$lt_simple_compile_test_code" > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } 2>conftest.err; then
soname=conftest
lib=conftest
libobjs=conftest.$ac_objext
deplibs=
wl=$lt_prog_compiler_wl
pic_flag=$lt_prog_compiler_pic
compiler_flags=-v
linker_flags=-v
verstring=
output_objdir=.
libname=conftest
lt_save_allow_undefined_flag=$allow_undefined_flag
allow_undefined_flag=
if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
(eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }
then
archive_cmds_need_lc=no
else
archive_cmds_need_lc=yes
fi
allow_undefined_flag=$lt_save_allow_undefined_flag
else
cat conftest.err 1>&5
fi
$rm conftest*
echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
echo "${ECHO_T}$archive_cmds_need_lc" >&6
;;
esac
fi
;;
esac
echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=".so"
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
if test "$GCC" = yes; then
sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
# if the path contains ";" then we assume it to be the separator
# otherwise default to the standard path separator (i.e. ":") - it is
# assumed that no part of a normal pathname contains ";" but that should
# okay in the real world where ";" in dirpaths is itself problematic.
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
else
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
fi
else
sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi
need_lib_prefix=unknown
hardcode_into_libs=no
# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown
case $host_os in
aix3*)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
shlibpath_var=LIBPATH
# AIX 3 has no versioning support, so we append a major version to the name.
soname_spec='${libname}${release}${shared_ext}$major'
;;
aix4* | aix5*)
version_type=linux
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
if test "$host_cpu" = ia64; then
# AIX 5 supports IA64
library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
else
# With GCC up to 2.95.x, collect2 would create an import file
# for dependence libraries. The import file would start with
# the line `#! .'. This would cause the generated library to
# depend on `.', always an invalid library. This was fixed in
# development snapshots of GCC prior to 3.0.
case $host_os in
aix4 | aix4.[01] | aix4.[01].*)
if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
echo ' yes '
echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
:
else
can_build_shared=no
fi
;;
esac
# AIX (on Power*) has no versioning support, so currently we can not hardcode correct
# soname into executable. Probably we can add versioning support to
# collect2, so additional links can be useful in future.
if test "$aix_use_runtimelinking" = yes; then
# If using run time linking (on AIX 4.2 or later) use lib.so
# instead of lib.a to let people know that these are not
# typical AIX shared libraries.
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
else
# We preserve .a as extension for shared libraries through AIX4.2
# and later when we are not doing run time linking.
library_names_spec='${libname}${release}.a $libname.a'
soname_spec='${libname}${release}${shared_ext}$major'
fi
shlibpath_var=LIBPATH
fi
;;
amigaos*)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
beos*)
library_names_spec='${libname}${shared_ext}'
dynamic_linker="$host_os ld.so"
shlibpath_var=LIBRARY_PATH
;;
bsdi[45]*)
version_type=linux
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
# the default ld.so.conf also contains /usr/contrib/lib and
# /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
# libtool to hard-code these into programs
;;
cygwin* | mingw* | pw32*)
version_type=windows
shrext_cmds=".dll"
need_version=no
need_lib_prefix=no
case $GCC,$host_os in
yes,cygwin* | yes,mingw* | yes,pw32*)
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \${file}`~
dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
chmod a+x \$dldir/$dlname'
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$rm \$dlpath'
shlibpath_overrides_runpath=yes
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
;;
mingw*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
# It is most probably a Windows format PATH printed by
# mingw gcc, but we are running on Cygwin. Gcc prints its search
# path with ; separators, and with drive letters. We can handle the
# drive letters (cygwin fileutils understands them), so leave them,
# especially as we might pass files found there to a mingw objdump,
# which wouldn't understand a cygwinified path. Ahh.
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
else
sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
fi
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
;;
esac
;;
*)
library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
;;
esac
dynamic_linker='Win32 ld.exe'
# FIXME: first we should search . and the directory the executable is in
shlibpath_var=PATH
;;
darwin* | rhapsody*)
dynamic_linker="$host_os dyld"
version_type=darwin
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
soname_spec='${libname}${release}${major}$shared_ext'
shlibpath_overrides_runpath=yes
shlibpath_var=DYLD_LIBRARY_PATH
shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
# Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
if test "$GCC" = yes; then
sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
else
sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
fi
sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
;;
dgux*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
;;
freebsd1*)
dynamic_linker=no
;;
kfreebsd*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='GNU ld.so'
;;
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
objformat=`/usr/bin/objformat`
else
case $host_os in
freebsd[123]*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
version_type=freebsd-$objformat
case $version_type in
freebsd-elf*)
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
need_version=no
need_lib_prefix=no
;;
freebsd-*)
library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
need_version=yes
;;
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
freebsd2*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[01]* | freebsdelf3.[01]*)
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
freebsd*) # from 4.6 on
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
esac
;;
gnu*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
hardcode_into_libs=yes
;;
hpux9* | hpux10* | hpux11*)
# Give a soname corresponding to the major version so that dld.sl refuses to
# link against other versions.
version_type=sunos
need_lib_prefix=no
need_version=no
case $host_cpu in
ia64*)
shrext_cmds='.so'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.so"
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
if test "X$HPUX_IA64_MODE" = X32; then
sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
else
sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
fi
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
hppa*64*)
shrext_cmds='.sl'
hardcode_into_libs=yes
dynamic_linker="$host_os dld.sl"
shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
*)
shrext_cmds='.sl'
dynamic_linker="$host_os dld.sl"
shlibpath_var=SHLIB_PATH
shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
;;
esac
# HP-UX runs *really* slowly unless shared libraries are mode 555.
postinstall_cmds='chmod 555 $lib'
;;
interix3*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
irix5* | irix6* | nonstopux*)
case $host_os in
nonstopux*) version_type=nonstopux ;;
*)
if test "$lt_cv_prog_gnu_ld" = yes; then
version_type=linux
else
version_type=irix
fi ;;
esac
need_lib_prefix=no
need_version=no
soname_spec='${libname}${release}${shared_ext}$major'
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
case $host_os in
irix5* | nonstopux*)
libsuff= shlibsuff=
;;
*)
case $LD in # libtool.m4 will add one of these switches to LD
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
libsuff= shlibsuff= libmagic=32-bit;;
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
libsuff=32 shlibsuff=N32 libmagic=N32;;
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
libsuff=64 shlibsuff=64 libmagic=64-bit;;
*) libsuff= shlibsuff= libmagic=never-match;;
esac
;;
esac
shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
shlibpath_overrides_runpath=no
sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
hardcode_into_libs=yes
;;
# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
# This must be Linux ELF.
linux*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
# find out which ABI we are using
libsuff=
case "$host_cpu" in
x86_64*|s390x*|powerpc64*)
echo '#line 7947 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
case `/usr/bin/file conftest.$ac_objext` in
*64-bit*)
libsuff=64
sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
;;
esac
fi
rm -rf conftest*
;;
esac
# Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
fi
# We used to test for /lib/ld.so.1 and disable shared libraries on
# powerpc, because MkLinux only supported shared libraries with the
# GNU dynamic linker. Since this was broken with cross compilers,
# most powerpc-linux boxes support dynamic linking these days and
# people can always --disable-shared, the test was removed, and we
# assume the GNU/Linux dynamic linker is in use.
dynamic_linker='GNU/Linux ld.so'
;;
knetbsd*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='GNU ld.so'
;;
netbsd*)
version_type=sunos
need_lib_prefix=no
need_version=no
if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
dynamic_linker='NetBSD (a.out) ld.so'
else
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
dynamic_linker='NetBSD ld.elf_so'
fi
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
;;
newsos6)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
nto-qnx*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
openbsd*)
version_type=sunos
sys_lib_dlsearch_path_spec="/usr/lib"
need_lib_prefix=no
# Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
case $host_os in
openbsd3.3 | openbsd3.3.*) need_version=yes ;;
*) need_version=no ;;
esac
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
shlibpath_var=LD_LIBRARY_PATH
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
case $host_os in
openbsd2.[89] | openbsd2.[89].*)
shlibpath_overrides_runpath=no
;;
*)
shlibpath_overrides_runpath=yes
;;
esac
else
shlibpath_overrides_runpath=yes
fi
;;
os2*)
libname_spec='$name'
shrext_cmds=".dll"
need_lib_prefix=no
library_names_spec='$libname${shared_ext} $libname.a'
dynamic_linker='OS/2 ld.exe'
shlibpath_var=LIBPATH
;;
osf3* | osf4* | osf5*)
version_type=osf
need_lib_prefix=no
need_version=no
soname_spec='${libname}${release}${shared_ext}$major'
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
;;
solaris*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
# ldd complains unless libraries are executable
postinstall_cmds='chmod +x $lib'
;;
sunos4*)
version_type=sunos
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
if test "$with_gnu_ld" = yes; then
need_lib_prefix=no
fi
need_version=yes
;;
sysv4 | sysv4.3*)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
case $host_vendor in
sni)
shlibpath_overrides_runpath=no
need_lib_prefix=no
export_dynamic_flag_spec='${wl}-Blargedynsym'
runpath_var=LD_RUN_PATH
;;
siemens)
need_lib_prefix=no
;;
motorola)
need_lib_prefix=no
need_version=no
shlibpath_overrides_runpath=no
sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
;;
esac
;;
sysv4*MP*)
if test -d /usr/nec ;then
version_type=linux
library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
soname_spec='$libname${shared_ext}.$major'
shlibpath_var=LD_LIBRARY_PATH
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
version_type=freebsd-elf
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
hardcode_into_libs=yes
if test "$with_gnu_ld" = yes; then
sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
shlibpath_overrides_runpath=no
else
sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
shlibpath_overrides_runpath=yes
case $host_os in
sco3.2v5*)
sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
;;
esac
fi
sys_lib_dlsearch_path_spec='/usr/lib'
;;
uts4*)
version_type=linux
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
;;
*)
dynamic_linker=no
;;
esac
echo "$as_me:$LINENO: result: $dynamic_linker" >&5
echo "${ECHO_T}$dynamic_linker" >&6
test "$dynamic_linker" = no && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test "$GCC" = yes; then
variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi
echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
hardcode_action=
if test -n "$hardcode_libdir_flag_spec" || \
test -n "$runpath_var" || \
test "X$hardcode_automatic" = "Xyes" ; then
# We can hardcode non-existant directories.
if test "$hardcode_direct" != no &&
# If the only mechanism to avoid hardcoding is shlibpath_var, we
# have to relink, otherwise we might link with an installed library
# when we should be linking with a yet-to-be-installed one
## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
test "$hardcode_minus_L" != no; then
# Linking always hardcodes the temporary library directory.
hardcode_action=relink
else
# We can link without hardcoding, and we can hardcode nonexisting dirs.
hardcode_action=immediate
fi
else
# We cannot hardcode anything, or else we can only hardcode existing
# directories.
hardcode_action=unsupported
fi
echo "$as_me:$LINENO: result: $hardcode_action" >&5
echo "${ECHO_T}$hardcode_action" >&6
if test "$hardcode_action" = relink; then
# Fast installation is not supported
enable_fast_install=no
elif test "$shlibpath_overrides_runpath" = yes ||
test "$enable_shared" = no; then
# Fast installation is not necessary
enable_fast_install=needless
fi
striplib=
old_striplib=
echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
test -z "$striplib" && striplib="$STRIP --strip-unneeded"
echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
# FIXME - insert some real tests, host_os isn't really good enough
case $host_os in
darwin*)
if test -n "$STRIP" ; then
striplib="$STRIP -x"
echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
;;
*)
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
;;
esac
fi
if test "x$enable_dlopen" != xyes; then
enable_dlopen=unknown
enable_dlopen_self=unknown
enable_dlopen_self_static=unknown
else
lt_cv_dlopen=no
lt_cv_dlopen_libs=
case $host_os in
beos*)
lt_cv_dlopen="load_add_on"
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
;;
mingw* | pw32*)
lt_cv_dlopen="LoadLibrary"
lt_cv_dlopen_libs=
;;
cygwin*)
lt_cv_dlopen="dlopen"
lt_cv_dlopen_libs=
;;
darwin*)
# if libdl is installed we need to link against it
echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
if test "${ac_cv_lib_dl_dlopen+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char dlopen ();
int
main ()
{
dlopen ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dl_dlopen=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_lib_dl_dlopen=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
if test $ac_cv_lib_dl_dlopen = yes; then
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
else
lt_cv_dlopen="dyld"
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
fi
;;
*)
echo "$as_me:$LINENO: checking for shl_load" >&5
echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
if test "${ac_cv_func_shl_load+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define shl_load to an innocuous variant, in case declares shl_load.
For example, HP-UX 11i declares gettimeofday. */
#define shl_load innocuous_shl_load
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shl_load (); below.
Prefer to if __STDC__ is defined, since
exists even on freestanding compilers. */
#ifdef __STDC__
# include
#else
# include
#endif
#undef shl_load
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
{
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char shl_load ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub_shl_load) || defined (__stub___shl_load)
choke me
#else
char (*f) () = shl_load;
#endif
#ifdef __cplusplus
}
#endif
int
main ()
{
return f != shl_load;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_shl_load=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_func_shl_load=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
echo "${ECHO_T}$ac_cv_func_shl_load" >&6
if test $ac_cv_func_shl_load = yes; then
lt_cv_dlopen="shl_load"
else
echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
if test "${ac_cv_lib_dld_shl_load+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char shl_load ();
int
main ()
{
shl_load ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dld_shl_load=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_lib_dld_shl_load=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
if test $ac_cv_lib_dld_shl_load = yes; then
lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
else
echo "$as_me:$LINENO: checking for dlopen" >&5
echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
if test "${ac_cv_func_dlopen+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define dlopen to an innocuous variant, in case declares dlopen.
For example, HP-UX 11i declares gettimeofday. */
#define dlopen innocuous_dlopen
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char dlopen (); below.
Prefer to if __STDC__ is defined, since
exists even on freestanding compilers. */
#ifdef __STDC__
# include
#else
# include
#endif
#undef dlopen
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
{
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char dlopen ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub_dlopen) || defined (__stub___dlopen)
choke me
#else
char (*f) () = dlopen;
#endif
#ifdef __cplusplus
}
#endif
int
main ()
{
return f != dlopen;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_dlopen=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_func_dlopen=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
echo "${ECHO_T}$ac_cv_func_dlopen" >&6
if test $ac_cv_func_dlopen = yes; then
lt_cv_dlopen="dlopen"
else
echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
if test "${ac_cv_lib_dl_dlopen+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char dlopen ();
int
main ()
{
dlopen ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dl_dlopen=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_lib_dl_dlopen=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
if test $ac_cv_lib_dl_dlopen = yes; then
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
else
echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
if test "${ac_cv_lib_svld_dlopen+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld $LIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char dlopen ();
int
main ()
{
dlopen ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_svld_dlopen=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_lib_svld_dlopen=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
if test $ac_cv_lib_svld_dlopen = yes; then
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
else
echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
if test "${ac_cv_lib_dld_dld_link+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char dld_link ();
int
main ()
{
dld_link ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dld_dld_link=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_lib_dld_dld_link=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
if test $ac_cv_lib_dld_dld_link = yes; then
lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
fi
fi
fi
fi
fi
fi
;;
esac
if test "x$lt_cv_dlopen" != xno; then
enable_dlopen=yes
else
enable_dlopen=no
fi
case $lt_cv_dlopen in
dlopen)
save_CPPFLAGS="$CPPFLAGS"
test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
save_LDFLAGS="$LDFLAGS"
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
save_LIBS="$LIBS"
LIBS="$lt_cv_dlopen_libs $LIBS"
echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
if test "${lt_cv_dlopen_self+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test "$cross_compiling" = yes; then :
lt_cv_dlopen_self=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <
#endif
#include
#ifdef RTLD_GLOBAL
# define LT_DLGLOBAL RTLD_GLOBAL
#else
# ifdef DL_GLOBAL
# define LT_DLGLOBAL DL_GLOBAL
# else
# define LT_DLGLOBAL 0
# endif
#endif
/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
# ifdef RTLD_LAZY
# define LT_DLLAZY_OR_NOW RTLD_LAZY
# else
# ifdef DL_LAZY
# define LT_DLLAZY_OR_NOW DL_LAZY
# else
# ifdef RTLD_NOW
# define LT_DLLAZY_OR_NOW RTLD_NOW
# else
# ifdef DL_NOW
# define LT_DLLAZY_OR_NOW DL_NOW
# else
# define LT_DLLAZY_OR_NOW 0
# endif
# endif
# endif
# endif
#endif
#ifdef __cplusplus
extern "C" void exit (int);
#endif
void fnord() { int i=42;}
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
/* dlclose (self); */
}
else
puts (dlerror ());
exit (status);
}
EOF
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
case x$lt_status in
x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
esac
else :
# compilation failed
lt_cv_dlopen_self=no
fi
fi
rm -fr conftest*
fi
echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
echo "${ECHO_T}$lt_cv_dlopen_self" >&6
if test "x$lt_cv_dlopen_self" = xyes; then
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
if test "${lt_cv_dlopen_self_static+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test "$cross_compiling" = yes; then :
lt_cv_dlopen_self_static=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <
#endif
#include
#ifdef RTLD_GLOBAL
# define LT_DLGLOBAL RTLD_GLOBAL
#else
# ifdef DL_GLOBAL
# define LT_DLGLOBAL DL_GLOBAL
# else
# define LT_DLGLOBAL 0
# endif
#endif
/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
# ifdef RTLD_LAZY
# define LT_DLLAZY_OR_NOW RTLD_LAZY
# else
# ifdef DL_LAZY
# define LT_DLLAZY_OR_NOW DL_LAZY
# else
# ifdef RTLD_NOW
# define LT_DLLAZY_OR_NOW RTLD_NOW
# else
# ifdef DL_NOW
# define LT_DLLAZY_OR_NOW DL_NOW
# else
# define LT_DLLAZY_OR_NOW 0
# endif
# endif
# endif
# endif
#endif
#ifdef __cplusplus
extern "C" void exit (int);
#endif
void fnord() { int i=42;}
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
/* dlclose (self); */
}
else
puts (dlerror ());
exit (status);
}
EOF
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
case x$lt_status in
x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
esac
else :
# compilation failed
lt_cv_dlopen_self_static=no
fi
fi
rm -fr conftest*
fi
echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
fi
CPPFLAGS="$save_CPPFLAGS"
LDFLAGS="$save_LDFLAGS"
LIBS="$save_LIBS"
;;
esac
case $lt_cv_dlopen_self in
yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
*) enable_dlopen_self=unknown ;;
esac
case $lt_cv_dlopen_self_static in
yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
*) enable_dlopen_self_static=unknown ;;
esac
fi
# Report which library types will actually be built
echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
echo "$as_me:$LINENO: result: $can_build_shared" >&5
echo "${ECHO_T}$can_build_shared" >&6
echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
test "$can_build_shared" = "no" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
# are all built from PIC.
case $host_os in
aix3*)
test "$enable_shared" = yes && enable_static=no
if test -n "$RANLIB"; then
archive_cmds="$archive_cmds~\$RANLIB \$lib"
postinstall_cmds='$RANLIB $lib'
fi
;;
aix4* | aix5*)
if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
test "$enable_shared" = yes && enable_static=no
fi
;;
esac
echo "$as_me:$LINENO: result: $enable_shared" >&5
echo "${ECHO_T}$enable_shared" >&6
echo "$as_me:$LINENO: checking whether to build static libraries" >&5
echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
# Make sure either enable_shared or enable_static is yes.
test "$enable_shared" = yes || enable_static=yes
echo "$as_me:$LINENO: result: $enable_static" >&5
echo "${ECHO_T}$enable_static" >&6
# The else clause should only fire when bootstrapping the
# libtool distribution, otherwise you forgot to ship ltmain.sh
# with your package, and you will get complaints that there are
# no rules to generate ltmain.sh.
if test -f "$ltmain"; then
# See if we are running on zsh, and set the options which allow our commands through
# without removal of \ escapes.
if test -n "${ZSH_VERSION+set}" ; then
setopt NO_GLOB_SUBST
fi
# Now quote all the things that may contain metacharacters while being
# careful not to overquote the AC_SUBSTed values. We take copies of the
# variables and quote the copies for generation of the libtool script.
for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
SED SHELL STRIP \
libname_spec library_names_spec soname_spec extract_expsyms_cmds \
old_striplib striplib file_magic_cmd finish_cmds finish_eval \
deplibs_check_method reload_flag reload_cmds need_locks \
lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
lt_cv_sys_global_symbol_to_c_name_address \
sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
old_postinstall_cmds old_postuninstall_cmds \
compiler \
CC \
LD \
lt_prog_compiler_wl \
lt_prog_compiler_pic \
lt_prog_compiler_static \
lt_prog_compiler_no_builtin_flag \
export_dynamic_flag_spec \
thread_safe_flag_spec \
whole_archive_flag_spec \
enable_shared_with_static_runtimes \
old_archive_cmds \
old_archive_from_new_cmds \
predep_objects \
postdep_objects \
predeps \
postdeps \
compiler_lib_search_path \
archive_cmds \
archive_expsym_cmds \
postinstall_cmds \
postuninstall_cmds \
old_archive_from_expsyms_cmds \
allow_undefined_flag \
no_undefined_flag \
export_symbols_cmds \
hardcode_libdir_flag_spec \
hardcode_libdir_flag_spec_ld \
hardcode_libdir_separator \
hardcode_automatic \
module_cmds \
module_expsym_cmds \
lt_cv_prog_compiler_c_o \
exclude_expsyms \
include_expsyms; do
case $var in
old_archive_cmds | \
old_archive_from_new_cmds | \
archive_cmds | \
archive_expsym_cmds | \
module_cmds | \
module_expsym_cmds | \
old_archive_from_expsyms_cmds | \
export_symbols_cmds | \
extract_expsyms_cmds | reload_cmds | finish_cmds | \
postinstall_cmds | postuninstall_cmds | \
old_postinstall_cmds | old_postuninstall_cmds | \
sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
# Double-quote double-evaled strings.
eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
;;
*)
eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
;;
esac
done
case $lt_echo in
*'\$0 --fallback-echo"')
lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
;;
esac
cfgfile="${ofile}T"
trap "$rm \"$cfgfile\"; exit 1" 1 2 15
$rm -f "$cfgfile"
{ echo "$as_me:$LINENO: creating $ofile" >&5
echo "$as_me: creating $ofile" >&6;}
cat <<__EOF__ >> "$cfgfile"
#! $SHELL
# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
#
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
#
# This file is part of GNU Libtool:
# Originally by Gordon Matzigkeit , 1996
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# A sed program that does not truncate output.
SED=$lt_SED
# Sed that helps us avoid accidentally triggering echo(1) options like -n.
Xsed="$SED -e 1s/^X//"
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# The names of the tagged configurations supported by this script.
available_tags=
# ### BEGIN LIBTOOL CONFIG
# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# Shell to use when invoking shell scripts.
SHELL=$lt_SHELL
# Whether or not to build shared libraries.
build_libtool_libs=$enable_shared
# Whether or not to build static libraries.
build_old_libs=$enable_static
# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$archive_cmds_need_lc
# Whether or not to disallow shared libs when runtime libs are static
allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
# Whether or not to optimize for fast installation.
fast_install=$enable_fast_install
# The host system.
host_alias=$host_alias
host=$host
host_os=$host_os
# The build system.
build_alias=$build_alias
build=$build
build_os=$build_os
# An echo program that does not interpret backslashes.
echo=$lt_echo
# The archiver.
AR=$lt_AR
AR_FLAGS=$lt_AR_FLAGS
# A C compiler.
LTCC=$lt_LTCC
# LTCC compiler flags.
LTCFLAGS=$lt_LTCFLAGS
# A language-specific compiler.
CC=$lt_compiler
# Is the compiler the GNU C compiler?
with_gcc=$GCC
gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\`
gcc_ver=\`gcc -dumpversion\`
# An ERE matcher.
EGREP=$lt_EGREP
# The linker used to build libraries.
LD=$lt_LD
# Whether we need hard or soft links.
LN_S=$lt_LN_S
# A BSD-compatible nm program.
NM=$lt_NM
# A symbol stripping program
STRIP=$lt_STRIP
# Used to examine libraries when file_magic_cmd begins "file"
MAGIC_CMD=$MAGIC_CMD
# Used on cygwin: DLL creation program.
DLLTOOL="$DLLTOOL"
# Used on cygwin: object dumper.
OBJDUMP="$OBJDUMP"
# Used on cygwin: assembler.
AS="$AS"
# The name of the directory that contains temporary libtool files.
objdir=$objdir
# How to create reloadable object files.
reload_flag=$lt_reload_flag
reload_cmds=$lt_reload_cmds
# How to pass a linker flag through the compiler.
wl=$lt_lt_prog_compiler_wl
# Object file suffix (normally "o").
objext="$ac_objext"
# Old archive suffix (normally "a").
libext="$libext"
# Shared library suffix (normally ".so").
shrext_cmds='$shrext_cmds'
# Executable file suffix (normally "").
exeext="$exeext"
# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic
pic_mode=$pic_mode
# What is the maximum length of a command?
max_cmd_len=$lt_cv_sys_max_cmd_len
# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_lt_cv_prog_compiler_c_o
# Must we lock files when doing compilation?
need_locks=$lt_need_locks
# Do we need the lib prefix for modules?
need_lib_prefix=$need_lib_prefix
# Do we need a version for libraries?
need_version=$need_version
# Whether dlopen is supported.
dlopen_support=$enable_dlopen
# Whether dlopen of programs is supported.
dlopen_self=$enable_dlopen_self
# Whether dlopen of statically linked programs is supported.
dlopen_self_static=$enable_dlopen_self_static
# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static
# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_whole_archive_flag_spec
# Compiler flag to generate thread-safe objects.
thread_safe_flag_spec=$lt_thread_safe_flag_spec
# Library versioning type.
version_type=$version_type
# Format of library name prefix.
libname_spec=$lt_libname_spec
# List of archive names. First name is the real one, the rest are links.
# The last name is the one that the linker finds with -lNAME.
library_names_spec=$lt_library_names_spec
# The coded name of the library, if different from the real name.
soname_spec=$lt_soname_spec
# Commands used to build and install an old-style archive.
RANLIB=$lt_RANLIB
old_archive_cmds=$lt_old_archive_cmds
old_postinstall_cmds=$lt_old_postinstall_cmds
old_postuninstall_cmds=$lt_old_postuninstall_cmds
# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
# Commands used to build and install a shared archive.
archive_cmds=$lt_archive_cmds
archive_expsym_cmds=$lt_archive_expsym_cmds
postinstall_cmds=$lt_postinstall_cmds
postuninstall_cmds=$lt_postuninstall_cmds
# Commands used to build a loadable module (assumed same as above if empty)
module_cmds=$lt_module_cmds
module_expsym_cmds=$lt_module_expsym_cmds
# Commands to strip libraries.
old_striplib=$lt_old_striplib
striplib=$lt_striplib
# Dependencies to place before the objects being linked to create a
# shared library.
predep_objects=\`echo $lt_predep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Dependencies to place after the objects being linked to create a
# shared library.
postdep_objects=\`echo $lt_postdep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Dependencies to place before the objects being linked to create a
# shared library.
predeps=$lt_predeps
# Dependencies to place after the objects being linked to create a
# shared library.
postdeps=$lt_postdeps
# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=\`echo $lt_compiler_lib_search_path | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Method to check whether dependent libraries are shared objects.
deplibs_check_method=$lt_deplibs_check_method
# Command to use when deplibs_check_method == file_magic.
file_magic_cmd=$lt_file_magic_cmd
# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_allow_undefined_flag
# Flag that forces no undefined symbols.
no_undefined_flag=$lt_no_undefined_flag
# Commands used to finish a libtool library installation in a directory.
finish_cmds=$lt_finish_cmds
# Same as above, but a single script fragment to be evaled but not shown.
finish_eval=$lt_finish_eval
# Take the output of nm and produce a listing of raw symbols and C names.
global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
# Transform the output of nm in a proper C declaration
global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
# Transform the output of nm in a C name address pair
global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
# This is the shared library runtime path variable.
runpath_var=$runpath_var
# This is the shared library path variable.
shlibpath_var=$shlibpath_var
# Is shlibpath searched before the hard-coded library search path?
shlibpath_overrides_runpath=$shlibpath_overrides_runpath
# How to hardcode a shared library path into an executable.
hardcode_action=$hardcode_action
# Whether we should hardcode library paths into libraries.
hardcode_into_libs=$hardcode_into_libs
# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist.
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
# If ld is used when linking, flag to hardcode \$libdir into
# a binary during linking. This must work even if \$libdir does
# not exist.
hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
# Whether we need a single -rpath flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator
# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
# resulting binary.
hardcode_direct=$hardcode_direct
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
# resulting binary.
hardcode_minus_L=$hardcode_minus_L
# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
# the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var
# Set to yes if building a shared library automatically hardcodes DIR into the library
# and all subsequent libraries and executables linked against it.
hardcode_automatic=$hardcode_automatic
# Variables whose values should be saved in libtool wrapper scripts and
# restored at relink time.
variables_saved_for_relink="$variables_saved_for_relink"
# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs
# Compile-time system search path for libraries
sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
# Run-time system search path for libraries
sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
# Fix the shell variable \$srcfile for the compiler.
fix_srcfile_path="$fix_srcfile_path"
# Set to yes if exported symbols are required.
always_export_symbols=$always_export_symbols
# The commands to list exported symbols.
export_symbols_cmds=$lt_export_symbols_cmds
# The commands to extract the exported symbol list from a shared archive.
extract_expsyms_cmds=$lt_extract_expsyms_cmds
# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_exclude_expsyms
# Symbols that must always be exported.
include_expsyms=$lt_include_expsyms
# ### END LIBTOOL CONFIG
__EOF__
case $host_os in
aix3*)
cat <<\EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test "X${COLLECT_NAMES+set}" != Xset; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
EOF
;;
esac
# We use sed instead of cat because bash on DJGPP gets confused if
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
mv -f "$cfgfile" "$ofile" || \
(rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
chmod +x "$ofile"
else
# If there is no Makefile yet, we rely on a make rule to execute
# `config.status --recheck' to rerun these tests and create the
# libtool script then.
ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
if test -f "$ltmain_in"; then
test -f Makefile && make "$ltmain"
fi
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
CC="$lt_save_CC"
# Check whether --with-tags or --without-tags was given.
if test "${with_tags+set}" = set; then
withval="$with_tags"
tagnames="$withval"
fi;
if test -f "$ltmain" && test -n "$tagnames"; then
if test ! -f "${ofile}"; then
{ echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
fi
if test -z "$LTCC"; then
eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
if test -z "$LTCC"; then
{ echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
else
{ echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
fi
fi
if test -z "$LTCFLAGS"; then
eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
fi
# Extract list of available tagged configurations in $ofile.
# Note that this assumes the entire list is on one line.
available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
for tagname in $tagnames; do
IFS="$lt_save_ifs"
# Check whether tagname contains only valid characters
case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
"") ;;
*) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
echo "$as_me: error: invalid tag name: $tagname" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
then
{ { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
{ (exit 1); exit 1; }; }
fi
# Update the list of available tags.
if test -n "$tagname"; then
echo appending configuration tag \"$tagname\" to $ofile
case $tagname in
CXX)
if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
(test "X$CXX" != "Xg++"))) ; then
ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
archive_cmds_need_lc_CXX=no
allow_undefined_flag_CXX=
always_export_symbols_CXX=no
archive_expsym_cmds_CXX=
export_dynamic_flag_spec_CXX=
hardcode_direct_CXX=no
hardcode_libdir_flag_spec_CXX=
hardcode_libdir_flag_spec_ld_CXX=
hardcode_libdir_separator_CXX=
hardcode_minus_L_CXX=no
hardcode_shlibpath_var_CXX=unsupported
hardcode_automatic_CXX=no
module_cmds_CXX=
module_expsym_cmds_CXX=
link_all_deplibs_CXX=unknown
old_archive_cmds_CXX=$old_archive_cmds
no_undefined_flag_CXX=
whole_archive_flag_spec_CXX=
enable_shared_with_static_runtimes_CXX=no
# Dependencies to place before and after the object being linked:
predep_objects_CXX=
postdep_objects_CXX=
predeps_CXX=
postdeps_CXX=
compiler_lib_search_path_CXX=
# Source file extension for C++ test sources.
ac_ext=cpp
# Object file extension for compiled C++ test sources.
objext=o
objext_CXX=$objext
# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;\n"
# Code to be used in simple link tests
lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
# ltmain only uses $CC for tagged configurations so make sure $CC is set.
# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}
# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
# Allow CC to be a program name with arguments.
compiler=$CC
# save warnings/boilerplate of simple test code
ac_outfile=conftest.$ac_objext
printf "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$rm conftest*
ac_outfile=conftest.$ac_objext
printf "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$rm conftest*
# Allow CC to be a program name with arguments.
lt_save_CC=$CC
lt_save_LD=$LD
lt_save_GCC=$GCC
GCC=$GXX
lt_save_with_gnu_ld=$with_gnu_ld
lt_save_path_LD=$lt_cv_path_LD
if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
else
$as_unset lt_cv_prog_gnu_ld
fi
if test -n "${lt_cv_path_LDCXX+set}"; then
lt_cv_path_LD=$lt_cv_path_LDCXX
else
$as_unset lt_cv_path_LD
fi
test -z "${LDCXX+set}" || LD=$LDCXX
CC=${CXX-"c++"}
compiler=$CC
compiler_CXX=$CC
for cc_temp in $compiler""; do
case $cc_temp in
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
\-*) ;;
*) break;;
esac
done
cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
# We don't want -fno-exception wen compiling C++ code, so set the
# no_builtin_flag separately
if test "$GXX" = yes; then
lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
else
lt_prog_compiler_no_builtin_flag_CXX=
fi
if test "$GXX" = yes; then
# Set up default GNU C++ configuration
# Check whether --with-gnu-ld or --without-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then
withval="$with_gnu_ld"
test "$withval" = no || with_gnu_ld=yes
else
with_gnu_ld=no
fi;
ac_prog=ld
if test "$GCC" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
echo "$as_me:$LINENO: checking for ld used by $CC" >&5
echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
esac
case $ac_prog in
# Accept absolute paths.
[\\/]* | ?:[\\/]*)
re_direlt='/[^/][^/]*/\.\./'
# Canonicalize the pathname of ld
ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
done
test -z "$LD" && LD="$ac_prog"
;;
"")
# If it fails, then pretend we aren't using GCC.
ac_prog=ld
;;
*)
# If it is relative, then search for the first ld in PATH.
with_gnu_ld=unknown
;;
esac
elif test "$with_gnu_ld" = yes; then
echo "$as_me:$LINENO: checking for GNU ld" >&5
echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
else
echo "$as_me:$LINENO: checking for non-GNU ld" >&5
echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
fi
if test "${lt_cv_path_LD+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -z "$LD"; then
lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
IFS="$lt_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
lt_cv_path_LD="$ac_dir/$ac_prog"
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
case `"$lt_cv_path_LD" -v 2>&1 &5
echo "${ECHO_T}$LD" >&6
else
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
{ (exit 1); exit 1; }; }
echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
if test "${lt_cv_prog_gnu_ld+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
# I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 &5
echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
with_gnu_ld=$lt_cv_prog_gnu_ld
# Check if GNU C++ uses GNU ld as the underlying linker, since the
# archiving commands below assume that GNU ld is being used.
if test "$with_gnu_ld" = yes; then
archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
# If archive_cmds runs LD, not CC, wlarc should be empty
# XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
# investigate it a little bit more. (MM)
wlarc='${wl}'
# ancient GNU ld didn't support --whole-archive et. al.
if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
grep 'no-whole-archive' > /dev/null; then
whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
else
whole_archive_flag_spec_CXX=
fi
else
with_gnu_ld=no
wlarc=
# A generic and very simple default shared library creation
# command for GNU C++ for the case where it uses the native
# linker, instead of GNU ld. If possible, this setting should
# overridden to take advantage of the native linker features on
# the platform it is being used on.
archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
fi
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
else
GXX=no
with_gnu_ld=no
wlarc=
fi
# PORTME: fill in a description of your system's C++ link characteristics
echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
ld_shlibs_CXX=yes
case $host_os in
aix3*)
# FIXME: insert proper C++ library support
ld_shlibs_CXX=no
;;
aix4* | aix5*)
if test "$host_cpu" = ia64; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
no_entry_flag=""
else
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# need to do runtime linking.
case $host_os in aix4.[23]|aix4.[23].*|aix5*)
for ld_flag in $LDFLAGS; do
case $ld_flag in
*-brtl*)
aix_use_runtimelinking=yes
break
;;
esac
done
;;
esac
exp_sym_flag='-bexport'
no_entry_flag='-bnoentry'
fi
# When large executables or shared objects are built, AIX ld can
# have problems creating the table of contents. If linking a library
# or program results in "error TOC overflow" add -mminimal-toc to
# CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
# enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
archive_cmds_CXX=''
hardcode_direct_CXX=yes
hardcode_libdir_separator_CXX=':'
link_all_deplibs_CXX=yes
if test "$GXX" = yes; then
case $host_os in aix4.[012]|aix4.[012].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
collect2name=`${CC} -print-prog-name=collect2`
if test -f "$collect2name" && \
strings "$collect2name" | grep resolve_lib_name >/dev/null
then
# We have reworked collect2
hardcode_direct_CXX=yes
else
# We have old collect2
hardcode_direct_CXX=unsupported
# It fails to find uninstalled libraries when the uninstalled
# path is not listed in the libpath. Setting hardcode_minus_L
# to unsupported forces relinking
hardcode_minus_L_CXX=yes
hardcode_libdir_flag_spec_CXX='-L$libdir'
hardcode_libdir_separator_CXX=
fi
;;
esac
shared_flag='-shared'
if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G'
fi
else
# not using gcc
if test "$host_cpu" = ia64; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
if test "$aix_use_runtimelinking" = yes; then
shared_flag='${wl}-G'
else
shared_flag='${wl}-bM:SRE'
fi
fi
fi
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to export.
always_export_symbols_CXX=yes
if test "$aix_use_runtimelinking" = yes; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
allow_undefined_flag_CXX='-berok'
# Determine the default libpath from the value encoded in an empty executable.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_cxx_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`; fi
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
else
if test "$host_cpu" = ia64; then
hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
allow_undefined_flag_CXX="-z nodefs"
archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an empty executable.
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_cxx_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`; fi
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
no_undefined_flag_CXX=' ${wl}-bernotok'
allow_undefined_flag_CXX=' ${wl}-berok'
# Exported symbols can be pulled into shared objects from archives
whole_archive_flag_spec_CXX='$convenience'
archive_cmds_need_lc_CXX=yes
# This is similar to how AIX traditionally builds its shared libraries.
archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
fi
fi
;;
beos*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
allow_undefined_flag_CXX=unsupported
# Joseph Beckenbach