Example #1
0
static int func_getvar (void *vo, const char *name, NCDValMem *mem, NCDValRef *out)
{
    struct instance *o = vo;
    
    if (!strcmp(name, "succeeded")) {
        *out = ncd_make_boolean(mem, o->succeeded, o->i->params->iparams->string_index);
        return 1;
    }
    
    size_t pos;
    uintmax_t n;
    if ((pos = string_begins_with(name, "match")) && parse_unsigned_integer(MemRef_MakeCstr(name + pos), &n)) {
        if (o->succeeded && n < MAX_MATCHES && o->matches[n].rm_so >= 0) {
            regmatch_t *m = &o->matches[n];
            
            ASSERT(m->rm_so <= o->input.len)
            ASSERT(m->rm_eo >= m->rm_so)
            ASSERT(m->rm_eo <= o->input.len)
            
            size_t len = m->rm_eo - m->rm_so;
            
            *out = NCDVal_NewStringBinMr(mem, MemRef_Sub(o->input, m->rm_so, len));
            return 1;
        }
    }
    
    return 0;
}
Example #2
0
static void func_new_from_value (NCDModuleInst *i)
{
    // read arguments
    NCDValue *arg_value;
    if (!NCDValue_ListRead(i->args, 1, &arg_value)) {
        ModuleLog(i, BLOG_ERROR, "wrong arity");
        goto fail0;
    }
    if (NCDValue_Type(arg_value) != NCDVALUE_STRING) {
        ModuleLog(i, BLOG_ERROR, "wrong type");
        goto fail0;
    }
    
    // parse value
    uintmax_t value;
    if (!parse_unsigned_integer(NCDValue_StringValue(arg_value), &value)) {
        ModuleLog(i, BLOG_ERROR, "wrong value");
        goto fail0;
    }
    
    // check overflow
    if (value > SIZE_MAX) {
        ModuleLog(i, BLOG_ERROR, "value too large");
        goto fail0;
    }
    
    func_new_templ(i, value);
    return;
    
fail0:
    NCDModuleInst_Backend_SetError(i);
    NCDModuleInst_Backend_Dead(i);
}
Example #3
0
void
change_c::parse_value() {
  switch (m_property.m_type) {
    case property_element_c::EBMLT_STRING:  parse_ascii_string();          break;
    case property_element_c::EBMLT_USTRING: parse_unicode_string();        break;
    case property_element_c::EBMLT_UINT:    parse_unsigned_integer();      break;
    case property_element_c::EBMLT_INT:     parse_signed_integer();        break;
    case property_element_c::EBMLT_BOOL:    parse_boolean();               break;
    case property_element_c::EBMLT_BINARY:  parse_binary();                break;
    case property_element_c::EBMLT_FLOAT:   parse_floating_point_number(); break;
    default:                                assert(false);
  }
}
Example #4
0
static int parse_number (NCDModuleInst *i, MemRef str, NCDValMem *mem, NCDValRef *out)
{
    uintmax_t n;
    if (!parse_unsigned_integer(str, &n)) {
        ModuleLog(i, BLOG_ERROR, "failed to parse number");
        return 0;
    }
    
    *out = ncd_make_uintmax(mem, n);
    if (NCDVal_IsInvalid(*out)) {
        return 0;
    }
    
    return 1;
}
Example #5
0
static void client_handler (struct instance *o, char *devpath, int have_map, BStringMap map)
{
    if (o->devpath && !strcmp(devpath, o->devpath) && !NCDUdevManager_Query(o->i->params->iparams->umanager, o->devpath)) {
        // free devpath
        free(o->devpath);
        
        // set no devpath
        o->devpath = NULL;
        
        // signal down
        NCDModuleInst_Backend_Down(o->i);
    } else {
        const BStringMap *cache_map = NCDUdevManager_Query(o->i->params->iparams->umanager, devpath);
        if (!cache_map) {
            goto out;
        }
        
        int match_res = regexec(&o->reg, devpath, 0, NULL, 0);
        const char *interface = BStringMap_Get(cache_map, "INTERFACE");
        const char *ifindex_str = BStringMap_Get(cache_map, "IFINDEX");
        
        uintmax_t ifindex;
        if (!(!match_res && interface && MemRef_Equal(MemRef_MakeCstr(interface), o->ifname) && ifindex_str && parse_unsigned_integer(MemRef_MakeCstr(ifindex_str), &ifindex))) {
            goto out;
        }
        
        if (o->devpath && (strcmp(o->devpath, devpath) || o->ifindex != ifindex)) {
            // free devpath
            free(o->devpath);
            
            // set no devpath
            o->devpath = NULL;
            
            // signal down
            NCDModuleInst_Backend_Down(o->i);
        }
        
        if (!o->devpath) {
            // grab devpath
            o->devpath = devpath;
            devpath = NULL;
            
            // remember ifindex
            o->ifindex = ifindex;
            
            // signal up
            NCDModuleInst_Backend_Up(o->i);
        }
    }
    
out:
    free(devpath);
    if (have_map) {
        BStringMap_Free(&map);
    }
}
Example #6
0
int main(int argc, char *argv[])
{
	int max_users = 1000;
	int user_count = 0;
	
	if (argc < 2) {
		fprintf(stderr, "Usage: bff_book input_file.txt [max_users]\n");
		return 1;
	}

	if (argc > 2) {
		if (parse_unsigned_integer(argv[2], &max_users) < 0) {
			fprintf(stderr, "Failed to parse argument %s\n", argv[2]);
			return 1;
		}
		if (max_users < 0) {
			fprintf(stderr, "Invalid value for max_users\n");
			return 1;
		}
	}


	FILE *fp = fopen(argv[1], "rb");
	if (fp == NULL) {
		fprintf(stderr, "Error opening %s\n", argv[1]);
		return 1;
	}

	int i, j;
	struct tree_node *root = NULL;

	struct bff_user **users = calloc(max_users, sizeof(struct bff_user *));

	if (users == NULL) {
		perror("calloc");
		return 1;
	}

	/* Distances between users not used in part 1. */
	int **dist = calloc(max_users, sizeof(int *));

	if (dist == NULL) {
		perror("calloc");
		return 1;
	}

	for (i=0; i<max_users; i++) {
		dist[i] = calloc(max_users, sizeof(int));
		if (dist[i] == NULL) {
			perror("calloc");
			return 1;
		}
	}

	for (i=0; i<max_users; i++) {
		for (j=0; j<max_users; j++) {
			dist[i][j] = MAX_DIST;
		}
	}

	/* Edges between users, 1 bff 0 for not-bff. */
	int **edge = calloc(max_users, sizeof(int *));

	if (edge == NULL) {
		perror("calloc");
		return 1;
	}

	for (i=0; i<max_users; i++) {
		edge[i] = calloc(max_users, sizeof(int));
		if (edge[i] == NULL) {
			perror("calloc");
			return 1;
		}
	}

	char *lineptr = NULL;
	size_t n_chars;

	for (;;) {
		/* Read a line from the input file. */
		free(lineptr);
		lineptr = NULL;
		if (getline(&lineptr, &n_chars, fp) < 0) {
			free(lineptr);
			break;
		}

		struct bff_user new_user;
		int userid;
		int userid_from, userid_to;
		char name[100];
		char piece_of_info[100];

		if (sscanf(lineptr, "create_user %d, %[^,],%[^,],%[^,]\n",
			   &userid, name, new_user.summary, new_user.profile) == 4)
		{
			if (userid < 0 || userid >= max_users) {
				printf("Create_user failed: userid %d exceeds the range 0 to maximum %d\n", userid, max_users - 1);
				continue;
			}

			new_user.key.userid = userid;
			strcpy(new_user.name, name);
			new_user.key.bff_count = 0;

			printf("Create_user %d %s %s %s\n", userid, new_user.name, new_user.summary, new_user.profile);
			users[userid] = tree_insert(&root, new_user);
			tree_print(root);

			if (tree_validate(root) < 0) {
				abort();
			}
			user_count++;

			dist[userid][userid] = 0;

			printf("Edges:\n");
			print_matrix(edge, user_count);
			print_bff_counts(users, user_count);
		}
		else if (sscanf(lineptr, "delete_user %d\n",
				&userid) == 1)
		{
			printf("Delete_user %d\n", userid);

			struct bff_user user;
			struct tree_node *node = NULL;

			if (users[userid]) {
				user = *users[userid];
				node = tree_delete(&root, &user.key);

				/* Sometimes useful debug code: */
				/*
				printf("Found node %p with bff_count %d and userid %d:\n", node, user.key.bff_count, user.key.userid);
				if (node) {
					printf("node->key.bff_count = %d node->key.userid = %d\n", node->data.key.bff_count, node->data.key.userid);
				}
				printf("After user deletion:\n");
				tree_print(root);
				printf(".\n");
				*/

				free(node);

				/* Now clear distances for deleted id */
				for (i=0; i<user_count; i++) {
					if (edge[userid][i] > 0) {
						update_popularity_tree(users, &root, i, -1);
					}
					edge[userid][i] = 0;
					edge[i][userid] = 0;
				}
				update_distances_full(dist, edge, user_count);
			}
		}
		else if (sscanf(lineptr, "bff %d, %d\n",
				&userid_from, &userid_to) == 2)
		{
			printf("Bff %d %d\n", userid_from, userid_to);
			edge[userid_from][userid_to] = 1;
			edge[userid_to][userid_from] = 1;

			update_distances_incrementally(dist, userid_from, userid_to, user_count);
			update_popularity_tree(users, &root, userid_from, +1);
			//tree_print(root);
			update_popularity_tree(users, &root, userid_to, +1);
			//tree_print(root);

			printf("Edges:\n");
			print_matrix(edge, user_count);
			print_bff_counts(users, user_count);

			/* Commented out for project part 1. */
			/*
			  printf("Distances:\n");
			  print_matrix(dist, user_count);
			*/
		}
		else if (sscanf(lineptr, "unbff %d, %d\n",
				&userid_from, &userid_to) == 2)
		{
			printf("Unbff %d %d\n", userid_from, userid_to);

			if (edge[userid_from][userid_to] == 0) {
				printf("Unbff %d and %d are not bffs.\n", userid_from, userid_to);
				continue;
			}

			edge[userid_from][userid_to] = 0;
			edge[userid_to][userid_from] = 0;
			update_distances_full(dist, edge, user_count);

			update_popularity_tree(users, &root, userid_from, -1);
			//tree_print(root);
			update_popularity_tree(users, &root, userid_to, -1);
			//tree_print(root);

			printf("Edges:\n");
			print_matrix(edge, user_count);
			print_bff_counts(users, user_count);

			/* Commented out for project part 1. */
			/*
			  printf("Distances:\n");
			  print_matrix(dist, user_count);
			*/
		}
		else if (sscanf(lineptr, "read %d, %d, %[^,\n]\n", &userid_to, &userid_from, piece_of_info) == 3) {
			printf("Read %d %d %s\n", userid_to, userid_from, piece_of_info);
			int d = dist[userid_from][userid_to];
			int denied = 1;

			if (!strcmp(piece_of_info, "profile")) {
				if (d <= 1) {
					printf("Read %s: %s\n", piece_of_info, users[userid_from]->profile);
					denied = 0;
				}
			}
			else if (!strcmp(piece_of_info, "summary")) {
				if (d <= 2) {
					printf("Read %s: %s\n", piece_of_info, users[userid_from]->summary);
					denied = 0;
				}
			}
			else if (!strcmp(piece_of_info, "bffs")) {
				if (d <= 3) {
					printf("Read %s: \n", piece_of_info);
					denied = 0;
				}
			}
			else if (!strcmp(piece_of_info, "name")) {
				if (d <= 4) {
					printf("Read %s: %s\n", piece_of_info, users[userid_from]->name);
					denied = 0;
				}
			}
			else {
				printf("Read %s failed: Unkown record.\n", piece_of_info);
				denied = 0;
			}

			if (denied) {
				printf("Read %s: Permission denied, insufficient distance %d.\n", piece_of_info, d);

			}
		}
		else if (!strcmp(lineptr, "rank\n")) {
			printf("Rank:\n");
			tree_print(root);
			printf(".\n");
		}
		else {
			printf("Unrecognized command: %s\n", lineptr);
		}
	}

	if (ferror(fp)) {
		perror("read");
	}

	printf("Exiting...\n");

	printf("Final rank:\n");
	tree_print(root);

	tree_destroy(root);

	for (i=0; i<max_users; i++) {
		free(dist[i]);
	}
	free(dist);

	for (i=0; i<max_users; i++) {
		free(edge[i]);
	}
	free(edge);

	free(users);
	
	fclose(fp);
	return 0;
}