コード例 #1
0
ファイル: utils.c プロジェクト: KevinRL/torsocks
/*
 * Try to match a given name to localhost names (v4 and v6).
 *
 * If a match is found, the address in network byte order is copied in the
 * buffer thus len must match the size of the given address family and 1 is
 * returned.
 *
 * If NO match is found, 0 is return and buf is untouched.
 *
 * If len is the wrong size, -EINVAL is returned and buf is untouched.
 */
ATTR_HIDDEN
int utils_localhost_resolve(const char *name, int af, void *buf, size_t len)
{
	const char *entry;

	assert(name);
	assert(buf);

	if (af == AF_INET) {
		const in_addr_t addr = htonl(TSOCKS_LOOPBACK);

		entry = match_name(name, localhost_names_v4);
		if (entry) {
			if (len < sizeof(in_addr_t)) {
				/* Size of buffer is not large enough. */
				goto error;
			}
			memcpy(buf, &addr, sizeof(addr));
			goto match;
		}
	} else if (af == AF_INET6) {
		const uint8_t addr[] = TSOCKS_LOOPBACK6;

		entry = match_name(name, localhost_names_v6);
		if (entry) {
			if (len < sizeof(addr)) {
				/* Size of buffer is not large enough. */
				goto error;
			}
			memcpy(buf, addr, sizeof(addr));
			goto match;
		}
	} else {
		/* Unknown family type. */
		assert(0);
		goto error;
	}

	/* No match. */
	return 0;
match:
	/* Match found. */
	return 1;
error:
	return -EINVAL;
}
コード例 #2
0
ファイル: a.c プロジェクト: edufgf/Stateful_Firewall
int device_not_found(char *dev, char* errbuf){
	pcap_if_t *dev_list;
	if (pcap_findalldevs(&dev_list, errbuf)==-1){
			printf("%s\n",errbuf);
	    exit(1);
	}
	pcap_if_t *dev_it;
	for (dev_it = dev_list; dev_it != NULL; dev_it = dev_it->next)
		if (match_name(dev_it->name, dev)) return 0;
	return 1;
}
コード例 #3
0
ファイル: INIFile.C プロジェクト: HeyJJ/ball
	String INIFile::getValue(const String& section_name, const String& key) const
	{
		if (!section_index_.has(section_name)									||
				key.isEmpty()																			||
				!section_index_[section_name]->key_map_.has(key))
		{
			return UNDEFINED;
		}

		// get the part of the line behind the "="
		String match_name((*section_index_[section_name]->key_map_[key]).after('=', 0));
		match_name.trim();
		
		return match_name;
	}
