Initial commit.
[qa-tools:testrunner-lite.git] / src / hwinfo.c
1 /*
2  * This file is part of testrunner-lite
3  *
4  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5  *
6  * Contact: Sampo Saaristo <ext-sampo.2.saaristo@nokia.com>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * version 2.1 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  *
22  */
23
24 /* ------------------------------------------------------------------------- */
25 /* INCLUDE FILES */
26 #include <time.h>
27 #include <stdio.h>
28 #include <errno.h>
29 #include <string.h>
30 #include <libxml/xmlwriter.h>
31 #include "testrunnerlite.h"
32 #include "executor.h"
33 #include "hwinfo.h"
34 #include "log.h"
35
36 /* ------------------------------------------------------------------------- */
37 /* EXTERNAL DATA STRUCTURES */
38 /* None */
39
40 /* ------------------------------------------------------------------------- */
41 /* EXTERNAL GLOBAL VARIABLES */
42 /* None */
43
44 /* ------------------------------------------------------------------------- */
45 /* EXTERNAL FUNCTION PROTOTYPES */
46 /* None */
47
48 /* ------------------------------------------------------------------------- */
49 /* GLOBAL VARIABLES */
50 /* None */
51
52 /* ------------------------------------------------------------------------- */
53 /* CONSTANTS */
54 /* None */
55
56 /* ------------------------------------------------------------------------- */
57 /* MACROS */
58 /* None */
59
60 /* ------------------------------------------------------------------------- */
61 /* LOCAL GLOBAL VARIABLES */
62 /* None */
63 /* ------------------------------------------------------------------------- */
64 /* LOCAL CONSTANTS AND MACROS */
65 /* None */
66
67 /* ------------------------------------------------------------------------- */
68 /* MODULE DATA STRUCTURES */
69 /* None */
70 /* ------------------------------------------------------------------------- */
71 /* LOCAL FUNCTION PROTOTYPES */
72 /* ------------------------------------------------------------------------- */
73 LOCAL unsigned char *get_sysinfo (const char *);
74 /* ------------------------------------------------------------------------- */
75 /* FORWARD DECLARATIONS */
76 /* None */
77
78 /* ------------------------------------------------------------------------- */
79 /* ==================== LOCAL FUNCTIONS ==================================== */
80 /* ------------------------------------------------------------------------- */
81 /** Execute sysinfo-tool --get for given key
82  *  @param key to be passed to sysinfo-tool e.g. "component/product"
83  *  @return stdout output of the sysinfo-tool command
84  */
85 LOCAL unsigned char *get_sysinfo (const char *key)
86 {
87         char *cmd, *p;
88         exec_data edata;
89         memset (&edata, 0x0, sizeof (exec_data));
90         init_exec_data (&edata);
91         
92         edata.soft_timeout = 5;
93         edata.hard_timeout = COMMON_HARD_TIMEOUT;
94
95         cmd = (char *)malloc (strlen ("sysinfo-tool --get ") + 
96                               strlen (key) + 1);
97         sprintf (cmd, "sysinfo-tool --get /%s", key);
98         execute (cmd, &edata);
99         
100         if (edata.result) {
101                 LOG_MSG (LOG_ERR, "%s:%s():%d:%s\n", PROGNAME, __FUNCTION__,
102                          edata.result, (char *)edata.stderr_data.buffer ?
103                          (char *)edata.stderr_data.buffer : 
104                          "no info available");
105                 free (edata.stderr_data.buffer);
106                 free (edata.stdout_data.buffer);
107                 free (cmd);
108                 return NULL;
109         }
110         p = strchr  ((char *)edata.stdout_data.buffer, '\n');
111         if (p) *p ='\0';
112         free (cmd);
113         
114         return edata.stdout_data.buffer;
115 }
116
117 /* ------------------------------------------------------------------------- */
118 /* ======================== FUNCTIONS ====================================== */
119 /* ------------------------------------------------------------------------- */
120 /* ------------------------------------------------------------------------- */
121 /** Obtain hardware info and save it to argument
122  * @param hi container for hardware info
123  * @return 0 if basic information can be obtained 1 otherwise
124  */
125 int read_hwinfo (hw_info *hi)
126 {
127         memset (hi, 0x0, sizeof (hw_info));
128         
129         hi->product = get_sysinfo("component/product");
130         hi->hw_build = get_sysinfo("component/hw-build");
131         if (!hi->product || !hi->hw_build) {
132                 fprintf (stderr, "%s: Failed to read basic HW "
133                          "information from sysinfo.\n", PROGNAME);
134                 return 1;
135         } else {
136                 LOG_MSG (LOG_INFO, "Hardware: Product: %s HWbuild: %s",
137                          hi->product, hi->hw_build);
138         }
139         
140         hi->nolo = get_sysinfo("component/nolo");
141         hi->boot_mode = get_sysinfo("component/boot-mode");
142         hi->production_sn = get_sysinfo("device/production-sn");
143         hi->product_code = get_sysinfo("device/product-code");
144         hi->basic_product_code = get_sysinfo("device/basic-product-code");
145         
146         if (!hi->nolo)
147                 return 0;
148         
149         LOG_MSG(LOG_INFO, "Hardware: Nolo: %s"
150                 " Boot_mode: %s"
151                 " Production_sn: %s" 
152                 " Product_code: %s"
153                 " Basic_product_code: %s",
154                 hi->nolo, 
155                 hi->boot_mode ? hi->boot_mode : (unsigned char *)"unknown",
156                 hi->production_sn ? hi->production_sn : 
157                 (unsigned char *)"unknown",
158                 hi->product_code ? hi->product_code : 
159                 (unsigned char *)"unknown",
160                 hi->basic_product_code ? hi->product_code : 
161                 (unsigned char *)"unknown");
162         return 0;
163 }
164 /* ------------------------------------------------------------------------- */
165 /** Print hardware info
166  * @param hi hw_info data
167  */
168 void print_hwinfo (hw_info *hi)
169 {
170         printf ("Hardware Info:\n");
171         printf ("%s %s %s %s\n", 
172                 (char *)(hi->product ? hi->product : 
173                          (unsigned char *)"<none>"), 
174                 (char *)(hi->hw_build ? hi->hw_build : 
175                          (unsigned char *)"<none>"), 
176                 (char *)(hi->nolo ? hi->nolo : 
177                          (unsigned char *)"<none>"), 
178                 (char *)(hi->boot_mode ? hi->boot_mode : 
179                          (unsigned char *)"<none>"));
180         printf ("%s %s %s\n", 
181                 (char *)(hi->production_sn ? hi->production_sn : 
182                          (unsigned char *)"<none>") , 
183                 (char *)(hi->product_code ? hi->product_code : 
184                          (unsigned char *)"<none>"),
185                 (char *)(hi->basic_product_code ? hi->basic_product_code : 
186                          (unsigned char *)"<none>"));
187 }
188 /* ------------------------------------------------------------------------- */
189 /** Free the allocated data from hw_info
190  * @param hi hw_info data
191  */
192 void clean_hwinfo (hw_info *hi)
193 {
194         
195         if (hi->product) free (hi->product); 
196         if (hi->hw_build) free (hi->hw_build);
197         if (hi->nolo) free (hi->nolo);
198         if (hi->boot_mode) free (hi->boot_mode);
199         if (hi->production_sn) free (hi->production_sn);
200         if (hi->product_code) free (hi->product_code);
201         if (hi->basic_product_code) free (hi->basic_product_code);
202         return;
203
204
205 /* ================= OTHER EXPORTED FUNCTIONS ============================== */
206 /* None */
207
208 /* ------------------------------------------------------------------------- */
209 /* End of file */