view loadtools/bpunify.c @ 965:2969032bdfac

fcup-smsend[mult]: fix buglet in K&R C NULL pointer passing The only 100% safe way to pass a NULL pointer as a function argument in K&R C is to cast 0 to a pointer type; failing to do so may cause mysterious bugs (invalid stack frames or garbage in argument registers) on 64-bit machines. This issue has already been fixed in most of FC host tools, but I just found some missed spots: passing of NULL UDH to PDU encoding functions in fcup-smsend[mult] in the case of single (not concatenated) SMS.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 01 Sep 2023 07:33:51 +0000
parents 850b4f066d75
children
line wrap: on
line source

/*
 * fc-buzplay: this module implements the unified 'play' command.
 */

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>

set_bu_volume(vol)
	unsigned vol;
{
	char *targv[3], argbuf[16];

	sprintf(argbuf, "%u", vol - 1);
	targv[0] = "buzlev";
	targv[1] = argbuf;
	targv[2] = 0;
	tpinterf_make_cmd(targv);
	if (tpinterf_send_cmd() < 0)
		return(-1);
	return tpinterf_pass_output(1);
}

cmd_play(argc, argv)
	char **argv;
{
	char *filename, *tail;
	int pwt_mode, rc;
	unsigned global_vol;

	filename = argv[1];
	tail = rindex(filename, '.');
	if (!tail) {
unknown:	fprintf(stderr,
		"unable to intuit format of %s, use play-bu or play-pwt\n",
			filename);
		return(-1);
	}
	if (!strcmp(tail, ".buz"))
		pwt_mode = 0;
	else if (!strcmp(tail, ".pwt"))
		pwt_mode = 1;
	else
		goto unknown;
	if (argv[2]) {
		global_vol = strtoul(argv[2], 0, 0);
		if (global_vol < 1 || global_vol > 64) {
			fprintf(stderr,
				"error: invalid global volume argument\n");
			return(-1);
		}
	} else
		global_vol = 64;
	if (pwt_mode)
		return buzplay_pwt_file(filename, global_vol);
	else {
		rc = set_bu_volume(global_vol);
		if (rc)
			return(rc);
		return buzplay_bu_file(filename);
	}
}