Merged changes from 3.14 branch

Up to revno 12504.
This commit is contained in:
Andrew Johnson
2014-11-07 15:57:13 -06:00
14 changed files with 184 additions and 82 deletions

View File

@@ -18,16 +18,17 @@ ifeq ($(filter $(ARCH),$(BUILD_ARCHS)),$(ARCH))
buildInstall$(DIVIDER)$(ARCH) buildInstall: $(TARGETS)
clean$(DIVIDER)$(ARCH) clean:
$(RM) cdCommands envPaths dllPath.bat
$(RM) cdCommands envPaths dllPath.bat relPaths.sh
else
buildInstall$(DIVIDER)$(ARCH) buildInstall:
clean$(DIVIDER)$(ARCH) clean:
endif
cdCommands envPaths dllPath.bat: $(wildcard $(TOP)/configure/RELEASE*) \
cdCommands envPaths dllPath.bat relPaths.sh: \
$(wildcard $(TOP)/configure/RELEASE*) \
$(wildcard $(TOP)/configure/CONFIG_SITE*) $(INSTALL_BIN)
$(CONVERTRELEASE) -a $(ARCH) -t $(IOCS_APPL_TOP) $@
realclean:
$(RM) cdCommands envPaths dllPath.bat
$(RM) cdCommands envPaths dllPath.bat relPaths.sh

View File

@@ -0,0 +1,12 @@
# CONFIG.windows-x64.windows-x64-debug
#
# $Revision-Id$
# This file is maintained by the build community.
#
# Definitions for windows-x64 compiler host - windows-x64 debug compiler target builds
# Sites may override these definitions in CONFIG_SITE.windows-x64.windows-x64-debug
#-------------------------------------------------------
include $(CONFIG)/os/CONFIG.windows-x64.windows-x64
HOST_OPT=NO

View File

