Esempio n. 1
0
/* receive files */
static rt_err_t zrec_files(struct zfile *zf)
{
	rt_uint8_t *rxbuf;
	rt_err_t res = -RT_ERROR;

	zinit_parameter();
	rxbuf = rt_malloc(RX_BUFFER_SIZE*sizeof(rt_uint8_t));
	if (rxbuf == RT_NULL) {
		rt_kprintf("rxbuf: out of memory\r\n");
		return -RT_ERROR;
	}
	rt_kprintf("\r\nrz: ready...\r\n");	   /* here ready to receive things */
	if ((res = zrec_init(rxbuf,zf))!= RT_EOK) {
		rt_kprintf("\b\b\breceive init failed\r\n");
		rt_free(rxbuf);
		return -RT_ERROR;
	}
	res = zrec_file(rxbuf,zf);
	if (res == ZFIN) {
		rt_free(rxbuf);
		return RT_EOK;	     /* if finish session */
	} else if (res == ZCAN) {
		rt_free(rxbuf);
		return ZCAN;        /* cancel by sender */
	} else {
		zsend_can();
		rt_free(rxbuf);
		return res;
	}
}
Esempio n. 2
0
/* proccess file infomation */
static rt_err_t zget_file_info(char *name, struct zfile *zf)
{
	char *p;
	char *full_path,*ptr;
	rt_uint16_t i,len;
	rt_err_t res  = -RT_ERROR;
	struct statfs buf;
	struct stat finfo;

	if (zf->fname == RT_NULL) 		       /* extract file path  */
    {
	    len = strlen(name)+2; 
	}
	else
	    len = strlen(zf->fname)+strlen(name)+2; 
    full_path = rt_malloc(len);
    if (full_path == RT_NULL)		 
	{
	    zsend_can();
		rt_kprintf("\b\b\bfull_path: out of memory\n");
		rt_free(full_path);
		return -RT_ERROR;
	}
	memset(full_path,0,len);

    for (i=0,ptr=zf->fname;i<len-strlen(name)-2;i++)
		 full_path[i] = *ptr++;
    full_path[len-strlen(name)-2] = '/';
	/* check if is a directory */
	if ((zf->fd=open(full_path, DFS_O_DIRECTORY,0)) < 0)	 
	{
	    zsend_can();
	    rt_kprintf("\b\b\bcan not open file:%s\r\n",zf->fname+1);
		close(zf->fd);
		zf->fd = -1;
		rt_free(full_path);
	    return res;
	}
	fstat(zf->fd, &finfo);
	if ((finfo.st_mode&S_IFDIR) != S_IFDIR)           
	{
		close(zf->fd);
		zf->fd = -1;
		return res;
	}
	close(zf->fd);	   
	/* get fullpath && file attributes */
    strcat(full_path,name);
    zf->fname = full_path;
	p = strlen(name)+name+1;	   
	sscanf((const char *)p, "%ld%lo%o", &zf->bytes_total,&zf->ctime,&zf->mode);
#if defined(RT_USING_DFS) && defined(DFS_USING_WORKDIR)
	dfs_statfs(working_directory,&buf);
	if (zf->bytes_total > (buf.f_blocks * buf.f_bfree))
	{
	    zsend_can();
	    rt_kprintf("\b\b\bnot enough disk space\r\n");
		zf->fd = -1;
		rt_free(full_path);
		return -RT_ERROR;  
	}
#else
    buf = buf;
#endif
	zf->bytes_received   = 0L;
	if ((zf->fd = open(zf->fname,DFS_O_CREAT|DFS_O_WRONLY,0)) < 0)	 /* create or replace exist file */
	{
	    zsend_can();
	    rt_kprintf("\b\b\bcan not create file:%s \r\n",zf->fname);	
		return -RT_ERROR;
	}

	return RT_EOK;
}