Main Page | Class List | Directories | File List | Class Members | File Members

cmd_solparm.c

Go to the documentation of this file.
00001 /*
00002  * cmd_solparm.c
00003  *
00004  * A command interpreter for OpenIPMI
00005  *
00006  * Author: MontaVista Software, Inc.
00007  *         Corey Minyard <minyard@mvista.com>
00008  *         source@mvista.com
00009  *
00010  * Copyright 2004 MontaVista Software Inc.
00011  *
00012  *  This program is free software; you can redistribute it and/or
00013  *  modify it under the terms of the GNU Lesser General Public License
00014  *  as published by the Free Software Foundation; either version 2 of
00015  *  the License, or (at your option) any later version.
00016  *
00017  *
00018  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
00019  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00020  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00021  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00022  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00023  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00024  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00025  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
00026  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
00027  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00028  *
00029  *  You should have received a copy of the GNU Lesser General Public
00030  *  License along with this program; if not, write to the Free
00031  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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 /* Internal includes, do not use in your programs */
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         /* Not enough parameters */
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 /* read-only */
00364 #define FR(name, type) { #name, &lp_ ## type, ipmi_solconfig_get_ ## name, \
00365                          NULL }
00366 /* Writable */
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     /* Basic items */
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         /* Not enough parameters */
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         /* Not enough parameters */
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         /* Not enough parameters */
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         /* Not enough parameters */
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     /* Basic items */
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         /* Not enough parameters */
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 }

© sourcejam.com 2005-2008