Browse Source

SSM: Track authorised users for each connection

Luke Dashjr 11 years ago
parent
commit
97844bf4a0
1 changed files with 18 additions and 3 deletions
  1. 18 3
      driver-stratum.c

+ 18 - 3
driver-stratum.c

@@ -58,6 +58,11 @@ static struct event_base *_smm_evbase;
 static bool _smm_running;
 static struct evconnlistener *_smm_listener;
 
+struct stratumsrv_conn_userlist {
+	struct proxy_client *client;
+	struct stratumsrv_conn_userlist *next;
+};
+
 struct stratumsrv_conn {
 	struct bufferevent *bev;
 	uint32_t xnonce1_le;
@@ -65,7 +70,7 @@ struct stratumsrv_conn {
 	bool hashes_done_ext;
 	float current_share_pdiff;
 	float desired_share_pdiff;
-	bool have_authorised_user;
+	struct stratumsrv_conn_userlist *authorised_users;
 	
 	struct stratumsrv_conn *next;
 };
@@ -383,10 +388,14 @@ void stratumsrv_mining_authorize(struct bufferevent * const bev, json_t * const
 	if (unlikely(!client))
 		return_stratumsrv_failure(20, "Failed creating new cgpu");
 	
-	if ((!conn->have_authorised_user) || client->desired_share_pdiff < conn->desired_share_pdiff)
+	if ((!conn->authorised_users) || client->desired_share_pdiff < conn->desired_share_pdiff)
 		conn->desired_share_pdiff = client->desired_share_pdiff;
 	
-	conn->have_authorised_user = true;
+	struct stratumsrv_conn_userlist *ule = malloc(sizeof(*ule));
+	*ule = (struct stratumsrv_conn_userlist){
+		.client = client,
+	};
+	LL_PREPEND(conn->authorised_users, ule);
 	
 	_stratumsrv_success(bev, idstr);
 }
@@ -547,10 +556,16 @@ static
 void stratumsrv_client_close(struct stratumsrv_conn * const conn)
 {
 	struct bufferevent * const bev = conn->bev;
+	struct stratumsrv_conn_userlist *ule, *uletmp;
 	
 	bufferevent_free(bev);
 	LL_DELETE(_ssm_connections, conn);
 	release_work2d_(conn->xnonce1_le);
+	LL_FOREACH_SAFE(conn->authorised_users, ule, uletmp)
+	{
+		LL_DELETE(conn->authorised_users, ule);
+		free(ule);
+	}
 	free(conn);
 }