Example #1
0
/** @memo Destroy an HTTP Managed Server instance.

    @doc  This function must be called to release sockets, semaphores and treads
          owned by this instance of the server. This function does not de-allocate the
		  HTTPServerContext or the server's connectCtxArray, that must be done explicitly.

    @see  HTTP_ServerInit

    @return nothing
 */
void HTTP_ServerDestroy (
		HTTPServerContext* server, /**     Pointer to structure that was initialized by HTTP_ServerInit */
		HTTPServerConnection** connectCtxArray /** The server's contextArray is returned in the variable. Call rtp_free() to release it.*/
	)
{
    rtp_net_closesocket(server->serverSocket);

  #ifdef HTTP_SERVER_MULTITHREAD
    {
        RTP_MUTEX helperThreadMutex;
	    RTP_SEMAPHORE helperThreadSemaphore;
        if (connectCtxArray)
        {
	        *connectCtxArray = server->connectionContextArray;
        }
        rtp_sig_mutex_free(server->lock);

        rtp_helper_thread_ctx_destroy (
		        &server->helperContext,
		        &helperThreadMutex,
		        &helperThreadSemaphore
	        );

        rtp_sig_mutex_free(helperThreadMutex);
        rtp_sig_semaphore_free(helperThreadSemaphore);
    }
  #endif /* HTTP_SERVER_MULTITHREAD */

	rtp_memset((unsigned char *) server, 0, sizeof(HTTPServerContext));
}
Example #2
0
/*---------------------------------------------------------------------------*/
int rtp_queue_free (RTPMessageQueue *queue)
{
	rtp_sig_mutex_free(queue->lock);
	rtp_sig_semaphore_free(queue->sem);	
	
	return (0);
}
Example #3
0
/*---------------------------------------------------------------------------*/
int  rtp_timer_init     (void)
{
    if (rtpTimerInitialized == 0)
    {
        if (rtp_sig_mutex_alloc(&rtpTimerLock, 0) >= 0)
        {
            if (rtp_sig_semaphore_alloc(&rtpTimerSignal, 0) >= 0)
            {
                RTP_THREAD newThread;
                
                DLLIST_INIT(&rtpTimerNewList);
                DLLIST_INIT(&rtpTimerActiveList);
                
                rtpTimerNextToProcess = 0;
                
                if (rtp_thread_spawn (&newThread,
                                      _rtp_timer_thread,
                                      0, 
                                      0, 
                                      2, 
                                      0) >= 0)
                {
                    rtpTimerInitialized = 1;
                    return (0);
                }
                
                rtp_sig_semaphore_free(rtpTimerSignal);
            }
            else
            {
                rtp_printf("rtp_timer_init - rtp_sig_semaphore_alloc failed!\n");
            }
            
            rtp_sig_mutex_free(rtpTimerLock);
        }
        else
        {
            rtp_printf("rtp_timer_init - rtp_sig_mutex_alloc failed!");
        }
        
        return (-1);
    }
    
    rtpTimerInitialized++;
    return (0); 
}
Example #4
0
/*---------------------------------------------------------------------------*/
int rtp_queue_init (RTPMessageQueue *queue, int queueSize, long msgSize, void *messages)
{
	tc_memset(queue, 0, sizeof(RTPMessageQueue));
	
	if (rtp_sig_mutex_alloc(&queue->lock, 0) < 0)
	{
		return (-1);
	}

	if (rtp_sig_semaphore_alloc(&queue->sem, 0) < 0)
	{
		rtp_sig_mutex_free(queue->lock);
		return (-1);
	}
	
	queue->queueSize = queueSize;
	queue->msgSize = msgSize;
	queue->first = 0;
	queue->last = 0;
	queue->messages = messages;
	
	return (0);
}
Example #5
0
int rtsmb_client_config(void)
{
   int i, j;

    if (rtsmb_client_config_initialized)
    {
        return 1;
    }
#if ALLOC_FROM_HEAP
    else
    {
        RTSMB_CLI_SESSION               * sessions                 = safemalloc(sizeof(RTSMB_CLI_SESSION              ) * CFG_RTSMB_CLI_MAX_SESSIONS);
        RTSMB_CLI_SESSION_JOB           * jobs                     = safemalloc(sizeof(RTSMB_CLI_SESSION_JOB          ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_JOBS_PER_SESSION);
        RTSMB_CLI_SESSION_SHARE         * shares                   = safemalloc(sizeof(RTSMB_CLI_SESSION_SHARE        ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_SHARES_PER_SESSION);
        RTSMB_CLI_SESSION_FID           * fids                     = safemalloc(sizeof(RTSMB_CLI_SESSION_FID          ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_FIDS_PER_SESSION);
        RTSMB_CLI_SESSION_SEARCH        * searches                 = safemalloc(sizeof(RTSMB_CLI_SESSION_SEARCH       ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_SEARCHES_PER_SESSION);
        RTSMB_CLI_SESSION_SSTAT         * share_search_stats       = safemalloc(sizeof(RTSMB_CLI_SESSION_SSTAT        ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_SHARES_PER_SEARCH);
        RTSMB_CLI_SESSION_DSTAT         * file_search_stats        = safemalloc(sizeof(RTSMB_CLI_SESSION_DSTAT        ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_SEARCHES_PER_SESSION * CFG_RTSMB_CLI_MAX_FILES_PER_SEARCH);
        byte                            * wire_temp_buffers        = safemalloc(sizeof(byte                           ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_BUFFER_SIZE);
        RTSMB_CLI_WIRE_BUFFER           * wire_buffers             = safemalloc(sizeof(RTSMB_CLI_WIRE_BUFFER          ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_BUFFERS_PER_WIRE);
        byte                            * wire_buffer_buffers      = safemalloc(sizeof(byte                           ) * CFG_RTSMB_CLI_MAX_SESSIONS * CFG_RTSMB_CLI_MAX_BUFFERS_PER_WIRE * CFG_RTSMB_CLI_BUFFER_SIZE);
        RTSMB_CLI_SESSION_SERVER_SEARCH * server_search_results    = safemalloc(sizeof(RTSMB_CLI_SESSION_SERVER_SEARCH) * CFG_RTSMB_CLI_MAX_SERVER_SEARCHES);
        BBOOL                           * server_search_in_use     = safemalloc(sizeof(BBOOL                          ) * CFG_RTSMB_CLI_MAX_SERVER_SEARCHES);
        RTSMB_CHAR16                    * server_search_names      = safemalloc(sizeof(RTSMB_CHAR16                   ) * CFG_RTSMB_CLI_MAX_SERVER_SEARCHES * CFG_RTSMB_CLI_MAX_SERVERS_PER_SEARCH * RTSMB_NB_NAME_SIZE);

        #if (INCLUDE_RTSMB_CLIENT_EZ)
        RTSMB_CLI_EZ_SEARCH             * ez_share_searches        = safemalloc(sizeof(RTSMB_CLI_EZ_SEARCH            ) * CFG_RTSMB_CLI_MAX_SESSIONS);
        RTSMB_CLI_EZ_SEARCH             * ez_server_searches       = safemalloc(sizeof(RTSMB_CLI_EZ_SEARCH            ) * CFG_RTSMB_CLI_MAX_SERVER_SEARCHES);
        RTSMB_CLI_SESSION_SRVSTAT       * ez_server_stats          = safemalloc(sizeof(RTSMB_CLI_SESSION_SRVSTAT      ) * CFG_RTSMB_CLI_MAX_SERVER_SEARCHES);
        RTSMB_CLI_EZ_THREAD             * ez_threads               = safemalloc(sizeof(RTSMB_CLI_EZ_THREAD            ) * CFG_RTSMB_CLI_MAX_SUPPORTED_THREADS);
        #endif
    }
#endif

 #ifdef INCLUDE_RTSMB_THREADSAFE
   if (rtp_sig_mutex_alloc((RTP_MUTEX *) &prtsmb_cli_ctx->sessions_mutex, 0) < 0)
   {
       return 0;
   }

   if (rtp_sig_mutex_alloc((RTP_MUTEX *) &prtsmb_cli_ctx->server_search_mutex, 0) < 0)
   {
       rtp_sig_mutex_free(prtsmb_cli_ctx->sessions_mutex);
       return 0;
   }

  #if (INCLUDE_RTSMB_CLIENT_EZ)
   if (rtp_sig_mutex_alloc((RTP_MUTEX *) &prtsmb_cli_ctx->ez_threads_mutex, 0) < 0)
   {
       rtp_sig_mutex_free(prtsmb_cli_ctx->server_search_mutex);
       rtp_sig_mutex_free(prtsmb_cli_ctx->sessions_mutex);
       return 0;
   }
  #endif
 #endif /* INCLUDE_RTSMB_THREADSAFE */

   prtsmb_cli_ctx->max_sessions             = CFG_RTSMB_CLI_MAX_SESSIONS;
   prtsmb_cli_ctx->max_searches_per_session = CFG_RTSMB_CLI_MAX_SEARCHES_PER_SESSION;
   prtsmb_cli_ctx->max_fids_per_session     = CFG_RTSMB_CLI_MAX_FIDS_PER_SESSION;
   prtsmb_cli_ctx->max_shares_per_session   = CFG_RTSMB_CLI_MAX_SHARES_PER_SESSION;
   prtsmb_cli_ctx->max_jobs_per_session     = CFG_RTSMB_CLI_MAX_JOBS_PER_SESSION;
   prtsmb_cli_ctx->max_buffers_per_wire     = CFG_RTSMB_CLI_MAX_BUFFERS_PER_WIRE;
   prtsmb_cli_ctx->buffer_size              = CFG_RTSMB_CLI_BUFFER_SIZE;
   prtsmb_cli_ctx->max_shares_per_search    = CFG_RTSMB_CLI_MAX_SHARES_PER_SEARCH;
   prtsmb_cli_ctx->max_server_searches      = CFG_RTSMB_CLI_MAX_SERVER_SEARCHES;
   prtsmb_cli_ctx->max_servers_per_search   = CFG_RTSMB_CLI_MAX_SERVERS_PER_SEARCH;
   prtsmb_cli_ctx->max_files_per_search     = CFG_RTSMB_CLI_MAX_FILES_PER_SEARCH;
   prtsmb_cli_ctx->max_supported_threads    = CFG_RTSMB_CLI_MAX_SUPPORTED_THREADS;

   prtsmb_cli_ctx->sessions                 = sessions;
   prtsmb_cli_ctx->server_search_results    = server_search_results;
   prtsmb_cli_ctx->server_search_in_use     = server_search_in_use;

#if (INCLUDE_RTSMB_CLIENT_EZ)
   prtsmb_cli_ctx->ez_share_searches        = ez_share_searches;
   prtsmb_cli_ctx->ez_server_searches       = ez_server_searches;
   prtsmb_cli_ctx->ez_server_stats          = ez_server_stats;
   prtsmb_cli_ctx->ez_threads               = ez_threads;
#endif

#if (INCLUDE_RTSMB_CLIENT_EZ)
   for (i = 0; i < prtsmb_cli_ctx->max_supported_threads; i++)
   {
      prtsmb_cli_ctx->ez_threads[i].in_use = FALSE;
   }
#endif

   for (i = 0; i < prtsmb_cli_ctx->max_server_searches; i++)
   {
#if (INCLUDE_RTSMB_CLIENT_EZ)
      prtsmb_cli_ctx->ez_server_stats[i].sid = -1;
#endif
      prtsmb_cli_ctx->server_search_results[i].srvstats = &server_search_names[i * prtsmb_cli_ctx->max_servers_per_search * RTSMB_NB_NAME_SIZE];
   }

    for (i = 0; i < prtsmb_cli_ctx->max_sessions; i++)
    {
        sessions[i].state = CSSN_STATE_UNUSED;

        sessions[i].jobs                = &jobs                [i * prtsmb_cli_ctx->max_jobs_per_session];
        sessions[i].shares              = &shares              [i * prtsmb_cli_ctx->max_shares_per_session];
        sessions[i].fids                = &fids                [i * prtsmb_cli_ctx->max_fids_per_session];
        sessions[i].searches            = &searches            [i * prtsmb_cli_ctx->max_searches_per_session];
        sessions[i].wire.temp_buffer    = &wire_temp_buffers   [(dword)i * prtsmb_cli_ctx->buffer_size];
        sessions[i].wire.buffers        = &wire_buffers        [i * prtsmb_cli_ctx->max_buffers_per_wire];

        /* default to TCP over ethernet payload size */
        sessions[i].wire.physical_packet_size = 1460;

        sessions[i].share_search.sstats = &share_search_stats  [i * prtsmb_cli_ctx->max_shares_per_search];

        for (j = 0; j < prtsmb_cli_ctx->max_buffers_per_wire; j++)
        {
            sessions[i].wire.buffers[j].buffer = &wire_buffer_buffers [(dword)(i * prtsmb_cli_ctx->max_buffers_per_wire + j) * prtsmb_cli_ctx->buffer_size];
        }

        for (j = 0; j < prtsmb_cli_ctx->max_searches_per_session; j++)
        {
            sessions[i].searches[j].dstats = &file_search_stats [(i * prtsmb_cli_ctx->max_searches_per_session + j) * prtsmb_cli_ctx->max_files_per_search];
        }
    }

    rtsmb_client_config_initialized = 1;

    return 1;
}
Example #6
0
 int FreeMutex(wolfSSL_Mutex* m)
 {
     rtp_sig_mutex_free(*m);
     return 0;
 }
Example #7
0
int  HTTP_ServerInit                (HTTPServerContext *server,			    /**     pointer to uninitialized \Ref{HTTPServerContext} struct */
                                     const HTTP_CHAR *name,				    /**     Server name. Sent in HTTP header. */
                                     const HTTP_CHAR *rootDir,			    /**     Path to the root directory for content. */
                                     const HTTP_CHAR *defaultFile,		    /**     Default Filename if "\" or "path\" is passed with no file name. */
                                     HTTP_INT8 httpMajorVersion,		    /**     Normally 1 for HTTP 1.1 */
                                     HTTP_INT8 httpMinorVersion,		    /**     Normally 1 for HTTP 1.1 */
                                     HTTP_UINT8 *ipAddr,				    /**     V4/V6 examples: ipaddr[4] = {192, 168, 0, 6}; ipAddr = "fe80::20b:dbff:fe2f:c162";                                     */
                                     HTTP_INT16 port,					    /**     port number (80) usually */
									 HTTP_INT16 ipType,					    /**     ipversion 4 or 6       */
                                     HTTP_BOOL allowKeepAlive,			    /**     If HTTP version < 1.1 enables keep-alive support. For 1,1 and greater keep-alive is the default.*/
                                     HTTPServerConnection* connectCtxArray,	/**     pointer to uninitialized bytes, must be (sizeof(HTTPServerConnection) * maxConnections)) bytes.        */
                                     HTTP_INT16 maxConnections,			    /**     The maximum limit on simultaneous HTTP server connections         */
                                     HTTP_INT16 maxHelperThreads		    /**     If HTTP_SERVER_MULTITHREAD is defined, the max number of helper threads to spawn       */
                                     )
{
	rtp_memset((unsigned char *) server, 0, sizeof(HTTPServerContext));



	if (rtp_net_socket_stream_dual(&server->serverSocket, ipType) >= 0)
	{
		if (rtp_net_bind_dual(server->serverSocket, RTP_NET_STREAM, ipAddr, port, ipType) >= 0 &&
		    rtp_net_listen(server->serverSocket, maxConnections) >= 0)
		{
			if (!ipAddr)
			{
				if (rtp_net_getsockname(server->serverSocket, server->serverAddress.ipAddr,
										&server->serverAddress.port, &server->serverAddress.type) < 0)
				{
					rtp_memset(server->serverAddress.ipAddr, 0, RTP_NET_IP_ALEN);
				}
			}
			else
			{
				rtp_memcpy(server->serverAddress.ipAddr, ipAddr, RTP_NET_IP_ALEN);
				server->serverAddress.port = port;
			}

			if (name)
			{
				rtp_strncpy(server->serverName, name, HTTP_SERVER_NAME_LEN-1);
			}
			else
			{
				rtp_strncpy(server->serverName, HTTP_SERVER_NAME_STRING, HTTP_SERVER_NAME_LEN-1);
			}

			server->httpMajorVersion = httpMajorVersion;
			server->httpMinorVersion = httpMinorVersion;

			if (rootDir)
			{
				rtp_strncpy(server->rootDir, rootDir, HTTP_SERVER_PATH_LEN-1);
			}
			else
			{
				/* default to the current working directory */
				server->rootDir[0] = '.';
				server->rootDir[1] = 0;
			}

			if (defaultFile)
			{
				rtp_strncpy(server->defaultFile, defaultFile, HTTP_SERVER_DEFAULT_FILE_LEN-1);
			}
			else
			{
				rtp_strncpy(server->defaultFile, HTTP_SERVER_DEFAULT_FILE, HTTP_SERVER_DEFAULT_FILE_LEN-1);
			}

			if (!allowKeepAlive ||
			    (server->httpMajorVersion == 1 && server->httpMinorVersion > 0) ||
				(server->httpMajorVersion > 1))
			{
				server->allowKeepAlive = allowKeepAlive;
				server->maxConnections = maxConnections;

				DLLIST_INIT(&server->pathList);
				DLLIST_INIT(&server->realmList);

				server->allowedClientList = 0;
				server->numAllowedClients = 0;

				server->blockedClientList = 0;
				server->numBlockedClients = 0;

			  #ifdef HTTP_SERVER_KEEP_ALIVE
				DLLIST_INIT(&server->openConnections);
			  #endif /* HTTP_SERVER_KEEP_ALIVE */

			  #ifdef HTTP_SERVER_MULTITHREAD
				server->connectionContextArray = connectCtxArray;
				server->maxHelperThreads = maxHelperThreads;

				/* allocate the server lock */
				if (rtp_sig_mutex_alloc(&server->lock, 0) >= 0)
				{
					RTP_MUTEX helperThreadMutex;
					RTP_SEMAPHORE helperThreadSemaphore;

					/* initialize the session queue */
					if (rtp_sig_mutex_alloc(&helperThreadMutex, 0) >= 0)
					{
						if (rtp_sig_semaphore_alloc(&helperThreadSemaphore, 0) >= 0)
						{
							if (rtp_helper_thread_ctx_init (
									&server->helperContext,
									helperThreadMutex,
									helperThreadSemaphore
								) >= 0)
							{
								int n;
								// initialize the free job list

								server->jobFreeList = connectCtxArray;

								for (n = 0; n < maxConnections-1; n++)
								{
									connectCtxArray[n].job.next = &(connectCtxArray[n+1].job);
									connectCtxArray[n].job.execute = _HTTP_ServerExecuteJob;
									connectCtxArray[n].server = server;
								}
                                connectCtxArray[n].job.next = 0;
                                connectCtxArray[n].job.execute = _HTTP_ServerExecuteJob;
                                connectCtxArray[n].server = server;

								server->status = HTTP_SERVER_INITIALIZED;
								return (0);
							}

							rtp_sig_semaphore_free(helperThreadSemaphore);
						}

						rtp_sig_mutex_free(helperThreadMutex);
					}

					rtp_sig_mutex_free(server->lock);
				}

			  #else  /* HTTP_SERVER_MULTITHREAD */

				//server->queueFirst = 0;
				//server->queueLast = 0;
				server->status = HTTP_SERVER_INITIALIZED;
				return (0);

			  #endif /* HTTP_SERVER_MULTITHREAD */
			}
		}

		rtp_net_closesocket(server->serverSocket);
	}

	return (-1);
}