/* 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; } }
/* 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; }