code for Selection service question...
Mark Biggers
biggers at caip.RUTGERS.EDU
Mon Oct 6 12:11:21 AEST 1986
Oops, here it is!
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# get_select.c
# put_select.c
# This archive created: Mon Sep 22 17:33:56 1986
export PATH; PATH=/bin:$PATH
if test -f 'get_select.c'
then
echo shar: will not over-write existing file "'get_select.c'"
else
cat << \SHAR_EOF > 'get_select.c'
#ifndef lint
static char sccs_id[] = "%W% %H% %T% (c) Siemens RTL";
#endif
/* Selection service example - REQUESTER test
* Modified AND fixed from Sun manual "SunView System Programmer's Guide",
* Chapter 9, "The Selection Service and Library", pp 117 - 119.
*/
#include <stdio.h>
#include <sys/types.h>
#include <suntool/selection_svc.h>
#include <suntool/selection_attributes.h>
#include "basetype.h"
main(argc, argv)
int argc;
char *argv[];
{
extern Seln_result read_proc();
Seln_holder holder;
Seln_rank rank = SELN_PRIMARY;
char *context = NULL;
int arg_count;
arg_count = argc;
while (--argc)
{
argv++;
switch (**argv)
{
case '1':
rank = SELN_PRIMARY;
break;
case '2':
rank = SELN_SECONDARY;
break;
case '3':
rank = SELN_SHELF;
break;
case 'd':
seln_use_test_service();
break;
case 't':
seln_use_timeout(atoi(++argv));
--argc;
break;
default:
arg_count = 1; /* no valid args, so zap the count */
break;
}
}
if (arg_count == 1)
{
fprintf(stderr,"Usage: get_select [d]ebug [t]imeout secs 1|2|3\n");
exit(0);
}
/* find the holder of the desired selection
*/
holder = seln_inquire(rank);
if (holder.state == SELN_NONE)
{
quit("Selection not there, or failure of Service\n");
}
/* ask for the contents, and let "callback" procedure print them
*/
(void) seln_query(&holder, read_proc, context,
SELN_REQ_CONTENTS_ASCII, NULL, NULL);
exit(0);
}
quit(str)
char *str;
{
fprintf(stderr, str);
exit(1);
}
/* Called with each buffer of data returned in response to request
* transmitted by 'seln_query()'.
*/
Seln_result
read_proc(buffer)
Seln_request *buffer;
{
static bool request_attr_skipped = FALSE;
static int count = 0;
char *reply;
/* On first buffer, we have to skip the request attribute,
* and then make sure we don't repeat on subsequent buffers
*/
if (request_attr_skipped == FALSE)
{
if (buffer == (Seln_request *) NULL ||
*((Seln_attribute *) buffer->data) != SELN_REQ_CONTENTS_ASCII)
{
fprintf(stderr, "Selection holder error - unrecognized request\n");
return SELN_UNRECOGNIZED;
}
printf("Portion #%d of selection received: %s", ++count,
buffer->data + sizeof(Seln_attribute));
request_attr_skipped = TRUE;
return SELN_SUCCESS;
}
else /* buffer->status == SELN_CONTINUED or SELN_SUCCESS */
{
printf("Portion #%d of selection received: %s", ++count,
buffer->data);
return SELN_SUCCESS;
}
}
SHAR_EOF
fi # end of overwriting check
if test -f 'put_select.c'
then
echo shar: will not over-write existing file "'put_select.c'"
else
cat << \SHAR_EOF > 'put_select.c'
#ifndef lint
static char sccs_id[] = "%W% %H% %T% (c) Siemens RTL";
#endif
/* Selection service CLIENT test
*/
#include <stdio.h>
#include <sys/types.h>
#include <suntool/selection_svc.h>
#include <suntool/selection_attributes.h>
#include "basetype.h"
main(argc, argv)
int argc;
char *argv[];
{
extern int dummy_proc();
Seln_rank rank;
Seln_result reply_proc();
/* static struct selection empty_selection =
{
SELTYPE_NULL, 0, 0, 0, 0
};
*/ static Seln_client seln_client;
int arg_count;
caddr_t client_data;
Seln_rank req_rank;
Seln_holder holder;
arg_count = argc;
while (--argc)
{
argv++;
switch (**argv)
{
case '1':
rank = SELN_PRIMARY;
break;
case '2':
rank = SELN_SECONDARY;
break;
case '3':
rank = SELN_SHELF;
break;
case 'd':
seln_use_test_service();
break;
case 't':
seln_use_timeout(atoi(++argv));
--argc;
break;
case '&':
holder = seln_inquire(rank);
seln_dump_service(rank);
break;
default:
arg_count = 1; /* no valid args, so zap the count */
break;
}
}
if (arg_count == 1)
{
fprintf(stderr,"Usage: put_select [d]ebug [t]imeout secs 1|2|3");
fprintf(stderr," <selection-file (from stdin)\n");
exit(0);
}
if ((seln_client = seln_create(dummy_proc, reply_proc, client_data))
== (Seln_client) NULL)
{
fprintf(stderr, "Can't find selection service\n");
exit(1);
}
if ( (req_rank = seln_acquire(seln_client, rank)) != rank )
fprintf(stderr, "Did not get requested rank!\n");
sleep(10);
seln_destroy(seln_client);
exit(0);
}
int
dummy_proc()
{
/* do naught */
return;
}
Seln_result
reply_proc(item, context, length)
caddr_t item;
Seln_replier_data *context;
int length;
{
static bool any_reply = FALSE;
char my_buffer[SELN_BUFSIZE]; /* Selection buffer */
Seln_result my_result;
char *bufp;
switch (item)
{
case SELN_REQ_END_REQUEST:
return SELN_SUCCESS;
break;
case SELN_REQ_CONTENTS_ASCII: /* ok, continue processing this request */
break;
default:
return SELN_UNRECOGNIZED;
/* NOTREACHED */
break;
}
/* Don't be concerned with other selection ranks - yet.
*/
if (context->rank != SELN_PRIMARY)
return SELN_DIDNT_HAVE;
if (read(0, my_buffer, length) == 0) /* at EOF, so... */
{
my_result = (any_reply == FALSE) ? SELN_UNRECOGNIZED : SELN_SUCCESS;
}
else
{
any_reply = TRUE;
my_result = SELN_CONTINUED;
}
/* Point to the first full-word AFTER the end of the selection
*/
bufp = my_buffer + length;
*context->response_pointer = ( (int) bufp % 4 == 0 ) ?
bufp : bufp + (4 - ( (int) bufp % 4 ));
return my_result;
}
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
More information about the Comp.unix
mailing list