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

cmd_pet.c

Go to the documentation of this file.
00001 /*
00002  * cmd_pet.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_pet.h>
00041 #include <OpenIPMI/ipmi_mc.h>
00042 #include <OpenIPMI/ipmi_cmdlang.h>
00043 
00044 
00045 static void
00046 pet_list_handler(ipmi_pet_t *pet, void *cb_data)
00047 {
00048     ipmi_cmd_info_t *cmd_info = cb_data;
00049     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00050     char            pet_name[IPMI_PET_NAME_LEN];
00051 
00052     if (cmdlang->err)
00053         return;
00054 
00055     ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00056 
00057     ipmi_cmdlang_out(cmd_info, "Name", pet_name);
00058 }
00059 
00060 static void
00061 pet_list(ipmi_domain_t *domain, void *cb_data)
00062 {
00063     ipmi_cmd_info_t *cmd_info = cb_data;
00064     char             domain_name[IPMI_DOMAIN_NAME_LEN];
00065 
00066     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00067     ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00068     ipmi_cmdlang_down(cmd_info);
00069     ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00070     ipmi_cmdlang_out(cmd_info, "PETs", NULL);
00071     ipmi_cmdlang_down(cmd_info);
00072     ipmi_pet_iterate_pets(domain, pet_list_handler, cmd_info);
00073     ipmi_cmdlang_up(cmd_info);
00074     ipmi_cmdlang_up(cmd_info);
00075 }
00076 
00077 static void
00078 get_mc_name(ipmi_mc_t *mc, void *cb_data)
00079 {
00080     ipmi_cmd_info_t *cmd_info = cb_data;
00081     char            mc_name[IPMI_MC_NAME_LEN];
00082 
00083     ipmi_mc_get_name(mc, mc_name, sizeof(mc_name));
00084     ipmi_cmdlang_out(cmd_info, "MC", mc_name);
00085 }
00086 
00087 static void
00088 pet_info(ipmi_pet_t *pet, void *cb_data)
00089 {
00090     ipmi_cmd_info_t *cmd_info = cb_data;
00091     int             rv;
00092     unsigned char   mac_addr[6];
00093     struct in_addr  ip_addr;
00094     char            pet_name[IPMI_PET_NAME_LEN];
00095 
00096     ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00097     ipmi_cmdlang_out(cmd_info, "PET", NULL);
00098     ipmi_cmdlang_down(cmd_info);
00099     ipmi_cmdlang_out(cmd_info, "Name", pet_name);
00100     rv = ipmi_mc_pointer_cb(ipmi_pet_get_mc_id(pet), get_mc_name, cmd_info);
00101     if (rv)
00102         ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00103     ipmi_cmdlang_out_int(cmd_info, "Channel", ipmi_pet_get_channel(pet));
00104     ipmi_cmdlang_out_ip(cmd_info, "IP Address",
00105                         ipmi_pet_get_ip_addr(pet, &ip_addr));
00106     ipmi_cmdlang_out_mac(cmd_info, "MAC Address",
00107                          ipmi_pet_get_mac_addr(pet, mac_addr));
00108     ipmi_cmdlang_out_int(cmd_info, "EFT Selector", ipmi_pet_get_eft_sel(pet));
00109     ipmi_cmdlang_out_int(cmd_info, "Policy Number",
00110                          ipmi_pet_get_policy_num(pet));
00111     ipmi_cmdlang_out_int(cmd_info, "APT Selector", ipmi_pet_get_apt_sel(pet));
00112     ipmi_cmdlang_out_int(cmd_info, "LAN Dest Selector",
00113                          ipmi_pet_get_lan_dest_sel(pet));
00114     ipmi_cmdlang_up(cmd_info);
00115 }
00116 
00117 static void
00118 pet_done(ipmi_pet_t *pet, int err, void *cb_data)
00119 {
00120     ipmi_cmd_info_t *cmd_info = cb_data;
00121     char            pet_name[IPMI_PET_NAME_LEN];
00122 
00123     ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00124     ipmi_cmdlang_out(cmd_info, "PET Created", pet_name);
00125     ipmi_cmdlang_cmd_info_put(cmd_info);
00126 }
00127 
00128 static void
00129 pet_new(ipmi_domain_t *domain, void *cb_data)
00130 {
00131     ipmi_cmd_info_t *cmd_info = cb_data;
00132     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00133     int             connection;
00134     int             channel;
00135     struct in_addr  ip_addr;
00136     unsigned char   mac_addr[6];
00137     int             eft_selector;
00138     int             policy_num;
00139     int             apt_selector;
00140     int             lan_dest_selector;
00141     int             rv;
00142     int             curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00143     int             argc = ipmi_cmdlang_get_argc(cmd_info);
00144     char            **argv = ipmi_cmdlang_get_argv(cmd_info);
00145 
00146     if ((argc - curr_arg) < 8) {
00147         /* Not enough parameters */
00148         cmdlang->errstr = "Not enough parameters";
00149         cmdlang->err = EINVAL;
00150         goto out_err;
00151     }
00152 
00153     ipmi_cmdlang_get_int(argv[curr_arg], &connection, cmd_info);
00154     if (cmdlang->err) {
00155         cmdlang->errstr = "connection invalid";
00156         goto out_err;
00157     }
00158     curr_arg++;
00159 
00160     ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00161     if (cmdlang->err) {
00162         cmdlang->errstr = "channel invalid";
00163         goto out_err;
00164     }
00165     curr_arg++;
00166 
00167     ipmi_cmdlang_get_ip(argv[curr_arg], &ip_addr, cmd_info);
00168     if (cmdlang->err) {
00169         cmdlang->errstr = "ip addr invalid";
00170         goto out_err;
00171     }
00172     curr_arg++;
00173 
00174     ipmi_cmdlang_get_mac(argv[curr_arg], mac_addr, cmd_info);
00175     if (cmdlang->err) {
00176         cmdlang->errstr = "mac addr invalid";
00177         goto out_err;
00178     }
00179     curr_arg++;
00180 
00181     ipmi_cmdlang_get_int(argv[curr_arg], &eft_selector, cmd_info);
00182     if (cmdlang->err) {
00183         cmdlang->errstr = "eft_selector invalid";
00184         goto out_err;
00185     }
00186     curr_arg++;
00187 
00188     ipmi_cmdlang_get_int(argv[curr_arg], &policy_num, cmd_info);
00189     if (cmdlang->err) {
00190         cmdlang->errstr = "policy num invalid";
00191         goto out_err;
00192     }
00193     curr_arg++;
00194 
00195     ipmi_cmdlang_get_int(argv[curr_arg], &apt_selector, cmd_info);
00196     if (cmdlang->err) {
00197         cmdlang->errstr = "apt selectory invalid";
00198         goto out_err;
00199     }
00200     curr_arg++;
00201 
00202     ipmi_cmdlang_get_int(argv[curr_arg], &lan_dest_selector, cmd_info);
00203     if (cmdlang->err) {
00204         cmdlang->errstr = "lan dest selector invalid";
00205         goto out_err;
00206     }
00207     curr_arg++;
00208 
00209     ipmi_cmdlang_cmd_info_get(cmd_info);
00210     rv = ipmi_pet_create(domain,
00211                          connection,
00212                          channel,
00213                          ip_addr,
00214                          mac_addr,
00215                          eft_selector,
00216                          policy_num,
00217                          apt_selector,
00218                          lan_dest_selector,
00219                          pet_done,
00220                          cmd_info,
00221                          NULL);
00222     if (rv) {
00223         ipmi_cmdlang_cmd_info_put(cmd_info);
00224         cmdlang->errstr = "Error from ipmi_pet_create";
00225         cmdlang->err = rv;
00226         goto out_err;
00227     }
00228 
00229     return;
00230 
00231  out_err:
00232     ipmi_domain_get_name(domain, cmdlang->objstr,
00233                          cmdlang->objstr_len);
00234     cmdlang->location = "cmd_pet.c(pet_new)";
00235 }
00236 
00237 static void
00238 pet_mcnew(ipmi_mc_t *mc, void *cb_data)
00239 {
00240     ipmi_cmd_info_t *cmd_info = cb_data;
00241     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00242     int             channel;
00243     struct in_addr  ip_addr;
00244     unsigned char   mac_addr[6];
00245     int             eft_selector;
00246     int             policy_num;
00247     int             apt_selector;
00248     int             lan_dest_selector;
00249     int             rv;
00250     int             curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00251     int             argc = ipmi_cmdlang_get_argc(cmd_info);
00252     char            **argv = ipmi_cmdlang_get_argv(cmd_info);
00253 
00254     if ((argc - curr_arg) < 7) {
00255         /* Not enough parameters */
00256         cmdlang->errstr = "Not enough parameters";
00257         cmdlang->err = EINVAL;
00258         goto out_err;
00259     }
00260 
00261     ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00262     if (cmdlang->err) {
00263         cmdlang->errstr = "channel invalid";
00264         goto out_err;
00265     }
00266     curr_arg++;
00267 
00268     ipmi_cmdlang_get_ip(argv[curr_arg], &ip_addr, cmd_info);
00269     if (cmdlang->err) {
00270         cmdlang->errstr = "ip addr invalid";
00271         goto out_err;
00272     }
00273     curr_arg++;
00274 
00275     ipmi_cmdlang_get_mac(argv[curr_arg], mac_addr, cmd_info);
00276     if (cmdlang->err) {
00277         cmdlang->errstr = "mac addr invalid";
00278         goto out_err;
00279     }
00280     curr_arg++;
00281 
00282     ipmi_cmdlang_get_int(argv[curr_arg], &eft_selector, cmd_info);
00283     if (cmdlang->err) {
00284         cmdlang->errstr = "eft_selector invalid";
00285         goto out_err;
00286     }
00287     curr_arg++;
00288 
00289     ipmi_cmdlang_get_int(argv[curr_arg], &policy_num, cmd_info);
00290     if (cmdlang->err) {
00291         cmdlang->errstr = "policy num invalid";
00292         goto out_err;
00293     }
00294     curr_arg++;
00295 
00296     ipmi_cmdlang_get_int(argv[curr_arg], &apt_selector, cmd_info);
00297     if (cmdlang->err) {
00298         cmdlang->errstr = "apt selectory invalid";
00299         goto out_err;
00300     }
00301     curr_arg++;
00302 
00303     ipmi_cmdlang_get_int(argv[curr_arg], &lan_dest_selector, cmd_info);
00304     if (cmdlang->err) {
00305         cmdlang->errstr = "lan dest selector invalid";
00306         goto out_err;
00307     }
00308     curr_arg++;
00309 
00310     ipmi_cmdlang_cmd_info_get(cmd_info);
00311     rv = ipmi_pet_create_mc(mc,
00312                             channel,
00313                             ip_addr,
00314                             mac_addr,
00315                             eft_selector,
00316                             policy_num,
00317                             apt_selector,
00318                             lan_dest_selector,
00319                             pet_done,
00320                             cmd_info,
00321                             NULL);
00322     if (rv) {
00323         ipmi_cmdlang_cmd_info_put(cmd_info);
00324         cmdlang->errstr = "Error from ipmi_pet_create";
00325         cmdlang->err = rv;
00326         goto out_err;
00327     }
00328 
00329     return;
00330 
00331  out_err:
00332     ipmi_mc_get_name(mc, cmdlang->objstr,
00333                      cmdlang->objstr_len);
00334     cmdlang->location = "cmd_pet.c(pet_mcnew)";
00335 }
00336 
00337 static void
00338 close_done(ipmi_pet_t *pet, int err, void *cb_data)
00339 {
00340     ipmi_cmd_info_t *cmd_info = cb_data;
00341     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00342     char            pet_name[IPMI_PET_NAME_LEN];
00343 
00344     ipmi_cmdlang_lock(cmd_info);
00345     if (err) {
00346         ipmi_pet_get_name(pet, cmdlang->objstr,
00347                           cmdlang->objstr_len);
00348         cmdlang->errstr = "Error closing PET";
00349         cmdlang->err = err;
00350         cmdlang->location = "cmd_pet.c(close_done)";
00351         goto out;
00352     }
00353 
00354     ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00355     ipmi_cmdlang_out(cmd_info, "PET destroyed", pet_name);
00356 
00357  out:
00358     ipmi_cmdlang_unlock(cmd_info);
00359     ipmi_cmdlang_cmd_info_put(cmd_info);
00360 }
00361 
00362 static void
00363 pet_close(ipmi_pet_t *pet, void *cb_data)
00364 {
00365     ipmi_cmd_info_t *cmd_info = cb_data;
00366     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00367     int             rv;
00368 
00369     ipmi_cmdlang_cmd_info_get(cmd_info);
00370     rv = ipmi_pet_destroy(pet, close_done, cmd_info);
00371     if (rv) {
00372         ipmi_pet_get_name(pet, cmdlang->objstr,
00373                           cmdlang->objstr_len);
00374         ipmi_cmdlang_cmd_info_put(cmd_info);
00375         cmdlang->errstr = "Error closing PET";
00376         cmdlang->err = rv;
00377         cmdlang->location = "cmd_pet.c(pet_close)";
00378     }
00379 }
00380 
00381 static ipmi_cmdlang_cmd_t *pet_cmds;
00382 
00383 static ipmi_cmdlang_init_t cmds_pet[] =
00384 {
00385     { "pet", NULL,
00386       "- Commands dealing with Platform Event Traps (PETs)",
00387       NULL, NULL, &pet_cmds},
00388     { "list", &pet_cmds,
00389       "- List all the pets in the system",
00390       ipmi_cmdlang_domain_handler, pet_list,  NULL },
00391     { "new", &pet_cmds,
00392       "<domain> <connection> <channel> <ip addr> <mac_addr> <eft selector>"
00393       " <policy num> <apt selector> <lan dest selector>"
00394       " - Set up the domain to send PET traps from the given connection"
00395       " to the given IP/MAC address over the given channel",
00396       ipmi_cmdlang_domain_handler, pet_new, NULL },
00397     { "mcnew", &pet_cmds,
00398       "<mc> <channel> <ip addr> <mac_addr> <eft selector>"
00399       " <policy num> <apt selector> <lan dest selector>"
00400       " - Set up the domain to send PET traps from the given connection"
00401       " to the given IP/MAC address over the given channel",
00402       ipmi_cmdlang_mc_handler, pet_mcnew, NULL },
00403     { "info", &pet_cmds,
00404       "<pet> - Dump information about a pet",
00405       ipmi_cmdlang_pet_handler, pet_info, NULL },
00406     { "close", &pet_cmds,
00407       "<pet> - Close the pet",
00408       ipmi_cmdlang_pet_handler, pet_close, NULL },
00409 };
00410 #define CMDS_PET_LEN (sizeof(cmds_pet)/sizeof(ipmi_cmdlang_init_t))
00411 
00412 int
00413 ipmi_cmdlang_pet_init(os_handler_t *os_hnd)
00414 {
00415     return ipmi_cmdlang_reg_table(cmds_pet, CMDS_PET_LEN);
00416 }

© sourcejam.com 2005-2008