コード例 #4
0
unsigned
as_find_containing(unsigned off, paddr_t start, paddr_t end, const char *container) {
	struct asinfo_entry	*as;
	struct asinfo_entry	*base;
	struct asinfo_entry	*stop;

	as = base = lsp.asinfo.p;
	if(off != AS_NULL_OFF) {
		as = ((struct asinfo_entry *)((uint8_t *)as + off)) + 1;
	}
	stop = (struct asinfo_entry *)((uint8_t *)base + lsp.asinfo.size);
	for( ;; ) {
		if(as >= stop) return(AS_NULL_OFF);
		if(match_name(base, as, container)) {
			if((start >= as->start) && (start <= as->end)) break;
			if((end >= as->start) && (end <= as->end)) break;
			if((start <= as->start) && (end >= as->end)) break;
		}
		++as;
	}
	return((uintptr_t)as - (uintptr_t)base);
}
コード例 #5
0
ファイル: fileops.c プロジェクト: cbmeeks/sd2iec
/* Callback for the partition directory */
static uint8_t pdir_refill(buffer_t* buf) {
  cbmdirent_t dent;

  buf->position = 0;

  /* read volume name */
  while(buf->pvt.pdir.part < max_part) {
    if (disk_label(buf->pvt.pdir.part, dent.name)) {
      free_buffer(buf);
      return 1;
    }

    dent.blocksize = buf->pvt.pdir.part+1;

    if (partition[buf->pvt.pdir.part].fop == &d64ops) {
      /* Use the correct partition type for Dxx images */
      dent.typeflags = (partition[buf->pvt.pdir.part].imagetype & D64_TYPE_MASK)
                       + TYPE_NAT - 1;
    } else {
      /* Anything else is "native" */
      dent.typeflags = TYPE_NAT;
    }

    buf->pvt.pdir.part++;

    /* Parse the name pattern */
    if (buf->pvt.pdir.matchstr &&
        !match_name(buf->pvt.pdir.matchstr, &dent, 0))
      continue;

    createentry(&dent, buf, DIR_FMT_CBM);
    return 0;
  }
  buf->lastused = 1;
  buf->sendeoi = 1;
  memset(buf->data,0,2);
  return 0;
}
コード例 #6
0
ファイル: selection.c プロジェクト: mittinatten/freesasa
static void
select_id(expression_type parent_type,
          struct selection *selection,
          const freesasa_structure *structure,
          const char *id)
{
    int count = 0, match, i;

    assert(id);

    for (i = 0; i < selection->size; ++i) {
        match = 0;
        switch(parent_type) {
        case E_NAME:
            match = match_name(structure, id, i);
            break;
        case E_SYMBOL:
            match = match_symbol(structure, id, i);
            break;
        case E_RESN:
            match = match_resn(structure, id, i);
            break;
        case E_RESI:
            match = match_resi(structure, id, i);
            break;
        case E_CHAIN:
            match = match_chain(structure, id, i);
            break;
        default:
            assert(0);
            break;
        }
        if (match) selection->atom[i] = 1;
        count += match;
    }
    if (count == 0) freesasa_warn("Found no matches to %s '%s', typo?",
                                  e_str(parent_type),id);
}
コード例 #7
0
ファイル: sdlmain.c プロジェクト: j4y4r/j4ymame
static TTF_Font *search_font_config(astring name, bool bold, bool italic, bool underline, bool &bakedstyles)
{
	TTF_Font *font = (TTF_Font *)NULL;
	FcConfig *config;
	FcPattern *pat;
	FcObjectSet *os;
	FcFontSet *fontset;
	FcValue val;

	config = FcConfigGetCurrent();
	pat = FcPatternCreate();
	os = FcObjectSetCreate();
	FcPatternAddString(pat, FC_FAMILY, (const FcChar8 *)name.cstr());

	// try and get a font with the requested styles baked-in
	if (bold)
	{
		if (italic)
		{
			FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Bold Italic");
		}
		else
		{
			FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Bold");
		}
	}
	else if (italic)
	{
		FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Italic");
	}
	else
	{
		FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Regular");
	}

	FcPatternAddString(pat, FC_FONTFORMAT, (const FcChar8 *)"TrueType");

	FcObjectSetAdd(os, FC_FILE);
	fontset = FcFontList(config, pat, os);

	for (int i = 0; i < fontset->nfont; i++)
	{
		if (FcPatternGet(fontset->fonts[i], FC_FILE, 0, &val) != FcResultMatch)
		{
			continue;
		}

		if (val.type != FcTypeString)
		{
			continue;
		}

		mame_printf_verbose("Matching font: %s\n", val.u.s);
		{
			astring match_name((const char*)val.u.s);
			font = TTF_OpenFont_Magic(match_name, POINT_SIZE);
		}

		if (font)
		{
			bakedstyles = true;
			break;
		}
	}

	// didn't get a font above?  try again with no baked-in styles
	if (!font)
	{
		FcPatternDestroy(pat);
		FcFontSetDestroy(fontset);

		pat = FcPatternCreate();
		FcPatternAddString(pat, FC_FAMILY, (const FcChar8 *)name.cstr());
		FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Regular");
		FcPatternAddString(pat, FC_FONTFORMAT, (const FcChar8 *)"TrueType");
		fontset = FcFontList(config, pat, os);

		for (int i = 0; i < fontset->nfont; i++)
		{
			if (FcPatternGet(fontset->fonts[i], FC_FILE, 0, &val) != FcResultMatch)
			{
				continue;
			}

			if (val.type != FcTypeString)
			{
				continue;
			}

			mame_printf_verbose("Matching unstyled font: %s\n", val.u.s);
			{
				astring match_name((const char*)val.u.s);
				font = TTF_OpenFont_Magic(match_name, POINT_SIZE);
			}

			if (font)
			{
				break;
			}
		}
	}

	FcPatternDestroy(pat);
	FcObjectSetDestroy(os);
	FcFontSetDestroy(fontset);
	return font;
}
コード例 #8
0
ファイル: parsing.cpp プロジェクト: xulaus/rig
results_t parse_tree(std::istream* in){

	auto trim = [](std::string str){
		str.erase(0,str.find_first_not_of(' '));
		str.erase(str.find_last_not_of(' ')+1);
		return str;
	};

	if(in==nullptr) throw std::invalid_argument("Input file cannot be null pointer.");
	if(!in->good()) throw std::runtime_error("Input file cannot be read from.");

	results_t results;
	std::queue<std::pair<std::string,std::string>> players;

	std::string line;
	std::regex name_regex("(\\d*\\.?\\s*)?([A-Za-z \\-\\.]+)\\s*");

	std::regex score_regex("(\\d)\\s*[\\-\\/]\\s*(\\d)\\s*|ret\\.?");

	std::pair<std::string,std::string> opponents;
	bool first_opponent_set=false;
	bool burn_in = true;
	while(getline(*in,line)){
		std::smatch m;
		if(std::regex_match(line,m,name_regex)){ // if line is a name

			std::string name = trim(m[2].str());

			if(players.empty()){
				// add to list of names
				if(first_opponent_set){
					opponents.second = name;
					players.push(opponents);
				}
				else{
					opponents.first = name;
				}

				first_opponent_set = !first_opponent_set;
				continue;
			}

			auto names = players.front();


			if(!(match_name(name, names.first) || match_name(name, names.second))){
				// if name is not the expected name

				if(burn_in){ // and we don't have full list of names yet.
					// add to list of names
					if(first_opponent_set){
						opponents.second = name;
						players.push(opponents);
					}
					else{
						opponents.first = name;
					}

					first_opponent_set = !first_opponent_set;
				}
				else{
					throw std::runtime_error("Unexpected name '" + name+ "'." +
					                         "Expected '"+players.front().first+"'" +
					                         " OR '"+players.front().second+"'.");
				}
			}
			else{ // we have the expected name

				// ensure names.first is the winner
				if(!match_name(name,names.first))
					swap(names.first,names.second);

				// Move forward in the list of expected players
				players.pop();

				burn_in = false; // competitors must be known now

				std::string score_line;
				std::smatch sm;
				getline(*in,score_line);

				// Extract score from matches
				int score1=0,score2=0;
				while(std::regex_search(score_line,sm,score_regex)){
					if(stoi(sm[1].str())>stoi(sm[2].str())){
						score1++;
					}
					else{
						score2++;
					}
					score_line=score_line.substr(sm[0].str().length());
				}
				bool walkover=score_line=="wo";

				if(score1+score2<1 && !walkover){
					throw std::runtime_error("Expected score line. Got '"+score_line+"'");
				}

				// Add outcome to list of results
				results.push_back(outcome_t(names.first,names.second,score1,score2,0));

				// Add winner to competitors
				if(first_opponent_set){
					opponents.second = names.first;
					players.push(opponents);
				}
				else{
					opponents.first = names.first;
				}

				first_opponent_set = !first_opponent_set;
			}
		}
		else{
			throw std::runtime_error("Expected name, got '"+line+"'");
		}

	}
	return results;
}
コード例 #9
0
ファイル: conf.c プロジェクト: 0xDEC0DE8/OpenYuma
/********************************************************************
* FUNCTION parse_top
* 
* Parse, and fill one val_value_t struct
*
* Error messages are printed by this function!!
* Do not duplicate error messages upon error return
*
*
* INPUTS:
*   tkc == token chain
*   val == value iniitalized and could be already filled in
*   keepvals == TRUE to save existing values in 'val', as needed
*               FALSE to overwrite old values in 'val', as needed
*
* RETURNS:
*   status of the operation
*********************************************************************/
static status_t 
    parse_top (tk_chain_t  *tkc,
               val_value_t *val,
               boolean keepvals)
{
    status_t       res;
    boolean        done;

    res = NO_ERR;

    /* get the container name */
    done = FALSE;
    while (!done) {
        res = match_name(tkc, obj_get_name(val->obj));
        if (res == ERR_NCX_EOF) {
            if (LOGDEBUG) {
                log_debug("\nconf: object '%s' not found in file '%s'",
                          obj_get_name(val->obj), 
                          tkc->filename);
            }
            return NO_ERR;
        } else if (res != NO_ERR) {
            res = skip_object(tkc);
            if (res != NO_ERR) {
                return res;
            }
        } else {
            done = TRUE;
        }
    }

    /* get a left brace */
    res = consume_tk(tkc, TK_TT_LBRACE);
    if (res != NO_ERR) {
        ncx_conf_exp_err(tkc, res, "left brace to start object");
        return res;
    }

    done = FALSE;
    while (!done) {

        res = get_tk(tkc);
        if (res == ERR_NCX_EOF) {
            return NO_ERR;
        } else if (res != NO_ERR) {
            return res;
        }
        
        /* allow an empty parmset */
        if (TK_CUR_TYP(tkc)==TK_TT_RBRACE) {
            done = TRUE;
        } else {
            res = parse_parm(tkc, val, keepvals);
            if (res != NO_ERR) {
                done = TRUE;
            }
        }
    }

    return res;

}  /* parse_top */
コード例 #10
0
ファイル: httpcookie.c プロジェクト: hanshaze/Cred_Harvester
/**
 * This code analyzes a <name=value> pair within a cookie, within the
 * context of an HTTP request, which includes relavent information
 * about the host that it comes from
 */
