hdt: Adding dump_mode & tftp_ip boot option
[profile/ivi/syslinux.git] / com32 / hdt / hdt-dump.c
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2011 Erwan Velu - All Rights Reserved
4  *
5  *   Permission is hereby granted, free of charge, to any person
6  *   obtaining a copy of this software and associated documentation
7  *   files (the "Software"), to deal in the Software without
8  *   restriction, including without limitation the rights to use,
9  *   copy, modify, merge, publish, distribute, sublicense, and/or
10  *   sell copies of the Software, and to permit persons to whom
11  *   the Software is furnished to do so, subject to the following
12  *   conditions:
13  *
14  *   The above copyright notice and this permission notice shall
15  *   be included in all copies or substantial portions of the Software.
16  *
17  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19  *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21  *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22  *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23  *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24  *   OTHER DEALINGS IN THE SOFTWARE.
25  *
26  * -----------------------------------------------------------------------
27  */
28
29 #include <stdio.h>
30 #include <string.h>
31 #include <stdlib.h>
32 #include <ctype.h>
33 #include "hdt-common.h"
34 #include "hdt-dump.h"
35
36 struct print_buf p_buf;
37
38 void compute_filename(struct s_hardware *hardware, char *filename, int size) {
39
40    snprintf(filename,size,"%s/",hardware->dump_path);
41
42     if (hardware->is_pxe_valid) {
43             strncat(filename, hardware->pxe.mac_addr, sizeof(hardware->pxe.mac_addr));
44             strncat(filename, "+", 1);
45     } 
46     
47     if (hardware->is_dmi_valid) {
48             strncat(filename, remove_spaces(hardware->dmi.system.product_name), sizeof(hardware->dmi.system.manufacturer));
49             strncat(filename, "+", 1);
50             strncat(filename, remove_spaces(hardware->dmi.system.manufacturer), sizeof(hardware->dmi.system.product_name));
51     }
52
53     /* We replace the ":" in the filename by some "-"
54      * This will avoid Microsoft FS turning crazy */
55     chrreplace(filename,':','-');
56
57     /* Avoid space to make filename easier to manipulate */
58     chrreplace(filename,' ','_');
59
60 }
61
62 int dumpprintf(FILE *p, const char *format, ...) {
63    va_list ap;
64    int rv;
65
66   (void) p;  
67    va_start(ap, format);
68    rv = vbufprintf(&p_buf,format, ap);
69    va_end(ap);
70    return rv;
71 }
72
73 void to_cpio(char *filename) { 
74    cpio_writefile(upload,filename,p_buf.buf,p_buf.len);
75    if ((p_buf.buf) && (p_buf.len > 0)){ 
76       memset(p_buf.buf,0,p_buf.len);
77       free(p_buf.buf); 
78       p_buf.buf=NULL;
79       p_buf.size=0;
80       p_buf.len=0;
81    }
82 }
83
84 void flush (ZZJSON_CONFIG *config, ZZJSON ** item) { 
85    zzjson_print(config, *item);
86    zzjson_free(config, *item);
87    *item=NULL;
88 }
89
90 /**
91  * dump - dump info
92  **/
93 void dump(struct s_hardware *hardware)
94 {
95     ZZJSON *json = NULL;
96     ZZJSON_CONFIG config = { ZZJSON_VERY_STRICT, NULL,
97                 (int(*)(void*)) fgetc,
98                 NULL,
99                 malloc, calloc, free, realloc,
100                 stderr, NULL, stdout,
101                 (int(*)(void *,const char*,...)) dumpprintf,
102                 (int(*)(int,void*)) fputc 
103     };
104
105     memset(&p_buf,0,sizeof(p_buf));
106
107     /* By now, we only support TFTP reporting */
108     upload=&upload_tftp;
109     upload->name="tftp";
110
111     /* The following defines the behavior of the reporting */
112     char *arg[64];
113     char filename[512]={0};
114     compute_filename(hardware, filename, sizeof(filename));
115
116     /* The filename */
117     arg[0] = filename;
118     /* The server to upload the file */
119     if (strlen(hardware->tftp_ip) != 0) {
120             arg[1] = hardware->tftp_ip;
121             arg[2] = NULL;
122     } else {
123             arg[1] = NULL;
124     }
125
126     /* We initiate the cpio to send */
127     cpio_init(upload,(const char **)arg);
128
129     dump_cpu(hardware, &config, &json);
130     dump_pxe(hardware, &config, &json);
131     dump_syslinux(hardware, &config, &json);
132     dump_vpd(hardware, &config, &json);
133     dump_vesa(hardware, &config, &json);
134     dump_disks(hardware, &config, &json);
135     dump_dmi(hardware, &config, &json);
136     dump_memory(hardware, &config, &json);
137     dump_pci(hardware, &config, &json);
138     dump_acpi(hardware, &config, &json);
139     dump_kernel(hardware, &config, &json);
140     dump_hdt(hardware, &config, &json);
141
142     /* We close & flush the file to send */
143     cpio_close(upload);
144     flush_data(upload);
145 }