@@ -109,7 +109,7 @@ $Date$</span></small></p>
<ul>
<li><a href="#When">When Clients Do Not Connect to Their Server</a>
<ul>
<li><a href="#Broadcast">Client and Server Broadcast Addresses Dont
<li><a href="#Broadcast">Client and Server Broadcast Addresses Don't
Match</a></li>
<li><a href="#Client">Client Isnt Configured to Use the Server's
Port</a></li>
@@ -370,7 +370,7 @@ to operate over a wide area network (WAN).</p>
<h3><a name="Network">IP Network Administration Background Information</a></h3>
<p>Channel Access is implemented using internet protocols (IP). IP addresses
<p>Channel Access is implemented using Internet protocols (IP). IP addresses
are divided into host and network portions. The boundary between each portion
is determined by the IP netmask. Portions of the IP address corresponding to
zeros in the netmask specify the hosts address within an IP subnet. Portions of
@@ -380,7 +380,7 @@ limited to one IP subnet. Addresses with the host address portion set to all
zeros or all ones are special. Modern IP kernel implementations reserve
destination addresses with the host portion set to all ones for the purpose of
addressing broadcasts to a particular subnet. In theory we can issue a
broadcast frame on any broadcast capable LAN within the interconnected internet
broadcast frame on any broadcast capable LAN within the interconnected Internet
by specifying the proper subnet address combined with a host portion set to all
ones. In practice these "directed broadcasts" are frequently limited by the
default router configuration. The proper directed broadcast address required to
@@ -586,7 +586,7 @@ restarted or because the IP kernel's internal TCP circuit inactivity keep alive
timer has expired after a typically long duration (as is appropriate for IP
based systems that need to avoid thrashing during periods of excessive load).
The net result is less search and TCP circuit setup and shutdown activity
suring periods of excessive load.</p>
during periods of excessive load.</p>
<h3><a name="Dynamic">Dynamic Changes in the CA Client Library Search
Interval</a></h3>
@@ -613,7 +613,7 @@ doubles the delay between name resolution attempts and reduces the number of
requests per interval. The maximum delay between attempts is limited by
EPICS_CA_MAX_SEARCH_PERIOD (see <a href="#Configurin3">Configuring the Maximum
Search Period</a>). Note however that prior to R3.14.7, if the client library
did not receive any responses over a long interval it stoped sending name
did not receive any responses over a long interval it stopped sending name
resolution attempts altogether until a beacon anomaly was detected (see
below).</p>
@@ -688,7 +688,7 @@ the correct time zone. Nevertheless, several programs commonly used with EPICS
still use the original "tssubr" library and therefore they still rely on proper
configuration of EPICS_TS_MIN_WEST.</em></p>
<p>While the CA client library does not translate inbetween the local time and
<p>While the CA client library does not translate between the local time and
the time zone independent internal storage of EPICS time stamps, many EPICS
client side applications call core EPICS libraries which provide these
services. To set the correct time zone users must compute the number of
@@ -954,7 +954,7 @@ and Windows systems.</p>
<p></p>
<p>The above libraries are located in "&lt;EPICS
base&gt;/lib/&lt;architechture&gt;".</p>
base&gt;/lib/&lt;architecture&gt;".</p>
<h3><a name="Compiler">Compiler and System Specific Build
Options</a></h3>
@@ -1556,7 +1556,7 @@ command line is used.</p>
</tr>
<tr>
<td>-t</td>
<td>Terse mode - print only sucessfully written value, without name</td>
<td>Terse mode - print only successfully written value, without name</td>
</tr>
<tr>
<td></td>
@@ -1646,7 +1646,7 @@ etc.</p>
<p>excas [options]</p>
<p>This is an example CA server that is sometimes used for testing purposes. An
example server can be created with the makeBaseApp perl script, as descibed in
example server can be created with the makeBaseApp Perl script, as described in
the application Developer's Guide.</p>
<table border="1">
@@ -1830,7 +1830,7 @@ the application Developer's Guide.</p>
<h3><a name="When">When Clients Do Not Connect to Their Server</a></h3>
<h4><a name="Broadcast">Client and Server Broadcast Addresses Dont
<h4><a name="Broadcast">Client and Server Broadcast Addresses Don't
Match</a></h4>
<p>Verify that the broadcast addresses are identical on the server's host and
@@ -1880,10 +1880,10 @@ EPICS_CA_MAX_SEARCH_PERIOD to find that newly introduced server.</em> Also,
starting with EPICS R3.14.7 the client library does <em>not</em> suspend
searching for a channel after 100 unsuccessful attempts until a beacon anomaly
is seen. Therefore, if the client library is from before version R3.14.7 of
EPICS and it timed out attempting to find a server whoose beacon cant be seen
EPICS and it timed out attempting to find a server whose beacon can't be seen
by the client library then the client application might need to be restarted in
order to connect to this new beacon-out-of-range server. The typical situation
where a client would not see the server's beacon might be when the client isnt
where a client would not see the server's beacon might be when the client isn't
on the same IP subnet as the server, and the client's EPICS_CA_ADDR_LIST was
modified to include a destination address for the server, but the server's
beacon address list was not modified so that its beacons are received by the
@@ -1898,7 +1898,7 @@ disconnected until TCP/IP's internal, typically long duration, keep alive timer
expires. The disconnected channels remain attached to the beleaguered circuit
and no attempt is made to search for, or to reestablish, a new circuit. If, at
some time in the future, the circuit becomes responsive again, then the
attached channels enter a connected state again and reconnect call back
attached channels enter a connected state again and reconnect callback
handlers are called. Any monitor subscriptions that received an update message
while the channel was disconnected are also refreshed. If at any time the
library receives an indication from the operating system that a beleaguered
@@ -2294,7 +2294,7 @@ int main ( int argc, char ** argv )
SEVCHK ( status, "ca_array_get()" );
status = ca_pend_io ( 15.0 );
if ( status != ECA_NORMAL ) {
fprintf ( stderr, "\"%s\" didnt return a value.\n", argv[1] );
fprintf ( stderr, "\"%s\" didn't return a value.\n", argv[1] );
return -1;
}
@@ -2320,7 +2320,7 @@ int main ( int argc, char ** argv )
<h3><a name="User">User Supplied Callback Functions</a></h3>
<p>Certain CA client initiated requests asynchronously execute an application
supplied call back in the client process when a response arrives. The functions
supplied callback in the client process when a response arrives. The functions
ca_put_callback, ca_get_callback, and ca_create_subscription all request notification of
asynchronous completion via this mechanism. The <code>event_handler_args
</code>structure is passed <em>by value</em> to the application supplied
@@ -2328,8 +2328,8 @@ callback. In this structure the <code>dbr</code> field is a void pointer to any
data that might be returned. The <code>status</code> field will be
set to one of the CA error codes in caerr.h and will indicate the status of the
operation performed in the IOC. If the status field isn't set to ECA_NORMAL or
data isn't normally returned from the operation (i.e. put call back) then you
should expect that the <code>dbr</code> field will be set to a nill pointer
data isn't normally returned from the operation (i.e. put callback) then you
should expect that the <code>dbr</code> field will be set to a null pointer
(zero). The fields <code>usr</code>, <code>chid</code>, and <code>type</code>
are set to the values specified when the request was made by the application.
The "dbr" pointer, and any data that it points to, are valid only when
@@ -2355,7 +2355,7 @@ void myCallback ( struct event_handler_args args )
<h3><a name="Channel1">Channel Access Exceptions</a></h3>
<p>When the server detects a failure, and there is no client call back function
<p>When the server detects a failure, and there is no client callback function
attached to the request, an exception handler is executed in the client. The
default exception handler prints a message on the console and exits if the
exception condition is severe. Certain internal exceptions within the CA client
@@ -2412,7 +2412,7 @@ method is best suited to toolkit components with long runtime duration. Use of
<code><a href="#ca_state">ca_state</a></code> is appropriate only in programs
that prefer to poll for connection state changes instead of opting for
asynchronous notification. The <code>ca_pend_io</code> function blocks only for
channels created specifying a nill connection handler callback function. The
channels created specifying a null connection handler callback function. The
user's connection state change function will be run immediately from within
<code><a href="#ca_create_channel">ca_create_channel</a></code> if the CA
client and CA server are both hosted within the same address space (within the
@@ -2488,11 +2488,11 @@ both part of the same context.</p>
<h3><a name="Polling">Polling the CA Client Library From Single Threaded
Applications</a></h3>
<p>If preemptive call back is not enabled, then for proper operation CA must
<p>If preemptive callback is not enabled, then for proper operation CA must
periodically be polled to take care of background activity. This requires that
your application must either wait in one of ca_pend_event(), ca_pend_io(), or
ca_sg_block() or alternatively it must call ca_poll() at least every 100
milli-seconds. In single threaded applications a file descriptor manager like
milliseconds. In single threaded applications a file descriptor manager like
Xt or the interface described in fdManager.h can be used to monitor both mouse
clicks and also CA's file descriptors so that ca_poll() can be called
immediately when CA server messages arrives over the network.</p>
@@ -2558,8 +2558,8 @@ questionable practice for the following reasons.</p>
<h3><a name="Calling1">Calling CA Functions from POSIX signal
handlers</a></h3>
<p>As you might expect, it isnt safe to call the CA client library from a POSIX
signal handler. Likewise, it isnt safe to call the CA client library from
<p>As you might expect, it isn't safe to call the CA client library from a POSIX
signal handler. Likewise, it isn't safe to call the CA client library from
interrupt context.</p>
<hr>
@@ -2690,7 +2690,7 @@ a connected state.</p>
<ul>
<li>The first and simplest method requires that you call ca_pend_io(), and
wait for successful completion, prior to using a channel that was created
specifying a nill connection call back function pointer.</li>
specifying a null connection callback function pointer.</li>
<li>The second method requires that you register a connection handler by
supplying a valid connection callback function pointer. This connection
handler is called whenever the connection state of the channel changes. If
@@ -2703,7 +2703,7 @@ channel. Valid connections may be isolated from invalid ones with this function
if ca_pend_io() times out.</p>
<p>Due to the inherently transient nature of network connections the order of
connection call backs relative to the order that ca_create_channel() calls are
connection callbacks relative to the order that ca_create_channel() calls are
made by the application can't be guaranteed, and application programs may need
to be prepared for a connected channel to enter a disconnected state at any
time.</p>
@@ -2724,9 +2724,9 @@ time.</p>
</dl>
<dl>
<dt><code>USERFUNC</code></dt>
<dd>Optional address of the user's call back function to be run when the
<dd>Optional address of the user's callback function to be run when the
connection state changes. Casual users of channel access may decide to
set this field to nill or 0 if they do not need to have a call back
set this field to null or 0 if they do not need to have a callback
function run in response to each connection state change event.
<p>The following structure is passed <em>by value </em>to the user's
connection callback function. The <code>op</code> field will
@@ -2746,7 +2746,7 @@ time.</p>
<dd>The value of this void pointer argument is retained in
storage associated with the specified channel. See the MACROS manual page
for reading and writing this field. Casual users of channel access may
wish to set this field to nill or 0.</dd>
wish to set this field to null or 0.</dd>
</dl>
<dl>
<dt><code>PRIORITY</code></dt>
@@ -2832,14 +2832,14 @@ unless the request can not be fulfilled in the server. If unsuccessful an
exception handler is run on the client side.</p>
<p>When ca_put_callback or ca_array_put_callback are invoked the user supplied
asynchronous call back is called only after the initiated write operation, and
asynchronous callback is called only after the initiated write operation, and
all actions resulting from the initiating write operation, complete.</p>
<p>If unsuccessful the call back function is invoked indicating failure status.
<p>If unsuccessful the callback function is invoked indicating failure status.
</p>
<p>If the channel disconnects before a put callback request can be completed,
then the client's call back function is called with failure status, but this
then the client's callback function is called with failure status, but this
does not guarantee that the server did not receive and process the request
before the disconnect. If a connection is lost and then resumed outstanding ca
put requests are not automatically reissued following reconnect.</p>
@@ -2961,7 +2961,7 @@ requests are not automatically reissued following reconnect.</p>
from the channel and then the user's callback is invoked with a pointer to the
retrieved value. Note that ca_pend_io will not block for the delivery of values
requested by ca_get_callback. If the channel disconnects before a ca get
callback request can be completed, then the clients call back function is
callback request can be completed, then the clients callback function is
called with failure status.</p>
<p>All of these functions return ECA_DISCONN if the channel is currently
@@ -3013,7 +3013,7 @@ when a CA get request is initiated.</p>
<dl>
<dt><code>USERARG</code></dt>
<dd>Pointer sized variable retained and then passed back to user supplied
call back function above.</dd>
callback function above.</dd>
</dl>
<h4>Returns</h4>
@@ -3052,7 +3052,7 @@ int ca_create_subscription ( chtype TYPE, unsigned long COUNT,
<h4>Description</h4>
<p>Register a state change subscription and specify a call back function to be
<p>Register a state change subscription and specify a callback function to be
invoked whenever the process variable undergoes significant state changes. A
significant change can be a change in the process variable's value, alarm
status, or alarm severity. In the process control function block database the
@@ -3080,7 +3080,7 @@ or ca_sg_pend are called. This allows several requests to be efficiently sent
over the network in one message.</p>
<p>If at any time after subscribing, read access to the specified process
variable is lost, then the call back will be invoked immediately indicating
variable is lost, then the callback will be invoked immediately indicating
that read access was lost via the status argument. When read access is restored
normal event processing will resume starting always with at least one update
indicating the current state of the channel.</p>
@@ -3094,7 +3094,7 @@ indicating the current state of the channel.</p>
<h4>Arguments</h4>
<dl>
<dt><code>TYPE</code></dt>
<dd>The type of value presented to the call back funstion. Conversion will
<dd>The type of value presented to the callback function. Conversion will
occur if it does not match native type. Specify one from the set of
DBR_XXXX in db_access.h</dd>
</dl>
@@ -3125,7 +3125,7 @@ indicating the current state of the channel.</p>
<dt><code>PEVID</code></dt>
<dd>This is a pointer to user supplied event id which is overwritten if
successful. This event id can later be used to clear a specific event.
This option may be omitted by passing a nill pointer.</dd>
This option may be omitted by passing a null pointer.</dd>
</dl>
<dl>
<dt><code>MASK</code></dt>
@@ -3202,12 +3202,12 @@ int ca_pend_io ( double TIMEOUT );</pre>
<p>This function flushes the send buffer and then blocks until outstanding <a
href="#ca_get">ca_get</a> requests complete, and until channels created
specifying nill connection handler function pointers connect for the first
specifying null connection handler function pointers connect for the first
time.</p>
<ul>
<li>If ECA_NORMAL is returned then it can be safely assumed that all
outstanding <a href="#ca_get">ca_get</a> requests have completed
successfully and channels created specifying nill connection handler
successfully and channels created specifying null connection handler
function pointers have connected for the first time.</li>
<li>If ECA_TIMEOUT is returned then it must be assumed for all previous <a
href="#ca_get">ca_get</a> requests and properly qualified first time
@@ -3217,7 +3217,7 @@ time.</p>
<p>If ECA_TIMEOUT is returned then get requests may be reissued followed by a
subsequent call to ca_pend_io(). Specifically, the function will block only for
outstanding <a href="#ca_get">ca_get</a> requests issued, and also any channels
created specifying a nill connection handler function pointer, after the last
created specifying a null connection handler function pointer, after the last
call to ca_pend_io() or ca client context creation whichever is later. Note
that <a href="#ca_create_channel">ca_create_channel</a> requests generally
should not be reissued for the same process variable unless <a
@@ -3247,7 +3247,7 @@ are pending.</p>
<p>ECA_NORMAL - Normal successful completion</p>
<p>ECA_TIMEOUT - Selected IO requests didnt complete before specified
<p>ECA_TIMEOUT - Selected IO requests didn't complete before specified
timeout</p>
<p>ECA_EVDISALLOW - Function inappropriate for use within an event handler</p>
@@ -3267,10 +3267,10 @@ int ca_test_io();</pre>
<h4>Description</h4>
<p>This function tests to see if all <a href="#ca_get">ca_get</a> requests are
complete and channels created specifying a nill connection callback function
complete and channels created specifying a null connection callback function
pointer are connected. It will report the status of outstanding <a
href="#ca_get">ca_get</a> requests issued, and channels created specifying a
nill connection callback function pointer, after the last call to ca_pend_io()
null connection callback function pointer, after the last call to ca_pend_io()
or CA context initialization whichever is later.</p>
<h4>Returns</h4>
@@ -3320,7 +3320,7 @@ Code</a>.</p>
<p>ECA_TIMEOUT - The operation timed out</p>
<p>ECA_EVDISALLOW - Function inappropriate for use within a call back
<p>ECA_EVDISALLOW - Function inappropriate for use within a callback
handler</p>
<h3><code><a name="ca_flush_io">ca_flush_io()</a></code></h3>
@@ -3389,8 +3389,7 @@ int ca_add_exception_event ( pCallback USERFUNC, void *USERARG );</pre>
<h4>Description</h4>
<p>Replace the currently installed CA context global exception handler call
back.</p>
<p>Replace the currently installed CA context global exception handler callback.</p>
<p>When an error occurs in the server asynchronous to the clients thread then
information about this type of error is passed from the server to the client in
@@ -3409,14 +3408,14 @@ field should not be used.</p>
<dl>
<dt><code>USERFUNC</code></dt>
<dd>Address of user callback function to be executed when an exceptions
occur. Passing a nill value causes the default exception handler to be
occur. Passing a null value causes the default exception handler to be
reinstalled. The following structure is passed by value to the user's
callback function. Currently, the <code>op</code> field can be one of
<code>CA_OP_GET, CA_OP_PUT, CA_OP_CREATE_CHANNEL, CA_OP_ADD_EVENT,
CA_OP_CLEAR_EVENT, or CA_OP_OTHER.</code>
<pre>struct exception_handler_args {
void *usr; /* user argument supplied when installed */
chanId chid; /* channel id (may be nill) */
chanId chid; /* channel id (may be null) */
long type; /* type requested */
long count; /* count requested */
void *addr; /* user's address to write results of CA_OP_GET */
@@ -3543,9 +3542,9 @@ default handler uses fprintf to send messages to 'stderr'.</p>
<h4>Arguments</h4>
<dl>
<dt><code>PFUNC</code></dt>
<dd>The address of a user supplied call back handler to be invoked when CA
prints diagnostic messages. Installing a nill pointer will cause the
default call back handler to be reinstalled.</dd>
<dd>The address of a user supplied callback handler to be invoked when CA
prints diagnostic messages. Installing a null pointer will cause the
default callback handler to be reinstalled.</dd>
</dl>
<h4>Examples</h4>
@@ -3577,7 +3576,7 @@ specified channel.</p>
<li>whenever CA connects the channel immediately before the channel's
connection handler is called</li>
<li>whenever CA disconnects the channel immediately after the channel's
disconnect call back is called</li>
disconnect callback is called</li>
<li>once immediately after installation if the channel is connected.</li>
<li>whenever the access rights state of a connected channel changes</li>
</ul>
@@ -3591,7 +3590,7 @@ specified channel.</p>
</dl>
<dl>
<dt><code>PFUNC</code></dt>
<dd>Address of user supplied call back function. A nill pointer uninstalls
<dd>Address of user supplied callback function. A null pointer uninstalls
the current handler. The following arguments are passed <em>by value</em>
to the supplied callback handler.
<pre>typedef struct ca_access_rights {
@@ -3929,7 +3928,7 @@ type.</p>
<h4>Description</h4>
<pre>void ca_test_event ( struct event_handler_args );</pre>
<p>A built-in subscription update call back handler for debugging purposes that
<p>A built-in subscription update callback handler for debugging purposes that
prints diagnostics to standard out.</p>
<h4>Examples</h4>
@@ -4285,7 +4284,7 @@ ca_client_status() prints information about the calling threads CA context.</p>
<h4>Description</h4>
<p>Returns a pointer to the current thread's CA context. If none then nill is
<p>Returns a pointer to the current thread's CA context. If none then null is
returned.</p>
<h4>See Also</h4>

View File

@@ -95,8 +95,8 @@ CA - Perl 5 interface to EPICS Channel Access
} else {
printf " Value: %g\n", $data->{value};
printf " Severity: %s\n", $data->{severity};
printf " Timestamp: %d.%09d\n",
$data->{stamp}, $data->{stamp_fraction};
printf " Timestamp: %.6f\n",
$data->{stamp} + $data->{stamp_fraction};
}
}
@@ -235,7 +235,7 @@ C<die> with an exception object in the callback and catch that using C<eval> in
the main thread are not likely to succeed and will probably result in a crash.
Callbacks should not perform any operations that would block for more than a
fraction of a second as this will hold up network communications with the
relevent server and could cause the Perl program and/or the Channel Access
relevant server and could cause the Perl program and/or the Channel Access
server to crash. Calling C<< CA->pend_event >> from within a callback is not
permitted by the underlying Channel Access library.
@@ -291,7 +291,7 @@ apply to the callback subroutine as described in C<get_callback> above.
=item put_acks( I<SEVR>, I<SUB> )
Applications that need to ackowledge alarms by doing a C<ca_put()> with type
Applications that need to acknowledge alarms by doing a C<ca_put()> with type
C<DBR_PUT_ACKS> can do so using the C<put_acks> method. The severity argument
may be provided as an integer from zero through three or as a string containing
one of the corresponding EPICS severity names C<NO_ALARM>, C<MINOR>, C<MAJOR> or
@@ -338,11 +338,12 @@ The data provided to a callback function registered with either C<get_callback>
or C<create_subscription> can be a scalar value or a reference to an array or a
hash, depending on the data type that was used for the data transfer. If the
request was for a single item of one of the basic data types, the data argument
will be a perl scalar that holds the value directly. If the request was for
will be a Perl scalar that holds the value directly. If the request was for
multiple items of one of the basic types, the data argument will be a reference
to an array holding the data. There is one exception though; if the data type
requested was for an array of C<DBF_CHAR> values that array will be represented
as a single Perl string contining all the characters before the first zero byte.
as a single Perl string containing all the characters before the first zero
byte.
If the request was for one of the compound data types, the data argument will be
a reference to a hash with keys as described below. Keys that are not classed
@@ -368,7 +369,7 @@ widened from the original type used to request or subscribe for the data.
The number of elements in the data returned by the server. If the data type is
C<DBF_CHAR> the value given for C<COUNT> is the number of bytes (including any
trailing zeros) returned by the server, although the value field is given as a
Perl string contining all the characters before the first zero byte.
Perl string containing all the characters before the first zero byte.
=back
@@ -430,7 +431,7 @@ Present only when I<TYPE> is C<DBR_GR_ENUM> or C<DBR_CTRL_ENUM>.
=item stamp
The process variable timestamp, converted to a local C<time_t>. This value is
suitable for passing to the perl C<localtime> or C<gmtime> functions.
suitable for passing to the Perl C<localtime> or C<gmtime> functions.
Present only when I<TYPE> is C<DBR_TIME_yyy>.
@@ -633,15 +634,15 @@ passing C<undef> as the subroutine reference.
Errors in using the library will be indicated by the module throwing an
exception, i.e. calling C<croak()> with an appropriate error message. These
exceptions can be caught using the standard Parl C<eval {}> statement and
exceptions can be caught using the standard Perl C<eval {}> statement and
testing the C<$@> variable afterwards; if not caught, they will cause the
running program to C<die> with an appropriate error message pointing to the
program line that called the C<CA> library.
Errors messages reported by the underlying CA client library all start with the
Error messages reported by the underlying CA client library all start with the
string C<ECA_> and the remainder of the symbol for the associated CA error
number, and are followed after a space-hyphen-space by a human-readable message
describing the error. Errors that are detected by the perl interface layer do
describing the error. Errors that are detected by the Perl interface layer do
not follow this pattern, but are still printable strings.

View File

@@ -954,16 +954,18 @@ SV * CA_create_subscription(SV *ca_ref, const char *mask_str, SV *sub, ...) {
dbr_text_to_type(treq, type);
if (type < 0) {
croak_msg = "Unknown data type";
croak_msg = "Unknown CA data type";
goto exit_croak;
}
if (type == DBR_PUT_ACKT ||
type == DBR_PUT_ACKS) {
croak_msg = "DBR_PUT_ACK types are write-only";
goto exit_croak;
} else if (type == DBR_CLASS_NAME ||
} else if (type == DBR_GR_ENUM ||
type == DBR_CTRL_ENUM ||
type == DBR_CLASS_NAME ||
type == DBR_STSACK_STRING)
/* These break the dbr_type_is macros */ ;
/* These above types are supported */ ;
else if (dbr_type_is_SHORT(type))
type += (DBR_LONG - DBR_SHORT);
else if (dbr_type_is_FLOAT(type))

View File

@@ -160,11 +160,21 @@ char *val2str (const void *v, unsigned type, int index)
case DBR_ENUM:
{
dbr_enum_t *val = (dbr_enum_t *)val_ptr;
if (dbr_type_is_GR(type) && !enumAsNr)
sprintf(str, "%s", ((struct dbr_gr_enum *)v)->strs[val[index]]);
else if (dbr_type_is_CTRL(type) && !enumAsNr)
sprintf(str, "%s", ((struct dbr_ctrl_enum *)v)->strs[val[index]]);
else
if (dbr_type_is_GR(type) && !enumAsNr) {
if (val[index] >= MAX_ENUM_STATES)
sprintf(str, "Illegal Value (%d)", val[index]);
else if (val[index] >= ((struct dbr_gr_enum *)v)->no_str)
sprintf(str, "Enum Index Overflow (%d)", val[index]);
else
sprintf(str, "%s", ((struct dbr_gr_enum *)v)->strs[val[index]]);
} else if (dbr_type_is_CTRL(type) && !enumAsNr) {
if (val[index] >= MAX_ENUM_STATES)
sprintf(str, "Illegal Value (%d)", val[index]);
else if (val[index] >= ((struct dbr_ctrl_enum *)v)->no_str)
sprintf(str, "Enum Index Overflow (%d)", val[index]);
else
sprintf(str, "%s", ((struct dbr_ctrl_enum *)v)->strs[val[index]]);
} else
sprintf(str, "%d", val[index]);
}
}

View File

@@ -43,6 +43,9 @@ int epicsStrnRawFromEscaped(char *to, size_t outsize, const char *from,
char c;
size_t nto = 0, nfrom = 0;
if (outsize == 0)
return 0;
while ((c = *pfrom++) && nto < outsize && nfrom < inlen) {
nfrom++;
if (c == '\\') {
@@ -100,7 +103,9 @@ int epicsStrnRawFromEscaped(char *to, size_t outsize, const char *from,
*pto++ = c; nto++;
}
}
*pto = '\0'; /* NOTE that nto does not have to be incremented */
if (nto == outsize)
pto--;
*pto = '\0';
return nto;
}

View File

@@ -84,9 +84,11 @@ MAIN(epicsStringTest)
const char * const a = "a";
const char * const abcd = "abcd";
const char * const abcde = "abcde";
char result[8];
char *s;
int status;
testPlan(305);
testPlan(323);
testChars();
@@ -123,5 +125,41 @@ MAIN(epicsStringTest)
testGlob();
memset(result, 'x', sizeof(result));
status = epicsStrnEscapedFromRaw(result, 4, ABCD, 3);
testOk(status == 3, "epicsStrnEscapedFromRaw returned %d (exp. 3)", status);
testOk(result[4] == 'x', "epicsStrnEscapedFromRaw no buffer overrun");
testOk(result[3] == 0, "epicsStrnEscapedFromRaw 0-terminated");
memset(result, 'x', sizeof(result));
status = epicsStrnEscapedFromRaw(result, 4, ABCD, 4);
testOk(status == 4, "epicsStrnEscapedFromRaw returned %d (exp. 4)", status);
testOk(result[4] == 'x', "epicsStrnEscapedFromRaw no buffer overrun");
testOk(result[3] == 0, "epicsStrnEscapedFromRaw 0-terminated");
memset(result, 'x', sizeof(result));
status = epicsStrnEscapedFromRaw(result, 4, ABCDE, 5);
testOk(status == 5, "epicsStrnEscapedFromRaw returned %d (exp. 5)", status);
testOk(result[4] == 'x', "epicsStrnEscapedFromRaw no buffer overrun");
testOk(result[3] == 0, "epicsStrnEscapedFromRaw 0-terminated");
memset(result, 'x', sizeof(result));
status = epicsStrnRawFromEscaped(result, 4, ABCD, 3);
testOk(status == 3, "epicsStrnRawFromEscaped returned %d (exp. 3)", status);
testOk(result[4] == 'x', "epicsStrnRawFromEscaped no buffer overrun");
testOk(result[3] == 0, "epicsStrnRawFromEscaped 0-terminated");
memset(result, 'x', sizeof(result));
status = epicsStrnRawFromEscaped(result, 4, ABCD, 4);
testOk(status == 4, "epicsStrnRawFromEscaped returned %d (exp. 4)", status);
testOk(result[4] == 'x', "epicsStrnRawFromEscaped no buffer overrun");
testOk(result[3] == 0, "epicsStrnRawFromEscaped 0-terminated");
memset(result, 'x', sizeof(result));
status = epicsStrnRawFromEscaped(result, 4, ABCDE, 5);
testOk(status == 4, "epicsStrnRawFromEscaped returned %d (exp. 4)", status);
testOk(result[4] == 'x', "epicsStrnRawFromEscaped no buffer overrun");
testOk(result[3] == 0, "epicsStrnRawFromEscaped 0-terminated");
return testDone();
}

View File

@@ -52,6 +52,8 @@ TEMPLATES += top/exampleBoot/nfsCommands@RTEMS
TEMPLATES += top/exampleBoot/ioc/Makefile@Common
TEMPLATES += top/exampleBoot/ioc/Makefile@vxWorks
TEMPLATES += top/exampleBoot/ioc/Makefile@win32
TEMPLATES += top/exampleBoot/ioc/Makefile@windows
TEMPLATES += top/exampleBoot/ioc/Makefile@cygwin
TEMPLATES += top/exampleBoot/ioc/st.cmd@Common
TEMPLATES += top/exampleBoot/ioc/st.cmd@vxWorks
TEMPLATES += top/exampleBoot/ioc/st.cmd@RTEMS
@@ -81,6 +83,8 @@ TEMPLATES += top/iocBoot/nfsCommands@RTEMS
TEMPLATES += top/iocBoot/ioc/Makefile@Common
TEMPLATES += top/iocBoot/ioc/Makefile@vxWorks
TEMPLATES += top/iocBoot/ioc/Makefile@win32
TEMPLATES += top/iocBoot/ioc/Makefile@windows
TEMPLATES += top/iocBoot/ioc/Makefile@cygwin
TEMPLATES += top/iocBoot/ioc/st.cmd@Common
TEMPLATES += top/iocBoot/ioc/st.cmd@Cross
TEMPLATES += top/iocBoot/ioc/st.cmd@vxWorks

View File

@@ -0,0 +1,5 @@
TOP = ../..
include $(TOP)/configure/CONFIG
ARCH = _ARCH_
TARGETS = envPaths relPaths.sh
include $(TOP)/configure/RULES.ioc

View File

@@ -0,0 +1,5 @@
TOP = ../..
include $(TOP)/configure/CONFIG
ARCH = _ARCH_
TARGETS = envPaths dllPath.bat
include $(TOP)/configure/RULES.ioc

View File

@@ -0,0 +1,5 @@
TOP = ../..
include $(TOP)/configure/CONFIG
ARCH = _ARCH_
TARGETS = envPaths relPaths.sh
include $(TOP)/configure/RULES.ioc

View File

@@ -0,0 +1,5 @@
TOP = ../..
include $(TOP)/configure/CONFIG
ARCH = _ARCH_
TARGETS = envPaths dllPath.bat
include $(TOP)/configure/RULES.ioc

View File

@@ -82,6 +82,7 @@ expandRelease(\%macros, \@apps);
for ($outfile) {
m/releaseTops/ and do { &releaseTops; last; };
m/dllPath\.bat/ and do { &dllPath; last; };
m/relPaths\.sh/ and do { &relPaths; last; };
m/cdCommands/ and do { &cdCommands; last; };
m/envPaths/ and do { &envPaths; last; };
m/checkRelease/ and do { &checkRelease; last; };
@@ -96,7 +97,8 @@ sub HELP_MESSAGE {
Usage: convertRelease.pl [-a arch] [-T top] [-t ioctop] outfile
where outfile is one of:
releaseTops - lists the module names defined in RELEASE*s
dllPath.bat - path changes for cmd.exe to find WIN32 DLLs
dllPath.bat - path changes for cmd.exe to find Windows DLLs
relPaths.sh - path changes for bash to add RELEASE bin dir's
cdCommands - generate cd path strings for vxWorks IOCs
envPaths - generate epicsEnvSet commands for other IOCs
checkRelease - checks consistency with support modules
@@ -113,13 +115,21 @@ sub releaseTops {
}
#
# Generate Path files so Windows can find our DLLs
# Generate Path files so Windows/Cygwin can find our DLLs
#
sub dllPath {
unlink $outfile;
open(OUT, ">$outfile") or die "$! creating $outfile";
print OUT "\@ECHO OFF\n";
print OUT "PATH %PATH%;", join(';', binDirs()), "\n";
print OUT "PATH \%PATH\%;", join(';', binDirs()), "\n";
close OUT;
}
sub relPaths {
unlink $outfile;
open(OUT, ">$outfile") or die "$! creating $outfile";
print OUT "export PATH=\$PATH:",
join(':', map {m/\s/ ? "\"$_\"" : $_ } binDirs()), "\n";
close OUT;
}