/[svn]/liblscp/trunk/examples/example_server.c
ViewVC logotype

Diff of /liblscp/trunk/examples/example_server.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 163 by capela, Wed Jun 30 15:16:03 2004 UTC revision 213 by capela, Thu Jul 29 09:22:02 2004 UTC
# Line 39  lscp_status_t server_callback ( lscp_con Line 39  lscp_status_t server_callback ( lscp_con
39      const char *pszResult = NULL;      const char *pszResult = NULL;
40      char szTemp[256];      char szTemp[256];
41      int i;      int i;
42      static int iChannel = 0;      static int iSamplerChannel = 0;
43        static int iAudioDevice = 0;
44        static int iMidiDevice  = 0;
45    
46      if (pchBuffer == NULL) {      if (pchBuffer == NULL) {
47          fprintf(stderr, "server_callback: addr=%s port=%d: ",          fprintf(stderr, "server_callback: addr=%s port=%d: ",
# Line 108  lscp_status_t server_callback ( lscp_con Line 110  lscp_status_t server_callback ( lscp_con
110          else if (lscp_parser_test(&tok, "CHANNELS")) {          else if (lscp_parser_test(&tok, "CHANNELS")) {
111              // Current number of sampler channels:              // Current number of sampler channels:
112              // GET CHANNELS              // GET CHANNELS
113              sprintf(szTemp, "%d", iChannel);              sprintf(szTemp, "%d", iSamplerChannel);
114              pszResult = szTemp;              pszResult = szTemp;
115          }          }
116          else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {          else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {
117              // Getting all available audio output drivers.              // Getting all available audio output drivers.
118              // GET AVAILABLE_AUDIO_OUTPUT_DRIVERS              // GET AVAILABLE_AUDIO_OUTPUT_DRIVERS
119              pszResult = "Alsa,Jack,CoreAudio\r\n";              pszResult = "Alsa,Jack\r\n";
120          }          }
121          else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {          else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {
122              // Getting all available MIDI input drivers.              // Getting all available MIDI input drivers.
123              // GET AVAILABLE_MIDI_INPUT_DRIVERS              // GET AVAILABLE_MIDI_INPUT_DRIVERS
124              pszResult = "Alsa,MidiShare,CoreMidi\r\n";              pszResult = "Alsa\r\n";
125          }          }
126          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER", "INFO")) {          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER", "INFO")) {
127              // Getting informations about a specific audio output driver.              // Getting informations about a specific audio output driver.
# Line 127  lscp_status_t server_callback ( lscp_con Line 129  lscp_status_t server_callback ( lscp_con
129              if (lscp_parser_test(&tok, "Alsa")) {              if (lscp_parser_test(&tok, "Alsa")) {
130                  pszResult = "DESCRIPTION: 'ALSA PCM'\r\n"                  pszResult = "DESCRIPTION: 'ALSA PCM'\r\n"
131                              "VERSION: '1.0'\r\n"                              "VERSION: '1.0'\r\n"
132                              "PARAMETERS: channels,samplerate,active,card\r\n";                              "PARAMETERS: channels,samplerate,active\r\n";
133              }              }
134              else if (lscp_parser_test(&tok, "Jack")) {              else if (lscp_parser_test(&tok, "Jack")) {
135                  pszResult = "DESCRIPTION: JACK Audio Connection Kit\r\n"                  pszResult = "DESCRIPTION: JACK Audio Connection Kit\r\n"
# Line 149  lscp_status_t server_callback ( lscp_con Line 151  lscp_status_t server_callback ( lscp_con
151          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER_PARAMETER", "INFO")) {          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER_PARAMETER", "INFO")) {
152              // Getting informations about a specific audio output driver parameter.              // Getting informations about a specific audio output driver parameter.
153              // GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO <audio-output-type> <param>              // GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO <audio-output-type> <param>
154              if (lscp_parser_test2(&tok, "Alsa", "active")) {              if (lscp_parser_test(&tok, "Alsa")) {
155                  pszResult = "DESCRIPTION: 'ALSA PCM device active state'\r\n"                  if (lscp_parser_test(&tok, "active")) {
156                              "TYPE: BOOL\r\n"                      pszResult = "DESCRIPTION: 'ALSA PCM active state'\r\n"
157                              "MANDATORY: TRUE\r\n"                                  "TYPE: BOOL\r\n"
158                              "FIX: TRUE\r\n"                                  "MANDATORY: TRUE\r\n"
159                              "MULTIPLICITY: FALSE\r\n"                                  "FIX: TRUE\r\n"
160                              "DEPENDS: channels,samplerate,card\r\n"                                  "MULTIPLICITY: FALSE\r\n"
161                              "DEFAULT: TRUE\r\n"                                  "DEPENDS: channels,samplerate,card\r\n"
162                              "RANGE_MIN: FALSE\r\n"                                  "DEFAULT: TRUE\r\n"
163                              "RANGE_MIN: TRUE\r\n"                                  "RANGE_MIN: FALSE\r\n"
164                              "POSSIBILITIES: FALSE,TRUE\r\n";                                  "RANGE_MAX: TRUE\r\n"
165              }                                  "POSSIBILITIES: FALSE,TRUE\r\n";
166              else if (lscp_parser_test2(&tok, "Jack", "active")) {                  }
167                  pszResult = "DESCRIPTION: 'JACK device active state'\r\n"                  else if (lscp_parser_test(&tok, "channels")) {
168                              "TYPE: BOOL\r\n"                      pszResult = "DESCRIPTION: 'Number of ALSA PCM channels'\r\n"
169                              "MANDATORY: TRUE\r\n"                                  "TYPE: INT\r\n"
170                              "FIX: TRUE\r\n"                                  "MANDATORY: TRUE\r\n"
171                              "MULTIPLICITY: FALSE\r\n"                                  "FIX: TRUE\r\n"
172                              "DEPENDS: channels,samplerate\r\n"                                  "MULTIPLICITY: FALSE\r\n"
173                              "DEFAULT: TRUE\r\n"                                  "DEFAULT: 2\r\n";
174                              "RANGE_MIN: FALSE\r\n"                  }
175                              "RANGE_MIN: TRUE\r\n"                  else if (lscp_parser_test(&tok, "samplerate")) {
176                              "POSSIBILITIES: FALSE,TRUE\r\n";                      pszResult = "DESCRIPTION: 'ALSA PCM sample rate'\r\n"
177                                    "TYPE: INT\r\n"
178                                    "MANDATORY: TRUE\r\n"
179                                    "FIX: TRUE\r\n"
180                                    "MULTIPLICITY: TRUE\r\n"
181                                    "DEFAULT: 44100\r\n"
182                                    "POSSIBILITIES: 44100,48000,96000\r\n";
183                    }
184                    else ret = LSCP_FAILED;
185                }
186                else if (lscp_parser_test(&tok, "Jack")) {
187                    if (lscp_parser_test(&tok, "active")) {
188                        pszResult = "DESCRIPTION: 'JACK active state'\r\n"
189                                    "TYPE: BOOL\r\n"
190                                    "MANDATORY: TRUE\r\n"
191                                    "FIX: TRUE\r\n"
192                                    "MULTIPLICITY: FALSE\r\n"
193                                    "DEPENDS: channels,samplerate\r\n"
194                                    "DEFAULT: TRUE\r\n"
195                                    "RANGE_MIN: FALSE\r\n"
196                                    "RANGE_MAX: TRUE\r\n"
197                                    "POSSIBILITIES: FALSE,TRUE\r\n";
198                    }
199                    else if (lscp_parser_test(&tok, "channels")) {
200                        pszResult = "DESCRIPTION: 'Number of JACK audio channels'\r\n"
201                                    "TYPE: INT\r\n"
202                                    "MANDATORY: TRUE\r\n"
203                                    "FIX: TRUE\r\n"
204                                    "MULTIPLICITY: FALSE\r\n"
205                                    "DEFAULT: 2\r\n";
206                    }
207                    else if (lscp_parser_test(&tok, "samplerate")) {
208                        pszResult = "DESCRIPTION: 'JACK sample rate'\r\n"
209                                    "TYPE: INT\r\n"
210                                    "MANDATORY: TRUE\r\n"
211                                    "FIX: TRUE\r\n"
212                                    "MULTIPLICITY: TRUE\r\n"
213                                    "DEFAULT: 44100\r\n"
214                                    "POSSIBILITIES: 44100,48000,96000\r\n";
215                    }
216                    else ret = LSCP_FAILED;
217              }              }
218              else ret = LSCP_FAILED;              else ret = LSCP_FAILED;
219          }          }
220          else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER_PARAMETER", "INFO")) {          else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER_PARAMETER", "INFO")) {
221              // Getting informations about a specific MIDI input driver parameter.              // Getting informations about a specific MIDI input driver parameter.
222              // GET MIDI_INPUT_DRIVER_PARAMETER INFO <midi-input-type> <param>              // GET MIDI_INPUT_DRIVER_PARAMETER INFO <midi-input-type> <param>
223              if (lscp_parser_test2(&tok, "Alsa", "active")) {              if (lscp_parser_test(&tok, "Alsa")) {
224                  pszResult = "DESCRIPTION: 'ALSA Sequencer device active state'\r\n"                  if (lscp_parser_test(&tok, "active")) {
225                              "TYPE: BOOL\r\n"                      pszResult = "DESCRIPTION: 'ALSA Sequencer device active state'\r\n"
226                              "MANDATORY: TRUE\r\n"                                  "TYPE: BOOL\r\n"
227                              "FIX: TRUE\r\n"                                  "MANDATORY: TRUE\r\n"
228                              "MULTIPLICITY: FALSE\r\n"                                  "FIX: TRUE\r\n"
229                              "DEPENDS: channels,ports\r\n"                                  "MULTIPLICITY: FALSE\r\n"
230                              "DEFAULT: TRUE\r\n"                                  "DEPENDS: channels,ports\r\n"
231                              "RANGE_MIN: FALSE\r\n"                                  "DEFAULT: TRUE\r\n"
232                              "RANGE_MIN: TRUE\r\n"                                  "RANGE_MIN: FALSE\r\n"
233                              "POSSIBILITIES: FALSE,TRUE\r\n";                                  "RANGE_MAX: TRUE\r\n"
234                                    "POSSIBILITIES: FALSE,TRUE\r\n";
235                    }
236                    else if (lscp_parser_test(&tok, "ports")) {
237                        pszResult = "DESCRIPTION: 'Number of ALSA Sequencer ports'\r\n"
238                                    "TYPE: INT\r\n"
239                                    "MANDATORY: FALSE\r\n"
240                                    "FIX: FALSE\r\n"
241                                    "MULTIPLICITY: FALSE\r\n"
242                                    "DEFAULT: 1\r\n"
243                                    "RANGE_MIN: 1\r\n"
244                                    "RANGE_MAX: 4\r\n";
245                    }
246                    else ret = LSCP_FAILED;
247                }
248                else ret = LSCP_FAILED;
249            }
250            else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DEVICE", "INFO")) {
251                // Getting informations about a specific audio output device.
252                // GET AUDIO_OUTPUT_DEVICE INFO <audio-device-id>
253                if (lscp_parser_nextint(&tok) < iAudioDevice) {
254                    pszResult = "driver: Alsa\r\n"
255                                "active: TRUE\r\n"
256                                "channels: 2\r\n"
257                                "samplerate: 44100\r\n";
258                }
259                else ret = LSCP_FAILED;
260            }
261            else if (lscp_parser_test2(&tok, "MIDI_INPUT_DEVICE", "INFO")) {
262                // Getting informations about a specific MIDI input device.
263                // GET MIDI_INPUT_DEVICE INFO <midi-device-id>
264                if (lscp_parser_nextint(&tok) < iMidiDevice) {
265                    pszResult = "driver: Alsa\r\n"
266                                "active: TRUE\r\n"
267                                "channels: 16\r\n"
268                                "ports: 1\r\n";
269                }
270                else ret = LSCP_FAILED;
271            }
272            else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL", "INFO")) {
273                // Getting informations about an audio channel.
274                // GET AUDIO_OUTPUT_CHANNEL INFO <audio-device-id> <audio-channel>
275                if (lscp_parser_nextint(&tok) < iAudioDevice) {
276                    pszResult = "name: DummyMonitor\r\n"
277                                "is_mix_channel: FALSE\r\n"
278                                "mix_channel_destination: 0\r\n";
279                }
280                else ret = LSCP_FAILED;
281            }
282            else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT", "INFO")) {
283                // Getting informations about a MIDI port.
284                // GET MIDI_INPUT_PORT INFO <midi-device-id> <midi-port>
285                if (lscp_parser_nextint(&tok) < iMidiDevice) {
286                    pszResult = "name: DummyKeyboard\r\n"
287                                "alsa_seq_bindings: '64:0'\r\n";
288                }
289                else ret = LSCP_FAILED;
290            }
291            else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL_PARAMETER", "INFO")) {
292                // Getting informations about specific audio channel parameter.
293                // GET AUDIO_OUTPUT_CHANNEL_PARAMETER INFO <audio-device-id> <audio-channel> <param>
294                if (lscp_parser_nextint(&tok) < iAudioDevice) {
295                    lscp_parser_nextint(&tok);
296                    if (lscp_parser_test(&tok, "is_mix_channel")) {
297                        pszResult = "DESCRIPTION: 'Whether this is an audio mix channel'\r\n"
298                                    "TYPE: BOOL\r\n"
299                                    "MANDATORY: TRUE\r\n"
300                                    "FIX: FALSE\r\n"
301                                    "MULTIPLICITY: FALSE\r\n"
302                                    "POSSIBILITIES: FALSE,TRUE\r\n";
303                    }
304                    else if (lscp_parser_test(&tok, "mix_channel_destination")) {
305                        pszResult = "DESCRIPTION: 'Audio mix channel destination'\r\n"
306                                    "TYPE: INT\r\n"
307                                    "MANDATORY: TRUE\r\n"
308                                    "FIX: FALSE\r\n"
309                                    "MULTIPLICITY: TRUE\r\n"
310                                    "POSSIBILITIES: 0,1\r\n";
311                    }
312                    else ret = LSCP_FAILED;
313                }
314                else ret = LSCP_FAILED;
315            }
316            else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT_PARAMETER", "INFO")) {
317                // Getting informations about specific MIDI port parameter.
318                // GET MIDI_INPUT_PORT_PARAMETER INFO <midi-device-id> <midi-port> <param>
319                if (lscp_parser_nextint(&tok) < iMidiDevice) {
320                    lscp_parser_nextint(&tok);
321                    if (lscp_parser_test(&tok, "alsa_seq_bindings")) {
322                        pszResult = "DESCRIPTION: 'Alsa sequencer port bindings'\r\n"
323                                    "TYPE: STRING\r\n"
324                                    "MANDATORY: TRUE\r\n"
325                                    "FIX: FALSE\r\n"
326                                    "MULTIPLICITY: TRUE\r\n"
327                                    "POSSIBILITIES: '64:0','68:0','68:1'\r\n";
328                    }
329                    else ret = LSCP_FAILED;
330              }              }
331              else ret = LSCP_FAILED;              else ret = LSCP_FAILED;
332          }          }
333            else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
334                // Getting all created audio output device count.
335                // GET AUDIO_OUTPUT_DEVICES
336                sprintf(szTemp, "%d\r\n", iAudioDevice);
337                pszResult = szTemp;
338            }
339            else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
340                // Getting all created MID input device count.
341                // GET MIDI_INPUT_DEVICES
342                sprintf(szTemp, "%d\r\n", iMidiDevice);
343                pszResult = szTemp;
344            }
345          else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {          else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {
346              // Getting all available engines:              // Getting all available engines:
347              // GET AVAILABLE_ENGINES              // GET AVAILABLE_ENGINES
# Line 219  lscp_status_t server_callback ( lscp_con Line 369  lscp_status_t server_callback ( lscp_con
369      else if (lscp_parser_test(&tok, "LIST")) {      else if (lscp_parser_test(&tok, "LIST")) {
370          if (lscp_parser_test(&tok, "CHANNELS")) {          if (lscp_parser_test(&tok, "CHANNELS")) {
371              // Getting all created sampler channel list.              // Getting all created sampler channel list.
372              // GET CHANNELS              // LIST CHANNELS
373              if (iChannel > 0) {              if (iSamplerChannel > 0) {
374                  strcpy(szTemp, "0");                  strcpy(szTemp, "0");
375                  for (i = 1; i < iChannel; i++)                  for (i = 1; i < iSamplerChannel && strlen(szTemp) < sizeof(szTemp) - 8; i++)
376                      sprintf(szTemp + strlen(szTemp), ",%d", i);                      sprintf(szTemp + strlen(szTemp), ",%d", i);
377                  strcat(szTemp, "\r\n");                  strcat(szTemp, "\r\n");
378                  pszResult = szTemp;                  pszResult = szTemp;
# Line 231  lscp_status_t server_callback ( lscp_con Line 381  lscp_status_t server_callback ( lscp_con
381          }          }
382          else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {          else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
383              // Getting all created audio output device list.              // Getting all created audio output device list.
384              // GET AUDIO_OUTPUT_DEVICES              // LIST AUDIO_OUTPUT_DEVICES
385              pszResult = "0,1\r\n";              if (iAudioDevice > 0) {
386                    strcpy(szTemp, "0");
387                    for (i = 1; i < iAudioDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)
388                        sprintf(szTemp + strlen(szTemp), ",%d", i);
389                    strcat(szTemp, "\r\n");
390                    pszResult = szTemp;
391                }
392                else ret = LSCP_FAILED;
393          }          }
394          else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {          else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
395              // Getting all created MID input device list.              // Getting all created MID input device list.
396              // GET MIDI_INPUT_DEVICES              // LIST MIDI_INPUT_DEVICES
397              pszResult = "0\r\n";              if (iMidiDevice > 0) {
398                    strcpy(szTemp, "0");
399                    for (i = 1; i < iMidiDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)
400                        sprintf(szTemp + strlen(szTemp), ",%d", i);
401                    strcat(szTemp, "\r\n");
402                    pszResult = szTemp;
403                }
404                else ret = LSCP_FAILED;
405          }          }
406          else ret = LSCP_FAILED;          else ret = LSCP_FAILED;
407      }      }
# Line 293  lscp_status_t server_callback ( lscp_con Line 457  lscp_status_t server_callback ( lscp_con
457      else if (lscp_parser_test2(&tok, "ADD", "CHANNEL")) {      else if (lscp_parser_test2(&tok, "ADD", "CHANNEL")) {
458          // Adding a new sampler channel:          // Adding a new sampler channel:
459          // ADD CHANNEL          // ADD CHANNEL
460          sprintf(szTemp, "OK[%d]", iChannel++);          if (iSamplerChannel < 16) {
461          pszResult = szTemp;              sprintf(szTemp, "OK[%d]", iSamplerChannel++);
462                pszResult = szTemp;
463            } else {
464                iSamplerChannel = 0;
465                ret = LSCP_FAILED;
466            }
467      }      }
468      else if (lscp_parser_test2(&tok, "REMOVE", "CHANNEL")) {      else if (lscp_parser_test2(&tok, "REMOVE", "CHANNEL")) {
469          // Removing a sampler channel:          // Removing a sampler channel:
470          // REMOVE CHANNEL <sampler-channel>          // REMOVE CHANNEL <sampler-channel>
471            if (lscp_parser_nextint(&tok) < iSamplerChannel)
472                iSamplerChannel--;
473            else
474                ret = LSCP_FAILED;
475      }      }
476      else if (lscp_parser_test2(&tok, "RESET", "CHANNEL")) {      else if (lscp_parser_test(&tok, "RESET")) {
477          // Resetting a sampler channel:          if (lscp_parser_test(&tok, "CHANNEL")) {
478          // RESET CHANNEL <sampler-channel>              // Resetting a sampler channel:
479                // RESET CHANNEL <sampler-channel>
480                if (lscp_parser_nextint(&tok) > iSamplerChannel)
481                    ret = LSCP_FAILED;
482            } else {
483                // Reset sampler:
484                // RESET
485                iSamplerChannel = 0;
486                iAudioDevice = 0;
487                iMidiDevice = 0;
488            }
489        }
490        else if (lscp_parser_test(&tok, "CREATE")) {
491            if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
492                // Creating an audio output device.
493                // CREATE AUDIO_OUTPUT_DEVICE <audio-output-driver> [<params>]
494                if (iAudioDevice < 8) {
495                    sprintf(szTemp, "OK[%d]", iAudioDevice++);
496                    pszResult = szTemp;
497                } else {
498                    iAudioDevice = 0;
499                    ret = LSCP_FAILED;
500                }
501            }
502            else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
503                // Creating an MIDI input device.
504                // CREATE MIDI_INPUT_DEVICE <midi-input-driver> [<params>]
505                if (iMidiDevice < 8) {
506                    sprintf(szTemp, "OK[%d]", iMidiDevice++);
507                    pszResult = szTemp;
508                } else {
509                    iMidiDevice = 0;
510                    ret = LSCP_FAILED;
511                }
512            }
513            else ret = LSCP_FAILED;
514        }
515        else if (lscp_parser_test(&tok, "DESTROY")) {
516            if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
517                // Destroying an audio output device.
518                // DESTROY AUDIO_OUTPUT_DEVICE <audio-device-id>
519                if (lscp_parser_nextint(&tok) < iAudioDevice)
520                    iAudioDevice--;
521                else
522                    ret = LSCP_FAILED;
523            }
524            else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
525                // Destroying an MIDI intput device.
526                // DESTROY MIDI_INPUT_DEVICE <midi-device-id>
527                if (lscp_parser_nextint(&tok) < iMidiDevice)
528                    iMidiDevice--;
529                else
530                    ret = LSCP_FAILED;
531            }
532            else ret = LSCP_FAILED;
533      }      }
534      else if (lscp_parser_test(&tok, "SUBSCRIBE")) {      else if (lscp_parser_test(&tok, "SUBSCRIBE")) {
535          // Register frontend for receiving event notification messages:          // Register frontend for receiving event notification messages:
# Line 334  lscp_status_t server_callback ( lscp_con Line 561  lscp_status_t server_callback ( lscp_con
561    
562  ////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////
563    
564    
565  void server_usage (void)  void server_usage (void)
566  {  {
567      printf("\n  %s %s (Build: %s)\n", lscp_server_package(), lscp_server_version(), lscp_server_build());      printf("\n  %s %s (Build: %s)\n", lscp_server_package(), lscp_server_version(), lscp_server_build());

Legend:
Removed from v.163  
changed lines
  Added in v.213

  ViewVC Help
Powered by ViewVC