Bonjour,
Je suis en train d'essayer de reprendre le code source d'une commande Lunix pour le mettre dans un slot appelé par un bouton dans Qt.
Du coup je part d'un code en C où il y a le parsing des données entrées en ligne de commande et j'essaie de remplacé ce qui est entré au clavier par les contenu des QLineEdit de ma fenêtre (pour l'instant j'utilise de simples Array à la place):
voilà la fonction de départ:
et voilà ce que j'en ai fait pour l'instant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174 int main(int argc, char *argv[]) { netsnmp_session session, *ss; netsnmp_pdu *pdu, *response = NULL; netsnmp_variable_list *vars; int arg; int count; int current_name = 0; int current_type = 0; int current_value = 0; char *names[SNMP_MAX_CMDLINE_OIDS]; char types[SNMP_MAX_CMDLINE_OIDS]; char *values[SNMP_MAX_CMDLINE_OIDS]; oid name[MAX_OID_LEN]; size_t name_length; int status; int failures = 0; int exitval = 0; putenv(strdup("POSIXLY_CORRECT=1")); /* * get the common command line arguments */ switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) { case NETSNMP_PARSE_ARGS_ERROR: exit(1); case NETSNMP_PARSE_ARGS_SUCCESS_EXIT: exit(0); case NETSNMP_PARSE_ARGS_ERROR_USAGE: usage(); exit(1); default: break; } if (arg >= argc) { fprintf(stderr, "Missing object name\n"); usage(); exit(1); } if ((argc - arg) > 3*SNMP_MAX_CMDLINE_OIDS) { fprintf(stderr, "Too many assignments specified. "); fprintf(stderr, "Only %d allowed in one request.\n", SNMP_MAX_CMDLINE_OIDS); usage(); exit(1); } /* * get object names, types, and values */ for (; arg < argc; arg++) { DEBUGMSGTL(("snmp_parse_args", "handling (#%d): %s %s %s\n", arg,argv[arg], arg+1 < argc ? argv[arg+1] : NULL, arg+2 < argc ? argv[arg+2] : NULL)); names[current_name++] = argv[arg++]; if (arg < argc) { switch (*argv[arg]) { case '=': case 'i': case 'u': case '3': case 't': case 'a': case 'o': case 's': case 'x': case 'd': case 'b': #ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES case 'I': case 'U': case 'F': case 'D': #endif /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */ types[current_type++] = *argv[arg++]; break; default: fprintf(stderr, "%s: Bad object type: %c\n", argv[arg - 1], *argv[arg]); exit(1); } } else { fprintf(stderr, "%s: Needs type and value\n", argv[arg - 1]); exit(1); } if (arg < argc) values[current_value++] = argv[arg]; else { fprintf(stderr, "%s: Needs value\n", argv[arg - 2]); exit(1); } } SOCK_STARTUP; /* * open an SNMP session */ ss = snmp_open(&session); if (ss == NULL) { /* * diagnose snmp_open errors with the input netsnmp_session pointer */ snmp_sess_perror("snmpset", &session); SOCK_CLEANUP; exit(1); } /* * create PDU for SET request and add object names and values to request */ pdu = snmp_pdu_create(SNMP_MSG_SET); for (count = 0; count < current_name; count++) { name_length = MAX_OID_LEN; if (snmp_parse_oid(names[count], name, &name_length) == NULL) { snmp_perror(names[count]); failures++; } else if (snmp_add_var (pdu, name, name_length, types[count], values[count])) { snmp_perror(names[count]); failures++; } } if (failures) { snmp_close(ss); SOCK_CLEANUP; exit(1); } /* * do the request */ status = snmp_synch_response(ss, pdu, &response); if (status == STAT_SUCCESS) { if (response->errstat == SNMP_ERR_NOERROR) { if (!quiet) { for (vars = response->variables; vars; vars = vars->next_variable) print_variable(vars->name, vars->name_length, vars); } } else { fprintf(stderr, "Error in packet.\nReason: %s\n", snmp_errstring(response->errstat)); if (response->errindex != 0) { fprintf(stderr, "Failed object: "); for (count = 1, vars = response->variables; vars && (count != response->errindex); vars = vars->next_variable, count++); if (vars) fprint_objid(stderr, vars->name, vars->name_length); fprintf(stderr, "\n"); } exitval = 2; } } else if (status == STAT_TIMEOUT) { fprintf(stderr, "Timeout: No Response from %s\n", session.peername); exitval = 1; } else { /* status == STAT_ERROR */ snmp_sess_perror("snmpset", ss); exitval = 1; } if (response) snmp_free_pdu(response); snmp_close(ss); SOCK_CLEANUP; return exitval; }
Le problème c'est que lorsque je clique sur le bouton qui envoie le signal au slot, tout se ferme. et je n'ai pas de "mode debug" car j'utilise cmake et pas qmake car je n'arrive pas à m'en servir sur ce projet..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 void MainWindow::SnmpSet() { init_snmp("snmp set"); struct snmp_session sessionToPeer; snmp_sess_init(&sessionToPeer); sessionToPeer.peername = strdup(agentDeviceAddressLineEdit->text().toStdString().c_str()); /*memory allocated by strdup() will be freed by calling snmp_close() */ if(snmpVersion1RadioButton->isChecked()) {/* snmp version 1 is obsolete, do nothing about it. */ } if(snmpVersion2RadioButton->isChecked()) {/* only version 2 community is implemented here */ sessionToPeer.version = SNMP_VERSION_2c; sessionToPeer.community = (u_char*) (strdup(communityLineEdit->text().toStdString().c_str())); sessionToPeer.community_len = strlen((const char*) sessionToPeer.community); } if(snmpVersion3RadioButton->isChecked()) { //TODO: implement SNMP version 3 options. more item may be needed to add to combo box. } sessionToPeer.retries = retriesSpinBox->value(); sessionToPeer.timeout = timeoutSpinBox->value(); SOCK_STARTUP; struct snmp_session* sessionReturnedByLibrary = snmp_open(&sessionToPeer); if(sessionReturnedByLibrary == NULL) { #ifdef QT_DEBUG snmp_sess_perror((const char*) "No Ack!", sessionReturnedByLibrary); #endif //QT_DEBUG SOCK_CLEANUP; return; } struct snmp_pdu* requestPdu = snmp_pdu_create(SNMP_MSG_SET); oid requestOid[MAX_OID_LEN]; size_t requestOidLength = MAX_OID_LEN; snmp_parse_oid(mibFileLocationLineEdit->text().toAscii(), requestOid, &requestOidLength); char typeArray[6]={'s','t','r','i','n','g'}; char *valuesArray[6]; *valuesArray[0]='c'; *valuesArray[1]='h'; *valuesArray[2]='t'; *valuesArray[3]='e'; *valuesArray[4]='s'; *valuesArray[5]='t'; snmp_add_var(requestPdu, requestOid, requestOidLength, typeArray[6], valuesArray[6]);//snmp_add_null_var(requestPdu, requestOid, requestOidLength); struct snmp_pdu* responsePdu = NULL; int snmpStatus = snmp_synch_response(sessionReturnedByLibrary, requestPdu, &responsePdu); if(snmpStatus == STAT_SUCCESS and responsePdu->errstat == SNMP_ERR_NOERROR) { /* SUCCESS: Print the result variables */ struct variable_list *snmpVariables; #ifdef QT_DEBUG for(snmpVariables = responsePdu->variables; snmpVariables; snmpVariables = snmpVariables->next_variable) { print_variable(snmpVariables->name, snmpVariables->name_length, snmpVariables); } #endif //QT_DEBUG /* retrieve response that we're interested. */ #ifdef QT_DEBUG int count = 1; #endif //QT_DEBUG for(snmpVariables = responsePdu->variables; snmpVariables != NULL; snmpVariables = snmpVariables->next_variable) { if(snmpVariables->type == ASN_OCTET_STR) { char* response = (char *) malloc(1 + snmpVariables->val_len); memcpy(response, snmpVariables->val.string, snmpVariables->val_len); response[snmpVariables->val_len] = '\0'; #ifdef QT_DEBUG printf("value #%d is a string: %s\n", count++, response); #endif //QT_DEBUG resultTextEdit->setText(QString(response)); free(response); } else { #ifdef QT_DEBUG printf("value #%d is NOT a string! Ack!\n", count++); #endif //QT_DEBUG } } } else { /* FAILURE: print what goes wrong! */ #ifdef QT_DEBUG if(snmpStatus == STAT_SUCCESS) { fprintf(stderr, "Error in packet\nReason: %s\n", snmp_errstring(responsePdu->errstat)); } else if(snmpStatus == STAT_TIMEOUT) { fprintf(stderr, "Timeout: No response from %s.\n", sessionToPeer.peername); } else { snmp_sess_perror("snmp get", sessionReturnedByLibrary); } #endif //QT_DEBUG } /* * Clean up: * 1) free the response. * 2) close the session. */ if(responsePdu) { snmp_free_pdu(responsePdu); } snmp_close(sessionReturnedByLibrary); SOCK_CLEANUP; }
Partager