int sfs_read(int fd, int start, int length, char *buffer){ if(DEBUG) printf("%d\n",44); int blockOffset = start % super.blockSize; if(blockOffset + length > super.blockSize) return -1; //get open file table inode** oft; //open file table char* oft_buffer = malloc(sizeof(char)*super.blockSize); if(DEBUG) printf("%d\n",45); int ret = get_block( super.openFileTable_loc, oft_buffer); if (ret < 0) { free(oft_buffer); return ret;} //super not initialized? oft = malloc(sizeof(inode*)); int oft_size = read_itable( oft_buffer, oft, super.blockSize); if(DEBUG) printf("%d\n",46); free(oft_buffer); if (oft_size < 0) { free(oft); return -1;} //read failed? if(DEBUG) printf("%d\n",47); if ( fd < 0 || fd >= oft_size) {//verify fd range free(*oft); free(oft); return -1;} if(DEBUG) printf("%d\n",48); if( (*oft)[fd].type == 1){ //cant read dir like file free(*oft); free(oft); return -1;} if(DEBUG) printf("%d\n",49); if( (*oft)[fd].size < start + length){ //file is not that big free(*oft); free(oft); return -1;} //everything's good, we can can read the fd'th element char* block = malloc(sizeof(char)*super.blockSize); ret = get_block( (*oft)[fd].index + blockOffset, block); if(DEBUG) printf("%d\n",50); free(*oft); free(oft); if( ret < 0){ free(block); return ret;} if(DEBUG) printf("%d\n",51); int i; for(i = 0; i < length; i++) buffer[i] = block[start + i]; free(block); buffer[length] = '\0'; //done return 0;}
int main(int argc, char **argv) { const char *ifname, *ofname, *itname, *otname; FILE *ifil, *ofil, *itab, *otab; int psftype, charsize, fontlen, hastable, notable; int i; int width = 8, bytewidth, height; char *inbuf, *fontbuf; int inbuflth, fontbuflth; set_progname(argv[0]); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE_NAME, LOCALEDIR); textdomain(PACKAGE_NAME); if (argc == 2 && !strcmp(argv[1], "-V")) print_version_and_exit(); ifil = ofil = itab = otab = NULL; ifname = ofname = itname = otname = NULL; fontbuf = NULL; notable = 0; if (!strcmp(get_progname(), "psfaddtable")) { /* Do not send binary data to stdout without explicit "-" */ if (argc != 4) { char *u = _("Usage:\n\t%s infont intable outfont\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } ifname = argv[1]; itname = argv[2]; ofname = argv[3]; } else if (!strcmp(get_progname(), "psfgettable")) { if (argc < 2 || argc > 3) { char *u = _("Usage:\n\t%s infont [outtable]\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } ifname = argv[1]; otname = (argc == 3) ? argv[2] : "-"; } else if (!strcmp(get_progname(), "psfstriptable")) { /* Do not send binary data to stdout without explicit "-" */ if (argc != 3) { char *u = _("Usage:\n\t%s infont outfont\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } ifname = argv[1]; ofname = argv[2]; notable = 1; } else { for (i = 1; i < argc; i++) { if ((!strcmp(argv[i], "-i") || !strcmp(argv[i], "-if")) && i < argc - 1) ifname = argv[++i]; else if ((!strcmp(argv[i], "-o") || !strcmp(argv[i], "-of")) && i < argc - 1) ofname = argv[++i]; else if (!strcmp(argv[i], "-it") && i < argc - 1) itname = argv[++i]; else if (!strcmp(argv[i], "-ot") && i < argc - 1) otname = argv[++i]; else if (!strcmp(argv[i], "-nt")) notable = 1; else break; } if (i < argc || argc <= 1) { char *u = _("Usage:\n\t%s [-i infont] [-o outfont] " "[-it intable] [-ot outtable] [-nt]\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } } if (!ifname) ifname = "-"; if (!strcmp(ifname, "-")) ifil = stdin; else { ifil = fopen(ifname, "r"); if (!ifil) { perror(ifname); exit(EX_NOINPUT); } } if (!itname) /* nothing */; else if (!strcmp(itname, "-")) itab = stdin; else { itab = fopen(itname, "r"); if (!itab) { perror(itname); exit(EX_NOINPUT); } } /* Refuse ifil == itab == stdin ? Perhaps not. */ if (!ofname) /* nothing */; else if (!strcmp(ofname, "-")) ofil = stdout; else { ofil = fopen(ofname, "w"); if (!ofil) { perror(ofname); exit(EX_CANTCREAT); } } if (!otname) /* nothing */; else if (!strcmp(otname, "-")) otab = stdout; else { otab = fopen(otname, "w"); if (!otab) { perror(otname); exit(EX_CANTCREAT); } } if (readpsffont(ifil, &inbuf, &inbuflth, &fontbuf, &fontbuflth, &width, &fontlen, 0, itab ? NULL : &uclistheads) == -1) { char *u = _("%s: Bad magic number on %s\n"); fprintf(stderr, u, get_progname(), ifname); exit(EX_DATAERR); } fclose(ifil); charsize = fontbuflth / fontlen; bytewidth = (width + 7) / 8; if (!bytewidth) bytewidth = 1; height = charsize / bytewidth; hastable = (uclistheads != NULL); if (PSF1_MAGIC_OK((unsigned char *)inbuf)) { psftype = 1; } else if (PSF2_MAGIC_OK((unsigned char *)inbuf)) { psftype = 2; } else { char *u = _("%s: psf file with unknown magic\n"); fprintf(stderr, u, get_progname()); exit(EX_DATAERR); } if (itab) { read_itable(itab, fontlen, &uclistheads); fclose(itab); } if (otab) { struct unicode_list *ul; struct unicode_seq *us; const char *sep; if (!hastable) { char *u = _("%s: input font does not have an index\n"); fprintf(stderr, u, get_progname()); exit(EX_DATAERR); } fprintf(otab, "#\n# Character table extracted from font %s\n#\n", ifname); for (i = 0; i < fontlen; i++) { fprintf(otab, "0x%03x\t", i); sep = ""; ul = uclistheads[i].next; while (ul) { us = ul->seq; while (us) { fprintf(otab, "%sU+%04x", sep, us->uc); us = us->next; sep = ", "; } ul = ul->next; sep = " "; } fprintf(otab, "\n"); } fclose(otab); } if (ofil) { writepsffont(ofil, fontbuf, width, height, fontlen, psftype, notable ? NULL : uclistheads); fclose(ofil); } return EX_OK; }