libinst.h revision 10619:bb631a61091f
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef __HDRS_LIBINST_H__ 28#define __HDRS_LIBINST_H__ 29 30 31#ifdef __cplusplus 32extern "C" { 33#endif 34 35#include <stdio.h> 36#include <fcntl.h> 37#include <sys/types.h> 38#include <sys/stat.h> 39#include <pkgstrct.h> 40#include <pkginfo.h> 41#include "pkglib.h" 42#include <cfext.h> 43#include "install.h" 44 45#define DEF_NONE_SCR "i.CompCpio" 46 47#define BL_ALL -1 /* refers to all allocated lists */ 48 49/* signal handler function definition */ 50 51typedef void (sighdlrFunc_t)(int); 52 53/* maximum parameter length */ 54 55#define MAX_PKG_PARAM_LENGTH (64+1) /* +1 for null termination */ 56 57/* flag for check_applicability */ 58 59typedef unsigned long CAF_T; 60 61/* flags for check_applicability */ 62 63#define CAF_IN_GLOBAL_ZONE 0x00000001 /* in global zone */ 64#define CAF_SCOPE_GLOBAL 0x00000002 /* -G specified */ 65#define CAF_SCOPE_NONGLOBAL 0x00000004 /* -Z specified */ 66 67/* path to the request file in the package directory */ 68 69#define REQUEST_FILE "install/request" 70 71/* path to the copyright file in the package directory */ 72 73#define COPYRIGHT_FILE "install/copyright" 74 75/* path to the depend file in the package directory */ 76 77#define DEPEND_FILE "install/depend" 78 79/* 80 * name of environment variable set to non-global zone name being installed: 81 * pkgadd/pkginstall expects this name and passes it on to any scripts that 82 * are run if it is set. 83 */ 84 85#define PKG_ZONENAME_VARIABLE "SUNW_PKG_INSTALL_ZONENAME" 86 87/* 88 * name of environment variable set to indicate this package should be installed 89 * in the current zone only - see PSARC/2004/789 - New Pkginfo(4) attributes 90 * for zones 91 */ 92 93#define PKG_THISZONE_VARIABLE "SUNW_PKG_THISZONE" 94 95/* 96 * name of environment variable set to indicate this package should be installed 97 * in all zones, and only from the global zone - see PSARC/2003/460 98 */ 99 100#define PKG_ALLZONES_VARIABLE "SUNW_PKG_ALLZONES" 101 102/* 103 * name of environment variable set to indicate this package should be installed 104 * hollow (db update only) when installed in nonglobal zone - see PSARC/2003/460 105 */ 106 107#define PKG_HOLLOW_VARIABLE "SUNW_PKG_HOLLOW" 108 109/* 110 * General purpose return codes used for functions which don't return a basic 111 * success or failure. For those functions wherein a yes/no result is 112 * possible, then 1 means OK and 0 means FAIL. 113 */ 114#define RESULT_OK 0x0 115#define RESULT_WRN 0x1 116#define RESULT_ERR 0x2 117 118/* These are the file status indicators for the contents file */ 119#define INST_RDY '+' /* entry is ready to installf -f */ 120#define RM_RDY '-' /* entry is ready for removef -f */ 121#define NOT_FND '!' /* entry (or part of entry) was not found */ 122#define SERVED_FILE '%' /* using the file server's RO partition */ 123#define STAT_NEXT '@' /* this is awaiting eptstat */ 124#define DUP_ENTRY '#' /* there's a duplicate of this */ 125#define CONFIRM_CONT '*' /* need to confirm contents */ 126#define CONFIRM_ATTR '~' /* need to confirm attributes */ 127#define ENTRY_OK '\0' /* entry is a confirmed file */ 128 129/* control bits for pkgdbmerg() */ 130#define NO_COPY 0x0001 131#define CLIENT_PATHS 0x0002 /* working with a client database */ 132 133/* control bits for file verification by class */ 134#define DEFAULT 0x0 /* standard full verification */ 135#define NOVERIFY 0x1 /* do not verify */ 136#define QKVERIFY 0x2 /* do a quick verification instead */ 137 138/* control bit for path type to pass to CAS */ 139#define DEFAULT 0x0 /* standard server-relative absolute path */ 140#define REL_2_CAS 0x1 /* pass pkgmap-type relative path */ 141 142/* findscripts() argument */ 143#define I_ONLY 0x0 /* find install class action scripts */ 144#define R_ONLY 0x1 /* find removal class action scripts */ 145 146struct cl_attr { 147 char name[CLSSIZ+1]; /* name of class */ 148 char *inst_script; /* install class action script */ 149 char *rem_script; /* remove class action script */ 150 unsigned src_verify:3; /* source verification level */ 151 unsigned dst_verify:4; /* destination verification level */ 152 unsigned relpath_2_CAS:1; /* CAS gets relative paths */ 153}; 154 155#if defined(__STDC__) 156#define __P(protos) protos 157#else /* __STDC__ */ 158#define __P(protos) () 159#endif /* __STDC__ */ 160 161/* Common quit declaration used across many package commands */ 162extern void quit(int) __NORETURN; 163 164 165/* listmgr.c */ 166extern int bl_create __P((int count_per_block, int struct_size, 167 char *desc)); 168extern char *bl_next_avail __P((int list_handle)); 169extern char *bl_get_record __P((int list_handle, int recno)); 170extern void bl_free __P((int list_handle)); 171extern int ar_create __P((int count_per_block, int struct_size, 172 char *desc)); 173extern char **ar_next_avail __P((int list_handle)); 174extern char **ar_get_head __P((int list_handle)); 175extern int ar_delete __P((int list_handle, int index)); 176extern void ar_free __P((int list_handle)); 177 178/* doulimit.c */ 179extern int set_ulimit __P((char *script, char *err_msg)); 180extern int clr_ulimit __P((void)); 181extern int assign_ulimit __P((char *fslimit)); 182 183/* dryrun.c */ 184extern void set_continue_not_ok __P((void)); 185extern int continue_is_ok __P((void)); 186extern int in_dryrun_mode __P((void)); 187extern int in_continue_mode __P((void)); 188extern void init_dryrunfile __P((char *dr_dir)); 189extern void init_contfile __P((char *cn_dir)); 190extern void set_dr_exitmsg __P((char *value)); 191extern void set_dr_info __P((int type, int value)); 192extern void write_dryrun_file __P((struct cfextra **extlist)); 193 194/* instvol.c */ 195extern void regfiles_free __P((void)); 196 197/* lockinst.c */ 198extern int lockinst __P((char *util_name, char *pkg_name, char *place)); 199extern void lockupd __P((char *place)); 200extern void unlockinst __P((void)); 201 202extern char *pathdup __P((char *s)); 203extern char *pathalloc __P((int n)); 204extern char *fixpath __P((char *path)); 205extern char *get_info_basedir __P((void)); 206extern char *get_basedir __P((void)); 207extern char *get_client_basedir __P((void)); 208extern int set_basedirs __P((int reloc, char *adm_basedir, 209 char *pkginst, int nointeract)); 210extern int eval_path __P((char **server_ptr, char **client_ptr, 211 char **map_ptr, char *path)); 212extern int get_orig_offset __P((void)); 213extern char *get_inst_root __P((void)); 214extern char *get_mount_point __P((short n)); 215extern char *get_remote_path __P((short n)); 216extern void set_env_cbdir __P((void)); 217extern int set_inst_root __P((char *path)); 218extern void put_path_params __P((void)); 219extern int mkpath __P((char *p)); 220extern void mkbasedir __P((int flag, char *path)); 221extern int is_an_inst_root __P((void)); 222extern int is_a_basedir __P((void)); 223extern int is_a_cl_basedir __P((void)); 224extern int is_relocatable __P((void)); 225extern char *orig_path __P((char *path)); 226extern char *orig_path_ptr __P((char *path)); 227extern char *qreason __P((int caller, int retcode, int started, 228 int includeZonename)); 229extern char *qstrdup __P((char *s)); 230extern char *srcpath __P((char *d, char *p, int part, int nparts)); 231extern char *trans_srcp_pi __P((char *local_path)); 232extern int copyf __P((char *from, char *to, time_t mytime)); 233extern int copyFile __P((int, int, char *, char *, struct stat *, long)); 234extern int openLocal __P((char *a_path, int a_oflag, char *a_tmpdir)); 235extern int dockdeps __P((char *depfile, int removeFlag, 236 boolean_t a_preinstallCheck)); 237extern int finalck __P((struct cfent *ept, int attrchg, int contchg, 238 boolean_t a_warning)); 239 240/* dockdeps.c */ 241extern void setUpdate __P((void)); 242extern int isUpdate __P((void)); 243extern void setPatchUpdate __P((void)); 244extern int isPatchUpdate __P((void)); 245 246/* mntinfo.c */ 247extern int get_mntinfo __P((int map_client, char *vfstab_file)); 248extern short fsys __P((char *path)); 249extern struct fstable *get_fs_entry __P((short n)); 250extern int mount_client __P((void)); 251extern int unmount_client __P((void)); 252extern short resolved_fsys __P((char *path)); 253extern char *get_server_host __P((short n)); 254extern char *server_map __P((char *path, short fsys_value)); 255extern int use_srvr_map __P((char *path, short *fsys_value)); 256extern int use_srvr_map_n __P((short n)); 257extern int is_fs_writeable __P((char *path, short *fsys_value)); 258extern int is_remote_fs __P((char *path, short *fsys_value)); 259extern int is_served __P((char *path, short *fsys_value)); 260extern int is_mounted __P((char *path, short *fsys_value)); 261extern int is_fs_writeable_n __P((short n)); 262extern int is_remote_fs_n __P((short n)); 263extern int is_served_n __P((short n)); 264extern int is_mounted_n __P((short n)); 265extern fsblkcnt_t get_blk_size_n __P((short n)); 266extern fsblkcnt_t get_frag_size_n __P((short n)); 267extern fsblkcnt_t get_blk_used_n __P((short n)); 268extern fsblkcnt_t get_blk_free_n __P((short n)); 269extern fsblkcnt_t get_inode_used_n __P((short n)); 270extern fsblkcnt_t get_inode_free_n __P((short n)); 271extern void set_blk_used_n __P((short n, fsblkcnt_t value)); 272extern char *get_source_name_n __P((short n)); 273extern char *get_fs_name_n __P((short n)); 274extern int load_fsentry __P((struct fstable *fs_entry, char *name, 275 char *fstype, char *remote_name)); 276extern int isreloc __P((char *pkginstdir)); 277extern int is_local_host __P((char *hostname)); 278extern void fs_tab_free __P((void)); 279 280/* pkgdbmerg.c */ 281extern int pkgdbmerg __P((PKGserver server, VFP_T *tmpvfp, 282 struct cfextra **extlist)); 283extern int files_installed __P((void)); 284 285/* ocfile.c */ 286extern int trunc_tcfile __P((int fd)); 287extern int ocfile __P((PKGserver *serverp, VFP_T **tmpvfp, 288 fsblkcnt_t map_blks)); 289extern int swapcfile __P((PKGserver server, VFP_T **a_tmpvfp, 290 char *pkginst, int dbchg)); 291extern int set_cfdir __P((char *cfdir)); 292extern int socfile __P((PKGserver *server, boolean_t quiet)); 293extern int relslock __P((void)); 294extern int pkgWlock __P((int verbose)); 295extern int iscfile __P((void)); 296extern int vcfile __P((void)); 297 298extern fsblkcnt_t nblk __P((fsblkcnt_t size, ulong_t bsize, 299 ulong_t frsize)); 300extern struct cfent **procmap __P((VFP_T *vfp, int mapflag, char *ir)); 301extern void repl_cfent __P((struct cfent *new, struct cfent *old)); 302extern struct cfextra **pkgobjmap __P((VFP_T *vfp, int mapflag, char *ir)); 303extern void pkgobjinit __P((void)); 304extern int seed_pkgobjmap __P((struct cfextra *ext_entry, char *path, 305 char *local)); 306extern int init_pkgobjspace __P((void)); 307 308/* eptstat.c */ 309extern void pinfo_free __P((void)); 310extern struct pinfo *eptstat __P((struct cfent *entry, char *pkg, char c)); 311 312/* echo.c */ 313/*PRINTFLIKE1*/ 314extern void echo __P((char *a_fmt, ...)); 315/*PRINTFLIKE1*/ 316extern void echoDebug __P((char *a_fmt, ...)); 317extern boolean_t echoGetFlag __P((void)); 318extern boolean_t echoDebugGetFlag __P((void)); 319extern boolean_t echoSetFlag __P((boolean_t a_debugFlag)); 320extern boolean_t echoDebugSetFlag __P((boolean_t a_debugFlag)); 321 322/* psvr4ck.c */ 323extern void psvr4cnflct __P((void)); 324extern void psvr4mail __P((char *list, char *msg, int retcode, char *pkg)); 325extern void psvr4pkg __P((char **ppkg)); 326 327/* ptext.c */ 328/*PRINTFLIKE2*/ 329extern void ptext __P((FILE *fp, char *fmt, ...)); 330 331/* putparam.c */ 332extern void putparam __P((char *param, char *value)); 333extern void getuserlocale __P((void)); 334extern void putuserlocale __P((void)); 335extern void putConditionInfo __P((char *, char *)); 336 337/* setadmin.c */ 338extern void setadminFile __P((char *file)); 339extern char *setadminSetting __P((char *a_paramName, 340 char *a_paramValue)); 341extern char *set_keystore_admin __P((void)); 342extern boolean_t get_proxy_port_admin __P((char **, ushort_t *)); 343extern boolean_t check_keystore_admin __P((char **)); 344extern int web_ck_retries __P((void)); 345extern int web_ck_timeout __P((void)); 346extern int web_ck_authentication __P((void)); 347 348/* setlist.c */ 349extern char *cl_iscript __P((int idx)); 350extern char *cl_rscript __P((int idx)); 351extern void find_CAS __P((int CAS_type, char *bin_ptr, char *inst_ptr)); 352extern int setlist __P((struct cl_attr ***plist, char *slist)); 353extern void addlist __P((struct cl_attr ***plist, char *item)); 354extern char *cl_nam __P((int cl_idx)); 355extern char *flex_device(char *device_name, int dev_ok); 356extern int cl_getn __P((void)); 357extern int cl_idx __P((char *cl_nam)); 358extern void cl_sets __P((char *slist)); 359extern void cl_setl __P((struct cl_attr **cl_lst)); 360extern void cl_putl __P((char *parm_name, struct cl_attr **list)); 361extern int cl_deliscript __P((int i)); 362extern unsigned cl_svfy __P((int i)); 363extern unsigned cl_dvfy __P((int i)); 364extern unsigned cl_pthrel __P((int i)); 365 366/* passwd.c */ 367extern int pkg_passphrase_cb __P((char *, int, int, void *)); 368extern void set_passarg __P((char *)); 369extern void set_prompt __P((char *)); 370 371/* fixpath.c */ 372extern void __P(export_client_env(char *)); 373extern void __P(set_partial_inst(void)); 374extern int __P(is_partial_inst(void)); 375extern void __P(set_depend_pkginfo_DB(boolean_t a_setting)); 376extern boolean_t __P(is_depend_pkginfo_DB(void)); 377extern void __P(disable_spool_create(void)); 378extern int __P(is_spool_create(void)); 379 380/* open_package_datastream.c */ 381extern boolean_t open_package_datastream(int a_argc, char **a_argv, 382 char *a_spoolto, char *a_device, 383 int *r_repeat, char **r_idsName, 384 char *a_tmpdir, struct pkgdev *a_pkgdev, 385 int a_optind); 386 387/* setup_temporary_directory.c */ 388extern boolean_t setup_temporary_directory(char **r_dirname, 389 char *a_tmpdir, char *a_suffix); 390 391/* unpack_package_from_stream.c */ 392extern boolean_t unpack_package_from_stream(char *a_idsName, 393 char *a_pkginst, char *a_tempDir); 394 395/* pkgops.c */ 396 397extern boolean_t pkgAddPackageToGzonlyList(char *a_pkgInst, 398 char *a_rootPath); 399extern void pkgAddThisZonePackage(char *a_pkgInst); 400extern boolean_t pkgRemovePackageFromGzonlyList(char *a_rootPath, 401 char *a_pkgInst); 402extern FILE *pkgOpenInGzOnlyFile(char *a_rootPath); 403extern void pkginfoFree(struct pkginfo **r_info); 404extern boolean_t pkginfoIsPkgInstalled(struct pkginfo **r_pinfo, 405 char *a_pkgInst); 406extern boolean_t pkgIsPkgInGzOnly(char *a_rootPath, char *a_pkgInst); 407extern boolean_t pkgIsPkgInGzOnlyFP(FILE *a_fp, char *a_pkgInst); 408extern boolean_t pkginfoParamTruth(FILE *a_fp, char *a_param, 409 char *a_value, boolean_t a_default); 410extern int pkgGetPackageList(char ***r_pkgList, char **a_argv, 411 int a_optind, char *a_categories, 412 char **a_categoryList, struct pkgdev *a_pkgdev); 413extern void pkgLocateHighestInst(char *r_path, int r_pathLen, 414 char *r_pkgInst, int r_pkgInstLen, 415 char *a_rootPath, char *a_pkgInst); 416extern boolean_t pkgPackageIsThisZone(char *a_pkgInst); 417extern boolean_t pkgMatchInherited(char *a_src, char *a_dst, 418 char *a_rootDir, char a_mode, time_t a_modtime, 419 char a_ftype, unsigned long a_cksum); 420extern char *pkgGetGzOnlyPath(void); 421extern boolean_t pkgTestInstalled(char *a_packageName, char *a_rootPath); 422 423/* depchk.c */ 424 425struct depckErrorRecord { 426 int ier_numZones; 427 char *ier_packageName; 428 char **ier_zones; 429 char **ier_values; 430}; 431 432typedef struct depckErrorRecord depckErrorRecord_t; 433 434struct depckError { 435 int er_numEntries; 436 depckErrorRecord_t *er_theEntries; 437}; 438 439typedef struct depckError depckError_t; 440 441typedef int (depcklFunc_t)(char *a_msg, char *a_pkg); 442 443/* 444 * ignore_values: 445 * == NULL - record one message for each instance of "name" found 446 * == "" - record multiple instances 447 * != "" - record multiple instances if value not in ignore_values 448 */ 449 450struct depckl_struct { 451 char *name; 452 char *ignore_values; 453 char **err_msg; 454 depcklFunc_t *depcklFunc; 455 depckError_t *record; 456}; 457 458typedef struct depckl_struct depckl_t; 459 460extern int depchkReportErrors(depckl_t *depckl); 461extern void depchkRecordError(depckError_t *a_erc, 462 char *a_pkginst, char *a_zoneName, 463 char *a_value); 464 465/* log.c */ 466 467/* types of log messages we recognize */ 468typedef enum { 469 LOG_MSG_ERR, 470 LOG_MSG_WRN, 471 LOG_MSG_INFO, 472 LOG_MSG_DEBUG 473} LogMsgType; 474 475/*PRINTFLIKE2*/ 476extern void log_msg(LogMsgType, const char *, ...); 477extern void log_set_verbose(boolean_t); 478extern boolean_t log_get_verbose(void); 479 480/* 481 * typedef for the 'ckreturn' function 482 */ 483typedef void (ckreturnFunc_t)(int a_retcode); 484 485/* sml.c */ 486 487/* null reference to SML_TAG object */ 488 489#define SML_TAG__NULL ((SML_TAG*)NULL) 490 491/* null reference to SML_TAG * object */ 492 493#define SML_TAG__R_NULL ((SML_TAG**)NULL) 494 495/* is reference to SML_TAG object valid? */ 496 497#define SML_TAG__ISVALID(tag) ((tag) != (SML_TAG__NULL)) 498 499/* is indirect reference to SML_TAG object valid? */ 500 501#define SML_TAG__R_ISVALID(r_tag) \ 502 ((r_tag) != ((SML_TAG**)(SML_TAG__NULL))) 503 504/* definitions for sml passed from pkginstall to pkgcond */ 505 506#define PKGCOND_GLOBAL_VARIABLE "SUNW_PKGCOND_GLOBAL_DATA" 507#define TAG_COND_TOPLEVEL "environmentConditionInformation" 508#define TAG_COND_PARENT_ZONE "parentZone" 509#define TAG_COND_CURRENT_ZONE "currentZone" 510#define TAG_COND_ZONE_NAME "zoneName" 511#define TAG_COND_ZONE_TYPE "zoneType" 512#define TAG_COND_INHERITED_FS "inheritedFileSystem" 513#define TAG_COND_FS_NAME "fileSystemName" 514#define TAG_VALUE_GLOBAL_ZONE "global" 515#define TAG_VALUE_NONGLOBAL_ZONE "nonglobal" 516 517typedef struct _sml_tag_struct SML_TAG; 518typedef struct _sml_parameter_struct SML_PARAM; 519 520struct _sml_tag_struct { 521 char *name; /* tag name */ 522 int params_num; /* # params in *params */ 523 SML_PARAM *params; /* tag parameters */ 524 int tags_num; /* # subtags in *tags */ 525 SML_TAG *tags; /* tag subtags */ 526}; 527 528struct _sml_parameter_struct { 529 char *name; /* tag name */ 530 char *value; /* parameters */ 531}; 532 533SML_TAG *smlAddTag(SML_TAG **r_tag, int a_index, 534 SML_TAG *a_subTag); 535boolean_t smlFstatCompareEq(struct stat *statbuf, 536 SML_TAG *tag, char *path); 537char *smlConvertTagToString(SML_TAG *tag); 538/*PRINTFLIKE2*/ 539void smlDbgPrintTag(SML_TAG *a_tag, char *a_format, ...); 540void smlDelTag(SML_TAG *tag, SML_TAG *sub_tag); 541void smlDelParam(SML_TAG *tag, char *name); 542SML_TAG *smlDup(SML_TAG *tag); 543boolean_t smlFindAndDelTag(SML_TAG *tag, char *findTag); 544void smlFreeTag(SML_TAG *tag); 545char *smlGetElementName(SML_TAG *a_tag); 546int smlGetNumParams(SML_TAG *a_tag); 547char *smlGetParam(SML_TAG *tag, char *name); 548/*PRINTFLIKE2*/ 549char *smlGetParamF(SML_TAG *tag, char *format, ...); 550void smlGetParam_r(SML_TAG *tag, char *name, char *buf, 551 int bufLen); 552char *smlGetParamByTag(SML_TAG *tag, int index, 553 char *tagName, char *parmName); 554char *smlGetParamByTagParam(SML_TAG *tag, int index, 555 char *tagName, char *parmName, char *parmValue, 556 char *parmReturn); 557char *smlGetParamName(SML_TAG *tag, int index); 558SML_TAG *smlGetTag(SML_TAG *tag, int index); 559SML_TAG *smlGetTagByName(SML_TAG *tag, int index, char *name); 560SML_TAG *smlGetTagByTagParam(SML_TAG *tag, int index, 561 char *tagName, char *paramName, char *paramValue); 562boolean_t smlGetVerbose(void); 563int smlLoadTagFromFile(SML_TAG **r_tag, char *a_fileName); 564SML_TAG *smlNewTag(char *name); 565boolean_t smlParamEq(SML_TAG *tag, char *findTag, 566 char *findParam, char *str); 567/*PRINTFLIKE4*/ 568boolean_t smlParamEqF(SML_TAG *tag, char *findTag, char *findParam, 569 char *format, ...); 570void smlPrintTag(SML_TAG *tag); 571int smlReadOneTag(SML_TAG **r_tag, char *a_str); 572int smlConvertStringToTag(SML_TAG **r_tag, char *str); 573void smlSetFileStatInfo(SML_TAG **tag, 574 struct stat *statbuf, char *path); 575void smlSetParam(SML_TAG *tag, char *name, char *value); 576/*PRINTFLIKE3*/ 577void smlSetParamF(SML_TAG *tag, char *name, char *format, ...); 578void smlSetVerbose(boolean_t a_setting); 579int smlWriteTagToFd(SML_TAG *tag, int fd); 580int smlWriteTagToFile(SML_TAG *tag, char *filename); 581/*PRINTFLIKE3*/ 582void sml_strPrintf_r(char *a_buf, int a_bufLen, char *a_format, ...); 583/*PRINTFLIKE1*/ 584char *sml_strPrintf(char *a_format, ...); 585char *sml_XmlEncodeString(char *a_plainTextString); 586char *sml_XmlDecodeString(char *a_xmlEncodedString); 587 588#if defined(lint) && !defined(gettext) 589#define gettext(x) x 590#endif /* defined(lint) && !defined(gettext) */ 591 592#ifdef __cplusplus 593} 594#endif 595 596#endif /* __HDRS_LIBINST_H__ */ 597