source: rtems/cpukit/shttpd/compat_rtems.c @ d1b3c44

4.104.114.84.95
Last change on this file since d1b3c44 was d1b3c44, checked in by Joel Sherrill <joel.sherrill@…>, on Sep 6, 2007 at 10:17:15 PM

2007-09-06 Joel Sherrill <joel.sherrill@…>

  • shttpd/compat_rtems.c: Style clean up.
  • Property mode set to 100644
File size: 4.5 KB
Line 
1/**********************************************************************
2 *
3 *  rtems shttpd management
4 *
5 *  FILE NAME   : rtems_shttpd.c
6 *
7 *  AUTHOR      : Steven Johnson
8 *
9 *  DESCRIPTION : Defines the interface functions to the shttp daemon
10 *
11 *  REVISION    : $Id$
12 *
13 *  COMMENTS    :
14 *
15 **********************************************************************/
16
17 /**********************************************************************
18 * INCLUDED MODULES
19 **********************************************************************/
20#include <rtems.h>
21#include "defs.h"
22
23#define MAX_WEB_BASE_PATH_LENGTH 256
24#define MIN_SHTTPD_STACK         (8*1024)
25
26typedef struct RTEMS_HTTPD_ARGS {
27    rtems_shttpd_init     init_callback;
28    rtems_shttpd_addpages addpages_callback;
29    unsigned int          port;
30    char                  webroot[MAX_WEB_BASE_PATH_LENGTH];
31} RTEMS_HTTPD_ARGS;
32
33static int rtems_webserver_running = FALSE; //not running.
34
35static rtems_task rtems_httpd_daemon(rtems_task_argument args)
36{
37  RTEMS_HTTPD_ARGS *httpd_args = (RTEMS_HTTPD_ARGS*)args;
38
39  struct shttpd_ctx       *ctx;
40
41  if (httpd_args != NULL)
42    if (httpd_args->init_callback != NULL)
43      httpd_args->init_callback();
44
45/**************************************
46 *  Initialize the web server
47 */
48  /*
49    * Initialize SHTTPD context.
50    * Set WWW root to current WEB_ROOT_PATH.
51    */
52  ctx = shttpd_init(NULL, "document_root", httpd_args->webroot, NULL);
53
54  if (httpd_args != NULL)
55    if (httpd_args->addpages_callback != NULL)
56      httpd_args->addpages_callback(ctx);
57
58  /* Finished with args, so free them */
59  if (httpd_args != NULL)
60    free(httpd_args);
61
62  /* Open listening socket */
63  shttpd_listen(ctx, httpd_args->port);
64
65  rtems_webserver_running = TRUE;
66
67  /* Serve connections infinitely until someone kills us */
68  while (rtems_webserver_running)
69    shttpd_poll(ctx, 1000);
70
71  /* Unreached, because we will be killed by a signal */
72  shttpd_fini(ctx);
73
74  rtems_task_delete( RTEMS_SELF );
75}
76
77rtems_status_code rtems_initialize_webserver(
78  rtems_task_priority   initial_priority,
79  size_t                stack_size,
80  rtems_mode            initial_modes,
81  rtems_attribute       attribute_set,
82  rtems_shttpd_init     init_callback,
83  rtems_shttpd_addpages addpages_callback,
84  char                 *webroot,
85  unsigned int          port
86)
87{
88  rtems_status_code   sc;
89  rtems_id            tid;
90  RTEMS_HTTPD_ARGS    *args;
91
92  if (stack_size < MIN_SHTTPD_STACK)
93    stack_size = MIN_SHTTPD_STACK;
94
95  args = malloc(sizeof(RTEMS_HTTPD_ARGS));
96
97  if (args != NULL) {
98    args->init_callback = init_callback;
99    args->addpages_callback = addpages_callback;
100    args->port = port;
101    strncpy(args->webroot,webroot,MAX_WEB_BASE_PATH_LENGTH);
102
103    sc = rtems_task_create(rtems_build_name('H', 'T', 'P', 'D'),
104                           initial_priority,
105                           stack_size,
106                           initial_modes,
107                           attribute_set,
108                           &tid);
109
110    if (sc == RTEMS_SUCCESSFUL) {
111      sc = rtems_task_start(tid, rtems_httpd_daemon, (rtems_task_argument)args);
112    }
113  } else {
114    sc = RTEMS_NO_MEMORY;
115  }
116
117  return sc;
118}
119
120void rtems_terminate_webserver(void)
121{
122  rtems_webserver_running = FALSE; // not running, so terminate
123}
124
125int rtems_webserver_ok(void)
126{
127  return rtems_webserver_running;
128}
129
130void
131set_close_on_exec(int fd)
132{
133        // RTEMS Does not have a functional "execve"
134        // so technically this call does not do anything,
135        // but it doesnt hurt either.
136        (void) fcntl(fd, F_SETFD, FD_CLOEXEC);
137}
138#ifndef __rtems__
139int
140my_stat(const char *path, struct stat *stp)
141{
142  return (stat(path, stp));
143}
144
145int
146my_open(const char *path, int flags, int mode)
147{
148  return (open(path, flags, mode));
149}
150
151int
152my_remove(const char *path)
153{
154  return (remove(path));
155}
156
157int
158my_rename(const char *path1, const char *path2)
159{
160  return (rename(path1, path2));
161}
162
163int
164my_mkdir(const char *path, int mode)
165{
166  return (mkdir(path, mode));
167}
168
169char *
170my_getcwd(char *buffer, int maxlen)
171{
172  return (getcwd(buffer, maxlen));
173}
174#endif
175int
176set_non_blocking_mode(int fd)
177{
178  int     ret = -1;
179  int     flags;
180
181  if ((flags = fcntl(fd, F_GETFL, 0)) == -1) {
182    DBG(("nonblock: fcntl(F_GETFL): %d", ERRNO));
183  } else if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) {
184    DBG(("nonblock: fcntl(F_SETFL): %d", ERRNO));
185  } else {
186    ret = 0;        /* Success */
187  }
188
189  return (ret);
190}
191
192#if !defined(NO_CGI)
193int
194spawn_process(struct conn *c, const char *prog, char *envblk, char **envp)
195{
196  return (-1); // RTEMS does not have subprocess support as standard.
197}
198#endif
Note: See TracBrowser for help on using the repository browser.