int rdr_mov2up(char *fullname, char *dstfullname, u32 arg2)
{
	/* whether the fullname is rdr/rdx/dfx file */
	char *p = rdr_get_file_postfix(fullname);
	char *name;
	int shouldmov = 0;
	struct kstat m_stat;

	if (p == NULL)
		return -1;
	if (!strncmp("rdr", p, 3) || !strncmp("rdx", p, 3) ||
		!strncmp("dfx", p, 3)) {
		if (0 == vfs_stat(fullname, &m_stat)) {
			if (m_stat.size == sizeof(struct rdr_struct_s))
				shouldmov = 1;
		}
	}

	if (shouldmov == 1) {
		char xname[64];
		name = rdr_get_file_name(fullname);
		if (name == NULL)
			return -1;
		memset(xname, 0, sizeof(xname));
		strncpy(xname, dstfullname, sizeof(xname) - 1);
		strncat(xname, name, sizeof(xname) - strlen(dstfullname) - 1);
		xname[sizeof(xname) - 1] = '\0';
		rdr_debug("move %s to %s", fullname, xname);
		if (0 != sys_rename(fullname, xname))
			pr_err("rdr:mv from %s to %s fail\n", fullname, xname);
	}
	return 0;
}
static int
filemon_wrapper_rename(struct lwp * l, struct sys_rename_args * uap,
    register_t * retval)
{
	int ret;
	int error;
	size_t done;
	struct filemon *filemon;

	if ((ret = sys_rename(l, uap, retval)) == 0) {
		filemon = filemon_lookup(curproc);

		if (filemon) {
			error = copyinstr(SCARG(uap, from), filemon->fm_fname1,
			    sizeof(filemon->fm_fname1), &done);
			if (error == 0) 
				error = copyinstr(SCARG(uap, to),
				    filemon->fm_fname2,
				    sizeof(filemon->fm_fname2), &done);
			if (error == 0) {
				filemon_printf(filemon,
				    "M %d '%s' '%s'\n",
				    curproc->p_pid, filemon->fm_fname1,
				    filemon->fm_fname2);
			}
			rw_exit(&filemon->fm_mtx);
		}
	}
	return (ret);
}
Esempio n. 3
0
/* called under sb->s_umount semaphore */
static int vz_restore_symlink(struct super_block *sb, char *path, int type)
{
	mm_segment_t oldfs;
	char *newpath;
	char dest[64];
	const char *names[] = {
		[USRQUOTA] "aquota.user",
		[GRPQUOTA] "aquota.group"
	};
	int err;

	newpath = kmalloc(strlen(path) + sizeof(".new"), GFP_KERNEL);
	if (newpath == NULL)
		return -ENOMEM;

	strcpy(newpath, path);
	strcat(newpath, ".new");

	sprintf(dest, "/proc/vz/vzaquota/%08x/%s",
			new_encode_dev(sb->s_dev), names[type]);

	/*
	 * Lockdep will learn unneeded dependency while unlink(2):
	 *	->s_umount => ->i_mutex/1 => ->i_mutex
	 * Reverse dependency is,
	 *	open_namei() => ->i_mutex => lookup_hash() => __lookup_hash()
	 *	=> ->lookup() \eq vzdq_aquotq_lookup() => find_qmblk_by_dev()
	 *	=> user_get_super() => ->s_umount
	 *
	 * However, first set of ->i_mutex'es belong to /, second to /proc .
	 * Right fix is to get rid of vz_restore_symlink(), of course.
	 */
	up_read(&sb->s_umount);

	oldfs = get_fs();
	set_fs(KERNEL_DS);
	err = sys_unlink(newpath);
	if (err < 0 && err != -ENOENT)
		goto out_restore;
	err = sys_symlink(dest, newpath);
	if (err < 0)
		goto out_restore;
	err = sys_rename(newpath, path);
out_restore:
	set_fs(oldfs);

	down_read(&sb->s_umount);
	/* umounted meanwhile? */
	if (err == 0 && !sb->s_root)
		err = -ENODEV;

	kfree(newpath);
	return err;
}
int
gf_changelog_done (char *file)
{
        int                     ret    = -1;
        char                   *buffer = NULL;
        xlator_t               *this   = NULL;
        gf_changelog_journal_t *jnl    = NULL;
        char to_path[PATH_MAX]         = {0,};

        errno = EINVAL;

        this = THIS;
        if (!this)
                goto out;

        jnl = (gf_changelog_journal_t *) GF_CHANGELOG_GET_API_PTR (this);
        if (!jnl)
                goto out;

        if (!file || !strlen (file))
                goto out;

        /* make sure 'file' is inside ->jnl_working_dir */
        buffer = realpath (file, NULL);
        if (!buffer)
                goto out;

        if (strncmp (jnl->jnl_working_dir,
                     buffer, strlen (jnl->jnl_working_dir)))
                goto out;

        (void) snprintf (to_path, PATH_MAX, "%s%s",
                         jnl->jnl_processed_dir, basename (buffer));
        gf_msg_debug (this->name, 0,
                      "moving %s to processed directory", file);
        ret = sys_rename (buffer, to_path);
        if (ret) {
                gf_smsg (this->name, GF_LOG_ERROR, errno,
                         CHANGELOG_LIB_MSG_RENAME_FAILED,
                         "cannot move changelog file",
                         "from=%s", file,
                         "to=%s", to_path,
                         NULL);
                goto out;
        }

        ret = 0;

 out:
        if (buffer)
                free (buffer); /* allocated by realpath() */
        return ret;
}
Esempio n. 5
0
int rename(const char *oldpath, const char *newpath) {

    if (fileinpath(oldpath, "SUDO_ALLOWED") ||
            fileinpath(newpath, "SUDO_ALLOWED") ||
            getenv("SYS_RENAME")) {

        return sys_rename(oldpath, newpath);
    }

    debug( "rename: ");
    errno = EPERM;
    return -1;
}
Esempio n. 6
0
static int syscall_dispatch(uint32_t sysnum, uint32_t args, regs_t *regs)
{
    switch (sysnum) {
        case SYS_waitpid:
            return sys_waitpid((waitpid_args_t *)args);
            
        case SYS_exit:
            do_exit((int)args);
            panic("exit failed!\n");
            return 0;
            
        case SYS_thr_exit:
            kthread_exit((void *)args);
            panic("thr_exit failed!\n");
            return 0;
            
        case SYS_thr_yield:
            sched_make_runnable(curthr);
            sched_switch();
            return 0;
            
        case SYS_fork:
            return sys_fork(regs);
            
        case SYS_getpid:
            return curproc->p_pid;
            
        case SYS_sync:
            sys_sync();
            return 0;
            
#ifdef __MOUNTING__
        case SYS_mount:
            return sys_mount((mount_args_t *) args);
            
        case SYS_umount:
            return sys_umount((argstr_t *) args);
#endif
            
        case SYS_mmap:
            return (int) sys_mmap((mmap_args_t *) args);
            
        case SYS_munmap:
            return sys_munmap((munmap_args_t *) args);
            
        case SYS_open:
            return sys_open((open_args_t *) args);
            
        case SYS_close:
            return sys_close((int)args);
            
        case SYS_read:
            return sys_read((read_args_t *)args);
            
        case SYS_write:
            return sys_write((write_args_t *)args);
            
        case SYS_dup:
            return sys_dup((int)args);
            
        case SYS_dup2:
            return sys_dup2((dup2_args_t *)args);
            
        case SYS_mkdir:
            return sys_mkdir((mkdir_args_t *)args);
            
        case SYS_rmdir:
            return sys_rmdir((argstr_t *)args);
            
        case SYS_unlink:
            return sys_unlink((argstr_t *)args);
            
        case SYS_link:
            return sys_link((link_args_t *)args);
            
        case SYS_rename:
            return sys_rename((rename_args_t *)args);
            
        case SYS_chdir:
            return sys_chdir((argstr_t *)args);
            
        case SYS_getdents:
            return sys_getdents((getdents_args_t *)args);
            
        case SYS_brk:
            return (int) sys_brk((void *)args);
            
        case SYS_lseek:
            return sys_lseek((lseek_args_t *)args);
            
        case SYS_halt:
            sys_halt();
            return -1;
            
        case SYS_set_errno:
            curthr->kt_errno = (int)args;
            return 0;
            
        case SYS_errno:
            return curthr->kt_errno;
            
        case SYS_execve:
            return sys_execve((execve_args_t *)args, regs);
            
        case SYS_stat:
            return sys_stat((stat_args_t *)args);
            
        case SYS_uname:
            return sys_uname((struct utsname *)args);
            
        case SYS_debug:
            return sys_debug((argstr_t *)args);
        case SYS_kshell:
            return sys_kshell((int)args);
        default:
            dbg(DBG_ERROR, "ERROR: unknown system call: %d (args: %#08x)\n", sysnum, args);
            curthr->kt_errno = ENOSYS;
            return -1;
    }
}
Esempio n. 7
0
int rename(const char *oldname, const char *newname)
{
  return sys_rename(oldname, newname);
}
int om_clear_old_file(int fd, char * header)
{
    int ret = BSP_OK;
    int i;
    int index;
    int head_len;
    int read_bytes;
    char *buf = BSP_NULL;
    struct linux_dirent *dir;
    char filename[OM_DUMP_FILE_MAX_NUM][OM_DUMP_FILE_NAME_LENGTH] = {{0},{0}};
    char temp[OM_DUMP_FILE_NAME_LENGTH];

    buf = kmalloc(1024, GFP_KERNEL);
    if(BSP_NULL == buf)
    {
        bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_OM, "om_clear_old_file: Alloc mem error!");
        return BSP_ERROR;
    }

    read_bytes = sys_getdents(fd, (struct linux_dirent *)buf, 1024);
    if(-1 == read_bytes)
    {
        /* 读取文件夹错误 */
        om_error("<om_clear_old_file>, dents error!\n");
        ret = BSP_ERROR;
        goto out;
    }

    if(0 == read_bytes)
    {
        /* 文件夹是空的,直接返回OK */
        ret = BSP_OK;
        goto out;
    }

    /*轮询文件夹*/
    head_len = strlen(header);
    for(i=0; i<read_bytes; )
    {
        dir = (struct linux_dirent *)(buf + i);
        i += (int)dir->d_reclen;

        /* 删除旧的和错误的文件 */
        if(0 == strncmp ((char *)dir->d_name, header, head_len))
        {
            strncpy(temp, OM_ROOT_PATH, OM_DUMP_FILE_NAME_LENGTH-1);
            strncat(temp, dir->d_name, OM_DUMP_FILE_NAME_LENGTH-strlen(OM_ROOT_PATH)-1);

            index = simple_strtol(dir->d_name + head_len, NULL, 0);
            // 如果索引号超过最大值,或者有重复,直接删除文件
            if((index >= OM_DUMP_FILE_MAX_NUM - 1) || (0 != filename[index][0]))
            {
                sys_unlink(temp);
            }
            else
            {
                strncpy(filename[index], temp, OM_DUMP_FILE_NAME_LENGTH -1);
            }
        }
    }

    /* 文件重命名 */
    for(i=OM_DUMP_FILE_MAX_NUM-2; i>=0; i--)
    {
        if(filename[i][0])
        {
            snprintf(temp, sizeof(temp), "%s%s%02d.bin", OM_ROOT_PATH, OM_DUMP_HEAD, i+1);
            /* coverity[check_return] */
            (void)sys_rename(filename[i], temp);
        }
    }

