* /tmp/test1 does, the real path is returned. In normal time, realpath(3)
* fails if the end point directory does not exist.
*/
+__attribute__((visibility("hidden")))
char *utils_expand_path(const char *path)
{
const char *end_path = path;
}
/* Add end part to expanded path */
- strncat(expanded_path, end_path, PATH_MAX);
+ strncat(expanded_path, end_path, PATH_MAX - strlen(expanded_path) - 1);
free(cut_path);
return expanded_path;
/*
* Create a pipe in dst.
*/
+__attribute__((visibility("hidden")))
int utils_create_pipe(int *dst)
{
int ret;
* Make sure the pipe opened by this function are closed at some point. Use
* utils_close_pipe().
*/
+__attribute__((visibility("hidden")))
int utils_create_pipe_cloexec(int *dst)
{
int ret, i;
/*
* Close both read and write side of the pipe.
*/
+__attribute__((visibility("hidden")))
void utils_close_pipe(int *src)
{
int i, ret;
}
}
}
+
+/*
+ * Create a new string using two strings range.
+ */
+__attribute__((visibility("hidden")))
+char *utils_strdupdelim(const char *begin, const char *end)
+{
+ char *str;
+
+ str = zmalloc(end - begin + 1);
+ if (str == NULL) {
+ PERROR("zmalloc strdupdelim");
+ goto error;
+ }
+
+ memcpy(str, begin, end - begin);
+ str[end - begin] = '\0';
+
+error:
+ return str;
+}
+
+/*
+ * Set CLOEXEC flag to the give file descriptor.
+ */
+__attribute__((visibility("hidden")))
+int utils_set_fd_cloexec(int fd)
+{
+ int ret;
+
+ if (fd < 0) {
+ ret = -EINVAL;
+ goto end;
+ }
+
+ ret = fcntl(fd, F_SETFD, FD_CLOEXEC);
+ if (ret < 0) {
+ PERROR("fcntl cloexec");
+ ret = -errno;
+ }
+
+end:
+ return ret;
+}