Example #1
0
//截断一个文件,只能截断读缓存中的文件,因为只有这种文件是可写的
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;
}
Example #2
0
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();
}
Example #3
0
/*
 * 写文件,只有本地的文件才可以写,已经传到服务器上的就不能写了
 *
 */
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;
}
Example #4
0
//创建一个文件,并把它加到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;
}
Example #5
0
void init(void) {
    usart_init();
    CLRP(RELAY_PIN);
    SETD(RELAY_PIN);
    sei();
}
Example #6
0
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 {