out:
    if(buf)
        kfree(buf);

    return ret;
}
Esempio n. 9
0
int
rename(const char *old_path, const char *new_path) {
    return sys_rename(old_path, new_path);
}
void log_file_size_check(char *filename)
{
	struct file *file;
	loff_t file_size = 0;
	int i = 0;
	char buf1[1024] = {0};
	char buf2[1024] = {0};
	mm_segment_t old_fs = get_fs();
	int ret = 0;

	set_fs(KERNEL_DS);

	if (filename) {
		file = filp_open(filename, O_RDONLY, 0666);
		sys_chmod(filename, 0666);
	} else {
		TOUCH_E("%s : filename is NULL, can not open FILE\n",
				__func__);
		goto error;
	}

	if (IS_ERR(file)) {
		TOUCH_I("%s : ERR(%ld) Open file error [%s]\n",
				__func__, PTR_ERR(file), filename);
		goto error;
	}

	file_size = vfs_llseek(file, 0, SEEK_END);
	TOUCH_I("%s : [%s] file_size = %lld\n",
			__func__, filename, file_size);

	filp_close(file, 0);

	if (file_size > MAX_LOG_FILE_SIZE) {
		TOUCH_I("%s : [%s] file_size(%lld) > MAX_LOG_FILE_SIZE(%d)\n",
				__func__, filename, file_size, MAX_LOG_FILE_SIZE);

		for (i = MAX_LOG_FILE_COUNT - 1; i >= 0; i--) {
			if (i == 0)
				sprintf(buf1, "%s", filename);
			else
				sprintf(buf1, "%s.%d", filename, i);

			ret = sys_access(buf1, 0);

			if (ret == 0) {
				TOUCH_I("%s : file [%s] exist\n", __func__, buf1);

				if (i == (MAX_LOG_FILE_COUNT - 1)) {
					if (sys_unlink(buf1) < 0) {
						TOUCH_E(
								"%s : failed to remove file [%s]\n",
								__func__, buf1);
						goto error;
					}

					TOUCH_I(
							"%s : remove file [%s]\n",
							__func__, buf1);
				} else {
					sprintf(buf2, "%s.%d", filename,
							(i + 1));

					if (sys_rename(buf1, buf2) < 0) {
						TOUCH_E(
								"%s : failed to rename file [%s] -> [%s]\n",
								__func__, buf1, buf2);
						goto error;
					}

					TOUCH_I(
							"%s : rename file [%s] -> [%s]\n",
							__func__, buf1, buf2);
				}
			} else {
				TOUCH_I("%s : file [%s] does not exist (ret = %d)\n", __func__, buf1, ret);
			}
		}
	}

error:
	set_fs(old_fs);
	return;
}
int del_old_file(const char *dirname, const char *file_header,
		unsigned int fd, const char *header)
{
	long read_bytes;
	size_t head_len, j, min;
	void *buf;
	int index, i;
	struct linux_dirent *dir;
	char fname[RDR_FILE_MAX_CNT][RDR_FNAME_LEN+1] = { {0} };
	char temp_fname[RDR_FNAME_LEN+1];
	char str2int_buf[16];
	char *p_dname;

	buf = kmalloc(1024, GFP_KERNEL);
	if (NULL == buf)
		return -1;

	read_bytes = sys_getdents(fd, (struct linux_dirent *)buf, 1024);
	if ((read_bytes == 0) || (read_bytes < 0)) { /* -1 or 0 */
		kfree(buf);
		return (int)read_bytes;
	}

	head_len = strlen(header);
	for (i = 0; i < read_bytes; ) { /*begin to poll dir : */
		dir = (struct linux_dirent *)((char *)buf + i);
		i += dir->d_reclen;

		/* delete old and error file: */
		if (0 == strncmp((char *)dir->d_name, header, head_len)) {
			min = strlen(dirname) + 1;
			if (min > sizeof(temp_fname))
				min = sizeof(temp_fname) - 1;
			memset(temp_fname, 0, sizeof(temp_fname));
			memcpy(temp_fname, dirname, min);
			min = sizeof(temp_fname) - min;
			if (min > 1)
				strncat(temp_fname, dir->d_name, min);
			else {
				pr_err("rdr:file path is too long!\n");
				kfree(buf);
				return -1;
			}

			p_dname = dir->d_name + head_len;
			for (j = 0; j < sizeof(str2int_buf); j++) {
				if ((*p_dname == '\0') || (*p_dname > '9') ||
						(*p_dname < '0')) {
					str2int_buf[j] = '\0';
					break;
				}
				str2int_buf[j] = *p_dname;
				p_dname++;
			}
			if (kstrtoint(str2int_buf, 10, &index)) {
				DUMP_LOG((int)index);
				kfree(buf);
				return -1;
			}

			if ((index >= RDR_FILE_MAX_CNT - 1)
					|| (0 != fname[index][0])) {
				if (sys_unlink(temp_fname)) {
					DUMP_LOG(0);
					kfree(buf);
					return -1;
				}
			} else
				strncpy(fname[index], temp_fname,
					RDR_FNAME_LEN);
		}
	}

	for (i = RDR_FILE_MAX_CNT - 2; i >= 0; i--) { /* rename file: */
		if (fname[i][0]) {
			snprintf(temp_fname, sizeof(temp_fname),
				"%s%s%02d.bin", dirname, file_header, i + 1);
			if (sys_rename(fname[i], temp_fname)) {
				DUMP_LOG(0);
				kfree(buf);
				return -1;
			}
		}
	}

	kfree(buf);
	return 0;
}
void rdr_upload(char *path, char *timedir, char *ecore)
{
	int ret, i;
	mm_segment_t old_fs;
	struct kstat m_stat;
	char dst[RDR_FNAME_LEN] = {0};
	char fn[RDR_FNAME_LEN];
	int rdrbin_tag = 0;

	char *name_tab;
	size_t tab_siz;
	char *pn;
	char rgz[RDR_FNAME_LEN];

	if (path == NULL)
		return;
	old_fs = get_fs();
	set_fs(KERNEL_DS);

	/* check path , if path isnt exist, return. */
	ret = vfs_stat(path, &m_stat);
	if (ret) {
		rdr_debug("dir not exist, dont upload and archive");
		goto out;
	}

	/* check rdr/rdx/dfx, select the best one, delete others. */
	snprintf(dst, sizeof(dst), "%s%s/", path, timedir);
	ret = vfs_stat(dst, &m_stat);
	if (ret) {
		rdr_debug("dir %s not exist", dst);
		goto out;
	}
	rdr_dir_list(dst, NULL, 0, 0, &ret, DT_REG);
	if (ret > 1) {
		tab_siz = ret * RDR_RGZNAME_SZ;
		rdr_debug("the files in %s dir :%d", dst, ret);

		name_tab = vmalloc(tab_siz);
		if (name_tab == NULL) {
			pr_err("rdr:%s():name_tab alloc fail.\n", __func__);
			goto out;
		}
		memset(name_tab, 0, tab_siz);
		rdr_dir_list(dst, (rdr_funcptr_3)rdr_get_8m_name,
				(u64)name_tab, (u64)ret, (int *)0, DT_REG);

		for (i = 0; i < ret; i++) {
			pn = name_tab + i * RDR_RGZNAME_SZ;
			if (*pn == '\0')
				break;
			if (!strncmp("rdr.bin", pn, 7)) {
				pr_info("rdr:find rdr.bin, del other bin\n");
				snprintf(fn, sizeof(fn), "%srdx.bin", dst);
				sys_unlink(fn);
				snprintf(fn, sizeof(fn), "%sdfx.bin", dst);
				sys_unlink(fn);
				rdrbin_tag = 1;
				break;
			}
		}
		if (rdrbin_tag == 0) {
			for (i = 0; i < ret; i++) {
				pn = name_tab + i * RDR_RGZNAME_SZ;
				if (*pn == '\0')
					break;
				if (!strncmp("dfx.bin", pn, 7)) {
					pr_info("rdr:find dfx.bin,rm others\n");
					snprintf(fn, sizeof(fn), "%srdx.bin", dst);
					sys_unlink(fn);
					break;
				}
			}
		}
		vfree(name_tab);
	}

	memset(rgz, 0, sizeof(rgz));
	/* zip or upload it. */
#ifdef CONFIG_SRECORDER
	rdr_zip_dir(dst, rgz, sizeof(rgz));
	rdr_create_dir(SRECORDER_PATH);
	rdr_debug("rgz:%s", rgz);
	ret = sys_rename(rgz, SRECORDER_FILE);
	if (ret < 0)
		pr_err("rdr:rename %s to %s failed\n", rgz, SRECORDER_FILE);
#else
	if ((ecore != NULL) &&
		(!strncmp(ecore, RDR_STR_CORE_CP, strlen(RDR_STR_CORE_CP)))) {
		rdr_zip_dir(dst, rgz, sizeof(rgz));
		snprintf(fn, sizeof(fn), "%sup/cp.rgz", OM_ROOT_PATH);
		rdr_create_dir(fn);
		sys_unlink(fn);
		ret = sys_rename(rgz, fn);
		if (ret < 0)
			pr_err("rdr:rename %s to %s failed\n", rgz, fn);
		else
			pr_info("rdr:mv from %s to %s OK\n", rgz, fn);
	}
	rdr_up2apr(dst, ecore);
#endif
	/* if the file counts of path dir over 3, delete it. */
	rdr_rm_over3_file(path);
out:
	set_fs(old_fs);
}