1082bfe67SJohn Polstra.\" Copyright 1998 Juniper Networks, Inc. 2082bfe67SJohn Polstra.\" All rights reserved. 3082bfe67SJohn Polstra.\" 4082bfe67SJohn Polstra.\" Redistribution and use in source and binary forms, with or without 5082bfe67SJohn Polstra.\" modification, are permitted provided that the following conditions 6082bfe67SJohn Polstra.\" are met: 7082bfe67SJohn Polstra.\" 1. Redistributions of source code must retain the above copyright 8082bfe67SJohn Polstra.\" notice, this list of conditions and the following disclaimer. 9082bfe67SJohn Polstra.\" 2. Redistributions in binary form must reproduce the above copyright 10082bfe67SJohn Polstra.\" notice, this list of conditions and the following disclaimer in the 11082bfe67SJohn Polstra.\" documentation and/or other materials provided with the distribution. 12082bfe67SJohn Polstra.\" 13082bfe67SJohn Polstra.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14082bfe67SJohn Polstra.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15082bfe67SJohn Polstra.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16082bfe67SJohn Polstra.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17082bfe67SJohn Polstra.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18082bfe67SJohn Polstra.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19082bfe67SJohn Polstra.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20082bfe67SJohn Polstra.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21082bfe67SJohn Polstra.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22082bfe67SJohn Polstra.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23082bfe67SJohn Polstra.\" SUCH DAMAGE. 24082bfe67SJohn Polstra.\" 257f3dea24SPeter Wemm.\" $FreeBSD$ 26082bfe67SJohn Polstra.\" 270981dfefSJohn Polstra.Dd October 30, 1999 28082bfe67SJohn Polstra.Dt LIBRADIUS 3 29a307d598SRuslan Ermilov.Os 30082bfe67SJohn Polstra.Sh NAME 31082bfe67SJohn Polstra.Nm libradius 32082bfe67SJohn Polstra.Nd RADIUS client library 33082bfe67SJohn Polstra.Sh SYNOPSIS 3432eef9aeSRuslan Ermilov.In radlib.h 350981dfefSJohn Polstra.Ft struct rad_handle * 360981dfefSJohn Polstra.Fn rad_acct_open "void" 37082bfe67SJohn Polstra.Ft int 38082bfe67SJohn Polstra.Fn rad_add_server "struct rad_handle *h" "const char *host" "int port" "const char *secret" "int timeout" "int max_tries" 390981dfefSJohn Polstra.Ft struct rad_handle * 400981dfefSJohn Polstra.Fn rad_auth_open "void" 41082bfe67SJohn Polstra.Ft void 42082bfe67SJohn Polstra.Fn rad_close "struct rad_handle *h" 43082bfe67SJohn Polstra.Ft int 44082bfe67SJohn Polstra.Fn rad_config "struct rad_handle *h" "const char *file" 45082bfe67SJohn Polstra.Ft int 4648caee2aSBrian Somers.Fn rad_continue_send_request "struct rad_handle *h" "int selected" "int *fd" "struct timeval *tv" 4748caee2aSBrian Somers.Ft int 48082bfe67SJohn Polstra.Fn rad_create_request "struct rad_handle *h" "int code" 49082bfe67SJohn Polstra.Ft struct in_addr 50082bfe67SJohn Polstra.Fn rad_cvt_addr "const void *data" 51082bfe67SJohn Polstra.Ft u_int32_t 52082bfe67SJohn Polstra.Fn rad_cvt_int "const void *data" 53082bfe67SJohn Polstra.Ft char * 54082bfe67SJohn Polstra.Fn rad_cvt_string "const void *data" "size_t len" 55082bfe67SJohn Polstra.Ft int 56082bfe67SJohn Polstra.Fn rad_get_attr "struct rad_handle *h" "const void **data" "size_t *len" 5748caee2aSBrian Somers.Ft int 5848caee2aSBrian Somers.Fn rad_init_send_request "struct rad_handle *h" "int *fd" "struct timeval *tv" 59082bfe67SJohn Polstra.Ft int 60082bfe67SJohn Polstra.Fn rad_put_addr "struct rad_handle *h" "int type" "struct in_addr addr" 61082bfe67SJohn Polstra.Ft int 62082bfe67SJohn Polstra.Fn rad_put_attr "struct rad_handle *h" "int type" "const void *data" "size_t len" 63082bfe67SJohn Polstra.Ft int 64082bfe67SJohn Polstra.Fn rad_put_int "struct rad_handle *h" "int type" "u_int32_t value" 65082bfe67SJohn Polstra.Ft int 66082bfe67SJohn Polstra.Fn rad_put_string "struct rad_handle *h" "int type" "const char *str" 67082bfe67SJohn Polstra.Ft int 68b49a88f6SBrian Somers.Fn rad_put_vendor_addr "struct rad_handle *h" "int vendor" "int type" "struct in_addr addr" 69b49a88f6SBrian Somers.Ft int 70b49a88f6SBrian Somers.Fn rad_put_vendor_attr "struct rad_handle *h" "int vendor" "int type" "const void *data" "size_t len" 71b49a88f6SBrian Somers.Ft int 72b49a88f6SBrian Somers.Fn rad_put_vendor_int "struct rad_handle *h" "int vendor" "int type" "u_int32_t value" 73b49a88f6SBrian Somers.Ft int 74b49a88f6SBrian Somers.Fn rad_put_vendor_string "struct rad_handle *h" "int vendor" "int type" "const char *str" 75b49a88f6SBrian Somers.Ft int 76082bfe67SJohn Polstra.Fn rad_send_request "struct rad_handle *h" 77082bfe67SJohn Polstra.Ft const char * 78082bfe67SJohn Polstra.Fn rad_strerror "struct rad_handle *h" 79082bfe67SJohn Polstra.Sh DESCRIPTION 80082bfe67SJohn PolstraThe 81082bfe67SJohn Polstra.Nm 820981dfefSJohn Polstralibrary implements the client side of the Remote Authentication Dial 830981dfefSJohn PolstraIn User Service (RADIUS). RADIUS, defined in RFCs 2138 and 2139, 840981dfefSJohn Polstraallows clients to perform authentication and accounting by means of 850981dfefSJohn Polstranetwork requests to remote servers. 86082bfe67SJohn Polstra.Sh INITIALIZATION 87082bfe67SJohn PolstraTo use the library, an application must first call 880981dfefSJohn Polstra.Fn rad_auth_open 890981dfefSJohn Polstraor 900981dfefSJohn Polstra.Fn rad_acct_open 91082bfe67SJohn Polstrato obtain a 92082bfe67SJohn Polstra.Va struct rad_handle * , 93082bfe67SJohn Polstrawhich provides the context for subsequent operations. 940981dfefSJohn PolstraThe former function is used for RADIUS authentication and the 950981dfefSJohn Polstralatter is used for RADIUS accounting. 96082bfe67SJohn PolstraCalls to 970981dfefSJohn Polstra.Fn rad_auth_open 980981dfefSJohn Polstraand 990981dfefSJohn Polstra.Fn rad_acct_open 100082bfe67SJohn Polstraalways succeed unless insufficient virtual memory is available. If 1010981dfefSJohn Polstrathe necessary memory cannot be allocated, the functions return 102082bfe67SJohn Polstra.Dv NULL . 1030981dfefSJohn PolstraFor compatibility with earlier versions of this library, 1040981dfefSJohn Polstra.Fn rad_open 1050981dfefSJohn Polstrais provided as a synonym for 1060981dfefSJohn Polstra.Fn rad_auth_open . 107082bfe67SJohn Polstra.Pp 108082bfe67SJohn PolstraBefore issuing any RADIUS requests, the library must be made aware 109082bfe67SJohn Polstraof the servers it can contact. The easiest way to configure the 110082bfe67SJohn Polstralibrary is to call 111082bfe67SJohn Polstra.Fn rad_config . 112082bfe67SJohn Polstra.Fn rad_config 113082bfe67SJohn Polstracauses the library to read a configuration file whose format is 114082bfe67SJohn Polstradescribed in 115082bfe67SJohn Polstra.Xr radius.conf 5 . 116082bfe67SJohn PolstraThe pathname of the configuration file is passed as the 117082bfe67SJohn Polstra.Va file 118082bfe67SJohn Polstraargument to 119082bfe67SJohn Polstra.Fn rad_config . 120082bfe67SJohn PolstraThis argument may also be given as 121082bfe67SJohn Polstra.Dv NULL , 122082bfe67SJohn Polstrain which case the standard configuration file 123082bfe67SJohn Polstra.Pa /etc/radius.conf 124082bfe67SJohn Polstrais used. 125082bfe67SJohn Polstra.Fn rad_config 126082bfe67SJohn Polstrareturns 0 on success, or -1 if an error occurs. 127082bfe67SJohn Polstra.Pp 128082bfe67SJohn PolstraThe library can also be configured programmatically by calls to 129082bfe67SJohn Polstra.Fn rad_add_server . 130082bfe67SJohn PolstraThe 131082bfe67SJohn Polstra.Va host 132082bfe67SJohn Polstraparameter specifies the server host, either as a fully qualified 133082bfe67SJohn Polstradomain name or as a dotted-quad IP address in text form. 134082bfe67SJohn PolstraThe 135082bfe67SJohn Polstra.Va port 136082bfe67SJohn Polstraparameter specifies the UDP port to contact on the server. If 137082bfe67SJohn Polstra.Va port 138082bfe67SJohn Polstrais given as 0, the library looks up the 139082bfe67SJohn Polstra.Ql radius/udp 1400981dfefSJohn Polstraor 1410981dfefSJohn Polstra.Ql radacct/udp 142082bfe67SJohn Polstraservice in the network services database, and uses the port found 1430981dfefSJohn Polstrathere. If no entry is found, the library uses the standard RADIUS 1440981dfefSJohn Polstraports, 1812 for authentication and 1813 for accounting. 1450981dfefSJohn PolstraThe shared secret for the server host is passed to the 146082bfe67SJohn Polstra.Va secret 147082bfe67SJohn Polstraparameter. 148082bfe67SJohn PolstraIt may be any NUL-terminated string of bytes. The RADIUS protocol 149082bfe67SJohn Polstraignores all but the leading 128 bytes of the shared secret. 150082bfe67SJohn PolstraThe timeout for receiving replies from the server is passed to the 151082bfe67SJohn Polstra.Va timeout 152082bfe67SJohn Polstraparameter, in units of seconds. The maximum number of repeated 153082bfe67SJohn Polstrarequests to make before giving up is passed into the 154082bfe67SJohn Polstra.Va max_tries 155082bfe67SJohn Polstraparameter. 156082bfe67SJohn Polstra.Fn rad_add_server 157082bfe67SJohn Polstrareturns 0 on success, or -1 if an error occurs. 158082bfe67SJohn Polstra.Pp 159082bfe67SJohn Polstra.Fn rad_add_server 160082bfe67SJohn Polstramay be called multiple times, and it may be used together with 161082bfe67SJohn Polstra.Fn rad_config . 162082bfe67SJohn PolstraAt most 10 servers may be specified. 163082bfe67SJohn PolstraWhen multiple servers are given, they are tried in round-robin 164082bfe67SJohn Polstrafashion until a valid response is received, or until each server's 165082bfe67SJohn Polstra.Va max_tries 166082bfe67SJohn Polstralimit has been reached. 167082bfe67SJohn Polstra.Sh CREATING A RADIUS REQUEST 168082bfe67SJohn PolstraA RADIUS request consists of a code specifying the kind of request, 169082bfe67SJohn Polstraand zero or more attributes which provide additional information. To 170082bfe67SJohn Polstrabegin constructing a new request, call 171082bfe67SJohn Polstra.Fn rad_create_request . 172082bfe67SJohn PolstraIn addition to the usual 173082bfe67SJohn Polstra.Va struct rad_handle * , 174082bfe67SJohn Polstrathis function takes a 175082bfe67SJohn Polstra.Va code 176082bfe67SJohn Polstraparameter which specifies the type of the request. Most often this 177082bfe67SJohn Polstrawill be 178082bfe67SJohn Polstra.Dv RAD_ACCESS_REQUEST . 179082bfe67SJohn Polstra.Fn rad_create_request 180082bfe67SJohn Polstrareturns 0 on success, or -1 on if an error occurs. 181082bfe67SJohn Polstra.Pp 182082bfe67SJohn PolstraAfter the request has been created with 183abac9a9eSBrian Somers.Fn rad_create_request , 184082bfe67SJohn Polstraattributes can be attached to it. This is done through calls to 185082bfe67SJohn Polstra.Fn rad_put_addr , 186082bfe67SJohn Polstra.Fn rad_put_int , 187082bfe67SJohn Polstraand 188082bfe67SJohn Polstra.Fn rad_put_string . 189082bfe67SJohn PolstraEach accepts a 190082bfe67SJohn Polstra.Va type 191082bfe67SJohn Polstraparameter identifying the attribute, and a value which may be 192082bfe67SJohn Polstraan Internet address, an integer, or a NUL-terminated string, 193082bfe67SJohn Polstrarespectively. 194b49a88f6SBrian SomersAlternatively, 195b49a88f6SBrian Somers.Fn rad_put_vendor_addr , 196b49a88f6SBrian Somers.Fn rad_put_vendor_int 197b49a88f6SBrian Somersor 198b49a88f6SBrian Somers.Fn rad_put_vendor_string 199b49a88f6SBrian Somersmay be used to specify vendor specific attributes. Vendor specific 200b49a88f6SBrian Somersdefinitions may be found in 201b49a88f6SBrian Somers.In radlib_vs.h 202082bfe67SJohn Polstra.Pp 203082bfe67SJohn PolstraThe library also provides a function 204082bfe67SJohn Polstra.Fn rad_put_attr 205082bfe67SJohn Polstrawhich can be used to supply a raw, uninterpreted attribute. The 206082bfe67SJohn Polstra.Va data 207082bfe67SJohn Polstraargument points to an array of bytes, and the 208082bfe67SJohn Polstra.Va len 209082bfe67SJohn Polstraargument specifies its length. 210082bfe67SJohn Polstra.Pp 211082bfe67SJohn PolstraThe 212082bfe67SJohn Polstra.Fn rad_put_X 213082bfe67SJohn Polstrafunctions return 0 on success, or -1 if an error occurs. 214082bfe67SJohn Polstra.Sh SENDING THE REQUEST AND RECEIVING THE RESPONSE 21548caee2aSBrian SomersAfter the RADIUS request has been constructed, it is sent either by means of 21648caee2aSBrian Somers.Fn rad_send_request 21748caee2aSBrian Somersor by a combination of calls to 21848caee2aSBrian Somers.Fn rad_init_send_request 21948caee2aSBrian Somersand 22048caee2aSBrian Somers.Fn rad_continue_send_request . 22148caee2aSBrian Somers.Pp 22248caee2aSBrian SomersThe 22348caee2aSBrian Somers.Fn rad_send_request 22448caee2aSBrian Somersfunction sends the request and waits for a valid reply, 225082bfe67SJohn Polstraretrying the defined servers in round-robin fashion as necessary. 226082bfe67SJohn PolstraIf a valid response is received, 227082bfe67SJohn Polstra.Fn rad_send_request 228082bfe67SJohn Polstrareturns the RADIUS code which specifies the type of the response. 229082bfe67SJohn PolstraThis will typically be 230082bfe67SJohn Polstra.Dv RAD_ACCESS_ACCEPT , 231082bfe67SJohn Polstra.Dv RAD_ACCESS_REJECT , 232082bfe67SJohn Polstraor 233082bfe67SJohn Polstra.Dv RAD_ACCESS_CHALLENGE . 234082bfe67SJohn PolstraIf no valid response is received, 235082bfe67SJohn Polstra.Fn rad_send_request 236082bfe67SJohn Polstrareturns -1. 237082bfe67SJohn Polstra.Pp 23848caee2aSBrian SomersAs an alternative, if you do not wish to block waiting for a response, 23948caee2aSBrian Somers.Fn rad_init_send_request 24048caee2aSBrian Somersand 24148caee2aSBrian Somers.Fn rad_continue_send_request 24248caee2aSBrian Somersmay be used instead. If a reply is received from the RADIUS server or a 24348caee2aSBrian Somerstimeout occurs, these functions return a value as described for 24448caee2aSBrian Somers.Fn rad_send_request . 24548caee2aSBrian SomersOtherwise, a value of zero is returned and the values pointed to by 24648caee2aSBrian Somers.Ar fd 24748caee2aSBrian Somersand 24848caee2aSBrian Somers.Ar tv 24948caee2aSBrian Somersare set to the descriptor and timeout that should be passed to 25048caee2aSBrian Somers.Xr select 2 . 25148caee2aSBrian Somers.Pp 25248caee2aSBrian Somers.Fn rad_init_send_request 25348caee2aSBrian Somersmust be called first, followed by repeated calls to 25448caee2aSBrian Somers.Fn rad_continue_send_request 25548caee2aSBrian Somersas long as a return value of zero is given. 25648caee2aSBrian SomersBetween each call, the application should call 25748caee2aSBrian Somers.Xr select 2 , 25848caee2aSBrian Somerspassing 25948caee2aSBrian Somers.Ar *fd 26048caee2aSBrian Somersas a read descriptor and timing out after the interval specified by 26148caee2aSBrian Somers.Ar tv . 26248caee2aSBrian SomersWhen select returns, 26348caee2aSBrian Somers.Fn rad_continue_send_request 26448caee2aSBrian Somersshould be called with 26548caee2aSBrian Somers.Ar selected 26648caee2aSBrian Somersset to a non-zero value if 26748caee2aSBrian Somers.Xr select 2 26848caee2aSBrian Somersindicated that the descriptor is readable. 26948caee2aSBrian Somers.Pp 270082bfe67SJohn PolstraLike RADIUS requests, each response may contain zero or more 271082bfe67SJohn Polstraattributes. After a response has been received successfully by 27248caee2aSBrian Somers.Fn rad_send_request 27348caee2aSBrian Somersor 27448caee2aSBrian Somers.Fn rad_continue_send_request , 275082bfe67SJohn Polstraits attributes can be extracted one by one using 276082bfe67SJohn Polstra.Fn rad_get_attr . 277082bfe67SJohn PolstraEach time 278082bfe67SJohn Polstra.Fn rad_get_attr 279082bfe67SJohn Polstrais called, it gets the next attribute from the current response, and 280082bfe67SJohn Polstrastores a pointer to the data and the length of the data via the 281082bfe67SJohn Polstrareference parameters 282082bfe67SJohn Polstra.Va data 283082bfe67SJohn Polstraand 284082bfe67SJohn Polstra.Va len , 285082bfe67SJohn Polstrarespectively. Note that the data resides in the response itself, 286082bfe67SJohn Polstraand must not be modified. 287082bfe67SJohn PolstraA successful call to 288082bfe67SJohn Polstra.Fn rad_get_attr 289082bfe67SJohn Polstrareturns the RADIUS attribute type. 290082bfe67SJohn PolstraIf no more attributes remain in the current response, 291082bfe67SJohn Polstra.Fn rad_get_attr 292082bfe67SJohn Polstrareturns 0. 293082bfe67SJohn PolstraIf an error such as a malformed attribute is detected, -1 is 294082bfe67SJohn Polstrareturned. 295082bfe67SJohn Polstra.Pp 296082bfe67SJohn PolstraThe common types of attributes can be decoded using 297082bfe67SJohn Polstra.Fn rad_cvt_addr , 298082bfe67SJohn Polstra.Fn rad_cvt_int , 299082bfe67SJohn Polstraand 300082bfe67SJohn Polstra.Fn rad_cvt_string . 301082bfe67SJohn PolstraThese functions accept a pointer to the attribute data, which should 302082bfe67SJohn Polstrahave been obtained using 303082bfe67SJohn Polstra.Fn rad_get_attr . 304082bfe67SJohn PolstraIn the case of 305082bfe67SJohn Polstra.Fn rad_cvt_string , 306082bfe67SJohn Polstrathe length 307082bfe67SJohn Polstra.Va len 308082bfe67SJohn Polstramust also be given. These functions interpret the attribute as an 309082bfe67SJohn PolstraInternet address, an integer, or a string, respectively, and return 310082bfe67SJohn Polstraits value. 311082bfe67SJohn Polstra.Fn rad_cvt_string 312082bfe67SJohn Polstrareturns its value as a NUL-terminated string in dynamically 313082bfe67SJohn Polstraallocated memory. The application should free the string using 314082bfe67SJohn Polstra.Xr free 3 315082bfe67SJohn Polstrawhen it is no longer needed. 316082bfe67SJohn Polstra.Pp 317082bfe67SJohn PolstraIf insufficient virtual memory is available, 318082bfe67SJohn Polstra.Fn rad_cvt_string 319082bfe67SJohn Polstrareturns 320082bfe67SJohn Polstra.Dv NULL . 321082bfe67SJohn Polstra.Fn rad_cvt_addr 322082bfe67SJohn Polstraand 323082bfe67SJohn Polstra.Fn rad_cvt_int 324082bfe67SJohn Polstracannot fail. 325082bfe67SJohn Polstra.Sh OBTAINING ERROR MESSAGES 326082bfe67SJohn PolstraThose functions which accept a 327082bfe67SJohn Polstra.Va struct rad_handle * 328082bfe67SJohn Polstraargument record an error message if they fail. The error message 329082bfe67SJohn Polstracan be retrieved by calling 330082bfe67SJohn Polstra.Fn rad_strerror . 331082bfe67SJohn PolstraThe message text is overwritten on each new error for the given 332082bfe67SJohn Polstra.Va struct rad_handle * . 333082bfe67SJohn PolstraThus the message must be copied if it is to be preserved through 334082bfe67SJohn Polstrasubsequent library calls using the same handle. 335082bfe67SJohn Polstra.Sh CLEANUP 336082bfe67SJohn PolstraTo free the resources used by the RADIUS library, call 337082bfe67SJohn Polstra.Fn rad_close . 338082bfe67SJohn Polstra.Sh RETURN VALUES 339082bfe67SJohn PolstraThe following functions return a non-negative value on success. If 340082bfe67SJohn Polstrathey detect an error, they return -1 and record an error message 341082bfe67SJohn Polstrawhich can be retrieved using 342082bfe67SJohn Polstra.Fn rad_strerror . 343082bfe67SJohn Polstra.Pp 344082bfe67SJohn Polstra.Bl -item -offset indent -compact 345082bfe67SJohn Polstra.It 346082bfe67SJohn Polstra.Fn rad_add_server 347082bfe67SJohn Polstra.It 348082bfe67SJohn Polstra.Fn rad_config 349082bfe67SJohn Polstra.It 350082bfe67SJohn Polstra.Fn rad_create_request 351082bfe67SJohn Polstra.It 352082bfe67SJohn Polstra.Fn rad_get_attr 353082bfe67SJohn Polstra.It 354082bfe67SJohn Polstra.Fn rad_put_addr 355082bfe67SJohn Polstra.It 356082bfe67SJohn Polstra.Fn rad_put_attr 357082bfe67SJohn Polstra.It 358082bfe67SJohn Polstra.Fn rad_put_int 359082bfe67SJohn Polstra.It 360082bfe67SJohn Polstra.Fn rad_put_string 361082bfe67SJohn Polstra.It 36248caee2aSBrian Somers.Fn rad_init_send_request 36348caee2aSBrian Somers.It 36448caee2aSBrian Somers.Fn rad_continue_send_request 36548caee2aSBrian Somers.It 366082bfe67SJohn Polstra.Fn rad_send_request 367082bfe67SJohn Polstra.El 368082bfe67SJohn Polstra.Pp 369082bfe67SJohn PolstraThe following functions return a 370082bfe67SJohn Polstra.No non- Ns Dv NULL 371082bfe67SJohn Polstrapointer on success. If they are unable to allocate sufficient 372082bfe67SJohn Polstravirtual memory, they return 373082bfe67SJohn Polstra.Dv NULL , 374082bfe67SJohn Polstrawithout recording an error message. 375082bfe67SJohn Polstra.Pp 376082bfe67SJohn Polstra.Bl -item -offset indent -compact 377082bfe67SJohn Polstra.It 3780981dfefSJohn Polstra.Fn rad_acct_open 379082bfe67SJohn Polstra.It 3800981dfefSJohn Polstra.Fn rad_auth_open 3810981dfefSJohn Polstra.It 3820981dfefSJohn Polstra.Fn rad_cvt_string 383082bfe67SJohn Polstra.El 384082bfe67SJohn Polstra.Sh FILES 385082bfe67SJohn Polstra.Pa /etc/radius.conf 386082bfe67SJohn Polstra.Sh SEE ALSO 387082bfe67SJohn Polstra.Xr radius.conf 5 388082bfe67SJohn Polstra.Rs 389082bfe67SJohn Polstra.%A C. Rigney, et al 39042635956SRuslan Ermilov.%T "Remote Authentication Dial In User Service (RADIUS)" 391082bfe67SJohn Polstra.%O RFC 2138 392082bfe67SJohn Polstra.Re 3930981dfefSJohn Polstra.Rs 3940981dfefSJohn Polstra.%A C. Rigney 3950981dfefSJohn Polstra.%T RADIUS Accounting 3960981dfefSJohn Polstra.%O RFC 2139 3970981dfefSJohn Polstra.Re 398082bfe67SJohn Polstra.Sh AUTHORS 3990981dfefSJohn PolstraThis software was originally written by 400082bfe67SJohn Polstra.An John Polstra , 401b5c508fbSRuslan Ermilovand donated to the 402b5c508fbSRuslan Ermilov.Fx 403b5c508fbSRuslan Ermilovproject by Juniper Networks, Inc. 4040981dfefSJohn PolstraOleg Semyonov subsequently added the ability to perform RADIUS 4050981dfefSJohn Polstraaccounting. 406