Skip to content

Commit 311ee91

Browse files
authored
Fixes #76. Print system errors on failure (#77)
1 parent 55be67a commit 311ee91

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

src/mqtt.c

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static void freeOpts(MQTTClient_connectOptions* conn_opts){
9494
}
9595

9696
#ifdef _WIN32
97-
void setenv(const char* env,const char* val,int notused){
97+
static void setenv(const char* env,const char* val,int notused){
9898
int len=strlen(env);
9999
char* setting=(char*)malloc(len+strlen(val)+2);
100100
strcpy(setting,env);
@@ -104,17 +104,17 @@ void setenv(const char* env,const char* val,int notused){
104104
_putenv(setting);
105105
free(setting);
106106
}
107-
void unsetenv(const char* env){
107+
static void unsetenv(const char* env){
108108
setenv(env,"",1);
109109
}
110110
#endif
111-
void setProxyEnv(const char* sys,const char* sysval,const char* mqtt){
111+
static void setProxyEnv(const char* sys,const char* sysval,const char* mqtt){
112112
if((sysval&&*sysval==0)||(mqtt&&*mqtt==0)) /* unset default env if blank env or blank override env */
113113
unsetenv(sys);
114114
if(mqtt&&*mqtt)
115115
setenv(sys,mqtt,1); /* use override env variables value */
116116
}
117-
void restoreProxyEnv(const char* sys,const char* sysval){
117+
static void restoreProxyEnv(const char* sys,const char* sysval){
118118
if(sysval)
119119
setenv(sys,sysval,1);
120120
}
@@ -430,21 +430,32 @@ static void pr0(K x){
430430
}
431431

432432
// Callback function definitions
433-
void qmsgsent(MQTTClient_deliveryToken p){
433+
static void qmsgsent(MQTTClient_deliveryToken p){
434434
pr0(k(0, (char*)".mqtt.msgsent", kj(p), (K)0));
435435
}
436436

437-
void qmsgrcvd(char* p,long sz){
437+
static void qmsgrcvd(char* p,long sz){
438438
K topic = kp(p);
439439
p += topic->n+1;
440440
K msg = kpn(p, sz - (topic->n+1));
441441
pr0(k(0, (char*)".mqtt.msgrcvd", topic, msg, (K)0));
442442
}
443443

444-
void qdisconn(){
444+
static void qdisconn(){
445445
pr0(k(0, (char*)".mqtt.disconn", ktn(0,0), (K)0));
446446
}
447447

448+
static char* getSysError(char* buff,int len){
449+
buff[0]=0;
450+
#ifdef _WIN32
451+
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0,
452+
WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buff,
453+
len, 0);
454+
#else
455+
strerror_r(errno,buff,len);
456+
#endif
457+
return buff;
458+
}
448459

449460
/* Socketpair initialization, callback definition and clean up functionality
450461
* detach function initialized at exit, socketpair start issues handled
@@ -454,7 +465,8 @@ K mqttCallback(int fd){
454465
CallbackData cb_data;
455466
long rc = recv(fd, (char*)&cb_data, sizeof(cb_data), 0);
456467
if (rc < (long)sizeof(cb_data)){
457-
fprintf(stderr, "recv(1) error: %li\n", rc);
468+
char buff[256];
469+
fprintf(stderr, "recv(%li) error: %s\n", rc, getSysError(buff,sizeof(buff)));
458470
return (K)0;
459471
}
460472
switch (cb_data.header.msg_type){
@@ -470,8 +482,10 @@ K mqttCallback(int fd){
470482
for (rc = 0, actual = 0;
471483
actual < expected && rc >= 0;
472484
actual += rc = recv(fd, body + actual, expected - actual, 0));
473-
if (rc < 0)
474-
fprintf(stderr, "recv(2) error: %li, expected: %li, actual: %li\n", rc, expected, actual);
485+
if (rc < 0){
486+
char buff[256];
487+
fprintf(stderr, "recv(%li) error: %s, expected: %li, actual: %li\n", rc, getSysError(buff,sizeof(buff)), expected, actual);
488+
}
475489
else
476490
qmsgrcvd(body, actual);
477491
free(body);
@@ -503,7 +517,8 @@ EXP K init(K UNUSED(X)){
503517
if(!(0==validinit))
504518
return 0;
505519
if(dumb_socketpair(spair,1) == SOCKET_ERROR){
506-
fprintf(stderr,"Init failed. socketpair: %s\n", strerror(errno));
520+
char buff[256];
521+
fprintf(stderr,"Init failed. socketpair: %s\n", getSysError(buff,sizeof(buff)));
507522
return 0;
508523
}
509524
// Have to use (0 - fd) rather than simple negate, since SOCKET on Windows is unsigned ptr.

0 commit comments

Comments
 (0)