NAME rpc_intro - Introduction to the DCE RPC API runtime DESCRIPTION This introduction gives general information about the DCE RPC Application Programming Interface (API) and an overview of the following parts of the DCE RPC API runtime: + Runtime services + Environment variables + Data types and structures + Permissions required + Frequently used routine arguments
1 – General Information
The following subsections contain topics, beyond those directly related to the RPC API, that application programmers need to know. IDL-to-C Mappings The Interface Definition Language (IDL) compiler converts an interface definition into output files. The rpc_intro reference page in the OSF DCE Command Reference contains a summary of the idl command, which invokes the IDL compiler. Additional information about the IDL compiler appears in the following table, which shows the IDL base types and the IDL-to-C mappings. The following table lists the IDL base data type specifiers. Where applicable, the table shows the size of the corresponding transmittable type and the type macro emitted by the IDL compiler for resulting declarations. Base Data Type Specifiers - rpc_intro ___________________________________________________________ Specifier Type Macro (sign) (size) (type) Size Emitted by idl ___________________________________________________________ small int 8 bits idl_small_int short int 16 bits idl_short_int long int 32 bits idl_long_int hyper int 64 bits idl_hyper_int unsigned small int 8 bits idl_usmall_int unsigned short int 16 bits idl_ushort_int unsigned long int 32 bits idl_ulong_int unsigned hyper int 64 bits idl_uhyper_int float 32 bits idl_short_float double 64 bits idl_long_float char 8 bits idl_char boolean 8 bits idl_boolean byte 8 bits idl_byte void - idl_void_p_t handle_t - - Note that you can use the idl_ macros in the code you write for an application to ensure that your type declarations are consistent with those in the stubs, even when the application is ported to another platform. The idl_ macros are especially useful when passing constant values to RPC calls. For maximum portability, all constants passed to RPC calls declared in your network interfaces should be cast to the appropriate type because the size of integer constants (like the size of the int data type) is unspecified in the C language. The idl_ macros are defined in SYS$COMMON:[DCE$LIBRARY]IDLBASE.H, which is included by header files that the IDL compiler generates. Management Commands for Programmers In addition to the idl command for programmers, DCE RPC provides two management commands for the RPC control program and the DCE Host daemon, as follows: + The rpccp control program accesses RPCCP, the RPC control program. This program provides a set of commands for accessing the operations of the RPC Name Service Interface (NSI operations). RPCCP also supports showing the elements of the local endpoint map and removing elements from it. You can manage the name service with RPCCP commands or with DCE RPC runtime routines. For example, suppose you want to obtain the members of a group. You can give the show group command to RPCCP or you can write an application program that calls the following DCE RPC runtime routines: - rpc_ns_group_mbr_inq_begin() - rpc_ns_group_mbr_inq_next() - rpc_ns_group_mbr_inq_done() + The dced command starts the DCE Host daemon. The daemon maintains the local endpoint map for RPC servers and looks up endpoints for RPC clients. See the OSF DCE Administration Reference for more information about these two management commands.
2 – Overview of DCE RPC Runtime Services
The RPC runtime services consist of RPC routines that perform a variety of operations. Note that the RPC API is thread safe and synchronous cancel safe (in the context of POSIX threads). However, the RPC API is not asynchronous cancel safe. For more information about threads and their cancellation, see the OSF DCE Application Development Guide - Core Components. The rest of this overview consists of the following items: + An explanation of abbreviations in the names of the RPC runtime routines + An alphabetical list of DCE RPC runtime routines. With each routine name is its description and the type of application program that most likely calls the routine. An alphabetical list of abbreviations in the names of the DCE RPC routines follows. The list can help you remember the names more easily. For example, consider the routine name rpc_mgmt_ep_elt_inq_begin(). Use the next list to expand the name to "RPC management endpoint element inquiry begin", which summarizes the description "Creates an inquiry context for viewing the elements in a local or remote endpoint map. (Management)." auth - authentication, authorization com - communications cs - character/code set interoperability dce - distributed computing environment dflt - default elt - element ep - endpoint exp - expiration fn - function id - identifier idl_es - IDL encoding services if - interface inq - inquiry mbr - member mgmt - management ns - name service protseq - protocol sequence rgy - DCE character and code set registry rpc - remote procedure call stats - statistics An alphabetical list of the RPC runtime routines follows. With each routine name is its description and the type of application program that most likely calls the routine. cs_byte_from_netcs() Converts international character data from a network code set to a local code set. (Client, server). cs_byte_local_size() Calculates the necessary buffer size for a code set conversion from a network code set to a local code set. (Client, server). cs_byte_net_size() Calculates the necessary buffer size for a code set conversion from a local code set to a network code set. (Client, server). cs_byte_to_netcs() Converts international character data from a local code set to a network code set. (Client, server). dce_cs_loc_to_rgy() Maps a local name for a code set to a code set value in the code set registry. (Client, server). dce_cs_rgy_to_loc() Maps a code set value in the code set registry to a the local name for a code set. (Client, server). idl_es_decode_buffer() Returns a buffer decoding handle. (Client, server). idl_es_decode_incremental() Returns an incremental decoding handle. (Client, server). idl_es_encode_dyn_buffer() Returns a dynamic buffer encoding handle. (Client, server). idl_es_encode_fixed_buffer() Returns a fixed buffer encoding handle. (Client, server). idl_es_encode_incremental() Returns an incremental encoding handle. (Client, server). idl_es_handle_free() Frees an IDL encoding services handle. (Client, server). idl_es_inq_encoding_id() Identifies an application encoding operation. (Client, server). rpc_binding_copy() Returns a copy of a binding handle. (Client or server). rpc_binding_free() Releases binding handle resources. (Client or server). rpc_binding_from_string_binding() Returns a binding handle from a string representation of a binding handle. (Client or management). rpc_binding_inq_auth_client() Returns authentication and authorization information from the binding handle for an authenticated client. (Server). rpc_binding_inq_auth_info() Returns authentication and authorization information from a server binding handle. (Client). rpc_binding_inq_object() Returns the object UUID from a binding handle. (Client or server). rpc_binding_reset() Resets a server binding handle so the host remains specified, but the server instance on that host is unspecified. (Client or management). rpc_binding_server_from_client() Converts a client binding handle to a server binding handle. (Server). rpc_binding_set_auth_info() Sets authentication and authorization information into a server binding handle. (Client). rpc_binding_set_object() Sets the object UUID value into a server binding handle. (Client). rpc_binding_to_string_binding() Returns a string representation of a binding handle. (Client, server, or management). rpc_binding_vector_free() Frees the memory used to store a vector and binding handles. (Client or server). rpc_cs_binding_set_tags() Places code set tags into a server binding handle. (Client). rpc_cs_char_set_compat_check() Evaluates character set compatibility between a client and a server. (Client). rpc_cs_eval_with_universal() Evaluates a server's supported character sets and code sets during the server binding selection process. (Client). rpc_cs_eval_without_universal() Evaluates a server's supported character sets and code sets during the server binding selection process. (Client). rpc_cs_get_tags() Retrieves code set tags from a binding handle. (Client, server). rpc_ep_register() Adds to, or replaces, server address information in the local endpoint map. (Server). rpc_ep_register_no_replace() Adds to server address information in the local endpoint map. (Server). rpc_ep_resolve_binding() Resolves a partially bound server binding handle into a fully bound server binding handle. (Client or management). rpc_ep_unregister() Removes server address information from the local endpoint map. (Server). rpc_if_id_vector_free() Frees a vector and the interface identifier structures it contains. (Client, server, or management). rpc_if_inq_id() Returns the interface identifier for an interface specification. (Client or server). rpc_mgmt_ep_elt_inq_begin() Creates an inquiry context for viewing the elements in a local or remote endpoint map. (Management). rpc_mgmt_ep_elt_inq_done() Deletes the inquiry context for viewing the elements in a local or remote endpoint map. (Management). rpc_mgmt_ep_elt_inq_next() Returns one element at a time from a local or remote endpoint map. (Management). rpc_mgmt_ep_unregister() Removes server address information from a local or remote endpoint map. (Management). rpc_mgmt_inq_com_timeout() Returns the communications time-out value in a binding handle. (Client). rpc_mgmt_inq_dflt_protect_level() Returns the default protection level for an authentication service. (Client or server). rpc_mgmt_inq_if_ids() Returns a vector of interface identifiers of interfaces a server offers. (Client, server, or management). rpc_mgmt_inq_server_princ_name() Returns a server's principal name. (Client, server, or management). rpc_mgmt_inq_stats() Returns RPC runtime statistics. (Client, server, or management). rpc_mgmt_is_server_listening() Tells whether a server is listening for remote procedure calls. (Client, server, or management). rpc_mgmt_set_authorization_fn() Establishes an authorization function for processing remote calls to a server's management routines. (Server). rpc_mgmt_set_cancel_timeout() Sets the lower bound on the time to wait before timing out after forwarding a cancel. (Client). rpc_mgmt_set_com_timeout() Sets the communications time-out value in a binding handle. (Client). rpc_mgmt_set_server_stack_size() Specifies the stack size for each server thread. (Server). rpc_mgmt_stats_vector_free() Frees a statistics vector. (Client, server, or management). rpc_mgmt_stop_server_listening() Tells a server to stop listening for remote procedure calls. (Client, server, or management). rpc_network_inq_protseqs() Returns all protocol sequences supported by both the RPC runtime and the operating system. (Client or server). rpc_network_is_protseq_valid() Tells whether the specified protocol sequence is supported by both the RPC runtime and the operating system. (Client or server). rpc_ns_binding_export() Establishes a name service database entry with binding handles or object UUIDs for a server. (Server). rpc_ns_binding_import_begin() Creates an import context for an interface and an object in the name service database. (Client). rpc_ns_binding_import_done() Deletes the import context for searching the name service database. (Client). rpc_ns_binding_import_next() Returns a binding handle of a compatible server (if found) from the name service database. (Client). rpc_ns_binding_inq_entry_name() Returns the name of an entry in the name service database from which the server binding handle came. (Client). rpc_ns_binding_lookup_begin() Creates a lookup context for an interface and an object in the name service database. (Client). rpc_ns_binding_lookup_done() Deletes the lookup context for searching the name service database. (Client). rpc_ns_binding_lookup_next() Returns a list of binding handles of one or more compatible servers (if found) from the name service database. (Client). rpc_ns_binding_select() Returns a binding handle from a list of compatible server binding handles. (Client). rpc_ns_binding_unexport() Removes the binding handles for an interface, or object UUIDs, from an entry in the name service database. (Server). rpc_ns_entry_expand_name() Expands the name of a name service entry. (Client, server, or management). rpc_ns_entry_object_inq_begin() Creates an inquiry context for viewing the objects of an entry in the name service database. (Client, server, or management). rpc_ns_entry_object_inq_done() Deletes the inquiry context for viewing the objects of an entry in the name service database. (Client, server, or management). rpc_ns_entry_object_inq_next() Returns one object at a time from an entry in the name service database. (Client, server, or management). rpc_ns_group_delete() Deletes a group attribute. (Client, server, or management). rpc_ns_group_mbr_add() Adds an entry name to a group; if necessary, creates the entry. (Client, server, or management). rpc_ns_group_mbr_inq_begin() Creates an inquiry context for viewing group members. (Client, server, or management). rpc_ns_group_mbr_inq_done() Deletes the inquiry context for a group. (Client, server, or management). rpc_ns_group_mbr_inq_next() Returns one member name at a time from a group. (Client, server, or management). rpc_ns_group_mbr_remove() Removes an entry name from a group. (Client, server, or management). rpc_ns_import_ctx_add_eval() Adds an evaluation routine to an import context. (Client). rpc_ns_mgmt_binding_unexport() Removes multiple binding handles, or object UUIDs, from an entry in the name service database. (Management). rpc_ns_mgmt_entry_create() Creates an entry in the name service database. (Management). rpc_ns_mgmt_entry_delete() Deletes an entry from the name service database. (Management). rpc_ns_mgmt_entry_inq_if_ids() Returns the list of interfaces exported to an entry in the name service database. (Client, server, or management). rpc_ns_mgmt_free_codesets() Frees a code sets array that has been allocated in memory. (Client). rpc_ns_mgmt_handle_set_exp_age() Sets a handle's expiration age for local copies of name service data. (Client, server, or management). rpc_ns_mgmt_inq_exp_age() Returns the application's global expiration age for local copies of name service data. (Client, server, or management). rpc_ns_mgmt_read_codesets() Reads the code sets attribute associated with an RPC server entry in the name service database. (Client). rpc_ns_mgmt_remove_attribute() Removes an attribute from an RPC server entry in the name service database. (Server, management). rpc_ns_mgmt_set_attribute() Adds an attribute to an RPC server entry in the name service database. (Server, management). rpc_ns_mgmt_set_exp_age() Modifies the application's global expiration age for local copies of name service data. (Client, server, or management). rpc_ns_profile_delete() Deletes a profile attribute. (Client, server, or management). rpc_ns_profile_elt_add() Adds an element to a profile. If necessary, creates the entry. (Client, server, or management). rpc_ns_profile_elt_inq_begin() Creates an inquiry context for viewing the elements in a profile. (Client, server, or management). rpc_ns_profile_elt_inq_done() Deletes the inquiry context for a profile. (Client, server, or management). rpc_ns_profile_elt_inq_next() Returns one element at a time from a profile. (Client, server, or management). rpc_ns_profile_elt_remove() Removes an element from a profile. (Client, server, or management). rpc_object_inq_type() Returns the type of an object. (Server). rpc_object_set_inq_fn() Registers an object inquiry function. (Server). rpc_object_set_type() Assigns the type of an object. (Server). rpc_protseq_vector_free() Frees the memory used by a vector and its protocol sequences. (Client or server). rpc_rgy_get_codesets() Gets supported code sets information from the local host. (Client, server). rpc_rgy_get_max_bytes() Gets the maximum number of bytes that a code set uses to encode one character. (Client, server). rpc_server_inq_bindings() Returns binding handles for communication with a server. (Server). rpc_server_inq_if() Returns the manager entry point vector registered for an interface. (Server). rpc_server_listen() Tells the RPC runtime to listen for remote procedure calls. (Server). rpc_server_register_auth_info() Registers authentication information with the RPC runtime. (Server). rpc_server_register_if() Registers an interface with the RPC runtime. (Server). rpc_server_unregister_if() Unregisters an interface from the RPC runtime. (Server). rpc_server_use_all_protseqs() Tells the RPC runtime to use all supported protocol sequences for receiving remote procedure calls. (Server). rpc_set_local_float_drep() Sets the float type in the runtime to the one with which the application is being compiled. rpc_server_use_all_protseqs_if() Tells the RPC runtime to use all the protocol sequences and endpoints specified in the interface specification for receiving remote procedure calls. (Server). rpc_server_use_protseq() Tells the RPC runtime to use the specified protocol sequence for receiving remote procedure calls. (Server). rpc_server_use_protseq_ep() Tells the RPC runtime to use the specified protocol sequence combined with the specified endpoint for receiving remote procedure calls. (Server). rpc_server_use_protseq_if() Tells the RPC runtime to use the specified protocol sequence combined with the endpoints in the interface specification for receiving remote procedure calls. (Server). rpc_sm_allocate() Allocates memory within the RPC stub memory management scheme. (Usually server, possibly client). rpc_sm_client_free() Frees memory allocated by the current memory allocation and freeing mechanism used by the client stubs. (Client). rpc_sm_destroy_client_context() Reclaims the client memory resources for a context handle, and sets the context handle to NULL. (Client). rpc_sm_disable_allocate() Releases resources and allocated memory within the RPC stub memory management scheme. (Client). rpc_sm_enable_allocate() Enables the stub memory management environment. (Client). rpc_sm_free() Frees memory allocated by the rpc_sm_allocate() routine. (Usually server, possibly client). rpc_sm_get_thread_handle() Gets a thread handle for the stub memory management environment. (Usually server, possibly client). rpc_sm_set_client_alloc_free() Sets the memory allocation and freeing mechanism used by the client stubs. (Client). rpc_sm_set_thread_handle() Sets a thread handle for the stub memory management environment. (Usually server, possibly client). rpc_sm_swap_client_alloc_free() Exchanges the current memory allocation and freeing mechanism used by the client stubs with one supplied by the client. (Client). rpc_string_binding_compose() Combines the components of a string binding into a string binding. (Client or server). rpc_string_binding_parse() Returns, as separate strings, the components of a string binding. (Client or server). rpc_string_free() Frees a character string allocated by the runtime. (Client, server, or management). uuid_compare() Compares two UUIDs and determines their order. (Client, server, or management). uuid_create() Creates a new UUID. (Client, server, or management). uuid_create_nil() Creates a nil UUID. (Client, server, or management). uuid_equal() Determines if two UUIDs are equal. (Client, server, or management). uuid_from_string() Converts a string UUID to its binary representation. (Client, server, or management). uuid_hash() Creates a hash value for a UUID. (Client, server, or management). uuid_is_nil() Determines if a UUID is nil. (Client, server, or management). uuid_to_string() Converts a UUID from a binary representation to a string representation. (Client, server, or management). wchar_t_from_netcs() Converts international character data from a network code set to a local code set. (Client, server). wchar_t_local_size() Calculates the necessary buffer size for a code set conversion from a network code set to a local code set. (Client, server). wchar_t_net_size() Calculates the necessary buffer size for a code set conversion from a local code set to a network code set. (Client, server). wchar_t_to_netcs() Converts international character data from a local code set to a net work code set. (Client, server).
3 – Logical Names
The RPC Name Service Interface (NSI) routines uses the following logical names: + RPC_DEFAULT_ENTRY Designates the default entry in the name service database that the import and lookup routines use as the starting point to search for binding information for a compatible server. Normally, the starting entry is a profile. An application that uses a default entry name must define this logical name. The RPC runtime does not provide a default. For example, suppose that a client application needs to search the name service database for a server binding handle. The application can use the rpc_ns_binding_import_begin() routine as part of the search. If so, the application must specify, to the routine's entry_name parameter, the name of the entry in the name service database at which to begin the search. If the search is to begin at the entry that the RPC_DEFAULT_ENTRY logical name specifies, then the application must specify the value NULL to parameter entry_name in rpc_ns_binding_import_begin(). + RPC_DEFAULT_ENTRY_SYNTAX Specifies the syntax of the name provided in the RPC_DEFAULT_ENTRY logical name. In addition, provides the syntax for those RPC NSI routines that allow a default value for the name syntax argument. If the RPC_DEFAULT_ENTRY_SYNTAX logical name is not defined, the RPC runtime uses the rpc_c_ns_syntax_dce name syntax. (For the valid name syntaxes in this reference page and for the valid syntax values, see the table in the description of the frequently used routine argument name_syntax, which appears later in this reference page.) Optionally, each application defines either or both of the first two logical names. The application can change the value of either one, or both, at any time during runtime.
4 – RPC Data Types and Structures
The following subsections contain the data types and structures used by client, server, and management application programs. Much of the information in this section is derived from the Application Development Guide. You may want to refer to this book as you read this section. For example, this section contains a brief description of a binding handle. The RPC section of the Application Development Guide explains binding handles in detail. It also explains concepts related to binding handles, such as binding information and string bindings.
4.1 – Binding Handle
A binding handle is a pointer-size opaque variable containing information the RPC runtime uses to manage binding information. The RPC runtime uses binding information to establish a client/ server relationship that allows the execution of remote procedure calls. Based on the context where it is created, a binding handle is considered a server binding handle or a client binding handle. A server binding handle is a reference to the binding information necessary for a client to establish a relationship with a specific server. Many RPC API runtime routines return a server binding handle that you can use to make a remote procedure call. A server binding handle refers to several components of binding information. One is the network address of a server's host system. Each server instance has one or more transport addresses (endpoints). A well-known endpoint is a stable address on the host, while a dynamic endpoint is an address that the RPC runtime requests for the server. Some transport protocols provide fewer well-known endpoints than dynamic endpoints. If binding information contains an endpoint, the corresponding binding handle is a fully bound binding handle. If the information lacks an endpoint, the binding handle is a partially bound binding handle. The RPC runtime creates and provides a client binding handle to a called remote procedure as the handle_t parameter. The client binding handle contains information about the calling client. A client binding handle cannot be used to make a remote procedure call. A server uses the client binding handle. The rpc_binding_server_from_client() routine converts a client binding handle to a server binding handle. You can use the resulting server binding handle to make a remote procedure call. For an explanation of making a remote procedure call with a partially bound binding handle, see the OSF DCE Application Development Guide - Core Components. For an explanation of failures associated with such a call, see the explanation of status code rpc_s_wrong_boot_time in the OSF DCE Problem Determination Guide. Binding information can contain an object UUID. The default object UUID associated with a binding handle is a nil UUID. Clients can obtain a non-nil UUID in various ways, such as from a string representation of binding information (a string binding), or by importing it. The following table contains the RPC runtime routines that operate on binding handles. The table also specifies the type of binding handle, client or server, allowed. Client and Server Binding Handles __________________________________________________________________ Routine Input Argument Output Argument __________________________________________________________________ rpc_binding_copy() Server Server rpc_binding_free() Server None rpc_binding_from_string_binding() None Server rpc_binding_inq_auth_client() Client None rpc_binding_inq_auth_info() Server None rpc_binding_inq_object() Server or client None rpc_binding_reset() Server None rpc_binding_server_from_client() Client Server rpc_binding_set_auth_info() Server None rpc_binding_set_object() Server None rpc_binding_to_string_binding() Server or client None rpc_binding_vector_free() Server None rpc_ns_binding_export() Server None rpc_ns_binding_import_next() None Server rpc_ns_binding_inq_entry_name() Server None rpc_ns_binding_lookup_next() None Server rpc_ns_binding_select() Server Server rpc_server_inq_bindings() None Server If the input argument type is only a client or only a server, the routines return the status code rpc_s_wrong_kind_of_binding when an application provides the incorrect binding handle type. An application can share a single binding handle across multiple threads of execution. The RPC runtime, instead of the application, manages binding handle concurrency control across concurrent remote procedure calls that use a single binding handle. However, the client application has responsibility for binding handle concurrency control for operations that read or modify a binding handle. The related routines are as follows: + rpc_binding_free() + rpc_binding_reset() + rpc_binding_set_auth_info() + rpc_binding_set_object() + rpc_ep_resolve_binding() + rpc_mgmt_set_com_timeout() For example, suppose an application shares a binding handle across two threads of execution and it resets the binding handle endpoint in one of the threads (by calling rpc_binding_reset()). The binding handle in the other thread is then also reset. Similarly, freeing the binding handle in one thread (by calling rpc_binding_free()) frees the binding handle in the other thread. If you do not want this effect, your application can create a copy of a binding handle by calling rpc_binding_copy(). An operation on one binding handle then has no effect on the second binding handle. Clients and servers can access and set object UUIDs using the rpc_binding_inq_object() and rpc_binding_set_object() routines. Routines requiring a binding handle as an argument show a data type of rpc_binding_handle_t. Binding handle arguments are passed by value.
4.2 – Binding Vector
The binding vector data structure contains a list of binding handles over which a server application can receive remote procedure calls. The binding vector contains a count member (count), followed by an array of binding handle (binding_h) elements. The C language representation of a binding vector is as follows: typedef struct { unsigned32 count; rpc_binding_handle_t binding_h[1]; } rpc_binding_vector_t; The RPC runtime creates binding handles when a server application registers protocol sequences. To obtain a binding vector, a server application calls the rpc_server_inq_bindings() routine. A client application obtains a binding vector of compatible servers from the name service database by calling rpc_ns_binding_lookup_next(). In both routines, the RPC runtime allocates memory for the binding vector. An application calls the rpc_binding_vector_free() routine to free the binding vector. An application, when it is finished with an individual binding handle in a binding vector, frees the binding handle by calling rpc_binding_free(). This routine also sets the corresponding pointer in the binding vector to NULL. Note that you should not decrement the count field in a binding vector structure when you call the rpc_binding_free() routine to free an individual binding handle. The following routines require a binding vector and show an argument data type of rpc_binding_vector_t: + rpc_binding_vector_free() + rpc_ep_register() + rpc_ep_register_no_replace() + rpc_ep_unregister() + rpc_ns_binding_export() + rpc_ns_binding_lookup_next() + rpc_ns_binding_select() + rpc_server_inq_bindings()
4.3 – Boolean
Routines that require a Boolean-valued argument or return a Boolean value show a data type of boolean32. DCE RPC provides the integer constants TRUE (1) and FALSE (0) for use as Boolean values.
4.4 – Code Set
A code set is a mapping of the members of a character set to specific numeric code values. Different code sets use different numeric code values to represent the same character. In general, operating systems use string names to refer to the code sets that the system supports. It is common for different operating systems to use different string names to refer to the same code set. Distributed applications that run in a network of heterogeneous operating systems need to be able to identify the character sets and code sets that client and server machines are using to avoid losing data during communications between each other. DCE RPC supports transparent automatic conversion for characters that are members of the DCE Portable Character Set (DCE PCS) and which are encoded in the ASCII and U.S. EBCDIC code sets. The RPC runtime automatically converts DCE PCS characters encoded in ASCII or U.S. EBCDIC, if necessary, when they are passed over the network between client and server. DCE RPC applications that need to transfer character data that is outside the DCE PCS character set and ASCII and U.S. EBCDIC encodings (international characters) can use special IDL constructs and a set of DCE RPC routines to set up their applications so that they can pass this "international" character data with minimal or no loss between client and server applications. An example of such an application would be one that used European, Chinese, or Japanese characters mapped to EUC, Big5, or SJIS encodings. Together, the IDL constructs and the DCE RPC routines provide a method of automatic code set conversion for applications that transfer international character data in heterogeneous code set environments. DCE provides a mechanism to uniquely identify a code set; this mechanism is the code set registry. The code set registry assigns a unique identifier to each character set and code set. Because the registry provides code set identifiers that are consistent across a network of heterogeneous operating systems, it provides a method for clients and servers in a heterogeneous environment to use to identify code sets without having to rely on operating system specific string names. The code set data structure contains a 32-bit hexadecimal value (c_set) that uniquely identifies the code set followed by a 16-bit decimal value (c_max_bytes) that indicates the maximum number of bytes this code set uses to encode one character in this code set. The value for c_set is one of the registered values in the code set registry. The following routines require a code set value: + cs_byte_from_netcs() + cs_byte_local_size() + cs_byte_net_size() + cs_byte_to_netcs() + dce_cs_loc_to_rgy() + dce_cs_rgy_to_loc() + rpc_cs_get_tags() + rpc_cs_binding_set_tags() + rpc_rgy_get_max_bytes() + wchar_t_from_netcs() + wchar_t_local_size() + wchar_t_net_size() + wchar_t_to_netcs() In these routines, the code set value shows a data type of unsigned32. The RPC stub buffer sizing routines *Lnet_size() and *_local_size use the value of c_max_bytes to calculate the size of a buffer for code set conversion. The C language representation of a code set structure is as follows: typedef struct { long c_set; short c_max_bytes; } rpc_cs_c_set_t; The code set data structure is a member of the code sets array.
4.4.1 – Code Sets Array
The code sets array contains the list of the code sets that a client or server supports. The structure consists of a version number member (version), followed by a count member (count), followed by an array of code set data structures (rpc_cs_c_set_t). This array is declared to be a conformant array so that its size will be determined at runtime. The count member indicates the number of code sets contained in the array. The first element in the code sets array represents the client or server process's local code set. The second element through the nth element represents one or more intermediate code sets that the process can use to transmit character data over the network. Client or server processes can convert into an intermediate code set when their host system does not provide a converter for the other's local code set but does provide a converter for the intermediate code set. DCE RPC routines for character/code sets compatibility evaluation and code set conversion support one intermediate code set, which is the ISO 10646 Universal character/code set. Consequently, DCE requires host systems running applications that transfer international characters to provide converters for this code set. System administrators for machines in internationalized DCE cells (that is, cells of machines that run applications that use the DCE character/code sets compatibility evaluation and conversion functionality) and who want to use other intermediate code sets can run the csrc utility and specify that their intermediate code set(s) be used in preference to ISO 10646. The remaining elements in the array represent other code sets that the process's host supports (that is, code sets for which the system provides converters). The C language representation of a code set structure is as follows: typedef struct rpc_codeset_mgmt_t { unsigned32 version; long count; [size_is(count)] rpc_cs_c_set_t codesets[]; } rpc_codeset_mgmt_t, *rpc_codeset_mgmt_p_t; Client and server applications and DCE RPC routines for automatic code set conversion obtain a code sets array by calling the routine rpc_rgy_get_codesets(). Server applications user the code sets array as input to the rpc_ns_mgmt_set_attribute() routine, which registers their supported code sets in the name service database. Client applications look up a server's supported code sets in the name service database by calling the routine rpc_ns_mgmt_read_codesets() and then use their code sets array to evaluate their supported code sets against the code sets that the server supports. The following DCE RPC routines require a code sets array and show an argument data type of rpc_codeset_mgmt_t: + rpc_ns_mgmt_read_codesets() + rpc_rgy_get_codesets() Server applications that use the routine rpc_ns_mgmt_set_attribute() to register their supported code sets in the name service database also specify the code sets array, but show an argument data type of void.
4.4.2 – Conversion Type
The conversion type data structure is an enumerated type that RPC stub buffer sizing routines return to indicate whether character data conversion is necessary and whether or not existing storage is sufficient for the stub to store the results of the conversion. The conversion type can be one of the following values: idl_cs_no_convert No code set conversion is required. idl_cs_in_place_convert Code set conversion can be performed in a single storage area. idl_cs_new_buffer_convert The converted data must be written to a new storage area. The C language representation of a conversion type structure is as follows: typedef enum { idl_cs_no_convert, idl_cs_in_place_convert, idl_cs_new_buffer_convert, } idl_cs_convert_t;
4.5 – Endpoint Map Inquiry Handle
An endpoint map inquiry handle is a pointer-size opaque variable containing information the RPC runtime uses to access the elements in a local or remote endpoint map. The description of the rpc_ep_register() routine lists the contents of an element. The following routines require an endpoint map inquiry handle and show an argument data type of rpc_ep_inq_handle_t: + rpc_mgmt_ep_elt_inq_begin() + rpc_mgmt_ep_elt_inq_done() + rpc_mgmt_ep_elt_inq_next()
4.6 – Global Name
The Name Service Interface (NSI) uses global names for the names of name service entries. A global name includes both a cell name and a cell-relative name composed of a directory pathname and a leaf name. For a description of global names, see the OSF DCE Administration Guide. The cell name is assigned to a cell root at its creation. When you specify only a cell-relative name to an NSI operation, the NSI automatically expands the name into a global name by inserting the local cell name. Thus, the name of a member in a group or in a profile element is always stored as a global name. When returning the name of a name service entry or a member, NSI operations return global names. For example, even when you specify a cell-relative name as the member_name parameter to routine rpc_ns_group_mbr_add(), when you read that group member (by calling rpc_ns_group_mbr_inq_next()), you will receive the corresponding global name.
4.7 – IDL Encoding Service Handle
An IDL encoding service handle is a pointer-size opaque variable that points to functions that control how data encoding or decoding is performed. The following routines return an IDL encoding service handle and show an argument data type of idl_es_handle_t: + idl_es_encode_incremental() + idl_es_decode_buffer() + idl_es_decode_incremental() + idl_es_encode_dyn_buffer() + idl_es_encode_fixed_buffer() The idl_es_handle_free() and idl_es_inq_encoding_id() routines require an IDL encoding service handle. Note that in order to use the IDL encoding services, you must include a header file that has been generated for an application that has used the encode and decode ACF attributes on one or more of its operations.
4.8 – Interface Handle and Specification
An interface handle is a pointer-size opaque variable containing information the RPC runtime uses to access the interface specification data structure. The DCE IDL compiler automatically creates an interface specification data structure from each IDL file and creates a global variable of type rpc_if_handle_t for the interface specification. The DCE IDL compiler places an interface handle declaration in the generated interface-name.h file. The compiler generates this include file for each interface. Routines requiring the interface handle as an argument show a data type of rpc_if_handle_t. The form of each interface handle name is as follows: + For the client: if-name_vmajor-version_minor-version_c_ifspec + For the server: if-name_vmajor-version_minor-version_s_ifspec where + The if-name variable is the interface identifier specified in the IDL file. + The major-version variable is the interface's major-version number specified in the IDL file. + The minor-version variable is the interface's minor-version number specified in the IDL file. An example is notes_v1_2_c_ifspec The maximum combined length of the interface identifier and interface version number is 19 characters. Since the major-version and minor-version numbers must each be at least 1 character, the interface name can be no more than 17 characters. This limits the interface handle name to 31 or fewer characters. No concurrency control is required for interface handles. The following routines require an interface handle and show an argument data type of rpc_if_handle_t: + rpc_ep_register() + rpc_ep_register_no_replace() + rpc_ep_resolve_binding() + rpc_ep_unregister() + rpc_if_inq_id() + rpc_ns_binding_export() + rpc_ns_binding_import_begin() + rpc_ns_binding_lookup_begin() + rpc_ns_binding_unexport() + rpc_server_inq_if() + rpc_server_register_if() + rpc_server_unregister_if() + rpc_server_use_all_protseqs_if() + rpc_server_use_protseq_if()
4.9 – Interface Identifier
The interface identifier (id) data structure contains the interface UUID and major-version and minor-version numbers of an interface. The interface identifier is a subset of the data contained in the interface specification structure. The C language representation of an interface identifier structure is as follows: typedef struct { uuid_t uuid; unsigned16 vers_major; unsigned16 vers_minor; } rpc_if_id_t; Routines that require an interface identifier structure show a data type of rpc_if_id_t. In those routines, the application is responsible for providing memory for the structure. The rpc_if_inq_id() routine returns the interface identifier from an interface specification. The following routines require an interface identifier: + rpc_mgmt_ep_elt_inq_begin() + rpc_mgmt_ep_elt_inq_next() + rpc_mgmt_ep_unregister() + rpc_ns_mgmt_binding_unexport() + rpc_ns_profile_elt_add() + rpc_ns_profile_elt_inq_begin() + rpc_ns_profile_elt_inq_next() + rpc_ns_profile_elt_remove()
4.10 – Interface Identifier Vector
The interface identifier (id) vector data structure contains a list of interfaces offered by a server. The interface identifier vector contains a count member (count), followed by an array of pointers to interface identifiers (rpc_if_id_t). The C language representation of an interface identifier vector is as follows: typedef struct { unsigned32 count; rpc_if_id_t *if_id[1]; } rpc_if_id_vector_t; The interface identifier vector is a read-only vector. To obtain a vector of the interface identifiers registered by a server with the RPC runtime, an application calls the rpc_mgmt_inq_if_ids() routine. To obtain a vector of the interface identifiers exported by a server to a name service database, an application calls the rpc_ns_mgmt_entry_inq_if_ids() routine. The RPC runtime allocates memory for the interface identifier vector. The application calls the rpc_if_id_vector_free() routine to free the interface identifier vector.
4.11 – Manager Entry Point Vector
The manager Entry Point Vector (EPV) is an array of pointers to remote procedures. The DCE IDL compiler automatically generates a manager EPV data type, into the header file generated by the IDL compiler, for use in constructing manager EPVs. The data type is named as follows: if-name_vmajor-version_minor-version_epv_t where + The if-name variable is the interface identifier specified in the IDL file. + The major-version variable is the interface's major-version number specified in the IDL file. + The minor-version variable is the interface's minor-version number specified in the IDL file. By default, the DCE IDL compiler automatically creates and initializes a manager EPV. DCE IDL creates this EPV assuming that a manager routine of the same name exists for each procedure in the interface (as specified in the IDL file). The DCE IDL compiler can define a client Entry Point Vector with addresses of local routines. Client applications can call these routines. For more information about client entry point vectors, see the explanation of the -cepv argument in the idl reference page. If the server offers multiple implementations of the same interface, the server must create additional manager EPVs, one for each implementation. Each EPV must contain exactly one entry point (address of a function) for each procedure defined in the IDL file. The server application declares and initializes one manager EPV variable of type if-name_vmajor-version_minor-version_epv_t for each implementation of the interface. The rpc_server_register_if() and rpc_server_inq_if() routines use the manager EPV data type and show the manager EPV argument as having an rpc_mgr_epv_t data type.
4.12 – Name Service Handle
A name service handle is a pointer-size opaque variable containing information the RPC runtime uses to return the following RPC data from the name service database: + Server binding handles + UUIDs of resources offered by a server + Profile members + Group members The following routines require a name service handle and show an argument data type of rpc_ns_handle_t: + rpc_ns_binding_import_begin() + rpc_ns_binding_import_next() + rpc_ns_binding_import_done() + rpc_ns_binding_lookup_begin() + rpc_ns_binding_lookup_next() + rpc_ns_binding_lookup_done() + rpc_ns_entry_object_inq_begin() + rpc_ns_entry_object_inq_next() + rpc_ns_entry_object_inq_done() + rpc_ns_group_mbr_inq_begin() + rpc_ns_group_mbr_inq_next() + rpc_ns_group_mbr_inq_done() + rpc_ns_profile_elt_inq_begin() + rpc_ns_profile_elt_inq_next() + rpc_ns_profile_elt_inq_done() + rpc_ns_mgmt_handle_set_exp_age() The scope of a name service handle is from a *_begin() routine through the corresponding *_done() routine. Applications have responsibility for concurrency control of name service handles across threads.
4.13 – Protocol Sequence
A protocol sequence is a character string identifying the network protocols used to establish a relationship between a client and server. The protocol sequence contains a set of options that the RPC runtime must know about. The following options are in this set: + The RPC protocol used for communications (choices are ncacn and ncadg). + The format used in the network address supplied in the binding (choice is ip). + The transport protocol used for communications (choices are tcp and udp). Because only certain combinations of these options are valid (are useful for interoperation), RPC provides predefined strings that represent the valid combinations. RPC applications use only these strings. The following table contains predefined strings representing valid protocol sequences. In the descriptions NCA is an abbreviation of Network Computing Architecture. Valid Protocol Sequences ___________________________________________________________ Protocol Sequence Description ___________________________________________________________ ncacn_ip_tcp NCA Connection over Internet Protocol: Transmission Control Protocol ip or ncadg_ip_udp NCA Datagram over Internet Protocol: User Datagram Protocol ncacn_dnet_nsp NCA Connection over DECnet Phase IV ncacn_osi_dna NCA Connection over DECnet/OSI A server application can use a particular protocol sequence only if the operating system software supports that protocol. A server chooses to accept remote procedure calls over some or all of the supported protocol sequences. Client and server applications can determine if a protocol sequence is supported by both the RPC runtime and the operating system. The applications make this determination by calling the following routines: + rpc_network_inq_protseqs() + rpc_network_is_protseq_valid() The following routines allow server applications to register protocol sequences with the runtime: + rpc_server_use_all_protseqs() + rpc_server_use_all_protseqs_if() + rpc_server_use_protseq() + rpc_server_use_protseq_ep() + rpc_server_use_protseq_if() Those routines requiring a protocol sequence argument show a data type of unsigned_char_t *. A client can use the protocol sequence strings to construct a string binding using the rpc_string_binding_compose() routine.
4.14 – Protocol Sequence Vector
The protocol sequence vector data structure contains a list of protocol sequences over which the RPC runtime can send or receive remote procedure calls. The protocol sequence vector contains a count member (count), followed by an array of pointers to protocol sequence strings (protseq). The C language representation of a protocol sequence vector is as follows: typedef struct { unsigned32 count; unsigned_char_t *protseq[1]; } rpc_protseq_vector_t; The protocol sequence vector is a read-only vector. To obtain a protocol sequence vector, a server application calls the rpc_network_inq_protseqs() routine. The RPC runtime allocates memory for the protocol sequence vector. The server application calls the rpc_protseq_vector_free() routine to free the protocol sequence vector.
4.15 – Statistics Vector
The statistics vector data structure contains statistics from the RPC runtime on a per address space basis. The statistics vector contains a count member (count), followed by an array of statistics. Each array element contains an unsigned32 value. The following list describes the statistics indexed by the specified constant: rpc_c_stats_calls_in The number of remote procedure calls received by the runtime. rpc_c_stats_calls_out The number of remote procedure calls initiated by the runtime. rpc_c_stats_pkts_in The number of network packets received by the runtime. rpc_c_stats_pkts_out The number of network packets sent by the runtime. The C language representation of a statistics vector is as follows: typedef struct { unsigned32 count; unsigned32 stats[1]; } rpc_stats_vector_t; To obtain runtime statistics, an application calls the rpc_mgmt_inq_stats() routine. The RPC runtime allocates memory for the statistics vector. The application calls the rpc_mgmt_stats_vector_free() routine to free the statistics vector.
4.16 – String Binding
A string binding contains the character representation of a binding handle. String bindings are a convenient way of representing portions of a binding handle. However, you cannot use string bindings directly to make remote procedure calls. You must first call the routine rpc_binding_from_string_binding(), which converts a string binding to a binding handle. A string binding does not contain all the information from a binding handle. For example, a call to the routine rpc_binding_to_string_binding() does not translate the authenti- cation information sometimes associated with a binding handle into the resulting string binding. You can begin the development of a distributed application by having its servers communicate their binding information to clients by using string bindings. This communication allows a server to establish a client/server relationship without using the local endpoint map or the name service database. In this case, the server calls none of the rpc_ep_register(), rpc_ep_register_no_replace(), and rpc_ns_binding_export() routines. Instead, the server calls only routine rpc_server_inq_bindings() to obtain a vector of binding handles. The server obtains binding handles one at a time from the vector and calls routine rpc_binding_to_string_binding() to convert each binding handle into a string binding. The resulting string binding is always fully bound and may contain a non-nil object UUID. The server then makes some or all of its string bindings available to clients. One way is placing the string bindings in a file to be read by clients or users or both. Another way is delivering the string bindings to clients or users by means of a file, mail, or paper. You can continue the distributed application's development by changing the application so that servers use the local endpoint map and the name service database to communicate their binding information. To find the server, a client obtains a string binding containing a protocol sequence that the client runtime supports and, optionally, an object UUID that the client requires. The client then calls routine rpc_binding_from_string_binding() to convert the string binding into a server binding handle. Other useful routines for working with string bindings are rpc_string_binding_compose(), which creates a string binding from its component parts, and rpc_string_binding_parse(), which separates a string binding into its component parts. The two formats of a string binding follow. The four fields represent the object UUID, RPC protocol sequence, network address, and endpoint and network options of the binding. A delimiter character such as @ (at sign) or : (colon) separates each field. A string binding does not contain any white space. object-uuid @ rpc-protocol-sequence : nw-addr [endpoint, option ...] or object-uuid @ rpc-protocol-sequence : nw-addr [endpoint = endpoint, option ...] object-uuid This field specifies the UUID of the object operated on by the remote procedure that is called with this string binding. The RPC runtime, at the server, maps the object's type to a manager Entry Point Vector (EPV) to invoke the correct manager routine. The explanation of the routine rpc_server_register_if() discusses mapping object UUIDs to manager EPVs. This field is optional. If you do not provide it the RPC runtime assumes a nil UUID. @ This symbol is the delimiter character for the object UUID field. If you specify an object UUID you must follow it with this symbol. rpc-protocol-sequence This field specifies the protocol sequence used for making remote procedure calls. The valid protocol sequences are as follows: ncacn_ip_tcp ncadg_ip_udp More information about these valid protocol sequences appears in the table in the entry on Protocol_Sequence. This field is required. : This symbol is the delimiter character for the RPC protocol sequence field. nw-addr This field specifies the address (addr) of a host on a network (nw) that receives remote procedure calls made with this string binding. The format and content of the network address depends on the value of rpc-protocol- sequence as follows: ncacn_ip_tcp and ncadg_ip_udp Specify an Internet address using the common Internet address notation or hostname. Two examples with common Internet address notation are 128.10.2.30 and #126.15.1.28. The second example shows the use of the optional # (number sign) character. An example with a host name is ko. If the specified hostname is multihomed, the binding handle returned from routine rpc_binding_from_string_binding() contains a host address. It is the first host address returned from the system library call that translates a hostname to a host address for the network address format in the protocol sequence. To control the host address used, specify the network address using the common Internet address notation instead of a hostname. The network address field is optional. If you do not supply this field, the string binding refers to your local host. [ This symbol is the delimiter character specifying that one endpoint and zero or more options follow. If the string binding contains at least one endpoint, this symbol is required. endpoint This field specifies the endpoint, or address of a specific server instance on a host, to receive remote procedure calls made with this string binding. Optionally the keyword endpoint= can precede the endpoint specifier. The format and content of the endpoint depends on the specified protocol sequence as follows: ncacn_ip_tcp and ncadg_ip_udp Specify an Internet port number. An example of an Internet port number is 1025. The endpoint field is optional. For more information about endpoints, see the information on binding handles in this reference page. , This symbol is the delimiter character specifying that option data follows. If an option follows, this delimiter is required. option This field specifies any options. Each option is specified as option name=option value. The format and content of the option depends on the specified protocol sequence as follows: ncacn_ip_tcp and ncadg_ip_udp There are no Internet options. The option field is optional. ] This symbol is the delimiter character specifying that one endpoint and zero or more options precede. If the string binding contains at least one endpoint, this symbol is required. The \ (backslash) character is treated as an escape character for all string binding fields. Examples of valid string bindings follow. In each example obj-uuid represents a UUID in string form. In other words, the symbol obj-uuid can represent the UUID 308fb580-1eb2-11ca-923b-08002b1075a7. obj-uuid@ncacn_ip_tcp:16.20.16.27[2001] obj-uuid@ncacn_ip_tcp:16.20.16.27[endpoint=2001]
4.16.1 – String UUID
A string UUID contains the character representation of a UUID. A string UUID consists of multiple fields of hexadecimal characters. Each field has a fixed length, and dashes separate the fields. An example of a string UUID follows: 989c6e5c-2cc1-11ca-a044-08002b1bb4f5 When you supply a string UUID as an input argument to an RPC runtime routine, you can enter the alphabetic hexadecimal characters in either uppercase or lowercase letters. The RPC runtime routines that return a string UUID always return the hexadecimal characters in lowercase letters. The following routines require a string UUID: + rpc_string_binding_compose() + uuid_from_string() The following routines return a string UUID: + rpc_string_binding_parse() + uuid_to_string()
4.16.2 – Unsigned Character String
DCE RPC treats all characters in strings as unsigned characters. Those routines with character string arguments show a data type of unsigned_char_t *.
4.16.3 – UUID Vector
The UUID vector data structure contains a list of UUIDs. The UUID vector contains a count member (count), followed by an array of pointers to UUIDs. The C language representation of a UUID vector is as follows: typedef struct { unsigned32 count; uuid_t *uuid[1]; } uuid_vector_t; An application constructs a UUID vector to contain object UUIDs to be exported or unexported from the name service database. The following routines require a UUID vector and show an argument data type of uuid_vector_t: + rpc_ep_register() + rpc_ep_register_no_replace() + rpc_ep_unregister() + rpc_ns_binding_export() + rpc_ns_binding_unexport() + rpc_ns_mgmt_binding_unexport()
5 – Permissions Required
To use the Name Service Interface (NSI) routines to access entries in a Cell Directory Service (CDS) database, you need Access Control List (ACL) permissions. Depending on the NSI operation, you need ACL permissions to the parent directory or the CDS object entry (the name service entry) or both. The ACL permissions are as follows: + To create an entry, you need insert permission to the parent directory. + To read an entry, you need read permission to the CDS object entry. + To write to an entry, you need write permission to the CDS object entry. + To delete an entry, you need delete permission either to the CDS object entry or to the parent directory. + To test an entry, you need either test permission or read permission to the CDS object entry. Note that write permission does not imply read permission. To find the ACL permissions for the NSI routines whose names begin with rpc_ns, see these routines' reference pages. The non-NSI routines whose names do not begin with rpc_ns do not need ACL permissions, so their reference pages do not specify any.
6 – Frequently Used Routine Parameters
A few parameters are common to many of the DCE RPC routines. These parameters are described fully here and again briefly on the specific routine reference pages.
6.1 – binding
Used as an input or output parameter. Returns a binding handle for making remote procedure calls to a server. A client obtains a binding handle by calling one of the following routines: + rpc_binding_copy() + rpc_binding_from_string_binding() + rpc_ns_binding_import_next() + rpc_ns_binding_select() Creating a binding handle establishes a relationship between a client and a server. However, the relationship does not involve any communications between the client and server. The communications occur when a client makes a remote procedure call. As an input parameter to a remote procedure call, binding specifies a binding handle that refers to binding information. The client's RPC runtime uses this binding information to make a remote procedure call to a server. Server manager routines can extract client information from a client binding handle by using the following routines: + rpc_binding_inq_auth_client() + rpc_binding_inq_object() + rpc_binding_to_string_binding() + rpc_string_binding_parse()
6.2 – name
Used as an input/output parameter. When used as an input parameter, the value of this parameter depends on the syntax selected in the name_syntax parameter. If it is allowed by the called routine, the value NULL specifies that the routine uses the name specified in the RPC_DEFAULT_ENTRY environment variable. Specifying NULL also has the called routine use the name syntax that the environment variable RPC_DEFAULT_ENTRY_SYNTAX specifies. For a name_syntax value of rpc_c_ns_syntax_dce, use the DCE naming rules to specify parameter name. As an output parameter, returns an entry in the name service database in the form of a character string that includes a terminating null character. The value of this parameter depends on the syntax selected in name_syntax. For a name_syntax value of rpc_c_ns_syntax_dce, name is returned using the DCE naming syntax. The DCE RPC runtime allocates memory for the returned string. The application is responsible for calling the rpc_string_free() routine to deallocate the string. If an application does not want a returned name string, the application usually specifies NULL for this parameter. The one exception is routine rpc_ns_entry_expand_name(); it always returns a name string.
6.3 – name_syntax
Used as an input parameter, an integer value that specifies the syntax of an entry name. When allowed by the called routine, a value of rpc_c_ns_syntax_default specifies that the routine uses the syntax specified in the RPC_DEFAULT_ENTRY_SYNTAX environment variable. The following table lists the valid syntaxes that applications can use in DCE RPC for entries in the name service database. Valid Name Syntaxes ________________________________________________ Constant Value Description ________________________________________________ rpc_c_ns_syntax_default 0 Default syntax rpc_c_ns_syntax_dce 3 DCE The name_syntax parameter tells routines how to parse the entry name specified in an input name parameter or specifies the syntax to use when returning an entry name as an output name parameter. If the RPC_DEFAULT_ENTRY_SYNTAX environment variable is not defined, the RPC runtime uses the rpc_c_ns_syntax_dce name syntax.
6.4 – string
Used as an input or output parameter. Returns a character string, which always includes the terminating null character \0. The DCE RPC runtime allocates memory for the returned string. The application calls the rpc_string_free() routine to deallocate the memory occupied by the string. If there is no data for the requested string, the routine returns the string \0. For example, if the string binding passed to routine rpc_string_binding_parse() does not contain an object UUID, the routine returns \0 as the value of the object UUID string. The application must call the rpc_string_free() routine to deallocate the memory occupied by this string. If an application does not require a returned output string, the application specifies NULL for this parameter.
6.5 – status
Each routine in the RPC API returns a DCE status code indicating whether the routine completed successfully or, if not, why not. A return value of rpc_s_ok indicates success. All other return values signify routine failure. The status codes listed for each RPC runtime routine are the most likely, but not necessarily all, the status codes that the routine can return. The status code argument has a data type of unsigned32. To translate a DCE status code to a text message, call the routine dce_error_inq_text(). Note that RPC exceptions are equivalent to RPC status codes. To identify the status code that corresponds to a given exception, replace the _x_ string of the exception with the string _s_; for example, the exception rpc_x_already_listening is equivalent to the status code rpc_s_already_listening. For more information about the RPC status codes, see the OSF DCE Problem Determination Guide.
6.6 – uuid
Used as an input or output parameter. When you need to specify a nil UUID to a uuid input parameter in any of the DCE RPC routines, you can supply the value NULL.
7 – RELATED_INFORMATION
Books: OSF DCE Application Development Guide-Introduction & Style Guide OSF DCE Application Development Guide-Core Components OSF DCE Application Development Guide-Directory Services OSF DCE Command Reference