home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / xinetd21 / part28 < prev    next >
Encoding:
Text File  |  1993-06-26  |  19.6 KB  |  879 lines

  1. Newsgroups: comp.sources.unix
  2. From: panos@cs.colorado.edu (Panos Tsirigotis)
  3. Subject: v26i272: xinetd-2.1.1 - inetd replacement with access control and logging, Part28/31
  4. Sender: unix-sources-moderator@gw.home.vix.com
  5. Approved: vixie@gw.home.vix.com
  6.  
  7. Submitted-By: panos@cs.colorado.edu (Panos Tsirigotis)
  8. Posting-Number: Volume 26, Issue 272
  9. Archive-Name: xinetd-2.1.1/part28
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 28 (of 31)."
  18. # Contents:  xinetd/parsers.c
  19. # Wrapped by panos@mystique on Mon Jun 21 14:51:28 1993
  20. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  21. if test -f 'xinetd/parsers.c' -a "${1}" != "-c" ; then 
  22.   echo shar: Will not clobber existing file \"'xinetd/parsers.c'\"
  23. else
  24. echo shar: Extracting \"'xinetd/parsers.c'\" \(17457 characters\)
  25. sed "s/^X//" >'xinetd/parsers.c' <<'END_OF_FILE'
  26. X/*
  27. X * (c) Copyright 1992 by Panagiotis Tsirigotis
  28. X * All rights reserved.  The file named COPYRIGHT specifies the terms 
  29. X * and conditions for redistribution.
  30. X */
  31. X
  32. Xstatic char RCSid[] = "$Id: parsers.c,v 6.4 1993/06/06 00:14:38 panos Exp $" ;
  33. X
  34. X#include <sys/file.h>
  35. X#include <syslog.h>
  36. X#include <string.h>
  37. X#include <netdb.h>
  38. X#include <pwd.h>
  39. X#include <grp.h>
  40. X
  41. Xint free() ;
  42. X
  43. X#include "pset.h"
  44. X#include "misc.h"
  45. X
  46. X#include "defs.h"
  47. X#include "parse.h"
  48. X#include "sconf.h"
  49. X#include "config.h"
  50. X#include "addr.h"
  51. X
  52. X#define NEW_SET( set, v1, v2 )                                                            \
  53. X                if ( (set) == NULL &&                                                         \
  54. X                        ( (set) = pset_create( (set), (v1), (v2) ) ) == NULL )    \
  55. X                {                                                                                    \
  56. X                    out_of_memory( func ) ;                                                    \
  57. X                    return( FAILED ) ;                                                        \
  58. X                }
  59. X
  60. X
  61. Xvoid msg() ;
  62. Xvoid parsemsg() ;
  63. Xvoid out_of_memory() ;
  64. Xchar **argv_alloc() ;
  65. X
  66. Xextern struct name_value success_log_options[] ;
  67. Xextern struct name_value failure_log_options[] ;
  68. Xextern struct name_value service_types[] ;
  69. Xextern struct name_value socket_types[] ;
  70. Xextern struct name_value service_flags[] ;
  71. Xextern struct name_value syslog_facilities[] ;
  72. Xextern struct name_value syslog_levels[] ;
  73. X
  74. Xextern env_h std_env ;
  75. X
  76. X
  77. X/*
  78. X * Find the flags corresponding to strings in "values" and apply
  79. X * them to "*maskp" (apply means add or remove depending on "op")
  80. X * "description" describes the type of flags.
  81. X */
  82. XPRIVATE status_e parse_value_list( values, maskp, list, op, description )
  83. X    pset_h                    values ;
  84. X    mask_t                    *maskp ;
  85. X    struct name_value        list[] ;
  86. X    enum assign_op            op ;
  87. X    char                        *description ;
  88. X{
  89. X    register unsigned                u ;
  90. X    register struct name_value *nvp ;
  91. X    char                                *func = "parse_value_list" ;
  92. X
  93. X    for ( u = 0 ; u < pset_count( values ) ; u++ )
  94. X    {
  95. X        char *name = (char *) pset_pointer( values, u ) ;
  96. X
  97. X        nvp = nv_find_value( list, name ) ;
  98. X        if ( nvp != NULL )
  99. X            if ( op == PLUS_EQ )
  100. X                M_SET( *maskp, nvp->value ) ;
  101. X            else
  102. X                M_CLEAR( *maskp, nvp->value ) ;
  103. X        else
  104. X            parsemsg( LOG_WARNING, func, "Bad %s: %s", description, name ) ;
  105. X    }
  106. X    return( OK ) ;
  107. X}
  108. X
  109. X
  110. Xstatus_e type_parser( values, scp, op )
  111. X    pset_h values ;
  112. X    struct service_config *scp ;
  113. X    enum assign_op op ;
  114. X{
  115. X    return( parse_value_list( values,
  116. X                        &scp->sc_type, service_types, PLUS_EQ, "service type" ) ) ;
  117. X}
  118. X
  119. X
  120. Xstatus_e flags_parser( values, scp, op )
  121. X    pset_h values ;
  122. X    struct service_config *scp ;
  123. X    enum assign_op op ;
  124. X{
  125. X    return( parse_value_list( values,
  126. X                        &scp->sc_flags, service_flags, PLUS_EQ, "service flag" ) ) ;
  127. X}
  128. X
  129. X
  130. Xstatus_e socket_type_parser( values, scp, op )
  131. X    pset_h values ;
  132. X    struct service_config *scp ;
  133. X    enum assign_op op ;
  134. X{
  135. X    register struct name_value *nvp ;
  136. X    register char *type = (char *) pset_pointer( values, 0 ) ;
  137. X    char *func = "socket_type_parser" ;
  138. X
  139. X    nvp = nv_find_value( socket_types, type ) ;
  140. X    if ( nvp != NULL )
  141. X    {
  142. X        scp->sc_socket_type = nvp->value ;
  143. X        return( OK ) ;
  144. X    }
  145. X    else
  146. X    {
  147. X        parsemsg( LOG_ERR, func, "Bad socket type: %s", type ) ;
  148. X        return( FAILED ) ;
  149. X    }
  150. X}
  151. X
  152. X
  153. Xstatus_e rpc_version_parser( values, scp, op )
  154. X    pset_h values ;
  155. X    struct service_config *scp ;
  156. X    enum assign_op op ;
  157. X{
  158. X    struct rpc_data *rdp = SC_RPCDATA( scp ) ;
  159. X    char *version = (char *) pset_pointer( values, 0 ) ;
  160. X    char *p = strchr( version, '-' ) ;
  161. X    char *func = "rpc_version_parser" ;
  162. X
  163. X    if ( p == NULL )
  164. X        rdp->rd_min_version = rdp->rd_max_version = atoi( version ) ;
  165. X    else
  166. X    {
  167. X        *p = NUL ;
  168. X        rdp->rd_min_version = atoi( version ) ;
  169. X        rdp->rd_max_version = atoi( p+1 ) ;
  170. X        if ( rdp->rd_min_version > rdp->rd_max_version )
  171. X        {
  172. X            parsemsg( LOG_ERR, func, "bad version range: %s", version ) ;
  173. X            return( FAILED ) ;
  174. X        }
  175. X    }
  176. X    return( OK ) ;
  177. X}
  178. X
  179. X
  180. Xstatus_e rpc_number_parser( values, scp, op )
  181. X    pset_h values ;
  182. X    struct service_config *scp ;
  183. X    enum assign_op op ;
  184. X{
  185. X    SC_RPCDATA( scp )->rd_program_number = 
  186. X                                    atoi( (char *) pset_pointer( values, 0 ) ) ;
  187. X    return( OK ) ;
  188. X}
  189. X
  190. X
  191. Xstatus_e protocol_parser( values, scp, op )
  192. X    pset_h values ;
  193. X    struct service_config *scp ;
  194. X    enum assign_op op ;
  195. X{
  196. X    char *proto_name = (char *) pset_pointer( values, 0 ) ;
  197. X    struct protoent *pep ;
  198. X    char *func = "protocol_parser" ;
  199. X
  200. X    if ( ( pep = getprotobyname( proto_name ) ) == NULL )
  201. X    {
  202. X        parsemsg( LOG_ERR, func, 
  203. X                    "Protocol %s not in /etc/protocols", proto_name ) ;
  204. X        return( FAILED ) ;
  205. X    }
  206. X
  207. X    scp->sc_protocol.name = make_string( 1, proto_name ) ;
  208. X    if ( scp->sc_protocol.name == NULL )
  209. X    {
  210. X        out_of_memory( func ) ;
  211. X        return( FAILED ) ;
  212. X    }
  213. X    scp->sc_protocol.value = pep->p_proto ;
  214. X    return( OK ) ;
  215. X}
  216. X
  217. X
  218. Xstatus_e wait_parser( values, scp, op )
  219. X    pset_h values ;
  220. X    struct service_config *scp ;
  221. X    enum assign_op op ;
  222. X{
  223. X    char *val = (char *) pset_pointer( values, 0 ) ;
  224. X    char *func = "wait_parser" ;
  225. X
  226. X    if ( EQ( val, "yes" ) )
  227. X        scp->sc_wait = YES ;
  228. X    else if ( EQ( val, "no" ) )
  229. X        scp->sc_wait = NO ;
  230. X    else
  231. X        parsemsg( LOG_ERR, func, "Bad value for wait: %s", val ) ;
  232. X    return( OK ) ;
  233. X}
  234. X
  235. X
  236. Xstatus_e user_parser( values, scp, op )
  237. X    pset_h values ;
  238. X    struct service_config *scp ;
  239. X    enum assign_op op ;
  240. X{
  241. X    char *user = (char *) pset_pointer( values, 0 ) ;
  242. X    struct passwd *pw ;
  243. X    char *func = "user_parser" ;
  244. X
  245. X    pw = getpwnam( user ) ;
  246. X    if ( pw == NULL )
  247. X    {
  248. X        parsemsg( LOG_ERR, func, "Unknown user: %s", user ) ;
  249. X        return( FAILED ) ;
  250. X    }
  251. X    
  252. X    scp->sc_uid = pw->pw_uid ;
  253. X    scp->sc_user_gid = pw->pw_gid ;
  254. X    return( OK ) ;
  255. X}
  256. X
  257. X
  258. X
  259. Xstatus_e group_parser( values, scp, op )
  260. X    pset_h values ;
  261. X    struct service_config *scp ;
  262. X    enum assign_op op ;
  263. X{
  264. X    char *group = (char *) pset_pointer( values, 0 ) ;
  265. X    struct group *grp ;
  266. X    char *func = "group_parser" ;
  267. X
  268. X    grp = getgrnam( group ) ;
  269. X    if ( grp == NULL )
  270. X    {
  271. X        parsemsg( LOG_ERR, func, "Unknown group: %s", group ) ;
  272. X        return( FAILED ) ;
  273. X    }
  274. X    
  275. X    scp->sc_gid = grp->gr_gid ;
  276. X    return( OK ) ;
  277. X}
  278. X
  279. X
  280. X
  281. Xstatus_e server_parser( values, scp, op )
  282. X    pset_h values ;
  283. X    struct service_config *scp ;
  284. X    enum assign_op op ;
  285. X{
  286. X    char *server = (char *) pset_pointer( values, 0 ) ;
  287. X    char *func = "server_parser" ;
  288. X
  289. X    if ( access( server, X_OK ) == -1 )
  290. X    {
  291. X        parsemsg( LOG_ERR, func, "Server %s is not executable", server ) ;
  292. X        return( FAILED ) ;
  293. X    }
  294. X
  295. X    scp->sc_server = make_string( 1, server ) ;
  296. X    if ( scp->sc_server == NULL )
  297. X    {
  298. X        out_of_memory( func ) ;
  299. X        return( FAILED ) ;
  300. X    }
  301. X    return( OK ) ;
  302. X}
  303. X
  304. X
  305. X
  306. Xstatus_e server_args_parser( values, scp, op )
  307. X    pset_h values ;
  308. X    struct service_config *scp ;
  309. X    enum assign_op op ;
  310. X{
  311. X    register char **argv ;
  312. X    register unsigned u ;
  313. X    unsigned i ;
  314. X    register unsigned argv_index ;
  315. X    register unsigned n_args = pset_count( values ) ;
  316. X    char *func = "server_args_parser" ;
  317. X
  318. X    /*
  319. X     * Create the argv for a future exec call
  320. X     * Reserve space for the server. We cannot use scp->sc_server
  321. X     * since it may not have a value yet.
  322. X     */
  323. X    argv = argv_alloc( n_args+1 ) ;
  324. X    
  325. X    for ( u = 0, argv_index = 1 ; u < pset_count( values ) ; u++, argv_index++ )
  326. X    {
  327. X        register char *s = make_string( 1, (char *) pset_pointer( values, u ) ) ;
  328. X
  329. X        if ( s == NULL )
  330. X        {
  331. X            for ( i = 1 ; i < argv_index ; i++ )
  332. X                free( argv[ i ] ) ;
  333. X            free( (char *) argv ) ;
  334. X            out_of_memory( func ) ;
  335. X            return( FAILED ) ;
  336. X        }
  337. X        argv[ argv_index ] = s ;
  338. X    }
  339. X
  340. X    argv[ argv_index ] = argv[ 0 ] = NULL ;
  341. X    scp->sc_server_argv = argv ;
  342. X    return( OK ) ;
  343. X}
  344. X
  345. X
  346. Xstatus_e instances_parser( values, scp, op )
  347. X    pset_h values ;
  348. X    struct service_config *scp ;
  349. X    enum assign_op op ;
  350. X{
  351. X    char *instances = (char *) pset_pointer( values, 0 ) ;
  352. X    char *func = "instances_parser" ;
  353. X
  354. X    if ( EQ( instances, "UNLIMITED" ) )
  355. X        scp->sc_instances = UNLIMITED ;
  356. X    else
  357. X    {
  358. X        scp->sc_instances = atoi( instances ) ;
  359. X        if ( scp->sc_instances < 0 )
  360. X        {
  361. X            parsemsg( LOG_ERR, func,
  362. X                "Number of instances is negative: %s", instances ) ;
  363. X            return( FAILED ) ;
  364. X        }
  365. X    }
  366. X    return( OK ) ;
  367. X}
  368. X
  369. X
  370. Xstatus_e id_parser( values, scp, op )
  371. X    pset_h values ;
  372. X    struct service_config *scp ;
  373. X    enum assign_op op ;
  374. X{
  375. X    char *func = "id_parser" ;
  376. X
  377. X    scp->sc_id = make_string( 1, (char *) pset_pointer( values, 0 ) ) ;
  378. X    if ( scp->sc_id != NULL )
  379. X        return( OK ) ;
  380. X    out_of_memory( func ) ;
  381. X    return( FAILED ) ;
  382. X}
  383. X
  384. X
  385. X
  386. X#define PORT_BITS                16
  387. X#define PORT_MAX                ( 1 << PORT_BITS )
  388. X
  389. Xstatus_e port_parser( values, scp, op )
  390. X    pset_h values ;
  391. X    struct service_config *scp ;
  392. X    enum assign_op op ;
  393. X{
  394. X    unsigned long port = atoi( (char *) pset_pointer( values, 0 ) ) ;
  395. X    char *func = "port_parser" ;
  396. X
  397. X    if ( port >= PORT_MAX )
  398. X    {
  399. X        parsemsg( LOG_ERR, func, "port number exceeds %d", PORT_MAX-1 ) ;
  400. X        return( FAILED ) ;
  401. X    }
  402. X    scp->sc_port = port ;
  403. X    return( OK ) ;
  404. X}
  405. X
  406. X
  407. XPRIVATE status_e add_new_string( set, str )
  408. X    pset_h set ;
  409. X    char *str ;
  410. X{
  411. X    char *p = make_string( 1, str ) ;
  412. X    char *func = "add_new_string" ;
  413. X
  414. X    if ( p == NULL )
  415. X    {
  416. X        parsemsg( LOG_CRIT, func, ES_NOMEM ) ;
  417. X        return( FAILED ) ;
  418. X    }
  419. X    if ( pset_add( set, p ) == NULL )
  420. X    {
  421. X        free( p ) ;
  422. X        parsemsg( LOG_CRIT, func, ES_NOMEM ) ;
  423. X        return( FAILED ) ;
  424. X    }
  425. X    return( OK ) ;
  426. X}
  427. X
  428. X
  429. Xstatus_e env_parser( values, scp, op )
  430. X    pset_h values ;
  431. X    struct service_config *scp ;
  432. X    enum assign_op op ;
  433. X{
  434. X    unsigned u ;
  435. X    char *func = "env_parser" ;
  436. X
  437. X    if ( op == MINUS_EQ )
  438. X    {
  439. X        parsemsg( LOG_WARNING, func,
  440. X            "operator '-=' not supported for env atribute" ) ;
  441. X        return( FAILED ) ;
  442. X    }
  443. X
  444. X    NEW_SET( scp->sc_env_var_defs, 5, 5 ) ;
  445. X
  446. X    if ( op == SET_EQ && pset_count( scp->sc_env_var_defs ) > 0 )
  447. X    {
  448. X        pset_apply( scp->sc_env_var_defs, free, NULL ) ;
  449. X        pset_clear( scp->sc_env_var_defs ) ;
  450. X    }
  451. X
  452. X    for ( u = 0 ; u < pset_count( values ) ; u++ )
  453. X    {
  454. X        char *str = (char *) pset_pointer( values, u ) ;
  455. X
  456. X        /*
  457. X         * Check if the string contains an '='
  458. X         */
  459. X        if ( strchr( str, '=' ) == NULL )
  460. X        {
  461. X            parsemsg( LOG_ERR, func, "%s has no '='", str ) ;
  462. X            continue ;
  463. X        }
  464. X
  465. X        if ( add_new_string( scp->sc_env_var_defs, str ) == FAILED )
  466. X            break ;
  467. X    }
  468. X    return( OK ) ;
  469. X}
  470. X
  471. X
  472. Xstatus_e passenv_parser( values, scp, op )
  473. X    pset_h values ;
  474. X    struct service_config *scp ;
  475. X    enum assign_op op ;
  476. X{
  477. X    pset_h var_set ;
  478. X    unsigned u ;
  479. X    char *func = "passenv_parser" ;
  480. X
  481. X    NEW_SET( scp->sc_pass_env_vars, 0, 0 ) ;
  482. X
  483. X    var_set = scp->sc_pass_env_vars ;
  484. X
  485. X    if ( op == SET_EQ )
  486. X    {
  487. X        pset_apply( var_set, free, NULL ) ;
  488. X        pset_clear( var_set ) ;
  489. X        op = PLUS_EQ ;
  490. X    }
  491. X
  492. X    for ( u = 0 ; u < pset_count( values ) ; u++ )
  493. X    {
  494. X        char *env_var = (char *) pset_pointer( values, u ) ;
  495. X        unsigned v ;
  496. X        boolean_e found ;
  497. X
  498. X        /*
  499. X         * Check if it is already there
  500. X         */
  501. X        for ( found = NO, v = 0 ; v < pset_count( var_set ) ; v++ )
  502. X            if ( EQ( env_var, (char *) pset_pointer( var_set, v ) ) )
  503. X            {
  504. X                found = YES ;
  505. X                break ;
  506. X            }
  507. X        
  508. X        if ( op == MINUS_EQ && found == NO || op != MINUS_EQ && found == YES )
  509. X            continue ;
  510. X        
  511. X        if ( op == MINUS_EQ )
  512. X        {
  513. X            free( (char *) pset_pointer( var_set, v ) ) ;
  514. X            pset_remove_index( var_set, v ) ;
  515. X        }
  516. X        else
  517. X        {
  518. X            if ( env_lookup( std_env, env_var ) == CHAR_NULL )
  519. X            {
  520. X                parsemsg( LOG_WARNING, func,
  521. X                    "undefined environment variable: %s", env_var ) ;
  522. X                continue ;
  523. X            }
  524. X
  525. X            if ( add_new_string( var_set, env_var ) == FAILED )
  526. X                return( FAILED ) ;
  527. X        }
  528. X    }
  529. X    return( OK ) ;
  530. X}
  531. X
  532. X
  533. X
  534. Xstatus_e disabled_parser( values, scp, op )
  535. X    pset_h values ;
  536. X    struct service_config *scp ;
  537. X    enum assign_op op ;
  538. X{
  539. X    register unsigned u ;
  540. X    char *func = "disabled_parser" ;
  541. X
  542. X    NEW_SET( scp->sc_disabled, pset_count( values ), 0 ) ;
  543. X    
  544. X    for ( u = 0 ; u < pset_count( values ) ; u++ )
  545. X    {
  546. X        char *name = (char *) pset_pointer( values, u ) ;
  547. X
  548. X        if ( add_new_string( scp->sc_disabled, name ) == FAILED )
  549. X            return( OK ) ;
  550. X    }
  551. X    return( OK ) ;
  552. X}
  553. X
  554. X
  555. X/*
  556. X * Interpret a number of the form: <num>[m|M|k|K]
  557. X * m and M mean megabytes, k and K mean kilobytes, nothing means bytes
  558. X */
  559. XPRIVATE unsigned get_limit( limitstr )
  560. X    char *limitstr ;
  561. X{
  562. X    int multiplier ;
  563. X
  564. X    switch ( limitstr[ strlen( limitstr ) - 1 ] )
  565. X    {
  566. X        case 'k':
  567. X        case 'K':
  568. X            multiplier = 1024 ;
  569. X            break ;
  570. X        
  571. X        case 'm':
  572. X        case 'M':
  573. X            multiplier = 1024 * 1024 ;
  574. X            break ;
  575. X        
  576. X        default:
  577. X            multiplier = 1 ;
  578. X    }
  579. X    return( (unsigned) atoi( limitstr ) * multiplier ) ;
  580. X}
  581. X
  582. X
  583. XPRIVATE status_e parse_filelog( flp, values )
  584. X    struct filelog        *flp ;
  585. X    pset_h                values ;
  586. X{
  587. X    unsigned        soft_limit ;
  588. X    unsigned        hard_limit ;
  589. X    char            *file ;
  590. X    unsigned        count = pset_count( values ) ;
  591. X    char            *func = "parse_filelog" ;
  592. X
  593. X    if ( count < 2 || count > 4 )
  594. X    {
  595. X        parsemsg( LOG_ERR, func, "wrong number of arguments" ) ;
  596. X        return( FAILED ) ;
  597. X    }
  598. X
  599. X    file = make_string( 1, (char *) pset_pointer( values, 1 ) ) ;
  600. X    if ( file == NULL )
  601. X    {
  602. X        out_of_memory( func ) ;
  603. X        return( FAILED ) ;
  604. X    }
  605. X
  606. X    /*
  607. X     * Get the limits, if any
  608. X     */
  609. X    if ( count > 2 )
  610. X    {
  611. X        soft_limit = get_limit( (char *) pset_pointer( values, 2 ) ) ;
  612. X        if ( soft_limit == 0 )
  613. X        {
  614. X            parsemsg( LOG_ERR, func, "soft limit is 0" ) ;
  615. X            free( file ) ;
  616. X            return( FAILED ) ;
  617. X        }
  618. X
  619. X        /*
  620. X         * If a hard limit was specified check that it is at least equal 
  621. X         * to the soft limit. If no hard limit was specified, determine
  622. X         * it from the formula:
  623. X         *        hard = soft + x
  624. X         * where 
  625. X         *        min( 1%soft,LOG_EXTRA_MIN ) <= x <= max( 1%soft,LOG_EXTRA_MAX )
  626. X         */
  627. X        if ( count == 4 )
  628. X        {
  629. X            hard_limit = get_limit( (char *) pset_pointer( values, 3 ) ) ;
  630. X            if ( hard_limit < soft_limit )
  631. X            {
  632. X                parsemsg( LOG_ERR, func,
  633. X                    "hard limit (%d) is less than soft limit (%d)",
  634. X                            hard_limit, soft_limit ) ;
  635. X                free( file ) ;
  636. X                return( FAILED ) ;
  637. X            }
  638. X        }
  639. X        else
  640. X        {
  641. X            unsigned extra = soft_limit / 100 ;        /* 1% of soft limit */
  642. X
  643. X            if ( extra < LOG_EXTRA_MIN )
  644. X                extra = LOG_EXTRA_MIN ;
  645. X            else if ( extra > LOG_EXTRA_MAX )
  646. X                extra = LOG_EXTRA_MAX ;
  647. X            hard_limit = soft_limit + extra ;
  648. X        }
  649. X        flp->fl_soft_limit = soft_limit ;
  650. X        flp->fl_hard_limit = hard_limit ;
  651. X    }
  652. X    flp->fl_filename = file ;
  653. X    return( OK ) ;
  654. X}
  655. X
  656. X
  657. XPRIVATE status_e parse_syslog( slp, values )
  658. X    struct syslog    *slp ;
  659. X    pset_h            values ;
  660. X{
  661. X    char                    *facility ;
  662. X    char                    *level ;
  663. X    struct name_value *nvp ;
  664. X    unsigned                count = pset_count( values ) ;
  665. X    char                    *func = "parse_syslog" ;
  666. X
  667. X    if ( count < 2 || count > 3 )
  668. X    {
  669. X        parsemsg( LOG_ERR, func, "wrong number of arguments" ) ;
  670. X        return( FAILED ) ;
  671. X    }
  672. X
  673. X    facility = (char *) pset_pointer( values, 1 ) ;
  674. X    if ( ( nvp = nv_find_value( syslog_facilities, facility ) ) == NULL )
  675. X    {
  676. X        parsemsg( LOG_ERR, func, "Unknown syslog facility: %s", facility ) ;
  677. X        return( FAILED ) ;
  678. X    }
  679. X    slp->sl_facility = nvp->value ;
  680. X
  681. X    if ( count == 3 )
  682. X    {
  683. X        level = (char *) pset_pointer( values, 2 ) ;
  684. X        if ( ( nvp = nv_find_value( syslog_levels, level ) ) == NULL )
  685. X        {
  686. X            parsemsg( LOG_ERR, func, "Unknown syslog level: %s", level ) ;
  687. X            return( FAILED ) ;
  688. X        }
  689. X        slp->sl_level = nvp->value ;
  690. X    }
  691. X    else
  692. X        slp->sl_level = DEFAULT_SERVICE_SYSLOG_LEVEL ;
  693. X
  694. X    return( OK ) ;
  695. X}
  696. X
  697. X
  698. Xstatus_e log_type_parser( values, scp, op )
  699. X    pset_h values ;
  700. X    struct service_config *scp ;
  701. X    enum assign_op op ;
  702. X{
  703. X    struct log *lp = SC_LOG( scp ) ;
  704. X    char *type ;
  705. X    char *func = "parse_log_type" ;
  706. X
  707. X    type = (char *) pset_pointer( values, 0 ) ;
  708. X
  709. X    if ( EQ( type, "FILE" ) )
  710. X    {
  711. X        if ( parse_filelog( log_filelog( lp ), values ) == FAILED )
  712. X            return( FAILED ) ;
  713. X        lp->l_type = L_FILE ;
  714. X    }
  715. X    else if ( EQ( type, "SYSLOG" ) )
  716. X    {
  717. X        if ( parse_syslog( log_syslog( lp ), values ) == FAILED )
  718. X            return( FAILED ) ;
  719. X        lp->l_type = L_SYSLOG ;
  720. X    }
  721. X    else
  722. X    {
  723. X        parsemsg( LOG_ERR, func, "Unknown log type: %s", type ) ;
  724. X        return( FAILED ) ;
  725. X    }
  726. X    return( OK ) ;
  727. X}
  728. X
  729. X
  730. X
  731. XPRIVATE status_e parse_log_flags( values, op, maskp, options, name )
  732. X    pset_h                values ;
  733. X    enum assign_op        op ;
  734. X    mask_t                *maskp ;
  735. X    struct name_value options[] ;
  736. X    char                    *name ;
  737. X{
  738. X    if ( op == SET_EQ )
  739. X    {
  740. X        M_CLEAR_ALL( *maskp ) ;
  741. X        op = PLUS_EQ ;
  742. X    }
  743. X
  744. X    return( parse_value_list( values, maskp, options, op, name ) ) ;
  745. X}
  746. X
  747. X
  748. Xstatus_e log_on_success_parser( values, scp, op )
  749. X    pset_h values ;
  750. X    struct service_config *scp ;
  751. X    enum assign_op op ;
  752. X{
  753. X    return( parse_log_flags( values, op,
  754. X        &scp->sc_log_on_success, success_log_options, "log-on-success flag" ) ) ;
  755. X}
  756. X
  757. X
  758. Xstatus_e log_on_failure_parser( values, scp, op )
  759. X    pset_h values ;
  760. X    struct service_config *scp ;
  761. X    enum assign_op op ;
  762. X{
  763. X    return( parse_log_flags( values, op,
  764. X        &scp->sc_log_on_failure, failure_log_options, "log-on_failure flag" ) ) ;
  765. X}
  766. X
  767. X
  768. X
  769. XPRIVATE status_e parse_inet_addresses( values, op, addr_list )
  770. X    pset_h            values ;
  771. X    enum assign_op op ;
  772. X    pset_h            *addr_list ;
  773. X{
  774. X    register unsigned        u ;
  775. X    pset_h                    addr_set ;
  776. X    statfunc                    addrlist_func ;
  777. X    char                        *func = "parse_inet_addresses" ;
  778. X    
  779. X    NEW_SET( *addr_list, 0, 0 ) ;
  780. X
  781. X    addr_set = *addr_list ;
  782. X
  783. X    /*
  784. X     * If the op was '=' clear the existing list of addresses
  785. X     */
  786. X    if ( op == SET_EQ )
  787. X    {
  788. X        op = PLUS_EQ ;
  789. X        addrlist_free( addr_set ) ;
  790. X        pset_clear( addr_set ) ;
  791. X    }
  792. X
  793. X    addrlist_func = ( op == PLUS_EQ ) ? addrlist_add : addrlist_remove ;
  794. X
  795. X    for ( u = 0 ; u < pset_count( values ) ; u++ )
  796. X    {
  797. X        register char *str_addr = (char *) pset_pointer( values, u ) ;
  798. X
  799. X        if ( (*addrlist_func)( addr_set, str_addr ) == FAILED )
  800. X            break ;
  801. X    }
  802. X    return( OK ) ;
  803. X}
  804. X
  805. X
  806. X
  807. Xstatus_e only_from_parser( values, scp, op )
  808. X    pset_h values ;
  809. X    struct service_config *scp ;
  810. X    enum assign_op op ;
  811. X{
  812. X    return( parse_inet_addresses( values, op, &scp->sc_only_from ) ) ;
  813. X}
  814. X
  815. X
  816. Xstatus_e no_access_parser( values, scp, op )
  817. X    pset_h values ;
  818. X    struct service_config *scp ;
  819. X    enum assign_op op ;
  820. X{
  821. X    return( parse_inet_addresses( values, op, &scp->sc_no_access ) ) ;
  822. X}
  823. X
  824. X
  825. Xstatus_e access_times_parser( values, scp, op )
  826. X    pset_h values ;
  827. X    struct service_config *scp ;
  828. X    enum assign_op op ;
  829. X{
  830. X    register unsigned u ;
  831. X    char *func = "access_times_parser" ;
  832. X    status_e ti_add() ;
  833. X
  834. X    NEW_SET( scp->sc_access_times, 0, 0 ) ;
  835. X
  836. X    for ( u = 0 ; u < pset_count( values ) ; u++ )
  837. X    {
  838. X        register char *interval = (char *) pset_pointer( values, u ) ;
  839. X
  840. X        if ( ti_add( scp->sc_access_times, interval ) == FAILED )
  841. X            break ;
  842. X    }
  843. X    return( OK ) ;
  844. X}
  845. X
  846. X
  847. Xstatus_e nice_parser( values, scp, op )
  848. X    pset_h values ;
  849. X    struct service_config *scp ;
  850. X    enum assign_op op ;
  851. X{
  852. X    scp->sc_nice = atoi( (char *) pset_pointer( values, 0 ) ) ;
  853. X    return( OK ) ;
  854. X}
  855. X
  856. END_OF_FILE
  857. if test 17457 -ne `wc -c <'xinetd/parsers.c'`; then
  858.     echo shar: \"'xinetd/parsers.c'\" unpacked with wrong size!
  859. fi
  860. # end of 'xinetd/parsers.c'
  861. fi
  862. echo shar: End of archive 28 \(of 31\).
  863. cp /dev/null ark28isdone
  864. MISSING=""
  865. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ; do
  866.     if test ! -f ark${I}isdone ; then
  867.     MISSING="${MISSING} ${I}"
  868.     fi
  869. done
  870. if test "${MISSING}" = "" ; then
  871.     echo You have unpacked all 31 archives.
  872.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  873. else
  874.     echo You still need to unpack the following archives:
  875.     echo "        " ${MISSING}
  876. fi
  877. ##  End of shell archive.
  878. exit 0
  879.