*
*/
-
/* for O_DIRECTORY */
#define _GNU_SOURCE
#include <unistd.h>
#endif
-#include <lnet/lnetctl.h>
-
#include <liblustre.h>
+#include <lnet/lnetctl.h>
#include <obd.h>
#include <lustre_lib.h>
#include <obd_lov.h>
if (errno != EEXIST && errno != EALREADY)
errmsg = strerror(errno);
- rc = -errno;
fprintf(stderr, "error on ioctl "LPX64" for '%s' (%d): %s\n",
(__u64)LL_IOC_LOV_SETSTRIPE, name, fd, errmsg);
}
return parent;
}
-static int llapi_semantic_traverse(char *path, DIR *parent,
+static int llapi_semantic_traverse(char *path, int size, DIR *parent,
semantic_func_t sem_init,
semantic_func_t sem_fini, void *data)
{
continue;
path[len] = 0;
+ if ((len + dent->d_reclen + 2) > size) {
+ fprintf(stderr,
+ "error: %s: string buffer is too small\n",
+ __FUNCTION__);
+ break;
+ }
strcat(path, "/");
strcat(path, dent->d_name);
* tool only makes sense for lustre filesystems. */
break;
case DT_DIR:
- ret = llapi_semantic_traverse(path, d, sem_init,
+ ret = llapi_semantic_traverse(path, size, d, sem_init,
sem_fini, data);
if (ret < 0)
goto out;
decision = -1;
/* If a OST UUID is given, and some OST matches, check it here. */
- if (decision != -1 && param->obdindex != OBD_NOT_FOUND &&
- S_ISREG(st->st_mode)) {
- /* Only those files should be accepted, which have a strip on
- * the specified OST. */
+ if (decision != -1 && param->obdindex != OBD_NOT_FOUND) {
+ if (!S_ISREG(st->st_mode))
+ goto decided;
+
+ /* Only those files should be accepted, which have a
+ * stripe on the specified OST. */
if (!param->lmd->lmd_lmm.lmm_stripe_count) {
decision = -1;
} else {
printf("\n");
}
+decided:
/* Do not get down anymore? */
if (param->depth == param->maxdepth)
return 1;
int llapi_find(char *path, struct find_param *param)
{
- char buf[PATH_MAX + 1];
- int ret;
+ char *buf;
+ int ret, len = strlen(path);
+
+ if (len > PATH_MAX) {
+ fprintf(stderr, "%s: Path name '%s' is too long.\n",
+ __FUNCTION__, path);
+ return -EINVAL;
+ }
+
+ buf = (char *)malloc(PATH_MAX + 1);
+ if (!buf)
+ return -ENOMEM;
ret = common_param_init(param);
- if (ret)
+ if (ret) {
+ free(buf);
return ret;
+ }
param->depth = 0;
- strncpy(buf, path, strlen(path));
- buf[strlen(path)] = '\0';
- ret = llapi_semantic_traverse(buf, NULL, cb_find_init,
+ strncpy(buf, path, PATH_MAX + 1);
+ ret = llapi_semantic_traverse(buf, PATH_MAX + 1, NULL, cb_find_init,
cb_common_fini, param);
find_param_fini(param);
+ free(buf);
return ret < 0 ? ret : 0;
}
int llapi_getstripe(char *path, struct find_param *param)
{
- int ret = 0;
+ char *buf;
+ int ret = 0, len = strlen(path);
+
+ if (len > PATH_MAX) {
+ fprintf(stderr, "%s: Path name '%s' is too long.\n",
+ __FUNCTION__, path);
+ return -EINVAL;
+ }
+
+ buf = (char *)malloc(PATH_MAX + 1);
+ if (!buf)
+ return -ENOMEM;
ret = common_param_init(param);
- if (ret)
+ if (ret) {
+ free(buf);
return ret;
+ }
param->depth = 0;
- ret = llapi_semantic_traverse(path, NULL, cb_getstripe,
+
+ strncpy(buf, path, PATH_MAX + 1);
+ ret = llapi_semantic_traverse(buf, PATH_MAX + 1, NULL, cb_getstripe,
cb_common_fini, param);
find_param_fini(param);
+ free(buf);
return ret < 0 ? ret : 0;
}
int llapi_quotachown(char *path, int flag)
{
struct find_param param;
- int ret = 0;
+ char *buf;
+ int ret = 0, len = strlen(path);
+
+ if (len > PATH_MAX) {
+ fprintf(stderr, "%s: Path name '%s' is too long.\n",
+ __FUNCTION__, path);
+ return -EINVAL;
+ }
+
+ buf = (char *)malloc(PATH_MAX + 1);
+ if (!buf)
+ return -ENOMEM;
memset(¶m, 0, sizeof(param));
param.recursive = 1;
if (ret)
goto out;
- ret = llapi_semantic_traverse(path, NULL, cb_quotachown,
+ strncpy(buf, path, PATH_MAX + 1);
+ ret = llapi_semantic_traverse(buf, PATH_MAX + 1, NULL, cb_quotachown,
NULL, ¶m);
out:
find_param_fini(¶m);
+ free(buf);
return ret;
}