prof_int.h revision bfc032a14cc866ab7f34ca6fd86c240a5ebede9d
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara/*
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara/*
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara * prof-int.h
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara/* Solaris Kerberos */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#ifndef __PROF_INT_H
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#define __PROF_INT_H
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#include <time.h>
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#include <stdio.h>
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#if defined(__MACH__) && defined(__APPLE__)
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#include <TargetConditionals.h>
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#define PROFILE_SUPPORTS_FOREIGN_NEWLINES
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#endif
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#include "k5-thread.h"
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#include "k5-platform.h"
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#include "com_err.h"
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#include "profile.h"
65e99be301d5a19db33f25841f671756e8dbb9b5ludovicp
a5b9f8fb834b1b2208e59a2fa76714bd91a5f147violettetypedef long prf_magic_t;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara/*
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara * This is the structure which stores the profile information for a
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara * particular configuration file.
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara *
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * Locking strategy:
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * - filespec, fslen are fixed after creation
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * - refcount and next should only be tweaked with the global lock held
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara * - other fields can be tweaked after grabbing the in-struct lock
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergarastruct _prf_data_t {
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara prf_magic_t magic;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara k5_mutex_t lock;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara struct profile_node *root;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara time_t last_stat;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara time_t timestamp; /* time tree was last updated from file */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara unsigned long frac_ts; /* fractional part of timestamp, if any */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara int flags; /* r/w, dirty */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara int upd_serial; /* incremented when data changes */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara char *comment;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara size_t fslen;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara /* Some separation between fields controlled by different
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara mutexes. Theoretically, both could be accessed at the same
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara time from different threads on different CPUs with separate
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara caches. Don't let the threads clobber each other's
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara changes. One mutex controlling the whole thing would be
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara better, but sufficient separation might suffice.
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara This is icky. I just hope it's adequate.
a5b9f8fb834b1b2208e59a2fa76714bd91a5f147violette
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara For next major release, fix this. */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara union { double d; void *p; UINT64_TYPE ll; k5_mutex_t m; } pad;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara int refcount; /* prf_file_t references */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara struct _prf_data_t *next;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara /* Was: "profile_filespec_t filespec". Now: flexible char
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara array ... except, we need to work in C89, so an array
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara length must be specified. */
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara const char filespec[sizeof("/etc/krb5.conf")];
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara};
d25372dc8e65a9ed019a88fdf659ca61313f1b31jcduff
a5b9f8fb834b1b2208e59a2fa76714bd91a5f147violettetypedef struct _prf_data_t *prf_data_t;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergaraprf_data_t profile_make_prf_data(const char *);
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergarastruct _prf_file_t {
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara prf_magic_t magic;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara struct _prf_data_t *data;
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara struct _prf_file_t *next;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara};
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaratypedef struct _prf_file_t *prf_file_t;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara/*
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * The profile flags
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara */
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara#define PROFILE_FILE_RW 0x0001
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara#define PROFILE_FILE_DIRTY 0x0002
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara#define PROFILE_FILE_SHARED 0x0004
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara/*
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * This structure defines the high-level, user visible profile_t
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * object, which is used as a handle by users who need to query some
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * configuration file(s)
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara */
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergarastruct _profile_t {
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara prf_magic_t magic;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara prf_file_t first_file;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara};
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaratypedef struct _profile_options {
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara char *name;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara int *value;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara int found;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara} profile_options_boolean;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaratypedef struct _profile_times {
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara char *name;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara char **value;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara int found;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara} profile_option_strings;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara/*
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * Solaris Kerberos: Added here to provide to other non-prof_get functions.
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * The profile_string_list structure is used for internal booking
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * purposes to build up the list, which is returned in *ret_list by
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * the end_list() function.
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara */
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergarastruct profile_string_list {
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara char **list;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara int num;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara int max;
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara};
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara/*
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara * Used by the profile iterator in prof_get.c
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#define PROFILE_ITER_LIST_SECTION 0x0001
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#define PROFILE_ITER_SECTIONS_ONLY 0x0002
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#define PROFILE_ITER_RELATIONS_ONLY 0x0004
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#define PROFILE_ITER_FINAL_SEEN 0x0100
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara/*
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara * Check if a filespec is last in a list (NULL on UNIX, invalid FSSpec on MacOS
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara#define PROFILE_LAST_FILESPEC(x) (((x) == NULL) || ((x)[0] == '\0'))
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara/* profile_parse.c */
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergaraerrcode_t profile_parse_file
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara (FILE *f, struct profile_node **root);
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergaraerrcode_t profile_write_tree_file
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara (struct profile_node *root, FILE *dstfile);
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergaraerrcode_t profile_write_tree_to_buffer
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara (struct profile_node *root, char **buf);
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara/* prof_tree.c */
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara
7056ae8910decb0d96b430451ac58b99526eb0d9jvergaravoid profile_free_node
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara (struct profile_node *relation);
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara
7056ae8910decb0d96b430451ac58b99526eb0d9jvergaraerrcode_t profile_create_node
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara (const char *name, const char *value,
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara struct profile_node **ret_node);
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraerrcode_t profile_verify_node
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *node);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraerrcode_t profile_add_node
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *section,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara const char *name, const char *value,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara struct profile_node **ret_node);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraerrcode_t profile_make_node_final
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *node);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraint profile_is_node_final
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *node);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraconst char *profile_get_node_name
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *node);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraconst char *profile_get_node_value
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *node);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraerrcode_t profile_find_node
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *section,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara const char *name, const char *value,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara int section_flag, void **state,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara struct profile_node **node);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraerrcode_t profile_find_node_relation
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *section,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara const char *name, void **state,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara char **ret_name, char **value);
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergaraerrcode_t profile_find_node_subsection
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara (struct profile_node *section,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara const char *name, void **state,
4cf0e2c1065147b79e7d6ffe59e517c38cbc6bdejvergara char **ret_name, struct profile_node **subsection);
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergara
11178d20048abeee671d0cdb2aab6dfbaa36293bjvergaraerrcode_t profile_get_node_parent
(struct profile_node *section,
struct profile_node **parent);
errcode_t profile_delete_node_relation
(struct profile_node *section, const char *name);
errcode_t profile_find_node_name
(struct profile_node *section, void **state,
char **ret_name);
errcode_t profile_node_iterator_create
(profile_t profile, const char *const *names,
int flags, void **ret_iter);
void profile_node_iterator_free
(void **iter_p);
errcode_t profile_node_iterator
(void **iter_p, struct profile_node **ret_node,
char **ret_name, char **ret_value);
errcode_t profile_remove_node
(struct profile_node *node);
errcode_t profile_set_relation_value
(struct profile_node *node, const char *new_value);
errcode_t profile_rename_node
(struct profile_node *node, const char *new_name);
/* prof_file.c */
errcode_t KRB5_CALLCONV profile_copy (profile_t, profile_t *);
errcode_t profile_open_file
(const_profile_filespec_t file, prf_file_t *ret_prof);
#define profile_update_file(P) profile_update_file_data((P)->data)
errcode_t profile_update_file_data
(prf_data_t profile);
#define profile_flush_file(P) (((P) && (P)->magic == PROF_MAGIC_FILE) ? profile_flush_file_data((P)->data) : PROF_MAGIC_FILE)
errcode_t profile_flush_file_data
(prf_data_t data);
#define profile_flush_file_to_file(P,F) (((P) && (P)->magic == PROF_MAGIC_FILE) ? profile_flush_file_data_to_file((P)->data, (F)) : PROF_MAGIC_FILE)
errcode_t profile_flush_file_data_to_file
(prf_data_t data, const char *outfile);
errcode_t profile_flush_file_data_to_buffer
(prf_data_t data, char **bufp);
void profile_free_file
(prf_file_t profile);
errcode_t profile_close_file
(prf_file_t profile);
void profile_dereference_data (prf_data_t);
void profile_dereference_data_locked (prf_data_t);
int profile_lock_global (void);
int profile_unlock_global (void);
/* prof_init.c -- included from profile.h */
errcode_t profile_ser_size
(const char *, profile_t, size_t *);
errcode_t profile_ser_externalize
(const char *, profile_t, unsigned char **, size_t *);
errcode_t profile_ser_internalize
(const char *, profile_t *, unsigned char **, size_t *);
/* prof_get.c */
errcode_t profile_get_value
(profile_t profile, const char **names,
const char **ret_value);
/*
* Solaris Kerberos: Need basic routines for other functions besides prof_get.
*/
errcode_t init_list(struct profile_string_list *list);
void end_list(struct profile_string_list *list, char ***ret_list);
errcode_t add_to_list(struct profile_string_list *list, const char *str);
/* Others included from profile.h */
/* prof_set.c -- included from profile.h */
/* Solaris Kerberos */
#endif /* __PROF_INT_H */