Exemple #1
0
void do_send_task(int fd, t_task_base *base, t_pfs_sig_head *h)
{
	struct conn *curcon = &acon[fd];
	curcon->send_len = 0;
	char obuf[2048] = {0x0};
	pfs_cs_peer *peer = (pfs_cs_peer *) curcon->user;
	peer->hbtime = time(NULL);
	uint8_t tmp_status = FILE_SYNC_DST_2_SRC;

	if (base->fsize == 0 || base->retry)
	{
		if (get_localfile_stat(base) != LOCALFILE_OK)
		{
			LOG(pfs_data_log, LOG_ERROR, "filename[%s] get_localfile_stat ERROR %m!\n", base->filename);
			tmp_status = FILE_SYNC_DST_2_SRC_E_OPENFILE;
		}
	}

	if (tmp_status == FILE_SYNC_DST_2_SRC)
	{
		t_pfs_tasklist *task = NULL;
		if (pfs_get_task(&task, TASK_Q_HOME))
		{
			LOG(pfs_data_log, LOG_ERROR, "filename[%s] do_newtask ERROR!\n", base->filename);
			tmp_status = FILE_SYNC_DST_2_SRC_E_MALLOC;
		}
		else
		{
			memset(&(task->task), 0, sizeof(task->task)); 
			t_task_sub *sub = &(task->task.sub);
			memset(sub, 0, sizeof(t_task_sub));
			ip2str(sub->peerip, peer->ip);
			sub->processlen = base->fsize;
			sub->starttime = time(NULL);
			sub->oper_type = OPER_GET_RSP;
			sub->need_sync = TASK_SRC_NOSYNC;
			memcpy(&(task->task.base), base, sizeof(t_task_base));

			int lfd = -1;
			if (open_localfile_4_read(base, &lfd) != LOCALFILE_OK)
			{
				LOG(pfs_data_log, LOG_ERROR, "fd[%d] err open [%s] %m close it\n", fd, base->filename);
				tmp_status = FILE_SYNC_DST_2_SRC_E_OPENFILE;
				task->task.base.overstatus = OVER_E_OPEN_SRCFILE;
				pfs_set_task(task, TASK_Q_FIN);
			}
			else
			{
				task->task.base.overstatus = OVER_UNKNOWN;
				pfs_set_task(task, TASK_Q_SEND);
				peer->sendtask = task;
				set_client_fd(fd, lfd, 0, sub->processlen);
				peer->sock_stat = SENDFILEING;
			}
		}
	}
	int n = create_sig_msg(CMD_GET_FILE_RSP, tmp_status, (t_pfs_sig_body *)base, obuf, sizeof(t_task_base));
	set_client_data(fd, obuf, n);
	peer->headlen = n;
}
static void inotify_event_handler(struct inotify_event *event)  
{
	int wd = event->wd;
	char *filename = event->name;

	if(filename == NULL )
	{
		LOG(vfs_sig_log, LOG_DEBUG, "inotify event has no filename, go next!\n");
		return;
	}
	LOG(vfs_sig_log, LOG_DEBUG, "inotify event filename [%s]!\n", filename);

	if(filename[0] == '.')
	{
		LOG(vfs_sig_log, LOG_TRACE, "tmpfile [%s] , i dont care!\n", filename);
		return;
	}

	char path[256] = {0x0};
	strcpy(path, watch_dirs[wd]);
	strcat(path, "/");
	strcat(path, filename);
	if (event->mask & IN_CREATE)
	{
		struct stat filestat;
		if (stat(path, &filestat))
		{
			LOG(vfs_sig_log, LOG_ERROR, "get file stat %s err %m\n", path);
			return;
		}

		if (S_ISDIR(filestat.st_mode))
		{
			LOG(vfs_sig_log, LOG_NORMAL, "new dir %s\n", path);
			add_watch(inotify_fd, path, mask);
		}
		else
			LOG(vfs_sig_log, LOG_NORMAL, "file %s be create, ignore it\n", path);
		return;
	}

    t_task_base task;
	memset(&task, 0, sizeof(task));

	snprintf(task.filename, sizeof(task.filename), "%s", path);
	if((event->mask & IN_CLOSE_WRITE) || (event->mask & IN_MOVED_TO)) 
	{
		if (get_localfile_stat(&task) != LOCALFILE_OK)
		{
			LOG(vfs_sig_log, LOG_ERROR, "get_localfile_stat err %s %m\n", task.filename);
			return;
		}
		task.type = TASK_ADDFILE;
    }
	
	if((event->mask & IN_DELETE) || (event->mask & IN_MOVED_FROM)) 
	{
		LOG(vfs_sig_log, LOG_DEBUG, "inotify file delete or move away %s\n", path);
		task.type = TASK_DELFILE;
	}
 	   
	t_vfs_tasklist *vfs_task;
	int ret = vfs_get_task(&vfs_task, TASK_HOME);
	if(ret != GET_TASK_OK) 
	{
		LOG(vfs_sig_log, LOG_ERROR, "inotify get task_home error %s:%d:%d\n", ID, FUNC, LN);
		return;
	}
	memset(&(vfs_task->task), 0, sizeof(t_vfs_taskinfo));
	memcpy(&(vfs_task->task.base), &task, sizeof(task));
	vfs_set_task(vfs_task, TASK_WAIT);	
	
	LOG(vfs_sig_log, LOG_DEBUG, "inotify add task to task_wait filepath %s, task type %d\n", task.filename, task.type);
	
	return;
}