/// @brief Maps the errno codes to DM_ERROR_*
/// @author Alejandro Álvarez Ayllón <aalvarez@cern.ch>
#include <dmlite/cpp/exceptions.h>
+#include <cstdarg>
+#include <cstdio>
#include <errno.h>
#include "Vfs.h"
+void dmlite::vfsThrowHelper(const std::string &classname, const std::string& func, int code, const char *fmt, ...) throw (DmException)
+{
+ va_list ap;
+ char *s;
+ int ret;
+ std::string msg;
+
+ va_start(ap, fmt);
+ ret = vasprintf(&s, fmt, ap);
+ va_end(ap);
+
+ if (ret == -1)
+ throw new DmException(DMLITE_SYSERR(ENOMEM));
+
+ msg = std::string(s);
+ free(s);
+ dmlite::vfsThrowHelper(classname, func, code, msg);
+}
+
+
+
int dmlite::vfsWrapCallHelper(const std::string &classname, const std::string &func, int r, const std::string& msg) throw (DmException) {
if (r < 0) {
if (msg.length() != 0)
vfsThrowHelper(classname, func, errno, msg + ": " + strerror(errno));
else
- vfsThrowHelper(classname, func, errno, strerror(errno));
+ vfsThrowHelper(classname, func, errno, std::string(strerror(errno)));
}
return r;
}
if (msg.length() != 0)
vfsThrowHelper(classname, func, errno, msg + ": " + strerror(errno));
else
- vfsThrowHelper(classname, func, errno, strerror(errno));
+ vfsThrowHelper(classname, func, errno, std::string(strerror(errno)));
}
return p;
}
+
+
+
+int dmlite::vfsWrapCallHelper(const std::string &classname, const std::string &func, int r, const char *fmt, ...) throw (DmException)
+{
+ va_list ap;
+ char *s;
+ int ret, origerrno;
+ std::string msg;
+
+ origerrno = errno;
+
+ va_start(ap, fmt);
+ ret = vasprintf(&s, fmt, ap);
+ va_end(ap);
+
+ if (ret == -1)
+ throw new DmException(DMLITE_SYSERR(ENOMEM));
+
+ msg = std::string(s);
+ free(s);
+
+ if (r < 0)
+ vfsThrowHelper(classname, func, origerrno, msg + ": " + strerror(origerrno));
+
+ return r;
+}
+
+
+
+void *dmlite::vfsWrapCallHelper(const std::string &classname, const std::string &func, void *p, const char *fmt, ...) throw (DmException)
+{
+ va_list ap;
+ char *s;
+ int ret, origerrno;
+ std::string msg;
+
+ origerrno = errno;
+
+ va_start(ap, fmt);
+ ret = vasprintf(&s, fmt, ap);
+ va_end(ap);
+
+ if (ret == -1)
+ throw new DmException(DMLITE_SYSERR(ENOMEM));
+
+ msg = std::string(s);
+ free(s);
+
+ if (!p)
+ vfsThrowHelper(classname, func, origerrno, msg + ": " + strerror(origerrno));
+
+ return p;
+}
#include <dmlite/cpp/io.h>
#include <dmlite/cpp/poolmanager.h>
-#define vfsThrowErrno(MSG) dmlite::vfsThrowHelper(getImplId(), __func__, DMLITE_SYSERR(errno), (MSG))
-#define vfsThrow(CODE, MSG) dmlite::vfsThrowHelper(getImplId(), __func__, (CODE), (MSG))
#ifdef __GNUC__
+ #define vfsThrowErrno(MSG...) dmlite::vfsThrowHelper(getImplId(), __func__, DMLITE_SYSERR(errno) , ##MSG)
+ #define vfsThrow(CODE, MSG...) dmlite::vfsThrowHelper(getImplId(), __func__, (CODE) , ##MSG)
#define wrapCall(RETVAL, MSG...) dmlite::vfsWrapCallHelper(getImplId(), __func__, (RETVAL) , ##MSG)
#else
+ #define vfsThrowErrno(MSG, ...) dmlite::vfsThrowHelper(getImplId(), __func__, DMLITE_SYSERR(errno), (MSG) , ##__VA_ARGS__)
+ #define vfsThrow(CODE, MSG, ...) dmlite::vfsThrowHelper(getImplId(), __func__, (CODE), (MSG) , ##__VA_ARGS__)
#define wrapCall(RETVAL, ...) dmlite::vfsWrapCallHelper(getImplId(), __func__, (RETVAL) , ##__VA_ARGS__)
#endif
int vfsWrapCallHelper(const std::string &classname, const std::string &func, int r, const std::string& msg = "") throw (DmException);
void *vfsWrapCallHelper(const std::string &classname, const std::string &func, void *p, const std::string& msg = "") throw (DmException);
+ void vfsThrowHelper(const std::string &classname, const std::string& func, int code, const char *fmt, ...) throw (DmException);
+ int vfsWrapCallHelper(const std::string &classname, const std::string &func, int r, const char *fmt, ...) throw (DmException);
+ void *vfsWrapCallHelper(const std::string &classname, const std::string &func, void *p, const char *fmt, ...) throw (DmException);
};
#endif // VFS_H