1*45916cd2Sjpk /* 2*45916cd2Sjpk * CDDL HEADER START 3*45916cd2Sjpk * 4*45916cd2Sjpk * The contents of this file are subject to the terms of the 5*45916cd2Sjpk * Common Development and Distribution License (the "License"). 6*45916cd2Sjpk * You may not use this file except in compliance with the License. 7*45916cd2Sjpk * 8*45916cd2Sjpk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*45916cd2Sjpk * or http://www.opensolaris.org/os/licensing. 10*45916cd2Sjpk * See the License for the specific language governing permissions 11*45916cd2Sjpk * and limitations under the License. 12*45916cd2Sjpk * 13*45916cd2Sjpk * When distributing Covered Code, include this CDDL HEADER in each 14*45916cd2Sjpk * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*45916cd2Sjpk * If applicable, add the following below this CDDL HEADER, with the 16*45916cd2Sjpk * fields enclosed by brackets "[]" replaced with your own identifying 17*45916cd2Sjpk * information: Portions Copyright [yyyy] [name of copyright owner] 18*45916cd2Sjpk * 19*45916cd2Sjpk * CDDL HEADER END 20*45916cd2Sjpk */ 21*45916cd2Sjpk /* 22*45916cd2Sjpk * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23*45916cd2Sjpk * Use is subject to license terms. 24*45916cd2Sjpk */ 25*45916cd2Sjpk 26*45916cd2Sjpk #ifndef _LABELD_H 27*45916cd2Sjpk #define _LABELD_H 28*45916cd2Sjpk 29*45916cd2Sjpk #pragma ident "%Z%%M% %I% %E% SMI" 30*45916cd2Sjpk 31*45916cd2Sjpk #include <sys/types.h> 32*45916cd2Sjpk #include <tsol/label.h> 33*45916cd2Sjpk #include <sys/tsol/label_macro.h> 34*45916cd2Sjpk 35*45916cd2Sjpk #ifdef __cplusplus 36*45916cd2Sjpk extern "C" { 37*45916cd2Sjpk #endif 38*45916cd2Sjpk 39*45916cd2Sjpk /* 40*45916cd2Sjpk * Definitions for the call parameters for the door-based label 41*45916cd2Sjpk * translation service. 42*45916cd2Sjpk */ 43*45916cd2Sjpk 44*45916cd2Sjpk #define BUFSIZE 4096 45*45916cd2Sjpk 46*45916cd2Sjpk #define DOOR_PATH "/var/tsol/doors/" 47*45916cd2Sjpk #define DOOR_NAME "labeld" 48*45916cd2Sjpk #define COOKIE (void *)0x6c616264 /* "labd" */ 49*45916cd2Sjpk 50*45916cd2Sjpk /* Op codes */ 51*45916cd2Sjpk 52*45916cd2Sjpk /* Labeld Commands */ 53*45916cd2Sjpk 54*45916cd2Sjpk #define LABELDNULL 1 55*45916cd2Sjpk 56*45916cd2Sjpk /* Miscellaneous */ 57*45916cd2Sjpk 58*45916cd2Sjpk #define BLINSET 10 59*45916cd2Sjpk #define BSLVALID 11 60*45916cd2Sjpk #define BILVALID 12 61*45916cd2Sjpk #define BCLEARVALID 13 62*45916cd2Sjpk #define LABELINFO 14 63*45916cd2Sjpk #define LABELVERS 15 64*45916cd2Sjpk #define BLTOCOLOR 16 65*45916cd2Sjpk 66*45916cd2Sjpk /* Binary to String Label Translation */ 67*45916cd2Sjpk 68*45916cd2Sjpk #define BSLTOS 23 69*45916cd2Sjpk #define BCLEARTOS 25 70*45916cd2Sjpk 71*45916cd2Sjpk /* String to Binary Label Translation */ 72*45916cd2Sjpk 73*45916cd2Sjpk #define STOBSL 31 74*45916cd2Sjpk #define STOBCLEAR 33 75*45916cd2Sjpk 76*45916cd2Sjpk /* 77*45916cd2Sjpk * Dimming List Routines 78*45916cd2Sjpk * Contract private for label builders 79*45916cd2Sjpk */ 80*45916cd2Sjpk 81*45916cd2Sjpk #define BSLCVT 40 82*45916cd2Sjpk #define BCLEARCVT 42 83*45916cd2Sjpk #define LABELFIELDS 43 84*45916cd2Sjpk #define UDEFS 44 85*45916cd2Sjpk 86*45916cd2Sjpk #define GETFLABEL 45 87*45916cd2Sjpk #define SETFLABEL 46 88*45916cd2Sjpk #define ZCOPY 47 89*45916cd2Sjpk 90*45916cd2Sjpk /* NEW LABELS */ 91*45916cd2Sjpk /* DIA printer banner labels */ 92*45916cd2Sjpk 93*45916cd2Sjpk #define PR_CAVEATS 101 94*45916cd2Sjpk #define PR_CHANNELS 102 95*45916cd2Sjpk #define PR_LABEL 103 96*45916cd2Sjpk #define PR_TOP 104 97*45916cd2Sjpk 98*45916cd2Sjpk /* DIA label to string */ 99*45916cd2Sjpk 100*45916cd2Sjpk #define LTOS 105 101*45916cd2Sjpk 102*45916cd2Sjpk /* DIA string to label */ 103*45916cd2Sjpk 104*45916cd2Sjpk #define STOL 106 105*45916cd2Sjpk 106*45916cd2Sjpk /* Structures */ 107*45916cd2Sjpk 108*45916cd2Sjpk typedef uint_t bufp_t; /* offset into buf[] in/out string buffer */ 109*45916cd2Sjpk 110*45916cd2Sjpk /* Null call */ 111*45916cd2Sjpk 112*45916cd2Sjpk typedef struct { 113*45916cd2Sjpk int null; 114*45916cd2Sjpk } null_call_t; 115*45916cd2Sjpk 116*45916cd2Sjpk typedef struct { 117*45916cd2Sjpk int null; 118*45916cd2Sjpk } null_ret_t; 119*45916cd2Sjpk 120*45916cd2Sjpk /* Miscellaneous interfaces */ 121*45916cd2Sjpk 122*45916cd2Sjpk typedef struct { 123*45916cd2Sjpk bslabel_t label; 124*45916cd2Sjpk int type; 125*45916cd2Sjpk } inset_call_t; 126*45916cd2Sjpk 127*45916cd2Sjpk typedef struct { 128*45916cd2Sjpk int inset; 129*45916cd2Sjpk } inset_ret_t; 130*45916cd2Sjpk 131*45916cd2Sjpk typedef struct { 132*45916cd2Sjpk bslabel_t label; 133*45916cd2Sjpk } slvalid_call_t; 134*45916cd2Sjpk 135*45916cd2Sjpk typedef struct { 136*45916cd2Sjpk int valid; 137*45916cd2Sjpk } slvalid_ret_t; 138*45916cd2Sjpk 139*45916cd2Sjpk typedef struct { 140*45916cd2Sjpk bclear_t clear; 141*45916cd2Sjpk } clrvalid_call_t; 142*45916cd2Sjpk 143*45916cd2Sjpk typedef struct { 144*45916cd2Sjpk int valid; 145*45916cd2Sjpk } clrvalid_ret_t; 146*45916cd2Sjpk 147*45916cd2Sjpk typedef struct { 148*45916cd2Sjpk int null; 149*45916cd2Sjpk } info_call_t; 150*45916cd2Sjpk 151*45916cd2Sjpk typedef struct { 152*45916cd2Sjpk struct label_info info; 153*45916cd2Sjpk } info_ret_t; 154*45916cd2Sjpk 155*45916cd2Sjpk typedef struct { 156*45916cd2Sjpk int null; 157*45916cd2Sjpk } vers_call_t; 158*45916cd2Sjpk 159*45916cd2Sjpk typedef struct { 160*45916cd2Sjpk char vers[BUFSIZE]; 161*45916cd2Sjpk } vers_ret_t; 162*45916cd2Sjpk 163*45916cd2Sjpk typedef struct { 164*45916cd2Sjpk blevel_t label; 165*45916cd2Sjpk } color_call_t; 166*45916cd2Sjpk 167*45916cd2Sjpk typedef struct { 168*45916cd2Sjpk char color[BUFSIZE]; 169*45916cd2Sjpk } color_ret_t; 170*45916cd2Sjpk 171*45916cd2Sjpk /* Binary Label to String interfaces */ 172*45916cd2Sjpk 173*45916cd2Sjpk typedef struct { 174*45916cd2Sjpk bslabel_t label; 175*45916cd2Sjpk uint_t flags; 176*45916cd2Sjpk } bsltos_call_t; 177*45916cd2Sjpk 178*45916cd2Sjpk typedef struct { 179*45916cd2Sjpk char slabel[BUFSIZE]; 180*45916cd2Sjpk } bsltos_ret_t; 181*45916cd2Sjpk 182*45916cd2Sjpk typedef struct { 183*45916cd2Sjpk bclear_t clear; 184*45916cd2Sjpk uint_t flags; 185*45916cd2Sjpk } bcleartos_call_t; 186*45916cd2Sjpk 187*45916cd2Sjpk typedef struct { 188*45916cd2Sjpk char cslabel[BUFSIZE]; 189*45916cd2Sjpk } bcleartos_ret_t; 190*45916cd2Sjpk 191*45916cd2Sjpk /* String to Binary Label interfaces */ 192*45916cd2Sjpk 193*45916cd2Sjpk typedef struct { 194*45916cd2Sjpk bslabel_t label; 195*45916cd2Sjpk uint_t flags; 196*45916cd2Sjpk char string[BUFSIZE]; 197*45916cd2Sjpk } stobsl_call_t; 198*45916cd2Sjpk 199*45916cd2Sjpk typedef struct { 200*45916cd2Sjpk bslabel_t label; 201*45916cd2Sjpk } stobsl_ret_t; 202*45916cd2Sjpk 203*45916cd2Sjpk typedef struct { 204*45916cd2Sjpk bclear_t clear; 205*45916cd2Sjpk uint_t flags; 206*45916cd2Sjpk char string[BUFSIZE]; 207*45916cd2Sjpk } stobclear_call_t; 208*45916cd2Sjpk 209*45916cd2Sjpk typedef struct { 210*45916cd2Sjpk bclear_t clear; 211*45916cd2Sjpk } stobclear_ret_t; 212*45916cd2Sjpk 213*45916cd2Sjpk /* 214*45916cd2Sjpk * The following Dimming List and Miscellaneous interfaces 215*45916cd2Sjpk * implement contract private interfaces for the label builder 216*45916cd2Sjpk * interfaces. 217*45916cd2Sjpk */ 218*45916cd2Sjpk 219*45916cd2Sjpk /* Dimming List interfaces */ 220*45916cd2Sjpk 221*45916cd2Sjpk typedef struct { 222*45916cd2Sjpk bslabel_t label; 223*45916cd2Sjpk brange_t bounds; 224*45916cd2Sjpk uint_t flags; 225*45916cd2Sjpk } bslcvt_call_t; 226*45916cd2Sjpk 227*45916cd2Sjpk typedef struct { 228*45916cd2Sjpk bufp_t string; 229*45916cd2Sjpk bufp_t dim; 230*45916cd2Sjpk bufp_t lwords; 231*45916cd2Sjpk bufp_t swords; 232*45916cd2Sjpk size_t d_len; 233*45916cd2Sjpk size_t l_len; 234*45916cd2Sjpk size_t s_len; 235*45916cd2Sjpk int first_comp; 236*45916cd2Sjpk int first_mark; 237*45916cd2Sjpk char buf[BUFSIZE]; 238*45916cd2Sjpk } cvt_ret_t; 239*45916cd2Sjpk 240*45916cd2Sjpk typedef cvt_ret_t bslcvt_ret_t; 241*45916cd2Sjpk 242*45916cd2Sjpk typedef struct { 243*45916cd2Sjpk bclear_t clear; 244*45916cd2Sjpk brange_t bounds; 245*45916cd2Sjpk uint_t flags; 246*45916cd2Sjpk } bclearcvt_call_t; 247*45916cd2Sjpk 248*45916cd2Sjpk typedef cvt_ret_t bclearcvt_ret_t; 249*45916cd2Sjpk 250*45916cd2Sjpk /* Miscellaneous interfaces */ 251*45916cd2Sjpk 252*45916cd2Sjpk typedef struct { 253*45916cd2Sjpk int null; 254*45916cd2Sjpk } fields_call_t; 255*45916cd2Sjpk 256*45916cd2Sjpk typedef struct { 257*45916cd2Sjpk bufp_t classi; 258*45916cd2Sjpk bufp_t compsi; 259*45916cd2Sjpk bufp_t marksi; 260*45916cd2Sjpk char buf[BUFSIZE]; 261*45916cd2Sjpk } fields_ret_t; 262*45916cd2Sjpk 263*45916cd2Sjpk typedef struct { 264*45916cd2Sjpk int null; 265*45916cd2Sjpk } udefs_call_t; 266*45916cd2Sjpk 267*45916cd2Sjpk typedef struct { 268*45916cd2Sjpk bslabel_t sl; 269*45916cd2Sjpk bclear_t clear; 270*45916cd2Sjpk } udefs_ret_t; 271*45916cd2Sjpk 272*45916cd2Sjpk typedef struct { 273*45916cd2Sjpk bslabel_t sl; 274*45916cd2Sjpk char pathname[BUFSIZE]; 275*45916cd2Sjpk } setfbcl_call_t; 276*45916cd2Sjpk 277*45916cd2Sjpk typedef struct { 278*45916cd2Sjpk int status; 279*45916cd2Sjpk } setfbcl_ret_t; 280*45916cd2Sjpk 281*45916cd2Sjpk typedef struct { 282*45916cd2Sjpk bslabel_t src_win_sl; 283*45916cd2Sjpk int transfer_mode; 284*45916cd2Sjpk bufp_t remote_dir; 285*45916cd2Sjpk bufp_t filename; 286*45916cd2Sjpk bufp_t local_dir; 287*45916cd2Sjpk bufp_t display; 288*45916cd2Sjpk char buf[BUFSIZE]; 289*45916cd2Sjpk } zcopy_call_t; 290*45916cd2Sjpk 291*45916cd2Sjpk typedef struct { 292*45916cd2Sjpk int status; 293*45916cd2Sjpk } zcopy_ret_t; 294*45916cd2Sjpk 295*45916cd2Sjpk typedef struct { 296*45916cd2Sjpk m_label_t label; 297*45916cd2Sjpk uint_t flags; 298*45916cd2Sjpk } pr_call_t; 299*45916cd2Sjpk 300*45916cd2Sjpk typedef struct { 301*45916cd2Sjpk char buf[BUFSIZE]; 302*45916cd2Sjpk } pr_ret_t; 303*45916cd2Sjpk 304*45916cd2Sjpk typedef struct { 305*45916cd2Sjpk m_label_t label; 306*45916cd2Sjpk uint_t flags; 307*45916cd2Sjpk } ls_call_t; 308*45916cd2Sjpk 309*45916cd2Sjpk typedef struct { 310*45916cd2Sjpk char buf[BUFSIZE]; 311*45916cd2Sjpk } ls_ret_t; 312*45916cd2Sjpk 313*45916cd2Sjpk typedef struct { 314*45916cd2Sjpk m_label_t label; 315*45916cd2Sjpk uint_t flags; 316*45916cd2Sjpk char string[BUFSIZE]; 317*45916cd2Sjpk } sl_call_t; 318*45916cd2Sjpk 319*45916cd2Sjpk typedef struct { 320*45916cd2Sjpk m_label_t label; 321*45916cd2Sjpk } sl_ret_t; 322*45916cd2Sjpk 323*45916cd2Sjpk /* Labeld operation call structure */ 324*45916cd2Sjpk 325*45916cd2Sjpk typedef struct { 326*45916cd2Sjpk uint_t op; 327*45916cd2Sjpk union { 328*45916cd2Sjpk null_call_t null_arg; 329*45916cd2Sjpk 330*45916cd2Sjpk inset_call_t inset_arg; 331*45916cd2Sjpk slvalid_call_t slvalid_arg; 332*45916cd2Sjpk clrvalid_call_t clrvalid_arg; 333*45916cd2Sjpk info_call_t info_arg; 334*45916cd2Sjpk vers_call_t vers_arg; 335*45916cd2Sjpk color_call_t color_arg; 336*45916cd2Sjpk 337*45916cd2Sjpk bsltos_call_t bsltos_arg; 338*45916cd2Sjpk bcleartos_call_t bcleartos_arg; 339*45916cd2Sjpk 340*45916cd2Sjpk stobsl_call_t stobsl_arg; 341*45916cd2Sjpk stobclear_call_t stobclear_arg; 342*45916cd2Sjpk 343*45916cd2Sjpk bslcvt_call_t bslcvt_arg; 344*45916cd2Sjpk bclearcvt_call_t bclearcvt_arg; 345*45916cd2Sjpk fields_call_t fields_arg; 346*45916cd2Sjpk udefs_call_t udefs_arg; 347*45916cd2Sjpk setfbcl_call_t setfbcl_arg; 348*45916cd2Sjpk zcopy_call_t zcopy_arg; 349*45916cd2Sjpk pr_call_t pr_arg; 350*45916cd2Sjpk ls_call_t ls_arg; 351*45916cd2Sjpk sl_call_t sl_arg; 352*45916cd2Sjpk } cargs; 353*45916cd2Sjpk } labeld_call_t; 354*45916cd2Sjpk 355*45916cd2Sjpk /* Labeld operation return structure */ 356*45916cd2Sjpk 357*45916cd2Sjpk typedef struct { 358*45916cd2Sjpk int ret; /* labeld return codes */ 359*45916cd2Sjpk int err; /* function error codes */ 360*45916cd2Sjpk union { 361*45916cd2Sjpk null_ret_t null_ret; 362*45916cd2Sjpk 363*45916cd2Sjpk inset_ret_t inset_ret; 364*45916cd2Sjpk slvalid_ret_t slvalid_ret; 365*45916cd2Sjpk clrvalid_ret_t clrvalid_ret; 366*45916cd2Sjpk info_ret_t info_ret; 367*45916cd2Sjpk vers_ret_t vers_ret; 368*45916cd2Sjpk color_ret_t color_ret; 369*45916cd2Sjpk 370*45916cd2Sjpk bsltos_ret_t bsltos_ret; 371*45916cd2Sjpk bcleartos_ret_t bcleartos_ret; 372*45916cd2Sjpk 373*45916cd2Sjpk stobsl_ret_t stobsl_ret; 374*45916cd2Sjpk stobclear_ret_t stobclear_ret; 375*45916cd2Sjpk 376*45916cd2Sjpk bslcvt_ret_t bslcvt_ret; 377*45916cd2Sjpk bclearcvt_ret_t bclearcvt_ret; 378*45916cd2Sjpk fields_ret_t fields_ret; 379*45916cd2Sjpk udefs_ret_t udefs_ret; 380*45916cd2Sjpk setfbcl_ret_t setfbcl_ret; 381*45916cd2Sjpk zcopy_ret_t zcopy_ret; 382*45916cd2Sjpk pr_ret_t pr_ret; 383*45916cd2Sjpk ls_ret_t ls_ret; 384*45916cd2Sjpk sl_ret_t sl_ret; 385*45916cd2Sjpk } rvals; 386*45916cd2Sjpk } labeld_ret_t; 387*45916cd2Sjpk 388*45916cd2Sjpk /* Labeld call/return structure */ 389*45916cd2Sjpk 390*45916cd2Sjpk typedef struct { 391*45916cd2Sjpk union { 392*45916cd2Sjpk labeld_call_t acall; 393*45916cd2Sjpk labeld_ret_t aret; 394*45916cd2Sjpk } param; 395*45916cd2Sjpk } labeld_data_t; 396*45916cd2Sjpk 397*45916cd2Sjpk #define callop param.acall.op 398*45916cd2Sjpk #define retret param.aret.ret 399*45916cd2Sjpk #define reterr param.aret.err 400*45916cd2Sjpk 401*45916cd2Sjpk #define CALL_SIZE(type, buf) (size_t)(sizeof (type) + sizeof (int) + (buf)) 402*45916cd2Sjpk #define RET_SIZE(type, buf) (size_t)(sizeof (type) + 2*sizeof (int) + (buf)) 403*45916cd2Sjpk 404*45916cd2Sjpk /* Labeld common client call function */ 405*45916cd2Sjpk 406*45916cd2Sjpk int 407*45916cd2Sjpk __call_labeld(labeld_data_t **dptr, size_t *ndata, size_t *adata); 408*45916cd2Sjpk 409*45916cd2Sjpk /* Return Codes */ 410*45916cd2Sjpk 411*45916cd2Sjpk #define SUCCESS 1 /* Call OK */ 412*45916cd2Sjpk #define NOTFOUND -1 /* Function not found */ 413*45916cd2Sjpk #define SERVERFAULT -2 /* Internal labeld error */ 414*45916cd2Sjpk #define NOSERVER -3 /* No server thread available, try later */ 415*45916cd2Sjpk 416*45916cd2Sjpk /* Flag Translation Values */ 417*45916cd2Sjpk 418*45916cd2Sjpk #define L_NEW_LABEL 0x10000000 419*45916cd2Sjpk 420*45916cd2Sjpk /* GFI FLAGS */ 421*45916cd2Sjpk 422*45916cd2Sjpk #define GFI_FLAG_MASK 0x0000FFFF 423*45916cd2Sjpk #define GFI_ACCESS_RELATED 0x00000001 424*45916cd2Sjpk 425*45916cd2Sjpk /* binary to ASCII */ 426*45916cd2Sjpk 427*45916cd2Sjpk #define LABELS_NO_CLASS 0x00010000 428*45916cd2Sjpk #define LABELS_SHORT_CLASS 0x00020000 429*45916cd2Sjpk #define LABELS_SHORT_WORDS 0x00040000 430*45916cd2Sjpk 431*45916cd2Sjpk /* Label view */ 432*45916cd2Sjpk 433*45916cd2Sjpk #define LABELS_VIEW_INTERNAL 0x00100000 434*45916cd2Sjpk #define LABELS_VIEW_EXTERNAL 0x00200000 435*45916cd2Sjpk 436*45916cd2Sjpk /* Dimming list (convert -- b*cvt* ) */ 437*45916cd2Sjpk 438*45916cd2Sjpk #define LABELS_FULL_CONVERT 0x00010000 439*45916cd2Sjpk 440*45916cd2Sjpk /* ASCII to binary */ 441*45916cd2Sjpk 442*45916cd2Sjpk #define LABELS_NEW_LABEL 0x00010000 443*45916cd2Sjpk #define LABELS_FULL_PARSE 0x00020000 444*45916cd2Sjpk #define LABELS_ONLY_INFO_LABEL 0x00040000 445*45916cd2Sjpk 446*45916cd2Sjpk #define MOVE_FILE 0 447*45916cd2Sjpk #define COPY_FILE 1 448*45916cd2Sjpk #define LINK_FILE 2 449*45916cd2Sjpk 450*45916cd2Sjpk #define PIPEMSG_FILEOP_ERROR 1 451*45916cd2Sjpk #define PIPEMSG_EXIST_ERROR 2 452*45916cd2Sjpk #define PIPEMSG_DONE 7 453*45916cd2Sjpk #define PIPEMSG_PATH_ERROR 20 454*45916cd2Sjpk #define PIPEMSG_ZONE_ERROR 21 455*45916cd2Sjpk #define PIPEMSG_LABEL_ERROR 22 456*45916cd2Sjpk #define PIPEMSG_READ_ERROR 23 457*45916cd2Sjpk #define PIPEMSG_READONLY_ERROR 24 458*45916cd2Sjpk #define PIPEMSG_WRITE_ERROR 25 459*45916cd2Sjpk #define PIPEMSG_CREATE_ERROR 26 460*45916cd2Sjpk #define PIPEMSG_DELETE_ERROR 27 461*45916cd2Sjpk #define PIPEMSG_CANCEL 101 462*45916cd2Sjpk #define PIPEMSG_PROCEED 102 463*45916cd2Sjpk #define PIPEMSG_MERGE 103 464*45916cd2Sjpk #define PIPEMSG_REPLACE_BUFFER 104 465*45916cd2Sjpk #define PIPEMSG_RENAME_BUFFER 105 466*45916cd2Sjpk #define PIPEMSG_MULTI_PROCEED 106 467*45916cd2Sjpk #define PIPEMSG_RENAME_FILE 107 468*45916cd2Sjpk 469*45916cd2Sjpk #ifdef __cplusplus 470*45916cd2Sjpk } 471*45916cd2Sjpk #endif 472*45916cd2Sjpk 473*45916cd2Sjpk #endif /* _LABELD_H */ 474