00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <errno.h>
00035 #include <string.h>
00036 #include <ctype.h>
00037 #include <stdlib.h>
00038 #include <stdio.h>
00039 #include <OpenIPMI/ipmiif.h>
00040 #include <OpenIPMI/ipmi_solparm.h>
00041 #include <OpenIPMI/ipmi_cmdlang.h>
00042 #include <OpenIPMI/ipmi_mc.h>
00043
00044
00045 #include <OpenIPMI/internal/ipmi_malloc.h>
00046 #include <OpenIPMI/internal/locked_list.h>
00047
00048 static locked_list_t *solcs;
00049
00050 static void
00051 solparm_list_handler(ipmi_solparm_t *solparm, void *cb_data)
00052 {
00053 ipmi_cmd_info_t *cmd_info = cb_data;
00054 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00055 char solparm_name[IPMI_SOLPARM_NAME_LEN];
00056
00057 if (cmdlang->err)
00058 return;
00059
00060 ipmi_solparm_get_name(solparm, solparm_name, sizeof(solparm_name));
00061
00062 ipmi_cmdlang_out(cmd_info, "Name", solparm_name);
00063 }
00064
00065 static void
00066 solparm_list(ipmi_domain_t *domain, void *cb_data)
00067 {
00068 ipmi_cmd_info_t *cmd_info = cb_data;
00069 char domain_name[IPMI_DOMAIN_NAME_LEN];
00070
00071 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00072 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00073 ipmi_cmdlang_down(cmd_info);
00074 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00075 ipmi_cmdlang_out(cmd_info, "SOLPARMs", NULL);
00076 ipmi_cmdlang_down(cmd_info);
00077 ipmi_solparm_iterate_solparms(domain, solparm_list_handler, cmd_info);
00078 ipmi_cmdlang_up(cmd_info);
00079 ipmi_cmdlang_up(cmd_info);
00080 }
00081
00082 static void
00083 get_mc_name(ipmi_mc_t *mc, void *cb_data)
00084 {
00085 ipmi_cmd_info_t *cmd_info = cb_data;
00086 char mc_name[IPMI_MC_NAME_LEN];
00087
00088 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name));
00089 ipmi_cmdlang_out(cmd_info, "MC", mc_name);
00090 }
00091
00092 static void
00093 solparm_info(ipmi_solparm_t *solparm, void *cb_data)
00094 {
00095 ipmi_cmd_info_t *cmd_info = cb_data;
00096 int rv;
00097 char solparm_name[IPMI_SOLPARM_NAME_LEN];
00098
00099 ipmi_solparm_get_name(solparm, solparm_name, sizeof(solparm_name));
00100
00101 ipmi_cmdlang_out(cmd_info, "SOLPARM", NULL);
00102 ipmi_cmdlang_down(cmd_info);
00103 ipmi_cmdlang_out(cmd_info, "Name", solparm_name);
00104 rv = ipmi_mc_pointer_cb(ipmi_solparm_get_mc_id(solparm), get_mc_name,
00105 cmd_info);
00106 ipmi_cmdlang_out_int(cmd_info, "Channel",
00107 ipmi_solparm_get_channel(solparm));
00108 ipmi_cmdlang_up(cmd_info);
00109 }
00110
00111 static void
00112 solparm_new(ipmi_mc_t *mc, void *cb_data)
00113 {
00114 ipmi_cmd_info_t *cmd_info = cb_data;
00115 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00116 int channel;
00117 int rv;
00118 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00119 int argc = ipmi_cmdlang_get_argc(cmd_info);
00120 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00121 ipmi_solparm_t *solparm;
00122 char solparm_name[IPMI_SOLPARM_NAME_LEN];
00123
00124 if ((argc - curr_arg) < 1) {
00125
00126 cmdlang->errstr = "Not enough parameters";
00127 cmdlang->err = EINVAL;
00128 goto out_err;
00129 }
00130
00131 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00132 if (cmdlang->err) {
00133 cmdlang->errstr = "channel invalid";
00134 goto out_err;
00135 }
00136 curr_arg++;
00137
00138 rv = ipmi_solparm_alloc(mc, channel, &solparm);
00139 if (rv) {
00140 cmdlang->errstr = "Error from ipmi_solparm_alloc";
00141 cmdlang->err = rv;
00142 goto out_err;
00143 }
00144
00145 ipmi_solparm_get_name(solparm, solparm_name, sizeof(solparm_name));
00146 ipmi_cmdlang_out(cmd_info, "SOLPARM", solparm_name);
00147
00148 return;
00149
00150 out_err:
00151 ipmi_mc_get_name(mc, cmdlang->objstr,
00152 cmdlang->objstr_len);
00153 cmdlang->location = "cmd_solparm.c(solparm_new)";
00154 }
00155
00156 typedef struct solparm_info_s
00157 {
00158 char name[IPMI_SOLPARM_NAME_LEN];
00159 ipmi_cmd_info_t *cmd_info;
00160 } solparm_info_t;
00161
00162 static void
00163 solparm_close_done(ipmi_solparm_t *solparm, int err, void *cb_data)
00164 {
00165 solparm_info_t *info = cb_data;
00166 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00167 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00168
00169 ipmi_cmdlang_lock(cmd_info);
00170 if (err) {
00171 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00172 cmdlang->objstr_len);
00173 cmdlang->errstr = "Error closing SOLPARM";
00174 cmdlang->err = err;
00175 cmdlang->location = "cmd_solparm.c(solparm_close_done)";
00176 goto out;
00177 }
00178
00179 ipmi_cmdlang_out(cmd_info, "SOLPARM destroyed", info->name);
00180
00181 out:
00182 ipmi_cmdlang_unlock(cmd_info);
00183 ipmi_cmdlang_cmd_info_put(cmd_info);
00184 ipmi_mem_free(info);
00185 }
00186
00187 static void
00188 solparm_close(ipmi_solparm_t *solparm, void *cb_data)
00189 {
00190 ipmi_cmd_info_t *cmd_info = cb_data;
00191 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00192 int rv;
00193 solparm_info_t *info;
00194
00195 info = ipmi_mem_alloc(sizeof(*info));
00196 if (!info) {
00197 cmdlang->errstr = "Out of memory";
00198 cmdlang->err = ENOMEM;
00199 goto out_err;
00200 }
00201 info->cmd_info = cmd_info;
00202 ipmi_solparm_get_name(solparm, info->name, sizeof(info->name));
00203
00204 ipmi_cmdlang_cmd_info_get(cmd_info);
00205 rv = ipmi_solparm_destroy(solparm, solparm_close_done, info);
00206 if (rv) {
00207 ipmi_cmdlang_cmd_info_put(cmd_info);
00208 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00209 cmdlang->objstr_len);
00210 cmdlang->errstr = "Error closing SOLPARM";
00211 cmdlang->err = rv;
00212 ipmi_mem_free(info);
00213 }
00214 return;
00215
00216 out_err:
00217 cmdlang->location = "cmd_solparm.c(solparm_close)";
00218 }
00219
00220 #define SOL_CONFIG_NAME_LEN 80
00221 typedef struct sol_config_info_s
00222 {
00223 char name[SOL_CONFIG_NAME_LEN];
00224 ipmi_sol_config_t *config;
00225 } sol_config_info_t;
00226
00227 static unsigned int unique_num = 0;
00228
00229 typedef struct find_config_s
00230 {
00231 char *name;
00232 ipmi_sol_config_t *config;
00233 int delete;
00234 } find_config_t;
00235
00236 static int
00237 find_config_handler(void *cb_data, void *item1, void *item2)
00238 {
00239 sol_config_info_t *info = item1;
00240 find_config_t *find = cb_data;
00241
00242 if (strcmp(find->name, info->name) == 0) {
00243 find->config = info->config;
00244 if (find->delete) {
00245 locked_list_remove(solcs, item1, item2);
00246 ipmi_mem_free(info);
00247 }
00248 return LOCKED_LIST_ITER_STOP;
00249 }
00250
00251 return LOCKED_LIST_ITER_CONTINUE;
00252 }
00253
00254 static ipmi_sol_config_t *
00255 find_config(char *name, int delete)
00256 {
00257 find_config_t find;
00258
00259 find.name = name;
00260 find.config = NULL;
00261 find.delete = delete;
00262 locked_list_iterate(solcs, find_config_handler, &find);
00263 return find.config;
00264 }
00265
00266 typedef void (*lp_set)(ipmi_cmd_info_t *cmd_info, char *val,
00267 ipmi_sol_config_t *solc, void *func);
00268 typedef void (*lp_out)(ipmi_cmd_info_t *cmd_info, char *name,
00269 ipmi_sol_config_t *solc, void *func);
00270 typedef struct lp_item_s
00271 {
00272 lp_set set;
00273 lp_out out;
00274 } lp_item_t;
00275
00276 static void
00277 set_retint(ipmi_cmd_info_t *cmd_info, char *val,
00278 ipmi_sol_config_t *solc, void *func)
00279 {
00280 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00281 int (*f)(ipmi_sol_config_t *l, unsigned int v) = func;
00282 int v;
00283
00284 ipmi_cmdlang_get_int(val, &v, cmd_info);
00285 if (!cmdlang->err) {
00286 cmdlang->err = f(solc, v);
00287 if (cmdlang->err) {
00288 cmdlang->errstr = "Error setting parameter";
00289 }
00290 }
00291 }
00292 static void
00293 out_retint(ipmi_cmd_info_t *cmd_info, char *name,
00294 ipmi_sol_config_t *solc, void *func)
00295 {
00296 unsigned int (*f)(ipmi_sol_config_t *l) = func;
00297 ipmi_cmdlang_out_int(cmd_info, name, f(solc));
00298 }
00299 static lp_item_t lp_retint = {set_retint, out_retint};
00300
00301 static void
00302 set_retbool(ipmi_cmd_info_t *cmd_info, char *val,
00303 ipmi_sol_config_t *solc, void *func)
00304 {
00305 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00306 int (*f)(ipmi_sol_config_t *l, unsigned int v) = func;
00307 int v;
00308
00309 ipmi_cmdlang_get_bool(val, &v, cmd_info);
00310 if (!cmdlang->err) {
00311 cmdlang->err = f(solc, v);
00312 if (cmdlang->err) {
00313 cmdlang->errstr = "Error setting parameter";
00314 }
00315 }
00316 }
00317 static void
00318 out_retbool(ipmi_cmd_info_t *cmd_info, char *name,
00319 ipmi_sol_config_t *solc, void *func)
00320 {
00321 unsigned int (*f)(ipmi_sol_config_t *l) = func;
00322 ipmi_cmdlang_out_bool(cmd_info, name, f(solc));
00323 }
00324 static lp_item_t lp_retbool = {set_retbool, out_retbool};
00325
00326 static void
00327 set_int(ipmi_cmd_info_t *cmd_info, char *val,
00328 ipmi_sol_config_t *solc, void *func)
00329 {
00330 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00331 int (*f)(ipmi_sol_config_t *l, unsigned int v) = func;
00332 int v;
00333
00334 ipmi_cmdlang_get_int(val, &v, cmd_info);
00335 if (!cmdlang->err) {
00336 cmdlang->err = f(solc, v);
00337 if (cmdlang->err) {
00338 cmdlang->errstr = "Error setting parameter";
00339 }
00340 }
00341 }
00342 static void
00343 out_int(ipmi_cmd_info_t *cmd_info, char *name,
00344 ipmi_sol_config_t *solc, void *func)
00345 {
00346 unsigned int v;
00347 int rv;
00348 int (*f)(ipmi_sol_config_t *l, unsigned int *v) = func;
00349
00350 rv = f(solc, &v);
00351 if (!rv)
00352 ipmi_cmdlang_out_int(cmd_info, name, v);
00353 }
00354 static lp_item_t lp_int = {set_int, out_int};
00355
00356 static struct lps_s
00357 {
00358 char *name;
00359 lp_item_t *lpi;
00360 void *get_func;
00361 void *set_func;
00362 } lps[] =
00363
00364 #define FR(name, type) { #name, &lp_ ## type, ipmi_solconfig_get_ ## name, \
00365 NULL }
00366
00367 #define F(name, type) { #name, &lp_ ## type, ipmi_solconfig_get_ ## name, \
00368 ipmi_solconfig_set_ ## name }
00369 {
00370 F(enable, retbool),
00371 F(force_payload_encryption, retbool),
00372 F(force_payload_authentication, retbool),
00373 F(privilege_level, retint),
00374 F(char_accumulation_interval, retint),
00375 F(char_send_threshold, retint),
00376 F(retry_count, retint),
00377 F(retry_interval, retint),
00378 F(port_number, retint),
00379 FR(payload_channel, int),
00380 { NULL }
00381 };
00382
00383 static void
00384 config_info(ipmi_cmd_info_t *cmd_info, ipmi_sol_config_t *config)
00385 {
00386 int i;
00387
00388
00389 for (i=0; lps[i].name; i++) {
00390 lp_item_t *lp = lps[i].lpi;
00391 lp->out(cmd_info, lps[i].name, config, lps[i].get_func);
00392 }
00393 }
00394
00395 static void
00396 solparm_config_get_done(ipmi_solparm_t *solparm,
00397 int err,
00398 ipmi_sol_config_t *config,
00399 void *cb_data)
00400 {
00401 ipmi_cmd_info_t *cmd_info = cb_data;
00402 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00403 char solparm_name[IPMI_SOLPARM_NAME_LEN];
00404 sol_config_info_t *info;
00405
00406 ipmi_cmdlang_lock(cmd_info);
00407 if (err) {
00408 cmdlang->errstr = "Error getting SOLPARM";
00409 cmdlang->err = err;
00410 goto out;
00411 }
00412
00413 ipmi_solparm_get_name(solparm, solparm_name, sizeof(solparm_name));
00414
00415 info = ipmi_mem_alloc(sizeof(*info));
00416 if (!info) {
00417 cmdlang->errstr = "Out of memory";
00418 cmdlang->err = ENOMEM;
00419 ipmi_sol_free_config(config);
00420 goto out;
00421 }
00422 snprintf(info->name, sizeof(info->name), "%s.%u",
00423 solparm_name, unique_num);
00424 info->config = config;
00425 if (!locked_list_add(solcs, info, NULL)) {
00426 cmdlang->errstr = "Out of memory";
00427 cmdlang->err = ENOMEM;
00428 ipmi_sol_free_config(config);
00429 ipmi_mem_free(info);
00430 goto out;
00431 }
00432 unique_num++;
00433
00434 ipmi_cmdlang_out(cmd_info, "SOLPARM Config", NULL);
00435 ipmi_cmdlang_down(cmd_info);
00436 ipmi_cmdlang_out(cmd_info, "Name", info->name);
00437 config_info(cmd_info, config);
00438 ipmi_cmdlang_up(cmd_info);
00439
00440 out:
00441 if (cmdlang->err) {
00442 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00443 cmdlang->objstr_len);
00444 cmdlang->location = "cmd_solparm.c(solparm_config_get_done)";
00445 }
00446 ipmi_cmdlang_unlock(cmd_info);
00447 ipmi_cmdlang_cmd_info_put(cmd_info);
00448 }
00449
00450 static void
00451 solparm_config_get(ipmi_solparm_t *solparm, void *cb_data)
00452 {
00453 ipmi_cmd_info_t *cmd_info = cb_data;
00454 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00455 int rv;
00456
00457 ipmi_cmdlang_cmd_info_get(cmd_info);
00458 rv = ipmi_sol_get_config(solparm, solparm_config_get_done, cmd_info);
00459 if (rv) {
00460 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00461 cmdlang->objstr_len);
00462 ipmi_cmdlang_cmd_info_put(cmd_info);
00463 cmdlang->errstr = "Error getting SOLPARM";
00464 cmdlang->err = rv;
00465 cmdlang->location = "cmd_solparm.c(solparm_config_get)";
00466 }
00467 }
00468
00469 typedef struct lp_config_op_s
00470 {
00471 char name[SOL_CONFIG_NAME_LEN];
00472 ipmi_cmd_info_t *cmd_info;
00473 } lp_config_op_t;
00474
00475 static void
00476 solparm_config_set_done(ipmi_solparm_t *solparm,
00477 int err,
00478 void *cb_data)
00479 {
00480 lp_config_op_t *info = cb_data;
00481 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00482 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00483
00484 ipmi_cmdlang_lock(cmd_info);
00485 if (err) {
00486 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00487 cmdlang->objstr_len);
00488 cmdlang->errstr = "Error setting SOLPARM";
00489 cmdlang->err = err;
00490 cmdlang->location = "cmd_solparm.c(solparm_config_set_done)";
00491 goto out;
00492 }
00493
00494 ipmi_cmdlang_out(cmd_info, "SOLPARM config set", info->name);
00495
00496 out:
00497 ipmi_mem_free(info);
00498 ipmi_cmdlang_unlock(cmd_info);
00499 ipmi_cmdlang_cmd_info_put(cmd_info);
00500 }
00501
00502 static void
00503 solparm_config_set(ipmi_solparm_t *solparm, void *cb_data)
00504 {
00505 ipmi_cmd_info_t *cmd_info = cb_data;
00506 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00507 int rv;
00508 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00509 int argc = ipmi_cmdlang_get_argc(cmd_info);
00510 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00511 ipmi_sol_config_t *solc;
00512 lp_config_op_t *info = cb_data;
00513 char *name;
00514
00515 if ((argc - curr_arg) < 1) {
00516
00517 cmdlang->errstr = "Not enough parameters";
00518 cmdlang->err = EINVAL;
00519 goto out_err;
00520 }
00521
00522 name = argv[curr_arg];
00523 curr_arg++;
00524
00525 solc = find_config(name, 0);
00526 if (!solc) {
00527 cmdlang->errstr = "Invalid SOL config";
00528 cmdlang->err = EINVAL;
00529 goto out_err;
00530 }
00531
00532 info = ipmi_mem_alloc(sizeof(*info));
00533 if (!info) {
00534 cmdlang->errstr = "Out of memory";
00535 cmdlang->err = ENOMEM;
00536 goto out_err;
00537 }
00538 info->cmd_info = cmd_info;
00539 strncpy(info->name, name, sizeof(info->name));
00540
00541 ipmi_cmdlang_cmd_info_get(cmd_info);
00542 rv = ipmi_sol_set_config(solparm, solc, solparm_config_set_done, info);
00543 if (rv) {
00544 ipmi_cmdlang_cmd_info_put(cmd_info);
00545 cmdlang->errstr = "Error setting SOLPARM";
00546 cmdlang->err = rv;
00547 ipmi_mem_free(info);
00548 goto out_err;
00549 }
00550
00551 return;
00552
00553 out_err:
00554 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00555 cmdlang->objstr_len);
00556 cmdlang->location = "cmd_solparm.c(solparm_config_set)";
00557 }
00558
00559 static void
00560 solparm_config_unlock_done(ipmi_solparm_t *solparm,
00561 int err,
00562 void *cb_data)
00563 {
00564 lp_config_op_t *info = cb_data;
00565 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00566 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00567
00568 ipmi_cmdlang_lock(cmd_info);
00569 if (err) {
00570 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00571 cmdlang->objstr_len);
00572 cmdlang->errstr = "Error unlocking SOLPARM";
00573 cmdlang->err = err;
00574 cmdlang->location = "cmd_solparm.c(solparm_config_unlock_done)";
00575 goto out;
00576 }
00577
00578 ipmi_cmdlang_out(cmd_info, "SOLPARM config unlocked", info->name);
00579
00580 out:
00581 ipmi_mem_free(info);
00582 ipmi_cmdlang_unlock(cmd_info);
00583 ipmi_cmdlang_cmd_info_put(cmd_info);
00584 }
00585
00586 static void
00587 solparm_config_unlock(ipmi_solparm_t *solparm, void *cb_data)
00588 {
00589 ipmi_cmd_info_t *cmd_info = cb_data;
00590 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00591 int rv;
00592 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00593 int argc = ipmi_cmdlang_get_argc(cmd_info);
00594 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00595 ipmi_sol_config_t *solc;
00596 lp_config_op_t *info = cb_data;
00597 char *name;
00598
00599 if ((argc - curr_arg) < 1) {
00600
00601 cmdlang->errstr = "Not enough parameters";
00602 cmdlang->err = EINVAL;
00603 goto out_err;
00604 }
00605
00606 name = argv[curr_arg];
00607 curr_arg++;
00608 solc = find_config(name, 0);
00609 if (!solc) {
00610 cmdlang->errstr = "Invalid SOL config";
00611 cmdlang->err = EINVAL;
00612 goto out_err;
00613 }
00614
00615 info = ipmi_mem_alloc(sizeof(*info));
00616 if (!info) {
00617 cmdlang->errstr = "Out of memory";
00618 cmdlang->err = ENOMEM;
00619 goto out_err;
00620 }
00621 info->cmd_info = cmd_info;
00622 strncpy(info->name, name, sizeof(info->name));
00623
00624 ipmi_cmdlang_cmd_info_get(cmd_info);
00625 rv = ipmi_sol_clear_lock(solparm, solc, solparm_config_unlock_done, info);
00626 if (rv) {
00627 ipmi_cmdlang_cmd_info_put(cmd_info);
00628 cmdlang->errstr = "Error getting SOLPARM";
00629 cmdlang->err = rv;
00630 ipmi_mem_free(info);
00631 goto out_err;
00632 }
00633
00634 return;
00635
00636 out_err:
00637 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00638 cmdlang->objstr_len);
00639 cmdlang->location = "cmd_solparm.c(solparm_config_unlock)";
00640 }
00641
00642 static void
00643 solparm_config_close(ipmi_cmd_info_t *cmd_info)
00644 {
00645 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00646 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00647 int argc = ipmi_cmdlang_get_argc(cmd_info);
00648 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00649 ipmi_sol_config_t *solc;
00650 char *solc_name;
00651
00652 if ((argc - curr_arg) < 1) {
00653
00654 cmdlang->errstr = "Not enough parameters";
00655 cmdlang->err = EINVAL;
00656 solc_name = "";
00657 goto out_err;
00658 }
00659 solc_name = argv[curr_arg];
00660
00661 solc = find_config(solc_name, 1);
00662 if (!solc) {
00663 cmdlang->errstr = "Invalid SOL config";
00664 cmdlang->err = EINVAL;
00665 goto out_err;
00666 }
00667
00668 ipmi_sol_free_config(solc);
00669 ipmi_cmdlang_out(cmd_info, "SOLPARM config destroyed", solc_name);
00670 return;
00671
00672 out_err:
00673 strncpy(cmdlang->objstr, solc_name, cmdlang->objstr_len);
00674 cmdlang->location = "cmd_solparm.c(solparm_config_close)";
00675 }
00676
00677 static int
00678 solparm_config_list_handler(void *cb_data, void *item1, void *item2)
00679 {
00680 ipmi_cmd_info_t *cmd_info = cb_data;
00681 sol_config_info_t *info = item1;
00682
00683 ipmi_cmdlang_out(cmd_info, "Name", info->name);
00684 return LOCKED_LIST_ITER_CONTINUE;
00685 }
00686
00687 static void
00688 solparm_config_list(ipmi_cmd_info_t *cmd_info)
00689 {
00690 ipmi_cmdlang_out(cmd_info, "SOLPARM Configs", NULL);
00691 ipmi_cmdlang_down(cmd_info);
00692 locked_list_iterate(solcs, solparm_config_list_handler, cmd_info);
00693 ipmi_cmdlang_up(cmd_info);
00694 }
00695
00696 static int
00697 solparm_config_info_handler(void *cb_data, void *item1, void *item2)
00698 {
00699 ipmi_cmd_info_t *cmd_info = cb_data;
00700 sol_config_info_t *info = item1;
00701
00702 ipmi_cmdlang_out(cmd_info, "SOLPARM Config", NULL);
00703 ipmi_cmdlang_down(cmd_info);
00704 ipmi_cmdlang_out(cmd_info, "Name", info->name);
00705 config_info(cmd_info, info->config);
00706 ipmi_cmdlang_up(cmd_info);
00707 return LOCKED_LIST_ITER_CONTINUE;
00708 }
00709
00710 static void
00711 solparm_config_info(ipmi_cmd_info_t *cmd_info)
00712 {
00713 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00714 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00715 int argc = ipmi_cmdlang_get_argc(cmd_info);
00716 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00717 ipmi_sol_config_t *solc;
00718
00719 if ((argc - curr_arg) < 1) {
00720 locked_list_iterate(solcs, solparm_config_info_handler, cmd_info);
00721 } else {
00722 solc = find_config(argv[curr_arg], 0);
00723 if (!solc) {
00724 cmdlang->errstr = "Invalid SOL config";
00725 cmdlang->err = EINVAL;
00726 goto out_err;
00727 }
00728 ipmi_cmdlang_out(cmd_info, "SOLPARM Config", NULL);
00729 ipmi_cmdlang_down(cmd_info);
00730 ipmi_cmdlang_out(cmd_info, "Name", argv[curr_arg]);
00731 config_info(cmd_info, solc);
00732 ipmi_cmdlang_up(cmd_info);
00733 }
00734 return;
00735
00736 out_err:
00737 strncpy(cmdlang->objstr, argv[curr_arg], cmdlang->objstr_len);
00738 cmdlang->location = "cmd_solparm.c(solparm_config_info)";
00739 }
00740
00741 static void
00742 solparm_config_update(ipmi_cmd_info_t *cmd_info)
00743 {
00744 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00745 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00746 int argc = ipmi_cmdlang_get_argc(cmd_info);
00747 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00748 ipmi_sol_config_t *solc;
00749 int i;
00750 char *name;
00751 char *val;
00752 char *solc_name;
00753
00754 if ((argc - curr_arg) < 3) {
00755
00756 cmdlang->errstr = "Not enough parameters";
00757 cmdlang->err = EINVAL;
00758 solc_name = "";
00759 goto out_err;
00760 }
00761 solc_name = argv[curr_arg];
00762 curr_arg++;
00763
00764 solc = find_config(solc_name, 0);
00765 if (!solc) {
00766 cmdlang->errstr = "Invalid SOL config";
00767 cmdlang->err = EINVAL;
00768 goto out_err;
00769 }
00770
00771 name = argv[curr_arg];
00772 curr_arg++;
00773 val = argv[curr_arg];
00774 curr_arg++;
00775
00776
00777 for (i=0; lps[i].name; i++) {
00778 if (strcmp(lps[i].name, name) == 0) {
00779 lp_item_t *lp = lps[i].lpi;
00780 if (!lp->set) {
00781 cmdlang->errstr = "Parameter is read-only";
00782 cmdlang->err = EINVAL;
00783 goto out_err;
00784 }
00785 lp->set(cmd_info, val, solc, lps[i].set_func);
00786 goto out;
00787 }
00788 }
00789
00790 cmdlang->errstr = "Invalid parameter name";
00791 cmdlang->err = EINVAL;
00792 goto out_err;
00793
00794 out:
00795 ipmi_cmdlang_out(cmd_info, "SOLPARM config updated", solc_name);
00796 return;
00797
00798 out_err:
00799 strncpy(cmdlang->objstr, solc_name, cmdlang->objstr_len);
00800 cmdlang->location = "cmd_solparm.c(solparm_config_update)";
00801 }
00802
00803 typedef struct solparm_mc_unlock_s
00804 {
00805 char name[IPMI_MC_NAME_LEN];
00806 ipmi_cmd_info_t *cmd_info;
00807 } solparm_mc_unlock_t;
00808
00809 static void
00810 solparm_unlock_mc_done(ipmi_solparm_t *solparm, int err, void *cb_data)
00811 {
00812 solparm_mc_unlock_t *info = cb_data;
00813 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00814 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00815
00816 ipmi_cmdlang_lock(cmd_info);
00817 if (err) {
00818 ipmi_solparm_get_name(solparm, cmdlang->objstr,
00819 cmdlang->objstr_len);
00820 cmdlang->errstr = "Error unlocking MC SOLPARM";
00821 cmdlang->err = err;
00822 cmdlang->location = "cmd_solparm.c(solparm_unlock_mc_done)";
00823 goto out;
00824 }
00825
00826 ipmi_cmdlang_out(cmd_info, "SOLPARM unlocked", info->name);
00827
00828 out:
00829 ipmi_cmdlang_unlock(cmd_info);
00830 ipmi_solparm_destroy(solparm, NULL, NULL);
00831 ipmi_cmdlang_cmd_info_put(cmd_info);
00832 ipmi_mem_free(info);
00833 }
00834
00835 static void
00836 solparm_unlock_mc(ipmi_mc_t *mc, void *cb_data)
00837 {
00838 ipmi_cmd_info_t *cmd_info = cb_data;
00839 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00840 int channel;
00841 int rv;
00842 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00843 int argc = ipmi_cmdlang_get_argc(cmd_info);
00844 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00845 ipmi_solparm_t *solparm = NULL;
00846 solparm_mc_unlock_t *info;
00847
00848 if ((argc - curr_arg) < 1) {
00849
00850 cmdlang->errstr = "Not enough parameters";
00851 cmdlang->err = EINVAL;
00852 goto out_err;
00853 }
00854
00855 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00856 if (cmdlang->err) {
00857 cmdlang->errstr = "channel invalid";
00858 goto out_err;
00859 }
00860 curr_arg++;
00861
00862 rv = ipmi_solparm_alloc(mc, channel, &solparm);
00863 if (rv) {
00864 cmdlang->errstr = "Error from ipmi_solparm_alloc";
00865 cmdlang->err = rv;
00866 goto out_err;
00867 }
00868
00869 info = ipmi_mem_alloc(sizeof(*info));
00870 if (!info) {
00871 cmdlang->errstr = "Out of memory";
00872 cmdlang->err = ENOMEM;
00873 goto out_err;
00874 }
00875 info->cmd_info = cmd_info;
00876 ipmi_mc_get_name(mc, info->name, sizeof(info->name));
00877
00878 ipmi_cmdlang_cmd_info_get(cmd_info);
00879 rv = ipmi_sol_clear_lock(solparm, NULL, solparm_unlock_mc_done, info);
00880 if (rv) {
00881 ipmi_cmdlang_cmd_info_put(cmd_info);
00882 cmdlang->errstr = "Error from ipmi_sol_clear_lock";
00883 cmdlang->err = rv;
00884 ipmi_solparm_destroy(solparm, NULL, NULL);
00885 ipmi_mem_free(info);
00886 goto out_err;
00887 }
00888 return;
00889
00890 out_err:
00891 if (solparm)
00892 ipmi_solparm_destroy(solparm, NULL, NULL);
00893 ipmi_mc_get_name(mc, cmdlang->objstr,
00894 cmdlang->objstr_len);
00895 cmdlang->location = "cmd_solparm.c(solparm_unlock_mc)";
00896 }
00897
00898 static ipmi_cmdlang_cmd_t *solparm_cmds;
00899 static ipmi_cmdlang_cmd_t *config_cmds;
00900
00901 static ipmi_cmdlang_init_t cmds_solparm[] =
00902 {
00903 { "solparm", NULL,
00904 "- Commands dealing with SOL Parameters (solparms)",
00905 NULL, NULL, &solparm_cmds},
00906 { "list", &solparm_cmds,
00907 "- List all the solparms in the system",
00908 ipmi_cmdlang_domain_handler, solparm_list, NULL },
00909 { "new", &solparm_cmds,
00910 "<mc> <channel>"
00911 " - Create a solparm for the given MC and channel.",
00912 ipmi_cmdlang_mc_handler, solparm_new, NULL },
00913 { "info", &solparm_cmds,
00914 "<solparm> - Dump information about a solparm",
00915 ipmi_cmdlang_solparm_handler, solparm_info, NULL },
00916 { "config", &solparm_cmds,
00917 "- Commands dealing with SOLPARM configs",
00918 NULL, NULL, &config_cmds },
00919 { "list", &config_cmds,
00920 "- List the sol configurations that currently exist",
00921 solparm_config_list, NULL, NULL },
00922 { "info", &config_cmds,
00923 "<config> - List info on sol configuration",
00924 solparm_config_info, NULL, NULL },
00925 { "get", &config_cmds,
00926 "<solparm> - Fetch the SOL information for the solparm",
00927 ipmi_cmdlang_solparm_handler, solparm_config_get, NULL },
00928 { "set", &config_cmds,
00929 "<solparm> <solparm config> - Set the SOL information for the solparm",
00930 ipmi_cmdlang_solparm_handler, solparm_config_set, NULL },
00931 { "unlock", &config_cmds,
00932 "<solparm> <solparm config> - Unlock, but do not set the config",
00933 ipmi_cmdlang_solparm_handler, solparm_config_unlock, NULL },
00934 { "update", &config_cmds,
00935 "<solparm config> <parm> [selector] <value> - Set the given parameter"
00936 " in the solparm config to the given value. If the parameter has"
00937 " a selector of some type, the selector must be given, otherwise"
00938 " no selector should be given.",
00939 solparm_config_update, NULL, NULL },
00940 { "close", &config_cmds,
00941 "<solparm config> - free the config",
00942 solparm_config_close, NULL, NULL },
00943 { "unlock_mc", &solparm_cmds,
00944 "<mc> <channel> - Unlock the solparms for the given mc/channel",
00945 ipmi_cmdlang_mc_handler, solparm_unlock_mc, NULL },
00946 { "close", &solparm_cmds,
00947 "<solparm> - Close the solparm",
00948 ipmi_cmdlang_solparm_handler, solparm_close, NULL },
00949 };
00950 #define CMDS_SOLPARM_LEN (sizeof(cmds_solparm)/sizeof(ipmi_cmdlang_init_t))
00951
00952 int
00953 ipmi_cmdlang_solparm_init(os_handler_t *os_hnd)
00954 {
00955 int rv;
00956
00957 solcs = locked_list_alloc(os_hnd);
00958 if (!solcs)
00959 return ENOMEM;
00960
00961 rv = ipmi_cmdlang_reg_table(cmds_solparm, CMDS_SOLPARM_LEN);
00962 if (rv) {
00963 locked_list_destroy(solcs);
00964 solcs = NULL;
00965 }
00966
00967 return rv;
00968 }
00969
00970 static int
00971 config_destroy_handler(void *cb_data, void *item1, void *item2)
00972 {
00973 sol_config_info_t *info = item1;
00974
00975 ipmi_sol_free_config(info->config);
00976 ipmi_mem_free(info);
00977 return LOCKED_LIST_ITER_CONTINUE;
00978 }
00979
00980 void
00981 ipmi_cmdlang_solparm_shutdown(void)
00982 {
00983 locked_list_iterate(solcs, config_destroy_handler, NULL);
00984 locked_list_destroy(solcs);
00985 solcs = NULL;
00986 }