/* Copyright 1999-2000 Red Hat, Inc.
*
* Bernhard Rosenkraenzer <bero@redhat.com>
* Harald Hoyer <harald@redhat.com>
* Florian La Roche <Florian.LaRoche@redhat.com>
*
* This software may be freely redistributed under the terms of the GNU
* public license.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _RHUTIL_H
#define _RHUTIL_H
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>
#include <grp.h>
#ifdef RHC_INTERNAL
#include <libintl.h>
#define _(s) dgettext("rhclib",(s))
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if 0
/* FOOL kdoc */
class rhclib {
public:
#endif
void nomem (size_t size)
#ifdef __GNUC__
__attribute__ ((noreturn))
#endif
;
void *rh_xcalloc (size_t s);
void *rh_xmalloc (size_t s);
void *rh_xrealloc (void *p, size_t s);
void *rh_xmemcpy (const void *p, size_t s);
char *rh_xstrdup (const char *s);
char *rh_xstrndup (const char *s, size_t n);
#define RH_FREE(x) if (x) free(x)
/* double linked list */
typedef struct rh_list {
char *data;
size_t n;
struct rh_list *next;
struct rh_list *prev;
} rh_list;
/* add a new node with "data" previous to "pos" or at the end if "pos"
* is NULL.
*/
rh_list *rh_list_add (rh_list *first, rh_list *pos, char *data, size_t n);
/* delete a complete list */
void rh_list_delete (rh_list *l, int free_data);
/* delete only one list element */
rh_list *rh_list_delete_node (rh_list *first, rh_list *pos);
/* go through the list and call a function for each element */
rh_list *rh_list_traverse (int (*func) (rh_list *), rh_list *first,
rh_list *pos);
rh_list *rh_list_dup (rh_list *first);
/* s does not have to be '\0'-terminated */
char *string_trim (const char *s, size_t n, size_t *m);
rh_list *string_tok (char *s, size_t *n, const char *delim);
/* return a good title string for dialog boxes etc. */
char *rhcl_title (void);
/**
* something similar to "mkdir -p": make a complete directory path with
* permissions 'mode_t'.
* it might be good to make a similar function that does not allocate
* memory, but can change the string to make the subdirectories.
* this function will not return an error if the complete path is a normal
* file instead of a directory. to check this, you have to call (l)stat()
* and check for a directory after calling this function.
* @return 0 on success, -2 if we don't get enough
* memory and -1 if we cannot create the directories.
* @param path directory path to make
* @param n length of the path
* @param mode permissions of the directory
*/
int mkdir_p (const char *path, size_t n, mode_t mode);
/** Copy one file to another.
* @param src path to the src file
* @param dest path to the dest file
* @return 0 on success, errno otherwise
*/
int copy(const char *src, const char *dest);
int WaitFd (int, int, unsigned long);
int SetBlockFlag (int fd, int block);
/** Get the group id by name.
* @param name the group name
* @return the group id, 0 if the group name does not exist
*/
gid_t Gid (const char *name);
/**
* read 'len' bytes into 'buf' from filedescriptor 'fd'.
* restart read() in case of partial/interrupted reads.
* @return the number of read bytes or -1 in case of error.
*/
ssize_t Read (int fd, /*@out@*/ void *buf, size_t len);
/**
* write 'len' bytes starting at 'buf' to the filedescriptor 'fd'
* restart the write() command in case of partial/interrupted writes
* @return 0 on success or -1 on error
*/
int Write (int, const void *, size_t);
typedef struct rhconfig_t {
char *name;
struct stat st;
char *buf;
size_t n;
} rhconfig_t;
/** read a complete file into a new buffer.
* *size contains the complete size.
* @param return NULL on error or a newly alloced buffer.
*/
rhconfig_t *ReadFile (const char *name, uid_t uid, gid_t gid, mode_t mode);
void FreeFile (rhconfig_t *c);
int BackupFile (const char *name);
/**
* WriteFile writes a file
*/
int NewContent (rhconfig_t *c, char *buf, size_t n);
int NewContent2 (rhconfig_t *c, rh_list *list);
int WriteFile (rhconfig_t *c);
int WriteFile2 (rhconfig_t *c);
/** parse a file that is supposed to be in shell-syntax for
* "key=value" entries. we ignore a lot of things that are possible
* within shell-scripts, but this routine should cope with all
* real-world config files. please try to keep this routine
* reasonable simple.
* @param s the string buffer
* @param n the length of the string buffer
* @param key the search key
* @return ptr to the line containing key, NULL otherwise
*/
char *GetKeyShell (rh_list *l, rh_list **pos, const char *key);
char *GetKey (rh_list *l, rh_list **pos, const char *key);
/** set a new value; in place editing
* @param s the string buffer
* @param n the length of the string buffer
* @param key the search key
* @param data the string to set the key to
* @return ptr to the line containing key, NULL otherwise
*/
rh_list *SetKeyShell (rh_list *first, rh_list **pos,
const char *key, const char *data);
void SetKey (rh_list **first, rh_list **pos, const char *key,
const char *value);
void SetKeyPos (rh_list **first, rh_list *pos, const char *key,
const char *value);
rh_list *DeleteAllKey (rh_list **first2, const char *key2);
/** change buffer into newly malloced lines
*/
rh_list *Buf2List (const char *buffer);
char *List2Buf (rh_list *l, size_t *);
void remove_line_continuations (rh_list *l);
/** Checks if the user is root (euid 0)
* This exits otherwise, with a dialog informing the user.
*/
void check_root (void);
/** Checks if the user has write access to a file or path.
* This exits otherwise, with a dialog informing the user.
* @param path the path to the file or directory
* @return 0 for success
*/
int check_for_write_access (const char *);
void vLog (const char *fmt, va_list ap);
void Log (int i, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
void vError (const char *fmt, va_list ap);
void Error (const char *fmt, ...) __attribute__((format(printf, 1, 2)));
int SetError (const char *fmt, ...) __attribute__((format(printf, 1, 2)));
/** Display a dialog before aborting the program
* @param fmt a printf style format string
* @return never
*/
void ErrorAbort (const char *fmt, ...)
#ifdef __GNUC__
__attribute__ ((noreturn,format(printf, 1, 2)));
#endif
;
/** Initialize a display
* @param argc parameter count
* @param argv parameters (on some frontends, parameters are used to
* handle crap like -geometry)
* @return 0 on success
*/
int InitDisplay (int *argc, char ***argv, const char *package,
const char *version);
/** Close a display
*/
void CloseDisplay (void);
int ParseYesNo (const char *);
/** Replace all occurences of
* @param what
* with
* @param with
* in
* @param str the string
*
* @return String with all occurrences replaced.
*/
char *rhcl_replace (const char *str, const char *what, const char *with);
/** Case-insensitive version of strstr
* Find the first occurrence of @param haystack in @param needle
* case insensitive.
*
* @return first occurrence
*/
char *rhcl_strcasestr (char *haystack, const char *needle);
/** Remove blanks from beginning and end of line
* @param line Line you want trimmed
* @return @param line without blanks at beginning and end
*/
char *rhcl_trim (const char *line);
#ifdef _RH_NETWORK
/* an ugly hack to not include this for all files */
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
/* connect to a single address */
int DoTcpConnect (struct addrinfo *addr, int blocking, unsigned long timeout);
char *GetNetError (struct addrinfo *addr);
/* connect inkl. looking up a hostname */
int TcpConnect (const char *hostname, const char *service, int *fd,
int blocking, unsigned long timeout);
#endif
#if 0
};
#endif
#ifdef __cplusplus
}
#endif
#endif
| Generated by: laroche@dudweiler.redhat.de on Mon Jun 26 19:25:45 2000, using kdoc 2.0a35. |