Print this page




 306 /*
 307  * Closes the given brand handle
 308  */
 309 void
 310 brand_close(brand_handle_t bh)
 311 {
 312         struct brand_handle *bhp = (struct brand_handle *)bh;
 313         if (bhp->bh_platform != NULL)
 314                 xmlFreeDoc(bhp->bh_platform);
 315         if (bhp->bh_config != NULL)
 316                 xmlFreeDoc(bhp->bh_config);
 317         free(bhp);
 318 }
 319 
 320 static int
 321 i_substitute_tokens(const char *sbuf, char *dbuf, int dbuf_size,
 322     const char *zonename, const char *zonepath, const char *username,
 323     const char *curr_zone)
 324 {
 325         int dst, src;
 326         static char *env_pool = NULL;
 327 
 328         /*
 329          * Walk through the characters, substituting values as needed.
 330          */
 331         dbuf[0] = '\0';
 332         dst = 0;
 333         for (src = 0; src < strlen((char *)sbuf) && dst < dbuf_size; src++) {
 334                 if (sbuf[src] != '%') {
 335                         dbuf[dst++] = sbuf[src];
 336                         continue;
 337                 }
 338 
 339                 switch (sbuf[++src]) {
 340                 case '%':
 341                         dst += strlcpy(dbuf + dst, "%", dbuf_size - dst);
 342                         break;
 343                 case 'P':
 344                         if (env_pool == NULL)
 345                                 env_pool = getenv("_ZONEADMD_ZPOOL");
 346                         if (env_pool == NULL)
 347                                 break;
 348                         dst += strlcpy(dbuf + dst, env_pool, dbuf_size - dst);
 349                         break;
 350                 case 'R':
 351                         if (zonepath == NULL)
 352                                 break;
 353                         dst += strlcpy(dbuf + dst, zonepath, dbuf_size - dst);
 354                         break;
 355                 case 'u':
 356                         if (username == NULL)
 357                                 break;
 358                         dst += strlcpy(dbuf + dst, username, dbuf_size - dst);
 359                         break;
 360                 case 'Z':
 361                         if (curr_zone == NULL)
 362                                 break;
 363                         /* name of the zone we're running in */
 364                         dst += strlcpy(dbuf + dst, curr_zone, dbuf_size - dst);
 365                         break;
 366                 case 'z':
 367                         /* name of the zone we're operating on */
 368                         if (zonename == NULL)
 369                                 break;




 306 /*
 307  * Closes the given brand handle
 308  */
 309 void
 310 brand_close(brand_handle_t bh)
 311 {
 312         struct brand_handle *bhp = (struct brand_handle *)bh;
 313         if (bhp->bh_platform != NULL)
 314                 xmlFreeDoc(bhp->bh_platform);
 315         if (bhp->bh_config != NULL)
 316                 xmlFreeDoc(bhp->bh_config);
 317         free(bhp);
 318 }
 319 
 320 static int
 321 i_substitute_tokens(const char *sbuf, char *dbuf, int dbuf_size,
 322     const char *zonename, const char *zonepath, const char *username,
 323     const char *curr_zone)
 324 {
 325         int dst, src;

 326 
 327         /*
 328          * Walk through the characters, substituting values as needed.
 329          */
 330         dbuf[0] = '\0';
 331         dst = 0;
 332         for (src = 0; src < strlen((char *)sbuf) && dst < dbuf_size; src++) {
 333                 if (sbuf[src] != '%') {
 334                         dbuf[dst++] = sbuf[src];
 335                         continue;
 336                 }
 337 
 338                 switch (sbuf[++src]) {
 339                 case '%':
 340                         dst += strlcpy(dbuf + dst, "%", dbuf_size - dst);
 341                         break;







 342                 case 'R':
 343                         if (zonepath == NULL)
 344                                 break;
 345                         dst += strlcpy(dbuf + dst, zonepath, dbuf_size - dst);
 346                         break;
 347                 case 'u':
 348                         if (username == NULL)
 349                                 break;
 350                         dst += strlcpy(dbuf + dst, username, dbuf_size - dst);
 351                         break;
 352                 case 'Z':
 353                         if (curr_zone == NULL)
 354                                 break;
 355                         /* name of the zone we're running in */
 356                         dst += strlcpy(dbuf + dst, curr_zone, dbuf_size - dst);
 357                         break;
 358                 case 'z':
 359                         /* name of the zone we're operating on */
 360                         if (zonename == NULL)
 361                                 break;