//截断一个文件,只能截断读缓存中的文件,因为只有这种文件是可写的 int baiduapi_truncate(const char * path, off_t offset) { filedec *f = getfcache(path); if (f) { if ((f->flags & DELETE) || (f->type == forread)) { pthread_mutex_unlock(&f->lock); return -EACCES; } f->flags &= ~SYNCED; if (f->flags & TRANSF) { f->flags |= REOPEN; } pthread_mutex_unlock(&f->lock); int oc = GetWriteBlkNo(f->lengh); //原来的块数 int nc = GetWriteBlkNo(offset); //扩展后的块数 if (offset > f->lengh) { //文件长度被扩展 if (oc && GETD(f->cache.w.flags, oc) == 0) { sem_wait(&wcache); //不能有太多的block没有同步 } pthread_mutex_lock(&f->lock); SETD(f->cache.w.flags, oc); if (f->cache.w.taskid[oc]) { SETR(f->cache.w.flags, oc); } for(int i=oc+1; i<=nc; ++i){ SETZ(f->cache.w.flags, i); } }else{ if (nc && GETD(f->cache.w.flags, nc) == 0) { sem_wait(&wcache); //不能有太多的block没有同步 } pthread_mutex_lock(&f->lock); SETD(f->cache.w.flags, nc); if (f->cache.w.taskid[nc]) { SETR(f->cache.w.flags, nc); } for(int i=nc+1; i<=oc; ++i){ CLRA(f->cache.w.flags, i); } } int ret = ftruncate(f->file, offset); if(ret) { pthread_mutex_unlock(&f->lock); return ret; } f->lengh = offset; pthread_mutex_unlock(&f->lock); return 0; } return -EACCES; }
void init(void) { usart_init(); SETD(BLE_RST); SETP(BLE_RST); SETD(BLE_CTRL); SETP(BLE_CTRL); CLRP(RELAY_PIN0); SETD(RELAY_PIN0); CLRP(RELAY_PIN1); SETD(RELAY_PIN1); sei(); }
/* * 写文件,只有本地的文件才可以写,已经传到服务器上的就不能写了 * */ int baiduapi_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { filedec *f = (filedec *) fi->fh; int c = GetWriteBlkNo(offset); //计算一下在哪个块 int len = Min(size, GetWriteBlkEndPointFromP(offset) - offset); //计算最长能写入的字节 switch (f->type) { case forread: errno = EBADF; return -EBADF; case forwrite: if(offset > f->lengh) { baiduapi_truncate(f->path, offset); } if (c && GETD(f->cache.w.flags, c) == 0) { sem_wait(&wcache); //不能有太多的block没有同步 } pthread_mutex_lock(&f->lock); f->flags &= ~SYNCED; lseek(f->file, offset, SEEK_SET); size_t ret = write(f->file,buf, len); SETD(f->cache.w.flags, c); if (f->cache.w.taskid[c]) { SETR(f->cache.w.flags, c); } pthread_mutex_unlock(&f->lock); if (ret != len) { //写入出错 return ret; } if (ret + offset > f->lengh) { //文件长度被扩展 f->lengh = ret + offset; } if (len < size) { //需要写入下一个block int tmp = baiduapi_write(f->path, buf + len, size - len, offset + len, fi); if (tmp < 0) { //调用出错 return tmp; } else { ret += tmp; } } return ret; } errno = EPERM; return -errno; }
//创建一个文件,并把它加到filelist里面 int baiduapi_create(const char *path, mode_t mode, struct fuse_file_info *fi) { (void) mode; filedec *f = initfcache(path); if (f == NULL) { int lasterrno = errno; errorlog("Init fcache error:%s\n", strerror(errno)); return -lasterrno; } f->type = forwrite; f->count = 1; f->ctime = time(NULL); SETD(f->cache.w.flags, 0); fi->fh = (uint64_t) f; return 0; }
void init(void) { usart_init(); CLRP(RELAY_PIN); SETD(RELAY_PIN); sei(); }
static void set_advanced_encoder_options(adv_opt *opts, int count, vorbis_info *vi) { #ifdef OV_ECTL_RATEMANAGE2_GET int manage = 0; struct ovectl_ratemanage2_arg ai; int i; double dval; long lval; vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_GET, &ai); for(i=0; i < count; i++) { if(opts[i].val) fprintf(stderr, _("Setting advanced encoder option \"%s\" to %s\n"), opts[i].arg, opts[i].val); else fprintf(stderr, _("Setting advanced encoder option \"%s\"\n"), opts[i].arg); if(!strcmp(opts[i].arg, "bitrate_average_damping")) { SETD(ai.bitrate_average_damping); manage = 1; } else if(!strcmp(opts[i].arg, "bitrate_average")) { SETL(ai.bitrate_average_kbps); manage = 1; } else if(!strcmp(opts[i].arg, "bit_reservoir_bias")) { SETD(ai.bitrate_limit_reservoir_bias); manage = 1; } else if(!strcmp(opts[i].arg, "bit_reservoir_bits")) { SETL(ai.bitrate_limit_reservoir_bits); manage = 1; } else if(!strcmp(opts[i].arg, "bitrate_hard_min")) { SETL(ai.bitrate_limit_min_kbps); manage = 1; } else if(!strcmp(opts[i].arg, "bitrate_hard_max")) { SETL(ai.bitrate_limit_max_kbps); manage = 1; } else if(!strcmp(opts[i].arg, "disable_coupling")) { int val=0; vorbis_encode_ctl(vi, OV_ECTL_COUPLING_SET, &val); } else if(!strcmp(opts[i].arg, "impulse_noisetune")) { double val; SETD(val); vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &val); } else if(!strcmp(opts[i].arg, "lowpass_frequency")) { double prev, new; SETD(new); vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_GET, &prev); vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &new); fprintf(stderr, _("Changed lowpass frequency from %f kHz to %f kHz\n"), prev, new); } else {