void parse_http_cookie(struct TCPRECORD *sess, struct NetFrame *frame, const unsigned char *name, unsigned name_length, const unsigned char *value, unsigned value_length)
{
	struct HTTPREQUEST *req = &sess->layer7.httpreq;
	unsigned char *dec;
	unsigned dec_length = value_length;

	if (dec_length > 1000)
		dec_length = 1000;


	switch (toupper(name[0])) {
	case 'C':
		/* MYSPACE COUNTRY CODE 
		 * Example:
		 * COUNTRYCODE=MFMGCisGAQQBgjdYA%2FmgRTBDBgorBgEEAYI3WAMBoDUwMwIDAgABAgJmAwICAMAECOOUmLvDDv%2BRBBB6gRxsNuYMZ2M7SXM7N4fdBAgyFGPRkgkD7Q%3D%3D;
		 */
		if (match_name("COUNTRYCODE", name, name_length) && ends_with_t(".myspace.com", req->host)) {
			unsigned char *dec0;
			unsigned dec0_length;
			unsigned i;

			/* First, "uudecode" this */
			dec0 = alloca(value_length);
			dec0_length = 0;
			for (i=0; i<value_length; i++) {
				if (value[i] != '%')
					dec0[dec0_length++] = value[i];
				else {
					unsigned c=0;
					i++;
					if (i<value_length && isxdigit(value[i]))
						c = hexval(value[i++])<<4;
					if (i<value_length && isxdigit(value[i]))
						c |= hexval(value[i++]);
					dec0[dec0_length++] = (unsigned char)c;
					i--;
				}
			}

			/* Second, "base64 decode" this */
			dec = alloca(dec0_length);
			dec_length = base64_decode(dec, dec_length, value, value_length);

			/* Third, "asn.1 decode" this */
			{
				unsigned tag, len;
				const unsigned char *px = dec;
				unsigned offset = 0;
				unsigned length = dec_length;
				unsigned max_offset;

				tag = asn1_tag(px,length,&offset);
				len = asn1_length(frame,px,length, &offset);

				/* Process the big object */
				if (tag == 0x30 && len != 0xFFFFFFFF) {
					max_offset = offset+len;

					tag = asn1_tag(px,max_offset,&offset);
					len = asn1_length(frame,px,max_offset, &offset);

					/* Process the OID */
					if (tag == 0x06) {
						JOTDOWN(sess->eng->ferret,
							JOT_SRC("ID-IP", frame),
							JOT_OID("MySpace-CountryCode", px+offset, len),
							0);
					}
					offset += len;


				}


			}
		}
		break;
	case 'D':
		/*
		 go.com (including such properties as espn.com) put in their cookies 
		 some sort of location information. Here are some examples that were googled
		 from the web:

		Z2JyO2VuZztsb25kb247YnJvYWRiYW5kOzU7NTs0Oy0xOzA1MS41MDA7LTAwMC4xMTc7ODI2OzEwMTk4OzQ3ODI7NTsK
		Z2JyO2VuZztsb25kb247YnJvYWRiYW5kOzU7NTs1Oy0xOzA1MS41MDA7LTAwMC4xMTc7ODI2OzEwMTk4OzQ3ODI7NTsK
		dXNhO21kO2NvbGxlZ2UgcGFyazt0MTs1OzQ7NDs1MTE7MDM4Ljk5NzstMDc2LjkyODs4NDA7MjE7MTU7NjsK
		dXNhO3R4O2RhbGxhczticm9hZGJhbmQ7NTs0OzQ7NjIzOzAzMi43ODc7LTA5Ni43OTk7ODQwOzQ0Ozc3OzY7Cg==
		dXNhO3R4O2RhbGxhczticm9hZGJhbmQ7NTs0OzQ7NjIzOzAzMi43ODc7LTA5Ni43OTk7ODQwOzQ0Ozc3OzY7Cg==
		dXNhO2dhO2F0bGFudGE7YnJvYWRiYW5kOzU7NTs1OzUyNDswMzMuNzQ5Oy0wODQuMzg4Ozg0MDsxMTszOzY7Cg==
		dXNhO29yO2JlYXZlcnRvbjticm9hZGJhbmQ7NTszOzM7ODIwOzA0NS40OTE7LTEyMi44MDU7ODQwOzM4OzYyOzY7Cg==
		dXNhO3R4O2RhbGxhczticm9hZGJhbmQ7NTs0OzQ7NjIzOzAzMi43ODc7LTA5Ni43OTk7ODQwOzQ0Ozc3OzY7Cg==
		dXNhO3R4O2RhbGxhczticm9hZGJhbmQ7NTs0OzM7NjIzOzAzMi43ODc7LTA5Ni43OTk7ODQwOzQ0Ozc3OzY7Cg==
		*/
		if (match_name("DE2", name, name_length) && ends_with_t(".go.com", req->host)) {
			dec = alloca(dec_length);
			dec_length = base64_decode(dec, dec_length, value, value_length);
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_PRINT("GO-LOC", dec, dec_length),
				0);
		}
		break;
	case 'E':
		if (starts_with("EMAIL", name, name_length)) {
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_PRINT("e-mail", value, value_length),
				0);
		}
		if (starts_with("E-MAIL", name, name_length)) {
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_PRINT("e-mail", value, value_length),
				0);
		}
		break;

	case 'G':
		/*
		d78da8e7eb998e8f571c4c641b104c60cxsAAABVUyxnYSxsYXdyZW5jZXZpbGxlLCwsLCw1MjQ=
		bf8e3d7c0474fa9da14b6551e6846ec7cxUAAABVUyxnYSxhdGxhbnRhLCwsLCw1MjQ=

		*/
		if (match_name("GEO", name, name_length) && ends_with_t(".youtube.com", req->host)) {
			unsigned i;
			unsigned comma_count=0;
			dec = alloca(dec_length);
			dec_length = base64_decode(dec, dec_length, value, value_length);

			for (i=dec_length; i>0; i--) {
				if (dec[i-1] == ',') {
					/*US,ga,lawrenceville,,,,,524*/
					if (++comma_count == 7)
						break;
				}
			}
			if (i>3 && isalpha(dec[i-2]) && isalpha(dec[i-3])) {
				unsigned offset=i-3;
				while (i<dec_length && comma_count > 5) {
					if (dec[i] == ',')
						comma_count--;
					i++;
				}
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_PRINT("YouTube-Loc", dec+offset, i-offset-1),
					0);
			}
		}
		/*Example:
		 * [email protected]/769779 
		 */
		if (match_name("GMAILCHAT", name, name_length) && ends_with_t("mail.google.com", req->host)) {
			unsigned j;
			for (j=0; j<value_length && value[j] != '/'; j++)
				;
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_PRINT("e-mail", value, j),
				0);
		}
		break;
	case 'I':
		if (match_name("ID", name, name_length) && ends_with_t(".doubleclick.net", req->host)) {
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_PRINT("DoubleClick", value, value_length),
				0);
		}
		break;
	case 'L':
		if (match_name("LOGIN", name, name_length) || match_name("LOGIN_X", name, name_length)) {
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_URLENC("login", value, value_length),
				0);

			if (ends_with_t(".facebook.com", req->host)) {
				req->login = stringtab_lookup(sess->eng->stringtab, value, value_length);
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_URLENC("Facebook-user", req->login->str, req->login->length),
					0);
			}

			if (contains("@", value, value_length)) {
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_URLENC("e-mail", value, value_length),
					0);
			} else if (contains("%40", value, value_length)) {
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_URLENC("e-mail", value, value_length),
					0);
			}
		}
		break;
	case 'M':
		/*http://facebook.com
		 *m_user = warnerc2%40gpc.edu%3A71101757%3ASwUchOEuvzIbYo7E*/
		if (match_name("M_USER", name, name_length)) {
			if (ends_with_t(".facebook.com", req->host)) {
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_URLENC("e-mail", value, value_length),
					0);
			}
		}

		/* http://login.live.com/login.srf
		 * [email protected] */
		if (match_name("MSPPRE", name, name_length)) {
			if (ends_with_t(".live.com", req->host)) {
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_PRINT("e-mail", value, value_length),
					0);
			}
		}

		/* Canadian Broadcasting */
		if (match_name("MyCBCSignIn", name, name_length)) {
			if (ends_with_t(".cbc.ca", req->host)) {
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_PRINT("e-mail", value, value_length),
					0);
			}
		}
		if (match_name("ME", name, name_length)) {
			if (ends_with_t(".myspace.com", req->host)) {
				JOTDOWN(sess->eng->ferret,
					JOT_SRC("ID-IP", frame),
					JOT_URLENC("e-mail", value, value_length),
					0);
			}
		}
		 
		break;
	case 'P':
		if (starts_with("PASSWORD", name, name_length)) {
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_PRINT("password", value, value_length),
				0);
		}
		break;
	case 'U':
		if (starts_with("USERNAME", name, name_length)) {
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_PRINT("username", value, value_length),
				0);
		}
		break;
	case 'W':
		if (starts_with("WATCHED_VIDEO_ID_LIST_", name, name_length)) {
			size_t l = sizeof("WATCHED_VIDEO_ID_LIST_")-1;
			JOTDOWN(sess->eng->ferret,
				JOT_SRC("ID-IP", frame),
				JOT_URLENC("YouTube-ID", name+l, name_length-l),
				0);
		}
		break;
	}
}
コード例 #11
0
ファイル: mount.c プロジェクト: cod5/kielder
int read_mountlist (char *filename)
{
	FILE *fp;
	char *name, *value;
	int i;	
	unsigned long ul_val;
	long l_val;
	char *errptr;
	
	
	/* Check if pathname is absolute, otherwise append to /sys/dev/mnt/ */
	
	if ((fp = fopen (filename, "r")) == NULL)
		return -1;
	
			
	while (fgets (line, 256, fp) != NULL)
	{
		if (line[0] == '#')
			continue;
		
		name = line;
				
		if ((value = find_equals (line)) == NULL)
			continue;
		
		*value = '\0';
		value++;
		
		name = trim_spaces (name);
		value = trim_spaces (value);
		
		i = match_name (name);
	
		switch (i)
		{
			case MOUNT:
				strlcpy (me.mount_name, value, MOUNTENVIRON_STR_MAX);
				break;
				
			case HANDLER:
				strlcpy (me.handler_name, value, MOUNTENVIRON_STR_MAX);
				break;
				
			case DEVICE:
				strlcpy (me.device_name, value, MOUNTENVIRON_STR_MAX);
				break;
							
			case STARTUP:
				strlcpy (me.startup_args, value, MOUNTENVIRON_STR_MAX);
				break;
				
			case HUNIT:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.handler_unit = ul_val;
				break;

			case HFLAGS:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.handler_flags = ul_val;
				break;
				
			case UNIT:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.device_unit = ul_val;
				break;

			case FLAGS:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.device_flags = ul_val;
				break;

			case BLOCKSIZE:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.block_size = ul_val;
				break;

			case PARTITIONSTART:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.partition_start = ul_val;
				break;

			case PARTITIONEND:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.partition_end = ul_val;
				break;

			case RESERVEDBLOCKS:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.reserved_blocks = ul_val;
				break;

			case BUFFERS:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.buffer_cnt = ul_val;
				break;
				
			case PRIORITY:
				l_val = strtol  (value, &errptr, 0);
				if (errptr == NULL)
					me.boot_priority = l_val;
				break;
				
			case BAUD:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.baud = ul_val;
				break;
			
			case REMOVABLE:		/* signed flag */
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.removable = ul_val;
				break;
			
			case WRITABLE:		/* signed flag */
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.writable = ul_val;
				break;


			case WRITETHRUCRITICAL:		/* signed flag */
				l_val = strtol  (value, &errptr, 0);
				if (errptr == NULL)
					me.writethru_critical = l_val;
				break;
			
			case WRITEBACKDELAY:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.writeback_delay = ul_val;
				break;
			
			case MAXTRANSFER:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.max_transfer = ul_val;
				break;
				
			case CONTROLFLAGS:
				ul_val = strtoul  (value, &errptr, 0);
				if (errptr == NULL)
					me.control_flags = ul_val;
				break;


				
			default:
				printf ("Variable not recognized : %s\n", name);
		}
	}	
	
	
	fclose (fp);
	
	return kos_mount (&me);
}